تاریخچه ساخت مترجم

از ویکی‌پدیا، دانشنامهٔ آزاد
پرش به: ناوبری، جستجو


در ‫‫رایانش، مترجم یا کامپایلر یک ‬‬برنامهٔ رایانه‌ای است که کد مبدأ را که به یک زبان برنامه‌نویسی یا زبان کامپیوتر (زبان مبدأ) نوشته‌شده‌است به یک زبان کامپیوتری دیگر (زبان مقصد، که اغلب به شکل دودویی است و آن را به نام کد مقصد یا کد ماشین می‌شناسند) تبدیل می‌کند. متداول‌ترین دلیل برای تبدیل کد مبدأ این است که می‌خواهیم یک برنامهٔ قابل اجرا ایجاد کنیم.

هر برنامه که به یک زبان برنامه‌نویسی سطح بالا نوشته‌شده‌است باید ابتدا به زبان ماشین ترجمه شود تا بتوان آن را اجرا کرد، بنابراین همهٔ برنامه‌نویسان که از چنین زبان‌هایی استفاده می‌کنند از یک مترجم یامفسر نیز استفاده می‌کنند. به همین دلیل، مترجم‌ها برای برنامه‌نویسان بسیار مهم هستند. هر پیشرفت در مترجم منجر به ایجاد تعداد زیادی برنامهٔ قابل اجرای بهبودیافته می‌شود.

مترجم‌ها برنامه‌های بزرگ و پیچیده‌ای هستند، امّا تحقیقات و تحلیل‌های اصولی دانشمندان کامپیوتر منجر به ایجاد درک روشن‌تری از ساختار مترجم گردیده‌است و پیکر عظیمی از نظریه‌ها پیرامون آن‌ها توسعه یافته‌اند. تحقیق در مورد ساختار مترجم منجر به ایجاد ابزاری برای ساخت هر چه راحت‌تر مترجم‌ها شد، بنابراین امروزه دانشجویان علوم کامپیوتر می‌توانند زبان کوچک متعلّق به خودشان را خلق کنند و طیّ چند هفته مترجم ساده‌ای برای آن ایجاد کنند.

مترجم‌های اوّلیّه[ویرایش]

نرم‌افزار کامپیوترهای اوّلیّه در درجه‌ی اوّل به زبان اسمبلی نوشته شده بودند. معمولاَ برای یک برنامه‌نویس پربارتر است که از یک زبان برنامه‌نویسی سطح بالا استفاده کند، و برنامه‌هایی که به زبان برنامه‌نویسی سطح بالا نوشته شده‌اند قابلیت استفاده‌ی مجدّد روی کامپیوترهای مختلف را دارند. با این حال، مدّتی طول کشید تا کامپایلرها ساخته شوند، زیرا آن‌ها کدی را تولید کردند که به کارآمدی کد های دست نویس در اسمبلر ها نبود، آن‌ها گسترش پروژه‌ها را محدود به رعایت قوانین خود می‌کردند و هم‌چنین حافظه‌ی محدود کامپیوترهای گذشته باعث ایجاد مشکلات تکنیکی بسیاری در طراحی مترجم‌ها می‌شد.

اوّلین کامپایلر توسّط گریس هاپر در سال ۱۹۵۲ برای زبان سیستم A-0 (نسخه‌ی صفر زبان علم حساب) نوشته‌شد. واژه‌ی مترجم (کامپایلر) توسّط هاپر ابداع شد. گروه فورترن به سرپرستی جان بکوس در آی‌بی‌ام به طور کلّی معتبر است نظر به این که اوّلین مترجم (کامپایلر) کامل را در سال ۱۹۵۷ معرّفی کردند. ۱۸ سال کاری طول کشید تا اوّلین مترجم فورترن ساخته شود.

اوّلین مترجم زبان ALGOL 58 توسّط ''فریدریش ال باوئر''، هرمن باتنبراک (Hermann Bottenbruchهینز راوتیشازر ( Heinz Rutishauser) و کلاز سملسون (Klaus Samelson ) در انتهای سال ۱۹۵۸ برای کامپیوتر Z22 کامل شد. بائر و همکاران در سال های گذشته مشغول کار کردن رو فن آوری کامپایلر برای Sequentielle Formelübersetzung (به معنی ترجمله متوالی فرمول ها) بودند.

در سال ۱۹۶۰ کامپایلری توسعه یافته برای فورترن به نام ALTAC برای فیلکو ۲۰۰۰ در دسترس بود. در نتیجه در اواسط دهه ۶۰ کامپایل برنامه های فورترن برای دو معماری IBM و فیلکو امکان پذیر بود. اولین زبان سطح بالای چند پلتفرمی شناخته شده زبان کوبول بود. در رونمایی دسامبر ۱۹۶۰ برنامه های کوبول می توانستند در هردوی پلتفرم های UNIVAC II و RCA 501 کامپایل و اجرا شوند.

کامپایلر کوبول برای UNIVAC II احتمالا برای اولین بار در یک زبان سطح بالا به نام FLOW-MATIC توسط تیم توسعه ای به رهبری گریس هاپر نوشته شده بود.


مترجم‌های خودمیزبان[ویرایش]

نباید با مترجم مترجم (Compiler compiler) اشتباه شود.

مانند همه‌ی نرم‌افزارهای دیگر، اجرای مترجم به زبان سطح بالا مزیّت‌هایی دارد. به طور خاص مترجم می‌تواند خود‌میزبان باشد یعنی، به زبانی که خودش ترجمه می‌کند نوشته‌شده باشد. ساختن مترجم‌های خودمیزبان مسأله‌ی راه‌اندازی خودکار (bootstrapping) است یعنی اوّلین مترجمی که این ویژگی را داشته‌باشد یا باید به زبان ماشین باشد یا این که به وسیله‌ی مترجمی که به زبان دیگری نوشته‌شده‌است ترجمه شود و یا این که به وسیله‌ی یک مفسّر اجرا شود.


نلیاک[ویرایش]

آزمایشگاه الکترونیک نیروی دریایی کامپایلر بین المللی الگل NELIAC یک لحجه از زبان و پیاده سازی کامپایلر زبان برنامه نویسی الگول ۵۸ است که توسط لابراتوار الکترونیک نیروی دریایی در سال ۱۹۵۸ گسترش داده شده است. NELIAC زاییده ذهن هری هاسکی - یک دانشمند کامپیوتر معروف و رییس ACM - است و توسط مااوری هالستید رییس مرکز محاسبات NEL پشتیبانی می شد. نسخه های اولیه روی پروتوتایپ USQ-17 کامپیوتر ( که کنتس نامیده می شود) در آزمایشگاه پیاده سازی شده است. این کامپایلر اولین کامپایلر خود کامپایل دنیا می باشد. یعنی ابتدا فرم ساده کامپایلر (راه انداز) در زبان اسمبلی پیاده سازی شده است و سپس کامپایلر اصلی توسط زبان خود نوشته شده است و توسط راه انداز کامپایل شده است، کامپایلر راه انداز دیگر مورد استفاده قرار نگرفته است.


لیسپ[ویرایش]

اوّلین مترجم خودمیزبان (به استثنای اسمبلرها برای زبان لیسپ توسّط تیم هارت (Tim Hart) و مایک لوین (Mike Levin) در ام‌آی‌تی در ۱۹۶۲ نوشته‌شده‌است. آن‌ها یک مترجم لیسپ به زبان لیسپ نوشتند و آن را با یک مفسّر به زبان لیسپ که قبلاً نوشته‌شده‌بود بررسی کرند. هنگامی که آن‌ها توانستند مترجم را به جایی برسانند که بتواند کد منبع خود را ترجمه کند خودمیزبان شده‌بود.

گرامرهای مستقل از متن و تجزیه‌کننده‌ها[ویرایش]

تجزیه‌کننده (parser) یک جزءِ مهم از مترجم است. کد منبع یک زبان برناهه‌نویسی را تجزیه می‌کند تا یک نمایش درونی از آن را ایجاد کند. زبان‌های برناهه‌نویسی باید به صورت گرامرهای مستقل از متن تصریح شوند که بتوان تجزیه‌کننده‌های سریع و کارآمدی برای آن‌ها نوشت. تجزیه‌کننده‌ها می‌توانند به صورت دستی نوشته شوند یا به وسیله‌ی تولیدکننده‌ی تجزیه‌کننده تولید شوند. گرامر مستقل از متن یک ساختار ساده و دقیق برای توصیف ساختار بلوکی برنامه است که چگونه سازه‌های زبان برنامه‌نویسی از بلوک‌های کوچک‌تر ساخته‌شده‌اند. رسمی‌سازی گرامر مستقل از متن توسّط نوآم چامسکی در میانه‌ی دهه‌ی ۱۹۵۰ توسعه یافت. ساختار بلوکی به وسیله‌ی پروژه‌ی ALGOL به دنیای زبان‌های برنامه‌نویسی معرّفی شد (۱۹۶۰-۱۹۵۷)، که به عنوان نتیجه هم‌چنین گرامر مستقل از متن را برای توضیح دستور ALGOL حاصل به طور برجسته نشان داد.

سادگی زبان های مستقل از متن باعث می شود که الگوریتم های تجزیه کارآمدتری را بتوان طراحی کرد که برای یک رشته ورودی خاص تعیین می کند این رشته با گرامر های موجود چگونه ساخته می شود. اگر طراح زبان برنامه نویسی خواهان استفاده از زیرمجموعه های کوچکتری از گرامر های مستقل از متن باشد، می توان تجزیه گر های موثر تری نیز نوشت.‎

تجزیه‌ی LR[ویرایش]

تجزیه کننده های LR(چپ به راست) در سال 1965 توسط دانلد کنوت در مقاله‌ی به نام "درترجمه‌ی زبان از چپ به راست" اختراع شد. یک تجزیه‌کننده‌ی LR تجزیه کننده ای است که ورودی را از چپ به راست می‌خواند و یک اشتقاق از سمت راست می‌سازد. تجزیه کننده های (LR(k نیز استفاده می‌شوند . k به تعداد علامت‌های پیش بینی مصرف نشده‌ی ورودی که برای تصمیم گیری های تجزیه استفاده می‌شود،اشاره می‌کند.

کنوت اثبات کرد که گرامرهای (LR(k می توانند با یک زمان اجرای متناسب با طول برنامه تجزیه شوند و همه‌ی تجزیه گرامرهای (LR(k با k > 1 می توانند به گرامرهای (LR(1 برای همان زمان تبدیل شوند. به بیان دیگر یک علامت پیش بینی برای تجزیه‌ی گرامرهای مستقل از متن قطعی کافی است (DCFG).

کرنیاک(1969) اولین کسی بود که نشان داد تجزیه کننده های زبان های برنامه‌نویسی با استفاده از این تکنیک ها می توانند تولید شوند.

فرانک درمر روشهای کاراتری مثل تجزیه‌کننده SLR و تجزیه کننده LALR را در پایان‌نامه ی دکترای خود در دانشگاه MIT در سال 1969 منتشر کرد. این یک پیشرفت بسیار مهم بود زیرا مترجم‌های (LR(k که توسط دانلد کنوت توصیف شده بود، برای اجرا در کامپیوترهای دهه‌های 1960 و 1970 بسیار بزرگ بود.

در عمل LALR یک راه حل خوب ارائه ‌می‌دهد.این برتری تجزیه‌کننده‌ی (LALR(1 بر تجزیه‌کننده‌های (SLR(1 (این است که(LALR(1 می‌تواند گرامرهای پیچیده‌تری نسبت به (SLR(1 را تجزیه کند.) بسیار مفید است، اگرچه (LALR(1 با تجزیه‌کننده‌های (LL(1 قابل مقایسه نیست ( (LALR(1 نمی‌تواند همه‌ی گرامرهای (LL(1 را تجزیه کند.)بیشتر گرامرهای (LL(1 که در عمل با آن‌ها مواجه هستیم معمولا می‌توانند با (LALR(1 تجزیه شوند. گرامرهای (1)LR از گرامرهای (LALR(1 بسیار قوی تر هستند، هر چند یک گرامر (1)LR به یک تجزیه‌کننده LR استاندارد نیاز دارد که از لحاظ اندازه بسیار بزرگ است و در عمل کارا نیست.

نحو بسیاری از زبان‌های برنامه‌نویسی که با گرامرها توصیف می‌شوند می‌توانند با تجزیه‌کننده‌های (LALR(1 تجزیه شوند و به همین دلیل تجزیه‌کننده‌های LALR معمولا توسط کامپایلرها برای اجرای تحلیل نحوی کدهای منبع استفاده می‌شوند. یک تجزیه‌کننده‌ی صعودی بازگشتی مانند یک تجزیه‌کننده LALR عمل می‌کند و به جای جدول‌هااز تابع های متقابل صعودی استفاده می‌کند. بنابراین تجزیه‌کننده به طور مستقیم به یک نزولی بازگشتی در زبان میزبان رمز می‌شود.

کدگذاری مستقیم معمولا منجر به تولید یک تجزیه‌کننده سریع تر نسبت به نوع مبتنی بر جدول آن می‌شود به همین دلیل است که تالیف بسیار از ترجمه سریع تر است. همچنین ویرایش یک تجزیه‌کننده‌ی بازگشتی صعودی ممکن است، در صورتی که اجرای جدولی آن تقریبا برای انسان غیرقابل خواندن است.

صعودی بازگشتی برای اولین بار در سال 1986 در مقاله‌ای به نام " تجزیه‌ی LR بسیار سریع " توسط توماس پنلو شرح داده‎شد. این روش در سال 1988 توسز جی.اچ.رابرتز و همچنین در مقاله‌ای به قلم لیرمارکرز، اگوستیخن و کروسمان آرتز در مجله‌ی تئوری علوم کامپیوتر در سال 1992 تشریح شد.

تجزیه‌ی LL[ویرایش]

یک تجزیه‌کننده LL ورودی را از چپ به راست تجزیه ‌می‌کند و یک اشتقاق چپ از جمله است. به دسته‌ی گرامرهایی که به این صورت قابل تجزیه هستند گرامرهای LL گفته می‌شود. گرامرهای LL گرامرهای مستقل از متنی هستند که از گرامرهای LR محدودتر هستند، با این وجود به دلیل سادگی و اجرای کارآمد در بین نویسندگان مترجم‌ها بسیار محبوب هستند.

گرامرهای (LL(k می‌توانند با تجزیه‌کننده‌های بازگشتی نزولی که معمولا با دست رمز می‌شوند، تجزیه شوند.

به دلیل این‌که ALGOL خود بازگشتی است، طراحی آن بررسی نزولی بازگشتی را برانگیخت. مفهوم تجزیه‌ی نزولی بازگشتی در ژانویه 1961 در CACM (گردهمایی ACM) در دو مقاله‌ی جداگانه توسط ای.ای.گرائو و ادگار تی. "ند" آیرنز بحث شد. در مارچ 1961 ریچارد وایچف به صورت مستقل با الهام از نزولی بازگشتی از آنها در مترجمهای Burroughs ALGOL استفاده کرد.

ایده ی گرامرهای (1)LL در سال 1968 توسط لوییس و استرنز معرفی شد.

نزولی بازگشتی توسط نیکلاس ورث و با PL/0 یک زبان برنامه نویسی علمی برای آموزش ساختار مترجم ها در دهه‌ی 70، محبوب شد.

تجزیه‌ی LR زبان‌های بیشتری نسبت به تجزیه‌ی LL پشتیبانی می‌کند و همچنین در گزارش خطا بهتر است، به عنوان مثال خطاهای نحوی را هنگامی که ورودی با گرامر مطابقت ندارد به سرعت تشخیص می‌دهد.

تجزیه‌کننده‌های ارلی[ویرایش]

در سال 1970 جی ارلی تجزیه‌کننده‌ای را اختراع کرد که به تجزیه‌کننده‌های ارلی معروف است. این تجزیه‌کننده‌ها بسیار پرطرفدار هستند زیرا تمام گرامرهای مستقل از متن را به صورت بسیار کارآمد تجزیه می‌کنند.

زبان های توصیف کننده گرامر[ویرایش]

جان بکوس "فرمول فرازبانی" را برای توصیف نحو زبان برنامه نویسی جدید IAL که امروزه با نام الگول ۵۸ شناخته می شود ارائه کرد(1959). کار بکوس برپایه سیستم استاندارد پست که توسط امیل لئون پست ابداع شد، قرار داشت. گشترس های بعدی الگول منجر به الگول ۶۰ شد، پیتر نااور در گزارش خود (۱۹۶۳) نشانه گذاری بکوس را فرم نرمال بکوس (BNF) نامید و آن را با حداقل کردن کاراکتر های مورد استفاده ساده سازی کرد. هرچند دونالد کنوث استدلال کرده است که BNF می بایست بصورت فرم بکوس-نائور خوانده شود و این استدلال بصورت عمومی قبول شده است.

نیکلاوس ویرت فرم بکوس-نائور توسعه‌یافته (EBNF) را تعریف کرده است که یک نسخه اصلاح شده از BNF در اوایل دهه 60 برای PL/0 می باشد. فرم تکمیل‌شده بکوس-نائور (ABNF) شکل دیگری از نشانه گذاری است. هردوی EBNF و ABNF به کرار برای مشخص کردن گرامر زبان های برنامه نویسی، به عنوان وردی برای ژنراتور های تجزیه گر مورد استقاده قرار می گیرد. همچنین در شاخه های دیگری همچون پروتکل های ارتباط مورد استفاده قرار می گیرد.


سازنده های تجزیه گر[ویرایش]

یک سازنده تجزیه گر بخش تحلیل گر لغوی یک کامپایلر را ایجاد می سازد. یک برنامه که با دریافت توضیحات گرامر یک زبان برنامه نویسی خاص تجزیه گر آن زبان را ایجاد می کند. این تجزیه گر می تواند در کامپایلر آن زبان خاص مورد استفاده قرار بگیرد. تجزیه گر، نمادها و کلید واژه های آن زبان خاص را در متن ورودی شناسایی کرده و این نشانه ها را به کدی که وظیفه تعیین ازرش نحوی و ترجمه به آبجکت کد را برعده دارد بر می گرداند. این بخش دوم کامپایلر می تواند با کامپایلر-کامپایلر ایجاد شود که قوانین اولیت شرح نحو رسم زبان را به عنوان ورودی می گیرد. اولین کامپایلر-کامپایلر برای استفاده به این نام توسط تونی بروکر در سال ۱۹۶۰ نوشته شد و برای ساخت کامپایلرهای برای کامپیوتر اطلس در دانشگاه منچستر مورد استفاده قرار گرفت، همانند کامپایلر اوتوکد اطلس. هر چند با کامپایلر-کامپایلر های مدرن بسیار متفاوت بود، و کامپایلر-کامپایلر امروزه تعریفی مابین کامپایلر عمومی با قابلیت شخصی سازی بالا و یک زبان با قابلیت توصعه پذیری نحو آن می تواند داشته باشد. نام کامپایلر-کامپایلر برای سیستم بروکر به متراتب مناسب تر است تا کامپایلر-کامپایلرهای مدرن، که به صراحت با نام سازنده تجزیه گر نامیده می شوند. به اطمینان می توان گفت که نام کامپایلر-کامپایلر پس از یاک بصورت عمومی مورد استفاده گرفت هرچند کار بروکر همچنان حائز اهمیت است. در اوایل ۱۹۶۰ رابرت مک کلور در ابزارآلات تگزاش کامپایلر-کامپایلری طراحی کرد که TMG نام گرفت که از کلمه “transmogrification” (به معنی تناسخ) گرفته شده است. در سالهای بعد TMG به مینفریم های برخی از کامپیوتر های UNIVAC و IBM پورت شد. نمونه دیگری از سازنده های تجزیه گر متا دو است که اولین بار در سال ۱۹۶۲ توسط وال شوور منتشر شد. متا دو گرامر و قاعد تولید کد را قبول می کرد و می توانست زبان خود و دیگر زبان ها را کامپایل کند. متادو دو اولین نسخه مستند شده متاکامپایلر بود. همچنین متادو به یکی از اولین نمونه های ماشین مجازی ترجمه شد. پروژه مالتیکس ریسک همکاری میان MIT و آزمایشگاههای بل، یکی از اولین ها برای گسترس یک سیستم عامل با استفاده از یک زبان سطح بالا بود، زبان انتخاب شده پی‌ال/۱ بود، اما یک کارپرداز خارجی نمی تواند کامپایلری برای کار تهیه کند. گروه مالتیکس پیاده سازی شخصی خود را از زبان PL/1 گشترش دادند که با نام EPL شناخته می شود. TMG روی سری GE-600 پورت شده بود و برای گسترش EPL توسط داگلاس مکلروی، رابرت موریس و دیگران مورد استفاده قرار گرفت. چندی بعد کن تامسون اولین نسخه یونیکس را برای PDP-7 در ۱۹۶۹ نوشت، داگ مکلروی اولین زبان سطح بالای سیستم جدید را ایجاد کرد: پیاده سازی مکلروی از TMG. TMG همچنین ابزار تعریف کامپایلری است که تامسون جهت پیاده سازی کامپایلر برای زبان بی برای PDP-7 در ۱۹۷۰ مورد استفاده قرار داد. بی اولین جد زبان سی می باشد. نخستین سازنده تجزیه گر LALR که توسط فرانک درمر و تام پندلو ساخته شد TWS نام داشت.

XPL[ویرایش]

XPL یک پیاده سازی شخصی از زبان PL/1 است که در سال ۱۹۶۷ گسترش یافت و برای ساخت کامپایلر کامپایلر ها مورد استفاده قرار گرفت. XPL توسط تیمی متشکل از ویلیام مک کیمن، جیمز هورینگ و دیوید ورتمن در دانشگاه استنفورد، دانشگاه کالیفورنیا و سانتا کروز طراحی و پیاده سازی شد. اولین رونمایی از آن در کنفرانس پاییزه کامپیوتر دانشگاه سانفرانسیسکو در سال ۱۹۶۸ بود. XPL به هردوی زبان برنامه نویسی و سازنده تجزیه گر LALR که برپایه همین زبان نوشته شده است گفته می شود. XPL یک سیستم نسبتا ساده پایین به بالا است که توسط نویسندگانش لقب MSP (استراتژی اولویت مختلط) گرفته است.

YACC[ویرایش]

YACC یک سازنده تجزیه گر است، آنرا با lex اشتباه نگیرید، lex یا تحلیلگر لغوی است که در مرحله اول یاک از آن استفاده می کند. یاک توسط استفان جانسون در AT&T برای سیستم عامل یونیکس گسترش داده شده است. نام یاک از عبارت "Yet Another Compiler Compiler" گرفته شده است. این سازنده تجزیه گر کامپایلر های LALR(1) را که برپایه گرامرهای نوشته به فرمی شبیه فرم بکوس نائور ایجاد می کند. جانسون در اوایل ۱۹۷۰ در آزمایشگاهای بل روی یاک کار می کرد. وی بسیار با TMG آشنا بود و تاثیرات آن را می توان در یاک و طراحی زبان برنامه نویسی C مشاهده کرد. از آنجایی که یاک سازنده کامپایلر پیش فرض در سیستم های یونیکس بود، بسیار گشترش یافته و مورد استفاده قرار گرفته است. گشترش هایی همانند GNU Bison همچنان در حال استفاده هستند. کامپایلر ایجاد شده توسط یاک نیازمند یک تحلیلگر لغوی است. سازنده های تحلیل گر لغوی همانند lex یا flex در دسترس هستند. استاندارد های موجود در IEEE POSIX P1003.2 نیازمندی ها و توانایی های هر دوی Lex و Yacc را تعیین می کند.

ترجمه‌ی تقابلی[ویرایش]

یک مترجم تقابلی در یک محیط اجرا می‌شود و برای یک محیط دیگر کد شی تولید ‌می‌کند. مترجم‌های تقابلی در توسعه‌های جاسازی شده، در جایی که کامپیوتر هدف قابلیت‌های محدودی دارد. یک مثال اولیه از این کامپایلرها AIMICO است که یک برنامه‌ی FLOW-MATIC بر روی UNIVAC II بود که برای اجرای کدهای اسمبلی در کامپیوتر IBM 705 است که بعدا روی کامپیوترهای IBM نصب شد.

مترجم ALGOL 68C کد خروجی ZCODE را تولید کرد که می‌تواند به یک کد ماشین محلی به وسیله‌ی یک مترجم ZCODE نیز ترجمه یا تفسیر شود. ZCODE یک برنامه‌ی میانی بر پایه‌ی رجیستر استوار است. این توانایی تفسیر یا ترجمه‌ی ZCODE سازندگان ALGOL 68C را تشویق کرد که کامپیوترهای پایه‌ی متنوعی را تکثیر کنند .

بهینه‌سازی مترجم‌ها[ویرایش]

بهینه‌سازی کامپایلر فرآیند بهبود کیفیت کد بدون تغییر نتیجه‌ی تولیدی آن است.

هدف توسعه‌دهندگان اولین مترجم FORTRAN این بود که مترجم بتواند با سرعتی بیش از اسمبلرهای دستی کدها را اجرا کند، بدین ترتیب مشتریان از محصول آن‌ها استفاده کردند و آنها در تلاش اولیه موفق شدند.

کامپایلرهای بعدی مثل مترجم Fortran IV شرکت IBM اولویت بیشتری برای عیب یابی بهتر و اجرای سریع‌تر در هزینه‌ی بهینه سازی کدها قائل شدند. سری IBM 360 دو مترجم جداگانه ارائه دادند : یک جستجوگر کد سریع در اجرا و یک بهینه‌ساز با سرعت پایین‌تر.

فرانسیس آلن به تنهایی و به همراه جان کوک بسیاری از جنبه‌های بهینه‌سازی را معرفی کرد. مقاله‌ی سال 1966 آلن ، بهینه‌سازی برنامه‌،نمودار ساختمان داده‌ای برای رمز کردن محتوای برنامه برای بهینه‌سازی ارائه داد. مقالات وی در سال 1970، کنترل تجزیه و تحلیل جریان و پایه ای برای بهینه سازی برنامه، به عنوان زمینه‌ای برای تجزیه و تحلیل جریان داده های کارآمد و موثر منتشر شد. مقاله‌ی مشترک وی با کوک در سال 1971، کاتالوگ بهینه سازی تحول،اولین شرح و اسلوبی از بهینه سازی تحولات را ارائه داد. مقالات سال‌های 1973 و 1974 وی بر تجزیه و تحلیل جریان داده‎‌ها، تحلیل را در کل برنامه گسترش داد. مقاله‌ی مشترک او و کوک در سال 1976 یکی از دو استراتژی اصلی تحلیل است که امروز در بهینه‌سازی کامپایلرها استفاده می‌شود. آلن روش‌های خود را به عنوان قسمتی از کامپایلرها برای کامپیوترهای IBM 7030 Stretch-Harvest و ماشینهای محاسباتی پیشرفته توسعه داد و اجرا کرد. این کار امکان و بنای ایجاد ماشین‌های مدرن و بهینه سازهای مستقل از زبان را به وجود آورد. او ایجاد و رهبری پروژه‌ی PTRAN را برای اجرای همزمان برنامه های FORTRAN به عهده گرفت. تیم PTRAN او طرح های تشخیص موازی جدید و ایجاد مفهوم گراف وابستگی برنامه را توسعه داد، پایه های اولیه روش در همزمانی کامپایلرها استفاده شده است.

کتاب زبان‌های برنامه نویسی و کامپایلرهای آن به قلم جان کوک و جیکوب تی.شوارتز، که در اوایل 1970 منتشر شد، بیش از 200 صفحه را به بهینه‌سازی الگوریتمها اختصاص داد. این کتاب شامل بسیاری از تکنیکهای آشنا از جمله حذف کد های تکراری و کاهش قدرت است.

بهینه‌سازی روزنه‌ای[ویرایش]

بهینه سازی روزنه ای یک روش بهینه‌سازی ساده ولی تاثیرگذار است که اختراع ویلیام مک کیمن است ودر سال 1965 در CACM منتشر شد. این روش در کامپایلرهای XPL که توسط مک کیمن توسعه یافت نیز استفاده می‌شود.

بهینه ساز Capex COBOL[ویرایش]

شرکت capex در اواسط دهه‌ی 70 بهینه‌ساز COBOL را برای COBOL توسعه داد. این نوع از بهینه ساز ها وابسته هستند، در این مورد، به آگاهی از ضعف های موجود در کامپایلر استاندارد IBM برای COBOL و در حقیقت بخشی از آبجکت کد را با کدی موثرتر جایگزین می کند یا کد موثر را به آن الحاق می کند کد جایگزین ممکن است یک جدول ارجاع خطی را با یک جستجوی دودویی یا گاهی یک دستورالعمل کند را با یک نوع سریعتر آن که عملکرد مشابه دارد جایگزین کند. این روش در حال حاضر به عنوان "کاهش قدرت" شناخته شده است.به عنوان مثال بر روی سخت افزار IBM/360 دستورالعمل CLI به یک مدل خاص وابسته بود که برای مقایسه یک بایت بین دو بار و 5 برابر سریع تر از یک دستور CLC بود.

کامپایلرهای مدرن به طورمعمول گزینه های بهینه سازی را ارائه می‌دهند و برنامه نویسان می‌توانند انتخاب کنند که گذر بهینه سازی را اجرا کنند یا خیر.

عیب یابی[ویرایش]

هنگامی که به یک کامپایلر یک برنامه ای داده می شود که از نظر نحوی نادرست است، نمایش یک پیغام خطای کوتاه و واضح بسیار مفید است. البته از دیدگاه طراح کامپایلر، رسیدن به آن دشوار است. کامپایلر فرترن WATFIV در اواخر دهه 1960 در دانشگاه واترلو کانادا توسعه داده شد. این کامپایلر برای ارائه پیغام خطای بهتر نسبت به کامپایلر فرترن IBM آن زمان، طراحی شده بود. علاوه بر این WATFIV بسیار کاربردی تر بود، به این دلیل که مراحل کامپایل، ]]پیوند دادن[[ اجرا را در یک مرحله ترکیب کرده بود، در حالی که کامپایلر IBM برای اجرای این مراحل را در 3 بخش جداگانه داشت!

PL\C[ویرایش]

پی ال/سی یک زبان برنامه نویسی است که اوایل دهه 1970 در دانشگاه کرنل پدید آمد. در حالی که پی ال/سی زیرمجموعه زبان پی ال/آی IBM بود، برای هدف خاص آموزش برنامه نویسی طراحی شده بود. دو محقق و استاد دانشگاهی که پی ال/سی را طراحی کردند، Richard W. Conway و Thomas R. Wilcox بودند. آنها مقاله معروف "طراحی و پیاده سازی یک کامپایلر عیب یاب برای پی ال/آی" ارائه دادند که در مارس 1973 در مجله Communications of ACM منتشر گردید. پی ال/سی برخی از ویژگی های پیچیده پی ال/آی را حذف کرد و امکان اشکال زدایی و بازیابی خطا به صورت وسیع را به آن اضافه کرد. پی ال/سی یک امکان غیرعادی داشت که هرگز در کامپایل یک برنامه شکست نمی خورد. این امکان غیر عادی با استفاده وسیع از تصحیح خودکار بسیاری از خطاهای نحوی و تبدیل هرگونه خطای باقیمانده به عنوان اعلامیه خروجی امکان پذیر شده بود.

ترجمه‌ی درجا[ویرایش]

مقاله اصلی:کامپایل درجا

کامپایل درجا (JIT) یک اصطلاح است که در حال حاضر برای توصیف تولید کدهای اجرایی آنی یا به اندازه ممکن نزدیک به اجرای واقعی به کار می رود. دلیل وجود کامپایل درجا این است که از معیارهای نرم افزارسنجی زمان اجرا یا دیگر گزینه های بهبود کارایی استفاده شود. یک مثال جدید از کامپایل درجا در Works Records System است، صفحه گسترده ای در سال 1974 که اخیراً قطعه کدهای ماشینIBM/360 را برای انجام محاسبات بر اساس فرمول وارد شده به عنوان قطعه های داده تولید کرده است. این از دستورالعمل های IBM/360 برای تولید کد ماشین IBM/360 استفاده کرده است، که بعدها از پروژه Dynamo شرکت HP پیشی گرفت.


منابع[ویرایش]

  • مشارکت‌کنندگان ویکی‌پدیا، «History of compiler construction»، ویکی‌پدیای انگلیسی، دانشنامهٔ آزاد (بازیابی در ۵ بهمن ۱۳۹۲).