کامپایلرها چه کاربردی دارند؟
دی‌کامپایلر
به طور کلی کامپایلرها قادر به بازگرداندن یک فایل اجرایی به سورس کد آن به شکل دقیق و بی‌نقص نیستند و در اکثر مواقع کدهایی مبهم() می‌سازند. با این حال دیکامپایلرها هنوز ابزاری بسیار مهم در مهندسی معکوس به شمار می‌روند.
دی‌کامپایلر
از دیکامپایلر برای مباحث امنیت کامپیوتر ، تصحیح خطاها و... استفاده می شود. زبان های کامپایلری مفسری که از کد میانی و ماشین مجازی استفاده می کنند معمولاً به صورت کامل قابل برگشت هستند ، یعنی حتی شماره ی خطوط و نام متغییرهای کد اصلی هم قابل برگشت است.از این دست زبان‌ها می توان به جاوا و .net اشاره کرد. به عنوان مثال دیکامپایلر jd-gui برای جاوا وجود دارد که کد را به صورت کامل برمی گرداند. برای جلوگیری از دیکامپایل برنامه ها ابزاری با عنوان مبهم کننده ی کد( obfuscated code) وجود دارد که عملیات مهندسی معکوس را مشکل تر می کند. کامپایلر
راه‌های مختلفی جهت دسته‌بندی کامپایلرها وجود دارد مثلاً می‌توان آن‌ها را با توجه به ورودی، خروجی، ساختار داخلی یا رفتار زمان اجرای آن تقسیم‌بندی کرد. کامپایل جلوتر از زمان
در یک برنامه ممکن است تمامی قسمت‌ها استفاده نشود کامپایلر پویا تنها قسمت‌هایی که کاربر لازم دارد را ترجمه می‌کند اما کامپایل جلوتر از زمان همهٔ قسمت‌ها را ترجمه می‌کند که باعث می‌شود در زمان شروع زمان و حافظهٔ بیشتری مصرف شود. بوت‌استرپینگ (کامپایلر)
در طی نصب برنامه‌های کامپایلر برخی اوقات لازم است که برنامه نصب کننده یا نرم‌افزار مدیریت بسته‌ها خودش به‌روزرسانی شود. الگوی رایج برای انجام این کار استفاده از یک فایل بوت‌استرپ کوچک مثلاً (setup.exe) است که نصاب را به‌روزرسانی می‌کند و فرایند نصب واقعی را پس از به‌روزرسانی آغاز می‌کند. برخی اوقات فایل بوت‌استرپ کننده، خود پیش‌نیازهای دیگری که برای نرم‌افزار لازم است را در طی فرایند بوت‌استرپ کردن نصب می‌کند. خطای کامپایل
یک خطای کامپایلرداخلی (معمولاً به صورت ICE گفته می‌شود) خطایی است که با توجه به نادرست بودن کد مرجع رخ نمی‌دهد، بلکه به دلیل وجود خطا درون خود کامپایلر رخ می‌دهد. آن‌ها گاهی اوقات می‌توانند با ایجاد تغییرات کوچک و ناچیز درون کد مرجع در اطراف خطی که که خطا در آن رخ داده، اصلاح شوند (اگر همچین خطی نشان داده شود) اما گاهی اوقات تغییرات بزرگتری باید انجام شوند، مانند اصلاح مجدد کد، تا از برخی ساختارها جلوگیری شود. استفاده از کامپایلر متفاوت یا یک نسخهٔ متفاوت از کامپایلر، ممکن است مشکل را حل کند و در برخی موارد یک جواب قابل قبول دهد. زمانی که یه یک خطای کامپایلر داخلی برخورد می‌کند، بسیاری از کامپایلرها خطای استاندارد را تولید نمی‌کنند، اما در عوض یک نسخه کوتاه شده را با فایل‌های اضافی ضمیمه، که فقط برای خطاهای کامپایلر داخلی ارایه می‌شوند، تولید می‌کنند. این برای این است که اطمینان حاصل کنیم برنامه در هنگام ورود خطا دچار خرابی نمی‌شود، که این باعث می‌شود حل خطای نزدیک غیرممکن شود. دیگر فایل‌هایی که برای خطاهای داخلی پیوست شده‌اند معمولاً با فرمت خاص ذخیره می‌شوند، مانند dump برای جاوا. آنالیز این فرمت‌ها معمولاً سخت‌تر از فایل‌های عادی است، اما همچنان می‌توانند دارای اطلاعات بسیار کمک کننده ای برای حل باگ‌های حاصل از خرابی باشند. دستکاری نام
کامپایلرهای مختلف، به روش‌های مختلفی این کار را انجام می‌دهند. حتی در میان کامپایلرهای موجود برای یک زبان خاص نیز لزوماً این روش یکسان نیست. اما در نهایت همهٔ آنها نام‌ها را در زبان مقصد به طریقی تغییر می‌دهند که به یک مجموعه نام منحصر به فرد برای موجودیت‌های برنامه برسند. برای نمونه تبدیل کد توابع را در نظر بگیرید. دو تابع با نام یکسان، مجبورند که امضاءهای متفاوتی داشته باشند (امضای توابع شامل تعداد، نوع و ترتیب ورودی‌های و خروجی‌هایش است). وگرنه نمی‌توان آنها را از هم تشخیص داد و برنامه دچار خطای زمان کامپایل می‌شود. از همین تفاوت می‌توان استفاده کرد تا برای توابع نام‌های منحصر به فردی تولید کرد. Pragma once
برخی از کامپایلرها نظیر جی‌سی‌سی و کلنگ، کدهای مخصوصی دارند که به کمک آن‌ها می‌توانند اینکلود گاردها را با سرعت زیاد و بهینه مدیریت کنند، بنابراین استفاده از #pragma once در این کامپایلرها تأثیر کمی دارد یا اصلاً بدون تأثیر است. بهینه سازی درون تابع
در اوایل دهه ۱۹۹۰ با کامپایلرهایی از محدب ("کامپایلر برنامه" برای محدب C4 و از اردنت کامپایلر برای [Ardent Titan]) وارد دنیای کامپایلر تجاری شد و دوباره ظهور کردند. این کامپایلرها نشان داده‌اند که فناوری‌ها می‌توانند به اندازه کافی سریع ساخته شوند تا به عنوان یک کامپایلر تجاری قابل قبول باشند. متعاقباً تکنیکهای بین رویه ای در تعدادی از سیستمهای تجاری و غیرتجاری دیده می‌شوند. آی‌ام‌پی (زبان برنامه‌نویسی)
کامپایلر برای ای پی ام در اوایل سال ۱۹۶۵ به وجود آمد؛ که استفاده می‌شد برای زبان برنامه‌نویسی (سیستم اشتراک زمان CDC-6600)و مورد استفاده در موسسه‌های دفاعی از سال ۱۹۶۷ قرار گرفت. اگر چه کامپایلر ان در مقایسه با زبان‌های غیرقابل توسعه کندتر بود ولی برای کار تولید عملی استفاده می‌شود. کامپایلرهای ابسافت فرترن
Absoft IDE برای استفاده از کامپایلرهای Absoft Fortran سیم‌کشی شده است و برای استفاده از یک کامپایلر C/C++ که فایل‌های شی سازگار با پیوند دهنده سیستم را تولید می‌کند، قابل تنظیم است. نمایش میانی
زبان میانی مناسب سطح معنایی‌ای نزدیک به اسمبلی دارد و باید بتواند با حفظ معنا در مسیر تبدیل کد زبان منبع به کد زبان مقصد (که عموماً کد اسمبلی است) قرار بگیرد. نمایش میانی‌ای که به درستی این خاصیت را داشته باشد می‌تواند به پودمانی کامپایلر کمک کند. در چنین شرایطی کامپایلر به دو بخش کلی عقب و جلو تقسیم می‌شود که کارشان از یکدیگر مجزا است. به واسطهٔ این جدایی در کامپایلر می‌توان علاوه بر بهره بردن از طراحی ساده‌تر و قابل نگه‌داری‌تر، از یک کد چند بار استفاده کرد و به این صورت هزینهٔ توسعهٔ کامپایلرها را کاهش داد. بخش جلو، که وظیفهٔ ترجمهٔ دقیق حافظ معنا از زبان مبدأ به نمایش میانی را بر عهده دارد، تنها به زبان منبع وابسته است و کاملاً از بخش عقب که وظیفهٔ ترجمه دقیق از نمایش میانی به زبان مقصد را برعهده دارد و به زبان مقصد وابسته است جداست؛ بنابراین می‌تواند برای زبان‌های مبدأ و مقصد متفاوت به صورت مجزا بخش‌های عقب و جلو را طراحی کرد و در نهایت به یکدیگر متصلشان کرد. از آنجایی که زبان مقصد عموماً زبان ماشین است، عموماً بخش عقب به زبان ماشین وابسته است. معماری جریان داده
به صورت عادی کامپایلر ها(compilers) متن اصلی برنامه(source code)را آنالیز می‌کنند تا وابستگی‌های داده‌ای میان دستورها را برای ساماندهی بهتر ترتیب دستورها، در فایل باینری خروجی، بیابد. دستورها به صورت ترتیبی ساماندهی شده‌اند ولی اطلاعات مربوط به وابستگی در فایل‌های باینری ذخیره نمی‌شوند. فایل‌های باینری ای که برای ماشین‌های گردش داده‌ای ذخیره می‌شوند، حاوی این اطلاعات وابستگی هستند. کامپایلر برای نگهداری این اطلاعات به جای استفاده از متغیرها از از برچسب‌های یکتایی استفاده می‌کند. با استفاده از این روش برچسب گذاری به قطعه کد غیر مستقل اجازه داده می‌شود که در پردازش موازی "بدون ترتیب (out of order") اجرا شود. کامپایلر
در این دوره، زبان‌ها به تدریج به وجود آمدند و ماشین‌ها چندان متعارف نبودند. مسئله این بود که چگونه باید کدی را برای یک ماشین تولید کرد. با توجه به اینکه برنامه‌نویسی به زبان اسمبلی رواج داشت، این مسئله وخیمتر شد. استفاده از کامپایلر، برنامه‌نویسی خودکار نامیده شد. طرفداران زبان‌های سطح بالا می‌ترسیدند که کد تولید شده نسبت به زبان اسمبلی کارایی چندان نداشته باشد. اولین کامپایلر فرترن (شریدان ۱۹۵۹) به خوبی بهینه‌سازی شد. گسترش در خط
به‌طور کلی توسعه‌دهندگان کامپایلرها از الگوریتم جستجوی کاشف و روش‌های مکاشفه‌ای در طراحی کامپایلر استفاده می‌کنند تا تشخیص دهند که در چه جایی نیاز به گسترش در خط می‌باشد. کامپایلرهای ابسافت فرترن
برای استفاده در کد انتقال نوشته شده بر روی سیستم‌های UNIX یا VAX، کتابخانه‌های ذاتی Fortran مخصوص UNIX و VAX با علامت زدن کادری در پنجره گزینه‌های پروژه، کتابخانه‌ها/ابزارها در دسترس هستند. سایر برنامه های افزودنی مهم برای انتقال از سیستم عامل های دیگر، مانند اشاره گرهای Cray، در Absoft Pro Fortran به عنوان بخشی از کامپایلر گنجانده شده است. تاریخچه ساخت مترجم
اوّلین کامپایلر عملیاتی و کاربردی توسط (در سال ۱۹۵۱ به عنوان پایان‌نامه‌ی دکترا) نوشته شد. اولین مترجم پیاده‌سازی‌شده توسط گریس هاپر نوشته شد. او اولین کسی بود که واژه‌ی compiler را برای اولین بار برای اشاره به خود به کار برد. البته این سیستم در حقیقت به عنوان یک پیوند‌دهنده (linker) یا بارگذار (loader) کار می‌کرد و نه چیزی که ما امروزه به عنوان مترجم از آن یاد می‌کنیم. در سال ۱۹۵۱، آلیک گلنی () اولین کد خودکار () و مترجم امروزی را در دانشگاه منچستر و برای کامپیوتر توسعه داد. در سال ۱۹۵۷ گروه فورترن به سرپرستی جان بکوس در آی‌بی‌ام اولین مترجم تجاری را معرفی کردند. ساخت این مترجم ۱۸ نفر-سال نیرو برد. کامپایلر بهینه‌ساز
تکنیک های مورد استفاده در بهینه سازی می تواند در زمینه های مختلف به کار برود که می تواند هر چیزی را از یک جمله واحد به کل برنامه تحت تأثیر قرار دهد. به طور کلی ، تکنیکهای محلی مورد استفاده در مقایسه با روشهای جهانی آسانتر هستند اما منجر به دستاوردهای کوچکتر می شوند. برخی از نمونه های دامنه شامل موارد زیر است: کامپایلر تک‌گذره
کامپایلرهای چندگذره قطعی و مطمئن هستند ولی در مقابل زبان های برنامه نویسی زیادی به گونه‌ای طراحی شده‌اند که به وسیله کامپایلر های تک گذره کامپایل شوند و دارای ساختار‌های خاصی هستند تا اجازه کامپایل تک گذره را به آنها بدهند. کامپایلر بهینه‌ساز
از اطلاعات جمع آوری شده در حین اجرای آزمون می توان در بهینه سازی با راهنمای مشخصات استفاده کرد. اطلاعات جمع آوری شده در زمان اجرا ، در حالت ایده آل با حداقل هزینه سربار ، می تواند توسط یک کامپایلر JIT برای بهبود پویا بهینه سازی استفاده شود. کامپایلر بهینه‌ساز
تعداد ثبت های CPU : تا حدودی هرچه تعداد ثبت ها بیشتر باشد ، بهینه سازی کارایی آسان تر است. متغیرهای محلی را می توان در رجیسترها اختصاص داد و نه روی پشته . نتایج موقت / واسط می توانند بدون ثبت و خواندن از حافظه در ثبت ها باقی بمانند.در حین نوشتن برنامه ، یک برنامه نویس اغلب مجدداً کامپایل می شود و آزمایش می کند ، بنابراین تدوین باید سریع باشد. این یکی از دلایلی است که اکثر بهینه سازی ها در مرحله آزمایش / اشکال زدایی از عمد اجتناب می کنند. همچنین ، کد برنامه معمولاً با استفاده از یک اشکال زدایی سمبولیک "قدم به قدم" می گذارد (به انیمیشن برنامه مراجعه کنید) و بهینه سازی دگرگونی ها ، به ویژه آنهایی که کد را دوباره ترتیب می دهند ، می توانند ارتباط کد خروجی را با شماره خط در کد منبع اصلی دشوار کنند. این می تواند هر دو ابزار اشکال زدایی و برنامه نویسان را که از آنها استفاده می کنند اشتباه گرفته شود. اجرا (رایانش)
سیستمی که یک برنامه را اجرا می‌کند مفسر برنامه نامیده می‌شود. به بیان عام، یک مفسر در واقع آنچه را که برنامه می‌گوید انجام می‌دهد. این با یک مترجم زبان که برنامه ای را از یک زبان به زبان دیگر تبدیل می‌کند در تضاد است. متداول‌ترین مترجمان زبان کامپایلرها هستند. مترجم‌ها به‌طور معمول منبع خود را از یک زبان سطح بالای انسانی به یک زبان سطح پایین (گاهی اوقات به اندازه کد ماشین بومی پایین) تبدیل می‌کنند که برای اجرای مستقیم پردازنده مرکزی ساده‌تر و سریع تر است. ایده این است که نسبت اجراها به ترجمه‌های یک برنامه بزرگ باشد. یعنی یک برنامه فقط باید یک بار کامپایل شود و می‌تواند هر تعداد بار اجرا شود. این می‌تواند فواید زیادی را برای ترجمه در مقابل تفسیر مستقیم از زبان مبدأ فراهم کند. نکته مهم این است که به دلیل کامپایل، زمان توسعه افزایش می‌یابد. در بعضی موارد، فقط فایل‌های تغییر یافته باید مجدداً کامپایل شوند. سپس فایل اجرایی باید مجدداً پیوند زده شود. برای برخی از تغییرات، فایل اجرایی باید دوباره از فایل مخدوش ساخته شود. با سریعتر شدن رایانه‌ها و کامپایلرها، این واقعیت کمتر مشکل ایجاد می‌کند. همچنین سرعت محصول نهایی به‌طور معمول برای کاربر مهمتر از زمان توسعه است. مترجم‌ها معمولاً یک نتیجه انتزاعی تولید می‌کنند که کاملاً آماده اجرا نیست. بیشتر اوقات، سیستم عامل درست قبل از شروع اجرای برنامه، کد هدف مترجم را به فرم اجرایی نهایی تبدیل می‌کند. بوت‌استرپینگ (کامپایلر)
روش توزیع کامپایلرها در کد منبع شامل ارائه نسخه پرتابلی از بایت‌کد آن کامپایلر است، به طوری که بوت‌استرپ به فرایند کامپایل کردن کامپایلر با خودش تبدیل می‌شود. نمودار T یک نمادگذاری است که برای اغلب این تکنیک‌های بوت‌استرپ کامپایلر استفاده می‌شود. در برخی موارد آسان‌ترین راه برای واداشتن یک کامپایلر پیچیده به اجرای سیستمی که نرم‌افزاری روی آن وجود ندارد یا اندک است، شامل یک سری از اسمبلرها و کامپایلرهای پیچیده‌تر است. کامپایلر
ترجمه کامل کد منبع برنامه‌ای از یک زبان سطح بالا به کد شیء، پیش از اجرای برنامه را هم‌گردانی یا کامپایل می‌گویند. تاریخچه ساخت مترجم
هنگامی که به یک کامپایلر یک برنامه‌ای داده می‌شود که از نظر نحوی نادرست است، نمایش یک پیغام خطای کوتاه و واضح بسیار مفید است. البته از دیدگاه طراح کامپایلر، رسیدن به آن دشوار است. کامپایلر فرترن WATFIV در اواخر دهه ۱۹۶۰ در دانشگاه واترلو کانادا توسعه داده شد. این کامپایلر برای ارائه پیغام خطای بهتر نسبت به کامپایلر فرترن IBM آن زمان، طراحی شده بود. علاوه بر این WATFIV بسیار کاربردی‌تر بود، به این دلیل که مراحل کامپایل، اجرا را در یک مرحله ترکیب کرده بود، در حالی که کامپایلر IBM برای اجرای این مراحل را در ۳ بخش جداگانه داشت! کاهش قدرت
کامپایلر از روش هایی برای شناسایی حلقه ها و تشخیص ویژگی های مقادیر در آن حلقه ها استفاده می کند. برای کاهش قدرت ،به داده های زیر نیازمند است : کلنگ (کامپایلر)
Clang اطلاعات بیشتری را در طول فرآیند کامپایل نسبت به GCC حفظ می‌کند و شکل کلی کد اصلی را حفظ می‌کند و نگاشت خطاها را به منبع اصلی آسان‌تر می‌کند. گزارش های خطای Clang دقیق تر، خاص تر و قابل خواندن توسط ماشین هستند، بنابراین IDE ها می توانند خروجی کامپایلر را فهرست کنند. طراحی ماژولار کامپایلر می‌تواند نمایه‌سازی کد منبع، بررسی نحو، و سایر ویژگی‌هایی را که معمولاً با سیستم‌های توسعه سریع برنامه مرتبط هستند ارائه دهد. درخت تجزیه همچنین برای پشتیبانی از بازآفرینی خودکار کد مناسب‌تر است، زیرا مستقیماً کد منبع اصلی را نشان می‌دهد. مترجم مبدأ به مبدأ
کامپایلر مبدا به مبدا یا مترجم مبدا به مبدا، مترجمی است که کد یک برنامه را به عنوان ورودی می‌گیرد و کد همان برنامه را به یک زبان برنامه‌نویسی دیگر به عنوان خروجی به ما برمی‌گرداند. تفاوت مترجم‌های مبدا به مبدا با مترجم‌های سنتی در این است که مترجم‌های مبدا به مبدا عملیات ترجمه را بین دو زبان برنامه‌نویسی هم‌سطح انجام می‌دهند، اما مترجم‌های سنتی یک زبان سطح بالا را به یک زبان سطح پایین تبدیل می‌کنند. برای مثال، یک مترجم مبدا به مبدا برنامه‌ای را از زبان پاسکال به سی تبدیل می‌کند. یک کامپایلر موازی‌ساز خودکار به صورت مداوم یک برنامۀ سطح بالا را به عنوان ورودی می‌گیرد و در کنار تبدیل کد، آن را با یادداشت‌های کد موازی (مثل OpenMP) یا ساختارهای زبان (مثل دستور forall در فورترن) حاشیه‌نویسی می‌کند. کامپایل جلوتر از زمان
با این کامپایلر مرورگر کد قابل اجرا را بلافاصله بارگذاری می‌کند بدون این که لازم باشد به کامپایل برنامه نیاز داشته باشد. درخواست‌های ناهم‌زمان را کمتر می‌کند و اگر برنامه از قبل کامپایل شده باشد نیازی به دانلود کامپایلر angular وجود ندارد. خطاهای الگو زودتر تشخیص و گزارش داده می‌شوند و امکان حمله به برنامه کمتر می‌شود. کامپایلر تک‌گذره
[https://web.archive.org/web/20171215173605/http://www.uobabylon.edu.iq/eprints/publication_10_17790_344.pdf [2]]What is the difference between a single pass and multipass compiler? موازی‌سازی خودکار
یک کامپایلر با موازی سازی حلقوی چند ریسمانی سعی می‌کند یک حلقه را تقسیم کند تا هر تکرار بتواند همزمان بر روی یک پردازنده جداگانه اجرا شود. کامپایلر
یک کامپایلر خود برنامه‌ای است که توسط زبان پیاده‌ساز تولید شده‌است. اولین کامپایلر خود محور که می‌توانست کد خود را کامپایل کند برای زبان Lisp و توسط Hart و Levin در سال ۱۹۶۲ و در مؤسسه فناوری ماساچوست ایجاد شد. در دهه ۷۰ از زبان‌های سطح بالایی مثل پاسکال و سی جهت نوشتن کامپایلرها استفاده شد. ساخت کامپایلرهای خود محور دارای مشکل راه‌اندازی است، چونکه هر کامپایلری باید توسط کامپایلر نوشته شده‌ای به زبان دیگر کامپایل شود یا برای این مشکل دست به دامن مفسری بشود. تاریخچه ساخت مترجم
نرم‌افزارهایی که برای کامپیوترهای اولیه نوشته می‌شد عموما به زبان اسمبلی بودند. از دید یک برنامه‌نویس بهتر است که برای توسعه‌ی نرم‌افزار از یک زبان برنامه‌نویسی سطح بالا استفاده کند، و برنامه‌هایی که به زبان برنامه‌نویسی سطح بالا نوشته شده‌اند قابلیت استفاده‌ی مجدد روی کامپیوترهای مختلف را دارند. با این حال، مدتی طول کشید تا کامپایلرها به صورت گسترده مورد استفاده قرار گیرند؛ زیرا کدهای تولیدی توسط کامپایلرها به کارآمدی کدهای دست‌نویس در اسمبلی نبود؛ کامپایلرها گسترش پروژه‌ها را محدود به رعایت قوانین خود می‌کردند و هم‌چنین حافظهٔ محدود کامپیوترهای قدیمی باعث ایجاد مشکلات تکنیکی بسیاری در طراحی مترجم‌ها می‌شد. بهینه‌سازی کامپایلر
بهینه‌سازی از مهم‌ترین وظایف یک کامپایلر است که معمول بعد از تولید کد میانی آغاز می شود. همیشه هنگام کامپایل یک برنامه برای پخش نهایی از بهینه‌سازی استفاده می شود. هرچند گاهی اوقات بهینه‌سازی مانع اصلی بعضی اهداف است و باید کنار گذاشته کردن یک کد بهینه شده دشوارتر و شاید غیرممکن شود چرا که debug شود. به عنوان مثال به منظور بهینه‌سازی بسیاری از کدها حین کامپایل ممکن است جابجا شده باشند یا اصل option ساختار آن‌ها عوض شده باشد. به همین دلیل بسیاری از کامپایلرها اجازه نمی‌دهند کامپایل کردن و بهینه‌سازی هم‌زمان فعال شوند. همچنین گاهی کد کامپایل debugهای مربوط به یکسان ولی خصوصیات (instruction) شده قرار است روی پردازنده‌هایی با دستورالعملهای مختلف از حیث زمان‌بندی، سرعت دسترسی به حافظه و … اجرا شود که در این صورت کامپایلر نباید بهینه‌سازی‌های خاص یک ماشین را روی آن اعمال کند. تکنیک‌های مختلف بهینه‌سازی می‌توانند وابسته به زبان منبع، وابسته به ماشین مقصد یا مستقل از هر دو باشند. اغلب روش‌های بهینه‌سازی مستقل از زبان منبع می‌باشند. همچنین برای بسیاری از الگوریتم‌های بهینه‌سازی وابسته به مقصد، می‌توان خصوصیات ماشین مقصد را با یکسری پارامتر معرفی کرد و خود الگوریتم برای مقصدهای مختلف دست نخورده بماند. اهداف کلی یک کیمپایلر هنگام بهینه‌سازی به صورت خلسه در زیر آمده‌است که کامپایلر بر اساس نوع بهینه‌سازی مورد نظرش، به آن‌ها اولویت می‌دهد: جا می‌گیرد وپردازنده برای cache کم کردن حجم کد: هرچه حجم کد کمتر باشد راحتتر در دسترسی به آن نیاز به تعداد کمتری مراجعه به حافظه دارد. کم کرد ن محاسبات: تغییر کد به گونه‌ای که محاسبات کمتری داشته باشد وقت پردازنده را کمتر می‌گیرد. پرهیز از پرش‌های شرطی و غیر شرطی: پردازنده‌ها در برخورد باانشعاب‌ها و پرش‌ها نمی استفاده کنند و در نتیجه زمان بیشتری در این‌گونه مواقع تلف می‌شود. pipelining توانند از کامپایلر باید کد را به گونه‌ای تغییر دهد که حتی المکان تعداد کمتری انشعاب و پرش داشته باشد. نزدیک کردن ارجاعات مشابه: بخش‌هایی از کد که یک داده خاص را از حافظه می‌خوانند بهتر است کنار هم باشند تا دسترسی به داده سریعتر برای آن‌ها انجام گیرد و کامپیوتر مجبور به مراجعه مکرر به حافظه نباشد. ترتیب دهی مناسب داده‌ها در حافظه: ثباتها باید حاوی داده‌های پراستفاده تر باشند. موازی سازی: ترتیب دستورها در حافظه باید به گونه‌ای باشد که به پردازنده حداکثرامکان پردازش موازی دستورها را بدهد. زبان کامپایل‌شونده
در علوم رایانه یک زبان ترجمه شده زبانی است که برای پیاده‌سازی آن نیاز به یک کمپایلر است و با استفاده از یک مفسر نمی‌توان آن را پیاده کرد. کامپایل پویا
کامپایل افزایشی یک شیوه مرتبط با کامپایل پویا است. به عنوان مثال کامپایلر افزایشی در POP-2 ،POP-11 ،Forth و برخی از نسخه‌های زبان لیسپ استفاده شده‌است. Maclisp و حداقل یک نسخه از زبان برنامه‌نویسی ML از کامپایل افزایشی استفاده کرده‌اند. این امر به کامپایلری نیاز دارد که زبان برنامه‌نویسی بخشی از سیستم زمان اجرا باشد. در نتیجه، کد منبع می‌تواند در هر زمان از ترمینال، از یک فایل، یا احتمالاً از یک داده ساختار ساخته شده توسط برنامه در حال اجرا، خوانده شود و به یک بلوک کد یا تابع تبدیل شود (ممکن است با تابع قبلی مشابه، به همین نام جایگزین شود)؛ که پس از آن بلافاصله برای استفاده توسط برنامه در دسترس خواهد بود. به دلیل نیاز به سرعت کامپایل در محیط‌های تعاملی، کد کامپایل شده به احتمال زیاد به اندازه کد تولید شده توسط یک «کامپایلر دسته ای» استاندارد که کد منبع راه خوانده و فایلهای شیء را تولید می‌کند، بهینه نشده‌است. با این حال، یک برنامه کامپایل شده افزایشی معمولاً بسیار سریعتر از نسخه تفسیر شده از همان برنامه اجرا می‌شود؛ بنابراین، کامپایل پویا تلفیقی از فواید زبانهای تفسیر شده و کامپایل شده را ارائه می‌دهد. برای اینکه کامپایلر افزایشی مستقل از سکو باشد، به‌طور کلی مطلوب است که کامپایلر افزایشی شامل دو مرحله باشد؛ به این صورت که ابتدا کد را به برخی زبان‌های مستقل از سکو تبدیل کند و سپس آن را به کد مقصد تبدیل کند. در این صورت فقط نیاز به تغییر کامپایلر، بخش دوم کامپایلر است. برخلاف کامپایل پویا، کامپایل افزایشی پس از اجرای قسمت اولین برنامه، در قسمت دوم، امکان بهینه‌سازی‌های بیشتری را فراهم نمی‌کند. جدول نمادها
جدول نماد، ساختمان داده مهمی است که به وسیله کامپایلرها برای ذخیره‌سازی اطلاعاتی در مورد رخداد گزاره‌های مختلف مانند نام متغیرها، نام تابع‌ها، اشیا، کلاس‌ها، رابط‌ها و مواردی از این دست استفاده می‌شود. جدول نماد هم از سوی بخش‌های تجزیه‌ای و هم توسط بخش‌های ترکیبی کامپایلر مورد استفاده قرار می‌گیرد. کامپایلر افزایشی
کامپایلر افزایشی نوعی محاسبات افزایشی در کامپایلرهاست. واضح است، کامپایلرهای معمولی بعد از هر تغییر، دوباره همه ماژول‌های برنامه را می‌سازند درحالی که کامپایلر افزایشی فقط آن بخش از برنامه را که تغییر کرده‌است را دوباره کامپایل می‌کند. کامپایلر افزایشی
قابلیت اضافه کردن، برداشتن و حذف کد هنگام اجرا به عنوان اتصال گرم شناخته می‌شود. برخی ازپلت فرم‌های برنامه‌نویسی‌های تعاملی از ترکیب کد تفسیر شده و کد کامپایل شده استفاده می‌کنند تا به این فرض که هرگونه تغییر در کد بلافاصله توسط برنامه قابل دسترسی است، برسند. زبان توصیف کامپایلر
زبان توصیف کامپایلر یک زبان برنامه‌نویسی است که برای توسعهٔ کامپایلرها و بر پایهٔ دستور زبان‌های ضمیمه بنا شده‌است. کامپایلرهای ++ IBM XL C/C
یک بهینه‌ساز معمولی سطح بالا در بین کامپایلرهای POWER و ++z/OS XL C/C، برنامه منبع را با استفاده از بهینه‌سازی‌های مبتنی بر پلتفرم مانند تجزیه و تحلیل بین رویه‌ای، بازخورد هدایت‌شده پروفایل، و بهینه‌سازی حلقه و برداری بهینه می‌کند. کلنگ (کامپایلر)
کلنگ ، به عنوان فرانت اند کامپایلر برای C ، C ++ ، زبان Objective-C و هدف- C ++ زبان های برنامه نویسی ، و همچنین به عنوان کتابخانه ، از OpenCL ، از RenderScript ، CUDA ، و HIP چارچوب ها استفاده میشود. کلنگ به عنوان جایگزینی برای مجموعه کامپایلر گنو (GCC) عمل می کند و از اکثر پرچم های کامپایل و پسوندهای زبان غیر رسمی پشتیبانی می کند. کلنگ شامل یک تحلیلگر استاتیک و چندین ابزار تجزیه و تحلیل کد است. زبان برنامه‌نویسی
خروجی یک کامپایلر ممکن است با سخت‌افزار یا برنامه‌ای به نام مفسر اجرا شود. در برخی پیاده‌سازی‌ها که از مفسر استفاده می‌شود، مرز مشخصی بین کامپایل و تفسیر وجود ندارد. برای مثال، برخی پیاده‌سازی‌های زبان برنامه‌نویسی بیسیک کامپایل می‌کنند و سپس کد را خط به خط اجرا می‌کنند. تاریخچه ساخت مترجم
یک سازنده تجزیه گر بخش تحلیل گر لغوی یک کامپایلر را ایجاد می‌سازد. یک برنامه که با دریافت توضیحات گرامر یک زبان برنامه‌نویسی خاص تجزیه گر آن زبان را ایجاد می‌کند. این تجزیه گر می‌تواند در کامپایلر آن زبان خاص مورد استفاده قرار بگیرد. تجزیه گر، نمادها و کلید واژه‌های آن زبان خاص را در متن ورودی شناسایی کرده و این نشانه‌ها را به کدی که وظیفه تعیین ازرش نحوی و ترجمه به آبجکت کد را برعده دارد برمی‌گرداند. این بخش دوم کامپایلر می‌تواند با کامپایلر-کامپایلر ایجاد شود که قوانین اولیت شرح نحو رسم زبان را به عنوان ورودی می‌گیرد. اولین کامپایلر-کامپایلر برای استفاده به این نام توسط تونی بروکر در سال ۱۹۶۰ نوشته شد و برای ساخت کامپایلرهای برای کامپیوتر اطلس در دانشگاه منچستر مورد استفاده قرار گرفت، همانند کامپایلر اوتوکد اطلس. هر چند با کامپایلر-کامپایلرهای مدرن بسیار متفاوت بود، و کامپایلر-کامپایلر امروزه تعریفی مابین کامپایلر عمومی با قابلیت شخصی‌سازی بالا و یک زبان با قابلیت توصعه‌پذیری نحو آن می‌تواند داشته باشد. نام کامپایلر-کامپایلر برای سیستم بروکر به متراتب مناسب تر است تا کامپایلر-کامپایلرهای مدرن، که به صراحت با نام سازنده تجزیه گر نامیده می‌شوند. به اطمینان می‌توان گفت که نام کامپایلر-کامپایلر پس از یاک به صورت عمومی مورد استفاده گرفت هرچند کار بروکر همچنان حائز اهمیت است. در اوایل ۱۹۶۰ رابرت مک کلور در ابزارآلات تگزاش کامپایلر-کامپایلری طراحی کرد که TMG نام گرفت که از کلمه “transmogrification” (به معنی تناسخ) گرفته شده‌است. در سالهای بعد TMG به مینفریم‌های برخی از کامپیوترهای UNIVAC و IBM پورت شد. نمونه دیگری از سازنده‌های تجزیه گر متا دو است که اولین بار در سال ۱۹۶۲ توسط وال شوور منتشر شد. متا دو گرامر و قاعد تولید کد را قبول می‌کرد و می‌توانست زبان خود و دیگر زبان‌ها را کامپایل کند. متادو دو اولین نسخه مستند شده متاکامپایلر بود. همچنین متادو به یکی از اولین نمونه‌های ماشین مجازی ترجمه شد. پروژه مالتیکس ریسک همکاری میان MIT و آزمایشگاه‌های بل، یکی از اولین‌ها برای گسترس یک سیستم عامل با استفاده از یک زبان سطح بالا بود، زبان انتخاب شده پی‌ال/۱ بود، اما یک کارپرداز خارجی نمی‌تواند کامپایلری برای کار تهیه کند. گروه مالتیکس پیاده‌سازی شخصی خود را از زبان PL/1 گشترش دادند که با نام EPL شناخته می‌شود. TMG روی سری GE-600 پورت شده بود و برای گسترش EPL توسط داگلاس مکلروی، رابرت موریس و دیگران مورد استفاده قرار گرفت. چندی بعد کن تامسون اولین نسخه یونیکس را برای PDP-7 در ۱۹۶۹ نوشت، داگ مکلروی اولین زبان سطح بالای سیستم جدید را ایجاد کرد: پیاده‌سازی مکلروی از TMG. TMG همچنین ابزار تعریف کامپایلری است که تامسون جهت پیاده‌سازی کامپایلر برای زبان بی برای PDP-7 در ۱۹۷۰ مورد استفاده قرار داد. بی اولین جد زبان سی می‌باشد. نخستین سازنده تجزیه گر LALR که توسط فرانک درمر و تام پندلو ساخته شد TWS نام داشت. رزلین(کامپایلر)
رزلین (به انگلیسی: Roslyn) مجموعه‌ای از کامپایلرهای متن‌باز و رابط‌های برنامه‌نویسی کاربردی یا ای‌پی‌آی (به انگلیسی: Application Programming Interface به اختصار API) برای تحلیل برنامه‌هایی به زبان #C و Visual Basic .NET است و توسط مایکروسافت ارائه شده‌است. کامپایلر بهینه‌ساز
معمولاً پس از تولید کد دستگاه ، دیر هنگام در مراحل تلفیقی انجام می شود. این شکل از بهینه سازی چند دستورالعمل مجاور را بررسی می کند (مانند "نگاه کردن از طریق یک گیره" در کد) تا ببیند آیا می توان آنها را با یک دستورالعمل واحد یا یک دستورالعمل کوتاه تر جایگزین کرد. به عنوان مثال ، ضرب یک مقدار توسط   2 ممکن است با تغییر دادن مقدار چپ یا اضافه کردن مقدار به خود ، کارایی بیشتری داشته باشد (این مثال نیز نمونه ای از کاهش قدرت است ). یک (کامپایلر)
بسته به اینکه از بایسون استفاده می‌کنید یا یَک، از کد پایین برای کامپایل برنامه استفاده می‌شود: کامپایلر-کامپایلر
اینجا با فراخوانی parser می‌توانیم عبارت ورودی را تجزیه کنیم. کامپایلر بهینه‌ساز
اینها همه کد منبع برنامه را تجزیه و تحلیل می کند. مقدار بیشتری از اطلاعات استخراج شده بدان معنی است که بهینه سازی ها می توانند در مقایسه با زمانی که فقط به اطلاعات محلی دسترسی داشته باشند (به عنوان مثال ، در یک عملکرد واحد) موثرتر باشند. این نوع بهینه سازی همچنین می تواند تکنیک های جدیدی را انجام دهد. برای عملکرد به عنوان مثال inlining ، که در آن یک تماس به تابع توسط یک کپی از بدن تابع جایگزین شده است. ماکرو (علوم رایانه)
ماکروها معمولاً برای نگاشت یک رشته کوتاه (فراخوانی ماکرو) به یک توالی طولانی‌تر از دستورالعمل‌ها مورد استفاده قرار می‌گیرند. یکی دیگر که کم‌تر متداول است، استفاده از ماکروها این است که معکوس شود: نگاشت یک توالی دستورالعمل‌ها به یک رشته ماکرو. این رویکرد توسط سیستم برنامه‌نویسی موبایل STAGE۲ اتخاذ شد، که از یک کامپایلر ماکروی ابتدایی (به نام SIMCMP)استفاده می‌کرد تا یک مجموعه دستورالعمل خاص از یک کامپیوتر داده‌شده به counterpart macros را نگاشت کند. برنامه‌های کاربردی (به‌طور خاص کامپایلرها) که در این ماکروها مستقل از دستگاه نوشته شده‌است، بدون تغییر در هر کامپیوتری که مجهز به کامپایلر ماکروی اولیه است اجرا می‌شود. اولین برنامه کاربردی که در چنین زمینه ای اجرا می‌شود، یک کامپایلر ماکرو پیچیده‌تر و قدرتمند است که در زبان ماکروی مستقل از دستگاه نوشته شده‌است. این کامپایلر ماکرو برای خودش، به روش بوت استرپ، برای تولید یک نسخه ترجمه‌شده و بسیار کارآمدتر از خودش استفاده می‌شود. مزیت این رویکرد این است که برنامه‌های پیچیده را می‌توان از یک کامپیوتر به یک کامپیوتر بسیار متفاوت با تلاش بسیار کمی (برای هر معماری ماشین هدف، فقط نوشتن یک compiler ابتدایی)منتقل کرد. ظهور زبان‌های برنامه‌نویسی مدرن، به خصوص C، که کامپایلرها در تمام رایانه‌ها در دسترس هستند، این رویکرد را بی‌فایده کرده‌است. با این وجود، این یکی از اولین نمونه از بوت استرپینگ کامپایلر بود. ترجمه دوگانه
ترجمه دوگانه، همگردان دوگانه، مترجم تقابلی، ‌کامپایلر متقابل یا کراس کامپایلر کامپایلری است که قادر به ایجاد کد اجرایی برای سیستم عامل دیگری غیر از آنچه در آن اجرا می شود، است. به عنوان مثال کامپایلری که روی رایانه شخصی ویندوز اجرا می شود اما کدی را تولید می کند که روی تلفن هوشمند اندروید اجرا می شود، یک کامپایلر متقابل است. هدف‌گیری مجدد
یک کامپایلر قابل تنظیم مجدد، کامپایلری است که به گونه ای طراحی شده تا بتواند به راحتی تغییر کند و کدها را برای معماری‌های مجموعه دستورالعمل‌های پردازنده مختلف تولید کند. جاوا
کارایی جاوا نسبت به نسخه‌های اولیه بیشتر شد. در تعدادی از تست‌ها نشان داده شد که کارایی کامپایلرJIT کاملاً مشابه کامپایلر محلی شد. عملکرد کامپایلرها لزوماً کارایی کدهای کامپایل شده را نشان نمی‌دهند. یکی از پیشرفت‌های بی‌نظیر در در زمان اجرای ماشین این بود که خطاها ماشین را دچار اشکال نمی‌کردند. علاوه بر این در زمان اجرای ماشینی مانند جاوا وسایلی وجود دارد که به زمان اجرای ماشین متصل شده و هر زمانی که یک استثناء رخ می‌دهد، اطلاعات اشکال زدایی که در حافظه وجود دارد، ثبت می‌کنند. هدف‌گیری مجدد
برخی از کامپایلرهای تنظیم مجدد، به عنوان مثال GCC، به قدری پورت شده و توسعه یافته که امروزه می‌تواند بسیاری از بهینه سازیها و جزئیات خاص ماشین را ساپورت کند. به‌طوری که حتی کیفیت کد تولید شده از آن از کیفیت کد کامپایلرهای غیرقابل بازگردانی نیز بیشتر می‌شود. دستکاری نام
با وجود این که دستکاری نام معمولاً در زبان‌هایی که از اضافه بار توابع پشتیبانی نمی‌کنند (مانند C و classic Pascal) نیاز نمی‌شود، از آن‌ها در برخی کاربردها برای ارائهٔ اطلاعات بیشتر در مورد توابع استفاده می‌شود. به عنوان مثال کامپایلرهایی که هدفشان اجرا شدن برنامه در پلتفرم‌های مایکروسافت ویندوز است، از قراردادهای فراخوانی مختلفی پشتیبانی می‌کنند که شیوهٔ ارسال پارامترها به زیرروال‌ها و دریافت نتایج برگردانده شده را مشخص می‌کنند. از آنجا که این قراردادهای فراخوانی با هم سازگاری ندارند، کامپایلرها از دستکاری استفاده می‌کنند تا بفهمند برای صدا کردن یک زیرروال از کدام قرارداد باید استفاده شود. کامپایلر تابعی
یک کامپایلر تابعی، کامپایلری برای یک زبان برنامه نویسی تابعی است. کامپایلر تابعی تغییری در کد منبع ایجاد می‌کند که آن را به سبک مابعد گذرنده یا فرم نرمال اجرایی تبدیل می‌کند و لازم است فراخوانی های دم را به درستی بکار بگیرد. کامپایلر سی پلاس پلاس اینتل
کامپایلرها کدهای بهینه شده برای معماری آی‌ای-۳۲ و اینتل ۶۴ و کدهای غیربهینه شده برای پردازنده‌های غیر اینتل اما سازگار مانند پردازنده‌های خاص ای‌ام‌دی تولید می‌کنند. نسخه ویژه ای از کامپایلر (۱۱٫۱) برای توسعه برنامه‌های مبتنی بر Linux برای پردازنده‌های (ایتانیوم IA-64 (۲ در دسترس است. رزلین(کامپایلر)
این پروژه به‌طور خاص شامل نسخه‌های کامپایلرهای #C و VB.NET است. کامپایلرها از طریق برنامه‌های خط فرمان (به انگلیسی: command-line) در دسترس هستند اما همچنین به عنوان APIهایی به زبان .NET هم در دسترس هستند. Roslyn ماژول‌هایی را برای تجزیه و تحلیل نحوی (واژگانی)، تحلیل معنایی، تدوین پویا به زبان میانی مشترک (به انگلیسی: Common Intermediate Language، به اختصار CIL) و انتشار کد در معرض دید قرار می‌دهد. ترکیب کننده تجزیه‌گر
پارسرهای ساخته شده با استفاده از ترکیب کننده‌ها، خوانا، ماژولار و ساختار یافته و همچنین ساده در مراحل ساخت و نگهداری هستند. از کاربردهای گسترده آن نمونه سازی کامپایلرها و پردازنده‌ها برای زبان‌های خاص دامنه (به انگلیسی: DSL) مانند واسط‌های زبان طبیعی به پایگاه‌داده‌ها، که در آن اقدامات معنایی پیچیده و متنوعی به همراه پردازش نحوی انجام می‌شوند، می‌باشد. در سال ۱۹۸۹، ریچارد فراست و جان لانچبروری نشان دادند که از ترکیب کننده‌های تجزیه گر می‌توان برای ساختن مفسرهای زبان طبیعی استفاده‌کرد. همچنین گراهام هاتن در سال ۱۹۹۲ از توابع مرتبه بالا در تجزیه کننده‌های پایه استفاده کرد. به علاوه S.D. Swierstra جنبه‌های عملی ترکیب کنندهٔ تجزیه گر را در سال ۲۰۰۱ به نمایش گذاشت. در سال ۲۰۰۸، فراست، هافیز و کالاهان مجموعه ای از ترکیب کننده‌های تجزیه گر را در زبان هسکل که مشکل دیرینه تطابق بازگشت چپ را حل می‌کرد، و به عنوان یک ابزار کامل تجزیه کننده از بالا به پایین در زمان و فضای چند جمله ای کار می‌کرد را تعریف کردند. دی‌کامپایلر
دیکامپایلرها در پروسه تبدیل یک فایل اجرایی به سورس کد فاز های مختلفی را طی میکنند که در ادامه فازهای مختلف آن را بررسی میکنیم. کامپایلر سی پلاس پلاس اینتل
بهینه‌سازی میان فرآیندی، کامپایلرهای معمولی را بهنه سازی می‌کند اما با استفاده از دامنه گسترده‌تر که ممکن است شامل چندین روش، چندین پرونده یا کل برنامه باشد. کامپایلر بهینه‌ساز
بسیاری از گزینه هایی که در مورد آنها بهینه سازی ها می توانند و باید انجام شوند به ویژگی های دستگاه هدف بستگی دارد. پارامتر کردن بعضی از این عوامل وابسته به ماشین گاهی اوقات امکان پذیر است ، به گونه ای که می توان تنها با تغییر پارامترهای توصیف دستگاه ، از یک قطعه کد کامپایلر برای بهینه سازی ماشینهای مختلف استفاده کرد. GCC کامپایلری است که نمونه این رویکرد را نشان می دهد. کامپایلر تک‌گذره
کامپایلر تک گذره به دلیل حوزه محدود اطلاعاتی که در اختیار دارد توانایی تولید کردن برنامه های کارا به مانند کامپایلر چندگذره را ندارد. بسیاری از بهینه‌سازی های کامپایلر نیازمند عبور چندباره از روی بلوک پایه،حلقه(به ویژه حلقه های تودرتو)،زیرروال و کل ماژول هستند حتی بعضی از این بهینه‌سازی ها نیازمند گذر از کل برنامه هستند. بعضی از زبان‌های برنامه نویسی به دلیل طراحی خاصشان امکان کامپایل شدن در یک گذر را ندارند. برای مثال PL/I امکان تعریف داده را در هرجای کد به برنامه نویس می‌دهد. بطور مشخص تر،می‌توان قبل از تعریف یک داده چند ارجاع به نام آن داد و سپس خود داده را تعریف کرد که به این سبب هیچ کد ماشینی تا قبل از پایان کامل اسکن نمی‌تواند تولید شود. همچنین تعریف زبان دارای عبارات پیش پردازشی است که به سورس کد توان کامپایل شدن می دهند. کامپایلر بهینه‌ساز
کارهای پیچیده یا دشوار یا گران قیمت را با کارهای ساده تر جایگزین کنید. به عنوان مثال ، جایگزینی تقسیم بر یک ثابت با ضرب با معکوس آن ، یا استفاده از تجزیه و تحلیل متغیر القایی برای جایگزینی ضرب با یک شاخص حلقه با جمع. برکلی یاک
یاک و لکس به صورت گسترده برای نوشتن کامپایلرها مورد استفاده قرار می‌گیرند. کامپایلر-کامپایلر
این ابزار یک تجریه‌کننده بر مبنای الگوریتم LL می‌سازد. این ابزار متن باز می‌باشد و می‌تواند به زبان‌های مختلفی از جمله پایتون و جاوا خروجی را ارائه دهد. گنو بایسون بخشی از پروژه گنو است و با خواندن مشخصات یک زبان مستقل از متن برای آن زبان تجزیه‌کننده می‌سازد. به‌طور پیش فرض، بایسون از LALR استفاده می‌کند اما از GLR هم پشتیبانی می‌کند. وجه تمایز این ابزار استفاده از فرم باکوس نائور گسترش یافته برای توصیف زبان است. اسکنری که Coco/R می‌سازد، مانند یک ماشین تعیین‌پذیر حالات متناهی عمل می‌کند و از قابلیت تشخیص پراگما پشتیبانی می‌کند. پراگما توکن‌هایی هستند که بخشی از نحو نیستند اما در هر جایی از ورودی می‌توانند ظاهر شوند، و دستورهایی مختص کامپایلر هستند. بخشی از پروژه اس‌کیوال لایت می‌باشد. تجزیه‌کننده‌ای که Lemon می‌سازد تجزیه‌کننده ال‌ای‌ال‌آر می‌باشد و خروجی هم به زبان C است. یک (کامپایلر) این ابزار توسط S.C.Johnson در آزمایشگاه‌های بل توسعه یافته‌است. عموماً به همراه لکس استفاده می‌شود. XPL یک زبان برنامه‌نویسی بر مبنای PL/I می‌باشد به همراه کامپایلری به همین زبان و یک کامپایلر-کامپایلر که به کمک آن بتوان کامپایلرهای مشابهی برای سایر زبان‌ها پیاده‌سازی کرد. XPL جزو اولین کامپایلر-کامپایلرها هست که در ۱۹۶۷ با اهداف آموزشی توسعه یافت. شناسه (زبان‌های کامپیوتری)
برای پیاده‌سازی زبان‌های برنامه‌نویسی که از کامپایلر استفاده می‌کنند، شناسه‌ها اغلب فقط موجودیت‌های زمان کامپایل هستند. این به این معنی است که در زمان اجرا، برنامه کامپایل شده به جای توکن‌های شناسه متنی، ارجاعاتی به آدرس‌ها و آفست‌های حافظه دارد (این آدرس‌های حافظه یا آفست‌ها توسط کامپایلر به هر شناسه اختصاص داده شده‌اند). کامپایلر سی پلاس پلاس اینتل
کامپایلرهای اینتل از کیلک پلاس پشتیبانی می‌کنند (که در نسخه ۱۹٫۱ حذف شده‌است)، این یک توانایی برای نوشتن کدهای برداری و موازی است که می‌تواند در پردازنده‌های IA-32 و Intel 64 استفاده شود یا می‌تواند در پردازنده‌های زئون فای بارگیری شود. آن‌ها همچنین پشتیبانی از اپن ام‌پی ۴، چند پردازی متقارن، موازی سازی خودکار و پارالایزاسیون خودکار هدایت شده (GAP) را ادامه می‌دهند. با قابلیت افزودنی کلاستر اوپن‌ام‌پی، کامپایلرها همچنین می‌توانند به‌طور خودکار تماس‌های رابط انتقال پیام برای چندپردازشی حافظه توزیع شده از بخشنامه‌های اوپن‌ام‌پی را ایجاد کنند. کامپایل شرطی
در برنامه نویسی کامپیوتر، کامپایل شرطی روش های اجرای کامپایل است که به کامپایلر اجازه می دهد تفاوت هایی را در برنامه اجرایی تولید و توسط پارامترهای ارایه شده در هنگام کامپایل کنترل کند. این تکنیک معمولاً زمانی مورد استفاده قرار می گیرد که این تفاوت ها لازم باشد نرم‌افزار را بر روی سیستم عامل های مختلف یا نسخه های متفاوت کتابخانه ای و یا سخت افزار اجرا کند. کامپایلرهای ابسافت فرترن
همه کامپایلرهای Absoft را می توان از خط فرمان فراخوانی کرد و به طور کامل کنترل کرد. از آنجایی که Absoft از نسخه 10.0 در سال 2005 از فرمت پیوند دهنده سیستم برای همه پلتفرم ها استفاده کرده است، فایل های شی C/C++ را می توان با فایل های آبجکت کامپایلر Absoft پیوند داد و ادغام با رایج ترین کامپایلرهای C/C++ توسط تنظیمات در Absoft IDE انجام می شود. حذف کد مرده
در نظریه کامپایلر، شاخه‌ای از علوم کامپیوتر نظری، حذف کد مرده (به انگلیسی: ) نوعی از بهینه‌سازی کامپایلر (به انگلیسی: ) است، که برای حذف بخشی از کد، که در نتیجهٔ برنامه تأثیری ندارد، استفاده می‌شود. کد مرده شامل بخشی از کد است که هیچ‌گاه اجرا نمی‌شود و یا در صورت اجرا، خروجی آن مورد استفاده قرار نگرفته و در واقع فقط بر روی متغیرهای مرده (متغیرهایی که در بقیه بخش‌های برنامه خوانده نمی‌شوند و از آن‌ها استفاده‌ای نمی‌شود) تأثیر می‌گذارد. به‌طور معمول، کامپایلرها در زمان کامپایل برنامه، به صورت بازگشتی تعیین می‌کنند که کدام متغیرها و بخش‌های برنامه استفاده شده‌اند. متغیرها و بخش‌های استفاده شده علامت گذاری می‌شوند و در نهایت بخش‌های علامت نخورده، از برنامه حذف می‌شوند. اکثر کامپایلرهای پیشرفته، گزینه‌های متعددی را در سطوح مختلف برای حذف کد مرده در اختیار قرار می‌دهند. در سطوح پایین، کامپایلر فقط بخش‌هایی از کد که اجرای آن‌های غیرممکن است را حذف می‌کند. در سطوح بالاتر کامپایلر فضایی را برای ذخیره‌سازی متغیرهای بی‌استفاده در نظر نمی‌گیرد. در سطوح بالاتر از آن نیز، کامپایلر دستورها و توابع بی‌استفاده را شناسایی و حذف می‌کند. کامپایلرهای ابسافت فرترن
کامپایل به عنوان یک برنامه AWE ورودی و خروجی استاندارد را به یک پنجره پیمایش شبیه به خط فرمان ترسیم می کند، اما کاربر تمام خروجی را حفظ می کند و این گزینه را دارد که پس از خروج برنامه، آن را به عنوان یک فایل متنی ذخیره کند. سایر ویژگی ها، که در زیر توضیح داده شده است، با استفاده از برنامه AWE فعال می شود. می توان یک برنامه AWE تعاملی نوشت که به هیچ عنوان از کنسول تعاملی استفاده نمی کند و این پنجره را برای استفاده به عنوان یک گزارش اجرا در دسترس می گذارد. ترجمه دوگانه
کاربرد اصلی یک کامپایلر متقاطع، جدا کردن محیط ساخت از محیط هدف است. این در چندین موقعیت مفید است: استفاده از ماشین‌های مجازی (مانند JVM جاوا) برخی از دلایل توسعه کامپایلرهای متقابل را برطرف می‌کند؛ پارادایم ماشین مجازی اجازه می‌دهد تا از خروجی کامپایلر یکسان در چندین سیستم هدف استفاده شود، اگرچه این همیشه ایده‌آل نیست زیرا ماشین‌های مجازی اغلب کندتر هستند و برنامه کامپایل‌شده را فقط می‌توان روی رایانه‌های دارای آن ماشین مجازی اجرا کرد. کامپایلر سی پلاس پلاس اینتل
کامپایلر سی++ اینتل، همچنین به عنوان آی‌سی‌سی یا آی‌سی‌ال شناخته می‌شود، گروهی از کامپایلرهای سی و سی پلاس پلاس از اینتل است که برای ویندوز، مک، لینوکس، فری‌بی‌اس‌دی و دستگاه‌های اندروید مبتنی بر اینتل در دسترس است. بابل (کامپایلر بین زبانی)
تفاوت بین کامپایلر های بین زبانی (transcompiler) و کامپایلر های معمولی (compiler) این است که کامپایلر کد منبع یک زبان برنامه‌نویسی خاص را می‌گیرد و آن را به کد قابل اجرای سطح ماشین تبدیل می‌کند درحالی که کامپایلر بین زبانی کدمنبع یک زبان برنامه نویسی را دریافت می‌کند و آن را به کد منبع یک زبان برنامه نویسی دیگر تبدیل می‌کند. این کد جدید تولید شده قابل اجرا شدن بر روی سخت افزار نیست بلکه این کد برای توسعه‌دهنده در زبان برنامه نویسی دیگر تولید شده است. به عنوان مثال می‌توان کد منبع زبان برنامه نویسی سی شارپ را به کامپایلر بین زبانی داد و در خروجی کد منبع زبان برنامه نویسی دیگری مثل سی‌ پلاس‌ پلاس را داشت. کامپایلر-کامپایلر
کامپایلر-کامپایلر یا کامپایلرساز در علوم کامپیوتر ابزاری است که با گرفتن توصیف یک زبان صوری و یک ماشین (مثلاً مجموعه دستورالعمل یک پردازنده) برای آن زبان یک تجزیه‌کننده یا کامپایلر می‌سازد. خروجی به شکل کد منبع کامپایلر یا تجریه‌کنندهٔ مذکور است و ورودی می‌تواند یک فایل متنی باشد که گرامر زبان را شرح دهد (برای نمونه به شکل فرم باکوس نائور). معمولاً کد ارائه شده توسط این ابزارها به تغییراتی نیاز دارد قبل از آن که آماده استفاده باشد. اولین استفاده از لفظ کامپایلر-کامپایلر مربوط است به ۱۹۶۰ میلادی. تونی بروکر که در آن زمان در دانشگاه منچستر فعالیت می‌کرد، برای آسان شدن ساختن کامپایلر برای کامپیوتر اطلس (Atlas Computer) ابزاری با این نام ساخت. در اصطلاح شناسی امروزی، آنچه بروکر انجام داد بیشتر به یک کامپایلر نوعی با قابلیت گسترش نحوی مطابقت دارد تا کامپایلر-کامپایلر و عموماً کامپایلر-کامپایلرهای امروزی فقط تجزیه‌کننده می‌سازند. فراگیر شدن لفظ کامپایلر-کامپایلر بیشتر ناشی از یک (کامپایلر) می‌باشد تا کار بروکر. از روندهای جدید در این حوزه می‌توان به تلاش برای پیاده‌سازی کامپایلر سازهایی بر طبق معناشناسی زبان (Semantics) اشاره کرد. مقالهٔ بدوین که مربوط به ۱۹۸۲ میلادی است، به بررسی این موضوع می‌پردازد و ادعا می‌کند که این روش اولین گام برای ساخت خودکار کامپایلرهایی بهینه و مطمین، به معنی اینکه صحت برنامه قابل اثبات باشد، است. هدف‌گیری مجدد
هزینه تولید یک کامپایلر قابل تنظیم مجدد که کدی با کیفیت مشابه یک کامپایلر غیرقابل بازگردانی تولید می‌کند (یعنی کدی که فقط برای تولید یک کد برای یک پردازنده طراحی شده‌است)، بیشتر است. زیرا در تمامی مراحل کامپایل، استفاده از جزئیات خاص واحدپردازش مرکزی یا cpu امکان‌پذیر نمی‌باشد. از مزایای این نوع کامپایلرها این است که هزینهٔ نهایی آن برای چندین پردازندهٔ مرکزی بسیار کمتر از هزینهٔ ترکیبی بسیاری از کامپایلرهای غیرهدفمند است بهینه سازی درون تابع
“بهینه سازی کامل برنامه"(WPO) بهینه سازی کامپایلر یک برنامه با استفاده از اطلاعات مربوط به همه (ماژول (برنامه نویسی)|ماژول‌ها) در برنامه است. به طور معمول، بهینه سازی‌ها بر اساس [واحد ترجمه (برنامه نویسی) | در هر ماژول ، "کامپایل"] انجام می‌شوند. اما این رویکرد، در حالی که نوشتن و تست ساده‌تر و نیازمند تقاضای کمتری از منابع در حین کامپایل خود است، قطعیت در مورد ایمنی تعدادی از بهینه سازی‌ها مانند تهاجمی درگیری را فراهم نمی‌کند و بنابراین نمی‌تواند آنها را انجام دهد حتی اگر آنها در واقع به دست آوردن عملکرد تبدیل می‌شوند که سمنتیک کد شیء منتشر شده را تغییر نمی‌دهند. اکمل
ابزارهای اکمل شامل یک مفسر سطح بالا، یک کامپایلر بایت‌کد، یک مدیر بسته/پکیج منیجر (OPAM)، و یک کامپایلر آپتیمایز کننده به زبان ماشین است. این زبان کتابخانهٔ استاندارد بزرگی دارد که آن را در بسیاری از کاربردهایی که پایتون و پرل استفاده می‌شوند کاربردی می‌کند، همین‌طور ساختارهای قویا مدولار شئ گرای این زبان آن را برای مهندسی نرم‌افزار در سطح بزرگ کارآمد می‌کند. اکمل یک جانشین برای کمل لایت است. سرواژهٔ CAML مخفف Categorical Abstract Machine Language(زبان رده‌ای ماشین انتزاعی) است، اگر چه CAML از این ماشین انتزاعی دل کنده. کامپایلر بهینه‌ساز
بهینه سازی کامپایلر به طور کلی با استفاده از دنباله ای از "بهینه سازی دگرگونی ها" ، الگوریتم هایی که یک برنامه را انجام می دهند و آنرا تبدیل می کنند تا یک برنامه خروجی معنایی معادل که از منابع کمتری استفاده می کند یا سریعتر اجرا می شود ، استفاده می شود. نشان داده شده است که برخی از مشکلات بهینه سازی کد NP-complete یا حتی غیرقابل انکار هستند . در عمل ، عواملی مانند تمایل برنامه نویس برای منتظر ماندن کامپایلر برای انجام وظیفه ، محدودیتهای بالایی را در مورد بهینه سازی هایی که ممکن است اجرا کننده کامپایلر ارائه دهد ، قرار می دهد. (بهینه سازی به طور کلی یک فرایند برای پردازنده و حافظه است. ) در گذشته محدودیت های حافظه رایانه نیز عامل اصلی محدود کردن عملکرد بهینه سازی ها بود. به دلیل همین عوامل ، بهینه‌سازی به ندرت خروجی بهینه می‌دهد ، و در واقع یک "بهینه سازی" ممکن است در برخی موارد مانع عملکرد شود. در عوض ، آنها روش های اکتشافی برای بهبود استفاده از منابع در برنامه های معمولی هستند. کامپایلر افزایشی
در الگوی برنامه‌نویسی تعاملی، به عنوان مثال در ادبیات مربوط به Poplog، یک کامپایلر تعاملی به کامپایلری گفته می‌شود که در واقع بخشی از سیستم زمان اجرای زبان مبدأ است. کامپایلرهای ++ IBM XL C/C
نسخه ارزیابی ۶۰ روزه قابل نصب برای ++XL C/C برای AIX در دسترس است. در ژوئن ۲۰۱۶، ++IBM XL C/C را برای Linux Community Edition معرفی کرد، که یک نسخه بدون هزینه و کاملاً کاربردی برای استفاده نامحدود از تولید است. کامپایلر
در اولین نگاه، تنوع کامپایلرها ممکن است به چشم نیاید. تعداد بسیار زیادی زبان‌های منبع وجود دارند که دامنه آن‌ها از زبان‌های شناخته شده مانند فرترن و پاسکال تا زبان‌های خاص منظوره گسترده‌است. زبان‌های مقصد نیز گستردگی متناظر با این زبان‌ها دارند. یک زبان مقصد ممکن است زبان برنامه‌سازی دیگر یا زبان ماشین یا … باشد. پی‌ال/۰
این خیلی ساده است برای دانشجویان که یک سری تجزیه‌کننده (parser) بازگشتی برای چنین نحو ساده‌ای بنویسند. بنابراین کامپایلر PL/0 هنوز به‌طور گسترده‌ای در دوره‌های ساخت و ساز کامپایلر در سرتاسر جهان استفاده می‌شود. با توجه به نبود ویژگی‌ها در مشخصات اصلی، دانشجویان معمولاً بیشتر وقت خود را در گسترش زبان و کامپایلر خود می‌گذرانند. آن‌ها معمولاً با معرفی REPEAT...UNTIL شروع می‌کنند و ادامه می‌دهند با بیشتر ویژگی‌های پیشرفته مثل پارامترهای گذرنده به توابع یا داده ساختارهایی شبیه آرایه‌ها، رشته‌ها یا اعداد دارای ممیز شناور. کامپایلر
در اواسط دهه ۱۹۵۰ کامپایلرها به عنوان برنامه‌هایی دشوار شناخته شده بودند. اولین کامپایلر فرترن، به عنوان مثال ۱۸ سال زمان برای طراحی صرف کرد. از آن زمان روش‌های سیستماتیک برای استفاده از بسیاری اعمال مهم حین عمل کامپایل ابداع شده‌است. همچنین زبان‌های پیاده‌سازی خوب، محیط‌های برنامه‌نویسی و ابزارهای نرم‌افزاری مناسب ایجاد شده‌اند. با کمک این پیشرفت‌ها یک کامپایلر را می‌توان حتی به عنوان پروژه درسی در یک ترم تحصیلی دانشجویی طراحی کرد. صحت کامپایلر
نسخه ۲۰۰۶ این کتاب بخشی مربوط به آزمایشن دارد، اما اهمیت آن را تأکید می کند: "بهینه سازی کامپایلرها آنقدر سخت است که به جرات می توان گفت که هیچ کامپایلر بهینه سازی شده کاملاً عاری از خطا نیست بنابراین ، مهمترین هدف در نوشتن کامپایلر صحیح بودن آن است." اکمل
سیستم نوع دادهٔ اکمل می‌تواند در کاهش مشکلات برنامه در حین اجرا کمک کند. اگرچه، این خود برنامه‌نویس را مجبور می‌کند که خود را با شرایط سیستم نوع وفق دهد، که ممکن است نیاز به فکر و توجه دقیق داشته باشد. یک کامپایلر استنتاج کنندهٔ نوع می‌تواند به شدت نیاز به نشانه گذاری‌های دستی را کاهش دهد (برای مثال، نوع دادهٔ متغیرها و اثر توابع نیاز نیست آنطور که در جاوا مشخص می‌شود، صریحاً مشخص شود). به هر حال، استفادهٔ مؤثر از سیستم نوع دادهٔ اکمل ممکن است نیاز به تجربهٔ بیشتری برای برنامه‌نویس دارد. بهینه‌سازی برنامه
برخی از طرح‌های CPU می‌توانند برخی از بهینه‌سازی‌ها را در زمان اجرا انجام دهند. بعضی از نمونه‌ها عبارتند , , و . کامپایلرها می‌توانند به این برنامه کمک کنند که از ویژگی‌های این CPU بهره‌مند شوند، مثلاً از طریق برنامه‌ریزی دستورالعمل. کامپایلر سی پلاس پلاس اینتل
این مجموعه‌ها شامل ابزارهای ساخت دیگر مانند کتابخانه‌ها و ابزارهایی برای رشته و تجزیه و تحلیل عملکرد هستند. تابع ذاتی
کامپایلرهایی که توابع ذاتی پیاده‌سازی می‌کنند به‌طور کلی تنها زمانی که یک برنامه درخواست بهینه‌سازی دارد آن‌ها را فعال می‌سازد در غیر این صورت به پیاده‌سازی پیش‌فرض آن که توسط زبان در زمان اجرا آماده می‌شود برمی گردد. بهینه‌سازی برنامه
با کامپایلرهای پیشرفته تر بهینه‌سازیو پیچیدگی CPUهای اخیر، بیشتر است که کد کارآمدتری را از آنچه که کامپایلر تولید می‌کند، بنویسید و پروژه‌های کوچک به این روش بهینه‌سازی نهایی نیاز دارند. کامپایلر تک‌گذره
کامپایلر تک‌گذره (one-pass compiler) کامپایلری است که بخش های کامپایل شونده را فقط یک بار می‌خواند که در این خوانش فورا هر بخش از کد را به زبان ماشین ترجمه می‌کند. این نوع کامپایلر در مقابل کامپایلر های چندگذره قرار می‌گیرد. کامپایر های چندگذره قبل از تبدیل نهایی کد به زبان ماشین ، آن را به چند نمایش میانی تبدیل میکنند و در هر کدام از این تبدیل ها از همه بخش های کامپایل شونده استفاده می‌کنند. یک (کامپایلر)
در بایسون: کامپایلر تک‌گذره
به عنوان مثال، زبان پاسکال با کامپایلر تک‌گذره ترجمه می‌شود اما زبان‌های پیشرفته‌تر مانند جاوا، تنها با کامپایلر چندگذره قابل ترجمه هستند. به همین دلیل، به کامپایلرها تک‌گذره، کامپایلر محدود و به کامپایلرهای چندگذری، کامپایلر نامحدود می‌گویند. کامپایلرهای تک‌گذره، به دلیل سادگی، بسیار رایج‌تر هستند و طراحی آن‌ها برای برنامه‌نویسان راحت‌تر است. بوت‌استرپینگ (کامپایلر)
اگر کسی بخواهد کامپایلری برای زبان x کامپایل کند (که به زبان x نوشته شده‌است) این مشکل پیش می‌آید که خود کامپایلر چگونه باید کامپایل شود. روش‌های مختلفی در عمل برای حل این مشکل «مرغ و تخم‌مرغ» استفاده شده‌اند که برخی از آن‌ها شامل موارد زیر هستند: اکشن!
برنامه‌نویسی در ACTION نیازمند کار با ویرایشگر و کامپایل یا اشکال زدایی روی نماشگر است . ویرایشگر شامل یک نمایش تمام صفحه با قابلیت پیمایش با امکان نمایش دو پنجره است . ویرایشگر همچنین شامل عملگرهای بلاکی و عمومی جستجو و جایگزینی می‌شود . کامپایل نمایشگر، هر حالتی که اجازه کامپایل و اشکال زدایی را می‌دهد انجام می‌شود . ACTION یک کامپایلر یک راهه است که کل کد برنامه در حافظه یا در یک فایل را یکجا کامپایل می‌کند که یک سرعت عالی را ارائه می‌دهد ولی میزان کد قابل کامپایل را محدود می‌کند . متغیرهای محلی دارای ادرس‌ها ی ثابت در حافظه هستند به جای آن که در پشته قرار بگیرند . این کار امکان ایجاد کدهای بسته در ۶۵۰۲ را می‌دهد و استفاده از بازگشتی را تحت تأثیر قرار می‌دهد . کد زیر یک مثال برای الگوریتم برای یافتن اعداد اول است که در Action نوشته شده‌است برای افزایش کارایی این پردازش گر همرمان گرافیکی ANTCC را غیرفعال می‌کند که باعث جلوگیری از دزدیده شدن سیکل‌های cpu توسط موتور dma آن در زمان محاسبه می‌شود. ای‌سی‌سی (زبان برنامه‌نویسی)
ای‌سی‌سی یک کامپایلر مشابه C، برای برنامه‌های سیستم عامل DOS برای سری کامپیترهای IBM است. کامپایلر و برنامه‌های کامپایل شده روی هر اینتل ۸۰۳۸۶ یا کامپیوترهای IBM که MS-DOS دارند، کار می‌کنند. همراه کامپایلر یک اسمبلر ۳۸۶ یک ارتباط دهنده برای ترکیب فایل‌های چند منظوره وجود دارد. همچنین دو کتابخانه وجود دارد، مدل محافظت شده گسترش دهنده DOS (بر اساس توماس پایتل، ایکا ترن PMODE30B + PMODE۳۰۷ گسترش دهنده DOS)، و یک کتابخانه وظایف که قابلیت استفاده شدن توسط برنامه‌های C را دارد. کامپوزر
کامپوزر به شدت از ان پی ام نود.جی‌اس و bundler روبی الهام گرفته‌است. کامپوزر توسط واسط خط فرمان اجرا می‌شود و وابستگی‌ها را برای برنامه نصب می‌کند. همچنین به شما این امکان را می‌دهد که بسته‌های موجود در "Packagist" را نصب کنید. کامپوزر به عنوان بخش جداناپذیزی در بسیاری از پروژه‌ها php مثل لاراول استفاده شده‌است. کامپایلر افزایشی
این طرح برخلاف کامپایلرهای قدیمی، چرخه توسعه یک برنامه‌نویس را به‌طور قابل توجهی کوتاه می‌کند. زیرا دیگر نیازی نیست مدت طولانی برای فرایند کامپایل قبل از اطلاع از خطاها منتظر ماند. کامپایلرهای ++ IBM XL C/C
یک بهینه‌ساز سطح پایین در هر پلتفرم بهینه‌سازی‌های سطح عملکرد را انجام می‌دهد و کد بهینه شده را برای سیستم عامل خاص و پلت فرم سخت‌افزاری تولید می‌کند. کامپایلر افزایشی
بسیاری از ابزارهای برنامه‌نویسی از مزایای کامپایلرهای افزایشی استفاده می‌کنند تا محیط برنامه‌نویسی بسیار تعاملی تری را در اختیار توسعه دهندگان قرار دهند. این غیر معمول نیست که یک کامپایلر افزایشی برای هر تغییر کد منبع فراخوانده شود، به گونه ای که توسعه دهنده تقریباً بلافاصله در مورد هرگونه خطای کامپایلرکه در نتیجه تغییر او در کد بوجود آمده، مطلع شود.