نقش کامپایلرها در برنامه نویسی چیست؟
کامپایل شرطی
در برنامه نویسی کامپیوتر، کامپایل شرطی روش های اجرای کامپایل است که به کامپایلر اجازه می دهد تفاوت هایی را در برنامه اجرایی تولید و توسط پارامترهای ارایه شده در هنگام کامپایل کنترل کند. این تکنیک معمولاً زمانی مورد استفاده قرار می گیرد که این تفاوت ها لازم باشد نرم‌افزار را بر روی سیستم عامل های مختلف یا نسخه های متفاوت کتابخانه ای و یا سخت افزار اجرا کند.
ماکرو (علوم رایانه)
ماکروها معمولاً برای نگاشت یک رشته کوتاه (فراخوانی ماکرو) به یک توالی طولانی‌تر از دستورالعمل‌ها مورد استفاده قرار می‌گیرند. یکی دیگر که کم‌تر متداول است، استفاده از ماکروها این است که معکوس شود: نگاشت یک توالی دستورالعمل‌ها به یک رشته ماکرو. این رویکرد توسط سیستم برنامه‌نویسی موبایل STAGE۲ اتخاذ شد، که از یک کامپایلر ماکروی ابتدایی (به نام SIMCMP)استفاده می‌کرد تا یک مجموعه دستورالعمل خاص از یک کامپیوتر داده‌شده به counterpart macros را نگاشت کند. برنامه‌های کاربردی (به‌طور خاص کامپایلرها) که در این ماکروها مستقل از دستگاه نوشته شده‌است، بدون تغییر در هر کامپیوتری که مجهز به کامپایلر ماکروی اولیه است اجرا می‌شود. اولین برنامه کاربردی که در چنین زمینه ای اجرا می‌شود، یک کامپایلر ماکرو پیچیده‌تر و قدرتمند است که در زبان ماکروی مستقل از دستگاه نوشته شده‌است. این کامپایلر ماکرو برای خودش، به روش بوت استرپ، برای تولید یک نسخه ترجمه‌شده و بسیار کارآمدتر از خودش استفاده می‌شود. مزیت این رویکرد این است که برنامه‌های پیچیده را می‌توان از یک کامپیوتر به یک کامپیوتر بسیار متفاوت با تلاش بسیار کمی (برای هر معماری ماشین هدف، فقط نوشتن یک compiler ابتدایی)منتقل کرد. ظهور زبان‌های برنامه‌نویسی مدرن، به خصوص C، که کامپایلرها در تمام رایانه‌ها در دسترس هستند، این رویکرد را بی‌فایده کرده‌است. با این وجود، این یکی از اولین نمونه از بوت استرپینگ کامپایلر بود. کامپایلر
در اواسط دهه ۱۹۵۰ کامپایلرها به عنوان برنامه‌هایی دشوار شناخته شده بودند. اولین کامپایلر فرترن، به عنوان مثال ۱۸ سال زمان برای طراحی صرف کرد. از آن زمان روش‌های سیستماتیک برای استفاده از بسیاری اعمال مهم حین عمل کامپایل ابداع شده‌است. همچنین زبان‌های پیاده‌سازی خوب، محیط‌های برنامه‌نویسی و ابزارهای نرم‌افزاری مناسب ایجاد شده‌اند. با کمک این پیشرفت‌ها یک کامپایلر را می‌توان حتی به عنوان پروژه درسی در یک ترم تحصیلی دانشجویی طراحی کرد. صحت کامپایلر
در رایانش، صحت کامپایلر شاخه ای از علوم کامپیوتر است که سعی دارد نشان دهد که یک کامپایلر طبق مشخصات زبان آن رفتار می کند. این تکنیک‌ها شامل توسعه کامپایلر با استفاده از روش‌های صوری و استفاده از تست دقیق (که اغلب به آن اعتبارسنجی کامپایلر گفته می شود) روی کامپایلر موجود می‌باشد. اعتبارسنجی کامپایلر با روشهای رسمی شامل زنجیره ای طولانی از منطق رسمی و استنتاجی است. اما از آنجا که ابزار یافتن اثبات (اثبات قضیه خودکار) در نرم‌افزار پیاده‌سازی شده و پیچیده است، احتمال بسیار بالایی وجود دارد که شامل خطا بشود. یک رویکرد استفاده از ابزاری برای اعتبارسنجی اثبات است که به دلیل اینکه خیلی ساده‌تر از یک اثبات‌کننده است، با احتمال کمتری با خطا روبرو خواهد شد. کامپایلر افزایشی
در برنامه‌نویسی دستوری و توسعه نرم‌افزار، زمانی که یک کامپایلر افزایشی فراخوانده می‌شود، فقط تغییرات یک مجموعه از فایلهای منبع شناخته شده را می‌گیرد و هر پرونده خروجی مربوطه که ممکن است از کامپایل‌های قبلی به دست آمده باشد را به روز رسانی می‌کند (به زبان مقصد کامپایلر، اغلب بایت کد). کامپایلر افزاینده به‌طور مؤثر با تغییر بر روی پرونده‌های خروجی که قبلاً کامپایل شده بود، از محاسبهٔ دوباره و بیهوده کل فایل‌های منبع که اکثر کدهای آن بدون تغییر باقی مانده‌است، جلوگیری می‌کند. برای بیشتر کامپایلرهای افزایشی، کامپایل برنامه با تغییرات اندک در کد منبع آن، تقریباً در یک لحظه است. می‌توان گفت که یک کامپایلر افزایشی ضمن حفظ معنای زبان، باعث می‌شود که دانه بندی واحدهای کامپایلرهای قدیمی کاهش یابد، به گونه ای که کامپایلر بتواند قطعات کوچکتر را اضافه و جایگزین کند. یک (کامپایلر)
عموماً Lex (فاز اول کامپایل کردن یک برنامه) و یَک در کنار یکدیگر مورد استفاده قرار می‌گیرند. چون لکس به ماشین تعیین‌پذیر حالات متناهی (به انگلیسی:DFA) محدود می‌شود، بنابراین آن رشته‌های ورودی، که لکس با استفاده از عبارات منظم قادر به تجزیهٔ آن‌ها نیست، یَک با استفاده از یک دستور زبان منظم، آن‌ها را تجزیه می‌کند، با این حال، یَک قادر به دریافت رشته از ورودی نمی‌باشد و به مجموعه‌ای از توکنها احتیاج دارد. غالباً لکس برای تأمین توکن‌های مورد نیاز یَک، مورد استفاده قرار می‌گیرد. توسعه نرم‌افزار سلولی
در برخی موارد امکان پورت کردن مستقیم کد VMX موجود وجود دارد.اگر کد VMX بسیار عمومی باشد، ترجمه می تواند نسبتاً ساده باشد.دو پردازنده فرمت کد باینری متفاوتی را مشخص می‌کنند، بنابراین حداقل نیاز به کامپایل مجدد است.حتی در جایی که دستورالعمل‌ها با رفتارهای یکسانی وجود دارند،آنها نام دستورالعمل‌های یکسانی ندارند، بنابراین این نیز باید نگاشت شود.IBM خودش این کامپایلر را فراهم می کند که از این Mapping به صورت شفاف به عنوان بخشی از جعبه ابزار توسعه مراقبت می کند. نمایش میانی
عملیات یک کامپایلر به دو بخش کلی عقب و جلو تقسیم می‌شود. در بخش جلو پس از پردازش کد کاربر، کد به نمایش میانی برده می‌شود و در بخش عقب کد از نمایش میانی به نمایش مقصد برده می‌شود. در صورتی که ویژگی‌های نمایش میانی مستقل از زبان منبع باشد، می‌توان از بخش عقب مشترکی برای کامپایلرهای مختلف استفاده کرد؛ بنابراین نمایش میانی خوب نمایش میانی‌ای است که مستقل از هر ویژگی نمایش مبدأ یا مقصد باشد؛ بنابراین اگر نیاز داشته باشیم کد n زبان متفاوت را به کد m زبان متفاوت ترجمه کنیم، بدون داشتن IR مناسب به mn کامپایلر نیاز داریم اما در صورت داشتن IR مناسب این امر با داشتن n بخش جلو و m بخش عقب قابل حل است. کامپایلر
تقسیم‌بندی پروسه‌های کامپایل به مجموعه‌ای از فازها مورد حمایت پروژه کامپایلری ((تولید کامپایلرهای باکیفیت))(PQCC) از دانشگاه Carnegie Mellon قرار گرفت. در این پروژه اصطلاحات جلو بندی، میان بندی (امروزه به ندرت به کار می‌رود) و عقب بندی معرفی شد. اکثر کامپایلرهای امروزی بیش از دو فاز دارند. جلوبندی معمولاً با پردازش املایی و معنایی شرح داده می‌شود. عقب بندی شامل تبدیل نوع و بهینه‌سازی‌های مختلف می‌باشد. سپس کد برای آن کامپیوتر خاص تولید می‌شود. استفاده از جلوبندی و عقب بندی این را ممکن می‌کند که جلوبندی‌های مختلفی برای زبان‌های مختلف وجود داشته باشد و عقب بندی‌های مختلفی نیز برای CPUهای مختلف. کامپایلر
ترجمه کامل کد منبع برنامه‌ای از یک زبان سطح بالا به کد شیء، پیش از اجرای برنامه را هم‌گردانی یا کامپایل می‌گویند. کامپایلر چندگذری
یک کامپایلر چند گذری یک نوع کامپایلر است که کد منبع یا درخت نحو انتزاعی از برنامه را چندین بار پردازش می‌کند. این نوع کامپایلر برخلاف کامپایلر تک گذری است که فقط یک بار از روی برنامه گذر می‌کند (برنامه را پردازش می‌کند). هر گذر نتیجهٔ گذر قبلی را به عنوان ورودی انتخاب می‌کند و یک خروجی میانی تولید می‌کند. به این ترتیب کد میانی گذر به گذر بهبود می‌یابد تا گذر نهایی، کد نهایی را منتشر کند. مترجم مبدأ به مبدأ
کامپایلر مبدا به مبدا یا مترجم مبدا به مبدا، مترجمی است که کد یک برنامه را به عنوان ورودی می‌گیرد و کد همان برنامه را به یک زبان برنامه‌نویسی دیگر به عنوان خروجی به ما برمی‌گرداند. تفاوت مترجم‌های مبدا به مبدا با مترجم‌های سنتی در این است که مترجم‌های مبدا به مبدا عملیات ترجمه را بین دو زبان برنامه‌نویسی هم‌سطح انجام می‌دهند، اما مترجم‌های سنتی یک زبان سطح بالا را به یک زبان سطح پایین تبدیل می‌کنند. برای مثال، یک مترجم مبدا به مبدا برنامه‌ای را از زبان پاسکال به سی تبدیل می‌کند. یک کامپایلر موازی‌ساز خودکار به صورت مداوم یک برنامۀ سطح بالا را به عنوان ورودی می‌گیرد و در کنار تبدیل کد، آن را با یادداشت‌های کد موازی (مثل OpenMP) یا ساختارهای زبان (مثل دستور forall در فورترن) حاشیه‌نویسی می‌کند. ترجمه دوگانه
کاربرد اصلی یک کامپایلر متقاطع، جدا کردن محیط ساخت از محیط هدف است. این در چندین موقعیت مفید است: استفاده از ماشین‌های مجازی (مانند JVM جاوا) برخی از دلایل توسعه کامپایلرهای متقابل را برطرف می‌کند؛ پارادایم ماشین مجازی اجازه می‌دهد تا از خروجی کامپایلر یکسان در چندین سیستم هدف استفاده شود، اگرچه این همیشه ایده‌آل نیست زیرا ماشین‌های مجازی اغلب کندتر هستند و برنامه کامپایل‌شده را فقط می‌توان روی رایانه‌های دارای آن ماشین مجازی اجرا کرد. مارگارت هلن هاپر
هارپر همچنین مقالهٔ خود که نام آن «زیر روال‌ها: بلوک‌های از پیش ساخته شده برای ساختمان» می باشد را در شماره مارس ۱۹۵۴ در "کامپیوترها و اتوماسیون" منتشر کرد. در مقاله خود، هارپر شروع می‌کند و می‌گوید که چگونه یک برنامه‌نویس دهه ۱۹۵۰ در اصل شبیه یک «ساکن در آمریکا» بوده‌است به این صورت که باید هر قسمت از خانه خود را با دست بسازد، درست تا پایه‌هایی که خانه را در کنار هم نگه داشته‌اند! وی با اشاره به اینکه زمانه تغییر کرده‌است، ادامه داد و گفت اکنون برنامه نویسان نه با گیره‌های خوب خانه بلکه با استفاده از ابزار و ایده‌هایی که دیگران در گذشته کشف کرده‌اند، کار می‌کنند. او بر اهمیت زیر روالها در برنامه‌نویسی رایانه تأکید می‌کند - این ایده که کارهای بزرگتر را می‌توان به بخشهای کوچکتر (فرعی) تقسیم کرد - اما در ادامه خاطرنشان می‌کند که "نبود یک کامپایلر [برای زیر روالها] به این معنی است که زیر روالها کدگذاری شده‌اند و فقط در یک قسمت ثابت از حافظهٔ کامپیوتر کار می‌کنند. " این مسئله مشکل ساز بود، زیرا به این معنی بود که استفاده مجدد از بسیاری کدها به سادگی امکان‌پذیر نیست. رایانه‌هایی که امروزه می‌شناسیم (در دهه ۲۰۰۰) بدون این کد قابل استفاده مجدد نمی‌توانند کار کنند. اما در سال ۱۹۵۴ هارپر بصیرت داشت و می‌پرسید: "اگر می‌توان روسی را به انگلیسی ترجمه کرد … چرا یک کامپیوتر را به دیگری کد ندهید؟" این موضوع اصلی در ایدهٔ طراحی و پیاده‌سازی کامپایلر بود. اگرچه هارپر کامپایلر را اختراع نکرد، اما او عضو یکی از اولین تیم‌های دانشمندان بود که اولین کامپایلرها را تصویرسازی کرد و ساخت. "New Scientist" از ۱۷ سپتامبر ۱۹۸۷ اظهار داشت که یکی از اولین افرادی که کامپایلرهای جدید را پیاده کرد، هارپر بود. کامپایلر سی پلاس پلاس اینتل
کامپایلرهای اینتل با استفاده از پردازنده‌هایی که از معماری‌های اینتل پشتیبانی می‌کنند، برای سیستم‌های رایانه ای بهینه می‌شوند. آنها برای به حداقل رساندن غرفه‌ها (stalls) و تولید کدی طراحی شده‌اند که در کمترین تعداد چرخه ممکن اجرا می‌شود. کامپایلر سی++ اینتل از سه تکنیک سطح بالا جداگانه برای بهینه‌سازی برنامه کامپایل شده پشتیبانی می‌کند: ببهینه سازی درون تابع (آی‌پی‌او)، بهینه‌سازی هدایت شده با پروفایل (پی‌جیی‌او) و بهینه‌سازی‌های سطح بالا (اچ‌ال‌او). کامپایلر سی++ اینتل در محصولات Parallel Studio XE همچنین از ابزارها، تکنیک‌ها و پسوند زبانی برای افزودن و حفظ موازی سازی برنامه‌ها در پردازنده‌های IA-32 و Intel 64 پشتیبانی می‌کند و امکان پردازش پردازنده‌های زئون فای اینتل را فراهم می‌کند. کامپایلر گلاسکو هسکل
کامپایلر گلاسکو هسکل (GHC) یک کامپایلر کد منبع باز برای زبان برنامه‌نویسی کاربردی هسکل است. این یک محیط بین پلتفرمی برای نوشتن و آزمایش کد Haskell فراهم می‌کند و از پسوندها، کتابخانه‌ها و بهینه‌سازی‌های متعددی که روند تولید و اجرای کد را ساده می‌کند پشتیبانی می‌کند. GHC متداول‌ترین کامپایلر Haskell است. توسعه دهندگان اصلی Simon Peyton Jones و Simon Marlow هستند. کامپایلر
به بیان ساده، کامپایلر برنامه‌ای است که یک برنامه نوشته شده در یک زبان خاص ساخت‌یافته را خوانده و آن را به یک برنامه مقصد (Target Language) تبدیل می‌نماید. در یکی از مهم‌ترین پروسه‌های این تبدیل، کامپایلر وجود خطا را در برنامه مبدأ اعلام می‌نماید. کلنگ (کامپایلر)
Clang در پشته با LLVM کار می کند. ترکیب Clang و LLVM بیشتر زنجیره ابزار را برای جایگزینی پشته GCC فراهم می کند. یکی از اهداف اصلی Clang ارائه یک معماری مبتنی بر کتابخانه است، به طوری که کامپایلر بتواند با ابزارهای دیگری که با کد منبع تعامل دارند، مانند محیط های توسعه یکپارچه (IDE) همکاری کند. در مقابل، GCC در یک گردش کار کامپایل-لینک - اشکال زدایی کار می کند. ادغام آن با ابزارهای دیگر همیشه آسان نیست. برای مثال، GCC از مرحله‌ای به نام "fold استفاده می‌کند" که کلید فرآیند کامپایل کلی است، که اثر جانبی ترجمه درخت کد به شکلی دارد که شبیه کد منبع اصلی نیست. اگر خطایی در حین یا بعد از مرحله فولد یافت شود، ترجمه آن به یک مکان در منبع اصلی ممکن است دشوار باشد. علاوه بر این، فروشندگانی که از پشته GCC در IDE ها استفاده می کنند باید از ابزارهای جداگانه برای فهرست کردن کد استفاده کنند تا ویژگی هایی مانند برجسته سازی نحو و تکمیل کد هوشمند را ارائه دهند . چارچوب دات‌نت
بخش کامپایلر این چارچوب یک مفسر همزمان است. به این معنی که کد تمام زبانها به یک زبان میانی به نام زبان میانی مشترک ترجمه شده و توسط یک ماشین مجازی بر اساس نیازها و مشخصات هر سیستم‌عامل و سخت‌افزار به اجرا در می‌آیند. کتابخانه‌های از پیش نوشته شده که در این چارچوب قرار دارند و در واقع پایه‌های اشیاء و کلاس‌های اصلی این چارچوب می‌باشند بخش وسیعی از نیازهای برنامه‌نویسی را تحت پوشش قرار می‌دهند. از جمله این کلاس‌ها می‌توان به واسط‌های گرافیکی کاربر، دسترسی به پایگاه‌های داده، رمزنگاری، برنامه‌های تحت‌وب، الگوریتم‌های کار با اعداد و ارتباطات شبکه‌ای را نام برد. بهینه‌سازی کامپایلر
بهینه‌سازی از مهم‌ترین وظایف یک کامپایلر است که معمول بعد از تولید کد میانی آغاز می شود. همیشه هنگام کامپایل یک برنامه برای پخش نهایی از بهینه‌سازی استفاده می شود. هرچند گاهی اوقات بهینه‌سازی مانع اصلی بعضی اهداف است و باید کنار گذاشته کردن یک کد بهینه شده دشوارتر و شاید غیرممکن شود چرا که debug شود. به عنوان مثال به منظور بهینه‌سازی بسیاری از کدها حین کامپایل ممکن است جابجا شده باشند یا اصل option ساختار آن‌ها عوض شده باشد. به همین دلیل بسیاری از کامپایلرها اجازه نمی‌دهند کامپایل کردن و بهینه‌سازی هم‌زمان فعال شوند. همچنین گاهی کد کامپایل debugهای مربوط به یکسان ولی خصوصیات (instruction) شده قرار است روی پردازنده‌هایی با دستورالعملهای مختلف از حیث زمان‌بندی، سرعت دسترسی به حافظه و … اجرا شود که در این صورت کامپایلر نباید بهینه‌سازی‌های خاص یک ماشین را روی آن اعمال کند. تکنیک‌های مختلف بهینه‌سازی می‌توانند وابسته به زبان منبع، وابسته به ماشین مقصد یا مستقل از هر دو باشند. اغلب روش‌های بهینه‌سازی مستقل از زبان منبع می‌باشند. همچنین برای بسیاری از الگوریتم‌های بهینه‌سازی وابسته به مقصد، می‌توان خصوصیات ماشین مقصد را با یکسری پارامتر معرفی کرد و خود الگوریتم برای مقصدهای مختلف دست نخورده بماند. اهداف کلی یک کیمپایلر هنگام بهینه‌سازی به صورت خلسه در زیر آمده‌است که کامپایلر بر اساس نوع بهینه‌سازی مورد نظرش، به آن‌ها اولویت می‌دهد: جا می‌گیرد وپردازنده برای cache کم کردن حجم کد: هرچه حجم کد کمتر باشد راحتتر در دسترسی به آن نیاز به تعداد کمتری مراجعه به حافظه دارد. کم کرد ن محاسبات: تغییر کد به گونه‌ای که محاسبات کمتری داشته باشد وقت پردازنده را کمتر می‌گیرد. پرهیز از پرش‌های شرطی و غیر شرطی: پردازنده‌ها در برخورد باانشعاب‌ها و پرش‌ها نمی استفاده کنند و در نتیجه زمان بیشتری در این‌گونه مواقع تلف می‌شود. pipelining توانند از کامپایلر باید کد را به گونه‌ای تغییر دهد که حتی المکان تعداد کمتری انشعاب و پرش داشته باشد. نزدیک کردن ارجاعات مشابه: بخش‌هایی از کد که یک داده خاص را از حافظه می‌خوانند بهتر است کنار هم باشند تا دسترسی به داده سریعتر برای آن‌ها انجام گیرد و کامپیوتر مجبور به مراجعه مکرر به حافظه نباشد. ترتیب دهی مناسب داده‌ها در حافظه: ثباتها باید حاوی داده‌های پراستفاده تر باشند. موازی سازی: ترتیب دستورها در حافظه باید به گونه‌ای باشد که به پردازنده حداکثرامکان پردازش موازی دستورها را بدهد. تاریخچه ساخت مترجم
در رایانش، مترجم یا کامپایلر یک برنامهٔ رایانه‌ای است که کد مبدأ را که به یک زبان برنامه‌نویسی یا زبان کامپیوتر ("زبان مبدأ") نوشته‌شده‌است به یک زبان کامپیوتری دیگر ("زبان مقصد"، که اغلب به شکل دودویی است و آن را به نام "کد مقصد" یا "کد ماشین" می‌شناسند) تبدیل می‌کند. متداول‌ترین دلیل برای تبدیل کد مبدأ این است که می‌خواهیم یک برنامهٔ قابل اجرا ایجاد کنیم. رزلین(کامپایلر)
این پروژه به‌طور خاص شامل نسخه‌های کامپایلرهای #C و VB.NET است. کامپایلرها از طریق برنامه‌های خط فرمان (به انگلیسی: command-line) در دسترس هستند اما همچنین به عنوان APIهایی به زبان .NET هم در دسترس هستند. Roslyn ماژول‌هایی را برای تجزیه و تحلیل نحوی (واژگانی)، تحلیل معنایی، تدوین پویا به زبان میانی مشترک (به انگلیسی: Common Intermediate Language، به اختصار CIL) و انتشار کد در معرض دید قرار می‌دهد. کامپایلر سی پلاس پلاس اینتل
کامپایلر سی++ اینتل، همچنین به عنوان آی‌سی‌سی یا آی‌سی‌ال شناخته می‌شود، گروهی از کامپایلرهای سی و سی پلاس پلاس از اینتل است که برای ویندوز، مک، لینوکس، فری‌بی‌اس‌دی و دستگاه‌های اندروید مبتنی بر اینتل در دسترس است. ترجمه دوگانه
ترجمه دوگانه، همگردان دوگانه، مترجم تقابلی، ‌کامپایلر متقابل یا کراس کامپایلر کامپایلری است که قادر به ایجاد کد اجرایی برای سیستم عامل دیگری غیر از آنچه در آن اجرا می شود، است. به عنوان مثال کامپایلری که روی رایانه شخصی ویندوز اجرا می شود اما کدی را تولید می کند که روی تلفن هوشمند اندروید اجرا می شود، یک کامپایلر متقابل است. استاندارد ام‌ال
کامپایلر استاندارد ام‌ال نوع int -> int برای این تابع را بدون وارد کردن نوع متغیرها توسط کاربر باید تفسیر کند. به عبارت دیگر کامپایلر وظیفه دارد تا تفسیر کند که n تنها همراه با عبارات INT می‌تواند استفاده شود، بنابراین نوع n نیز باید از نوع INT بوده و همه مقادیر برگشتی از تابع فوق نیز از همین نوع باشند. تاریخچه ساخت مترجم
نرم‌افزارهایی که برای کامپیوترهای اولیه نوشته می‌شد عموما به زبان اسمبلی بودند. از دید یک برنامه‌نویس بهتر است که برای توسعه‌ی نرم‌افزار از یک زبان برنامه‌نویسی سطح بالا استفاده کند، و برنامه‌هایی که به زبان برنامه‌نویسی سطح بالا نوشته شده‌اند قابلیت استفاده‌ی مجدد روی کامپیوترهای مختلف را دارند. با این حال، مدتی طول کشید تا کامپایلرها به صورت گسترده مورد استفاده قرار گیرند؛ زیرا کدهای تولیدی توسط کامپایلرها به کارآمدی کدهای دست‌نویس در اسمبلی نبود؛ کامپایلرها گسترش پروژه‌ها را محدود به رعایت قوانین خود می‌کردند و هم‌چنین حافظهٔ محدود کامپیوترهای قدیمی باعث ایجاد مشکلات تکنیکی بسیاری در طراحی مترجم‌ها می‌شد. تاریخچه ساخت مترجم
هنگامی که به یک کامپایلر یک برنامه‌ای داده می‌شود که از نظر نحوی نادرست است، نمایش یک پیغام خطای کوتاه و واضح بسیار مفید است. البته از دیدگاه طراح کامپایلر، رسیدن به آن دشوار است. کامپایلر فرترن WATFIV در اواخر دهه ۱۹۶۰ در دانشگاه واترلو کانادا توسعه داده شد. این کامپایلر برای ارائه پیغام خطای بهتر نسبت به کامپایلر فرترن IBM آن زمان، طراحی شده بود. علاوه بر این WATFIV بسیار کاربردی‌تر بود، به این دلیل که مراحل کامپایل، اجرا را در یک مرحله ترکیب کرده بود، در حالی که کامپایلر IBM برای اجرای این مراحل را در ۳ بخش جداگانه داشت! کامپایلر بهینه‌ساز
کد با پیچیدگی کمتر. پرش ها (شاخه های شرطی یا بدون قید و شرط) با واکشی اولیه دستورالعمل ها تداخل دارند و به این ترتیب سرعت کد را کاهش می دهند. استفاده از درون خطی یا باز کردن حلقه می تواند انشعاب را کاهش دهد ، در ازای افزایش اندازه فایل باینری با طول کد تکرار شده. این کار تمایل دارد چندین بلوک اساسی را در یکی ادغام کند. سی شارپ
این کامپایلر در مقابل C یا ++C دارای ساختار بسیار متفاوتی است که دانستن آن به برنامه‌نویس امکان نوشتن برنامه‌های بسیار بهینه را خواهد داد. کامپایلر
از ۱۹۷۵ تاکنون، تعداد زبان‌های جدید و انواع ماشین مختلف کاهش یافت در نتیجه نیاز به کامپایلرهای سریع و ساده یا سریع و ناقص برای زبان‌ها یا ماشین‌های جدید، کاهش یافت. بزرگ‌ترین آشفتگی در طراحی زبان و ماشین خاتمه یافت و افراد خواستار کامپایلرهای قابل اعتماد، کارآمد و با واسط کاربر مناسب شدند. بدین ترتیب، توجه کیفی به کد بیشتر شد زیرا با تغییر اندکی که در ساختار ماشین‌ها ایجاد می‌شود، طول عمر کدها افزایش می‌یابد. در همین دوره، مدلهایی در برنامه‌نویسی به وجود آمدند که برنامه‌نویسی تابعی، منطقی و توزیعی نمونه‌های از این مدل‌ها هستند، خواسته‌های زمان اجرای این زبان‌ها نسبت به زبان‌های دستور، افزایش یافت. کامپایلرهای ابسافت فرترن
کامپایلرهای Absoft Fortran مجموعه ای از کامپایلرهای فرترن برای مایکروسافت ویندوز ، اپل مکینتاش و لینوکس هستند که توسط Absoft Corporation تولید شده اند. کامپایلرها کد منبع سازگار با پلتفرم ها هستند. همه با اشکال زدایی گرافیکی و محیط توسعه یکپارچه همراه شده اند. پشتیبانی تک رشته ای و چند رشته ای موازی توسط کاربر کنترل می شود و شامل پنج سطح بهینه سازی، OpenMP، سطوح سرعت ریاضی 0 تا 9 و سایر قابلیت های پیشرفته است. شناسه (زبان‌های کامپیوتری)
برای پیاده‌سازی زبان‌های برنامه‌نویسی که از کامپایلر استفاده می‌کنند، شناسه‌ها اغلب فقط موجودیت‌های زمان کامپایل هستند. این به این معنی است که در زمان اجرا، برنامه کامپایل شده به جای توکن‌های شناسه متنی، ارجاعاتی به آدرس‌ها و آفست‌های حافظه دارد (این آدرس‌های حافظه یا آفست‌ها توسط کامپایلر به هر شناسه اختصاص داده شده‌اند). نمایش میانی
از آن جایی که نمایش میانی نمایش درونی کامپایلر است، تقریباً هیچ‌گاه کاربر برنامه‌ساز با آن ارتباطی ندارد (مگر در موارد خاص بهینه‌سازی)، پس نیازی نیست که نمایش میانی از ساخت‌های پیچیده که برنامه‌نویسی را برای کاربر برنامه‌ساز آسان می‌کنند بهره‌ای ببرد. این ساده‌سازی راه را برای بهینه‌سازی بهتر کد توسط کامپایلر باز می‌کند. کامپایلر
ساختار کامپایلرها و کامپایلر بهینه‌ساز امروزه بخشی از برنامه درسی دانشجویان کامپیوتر است. برخی کامپایلرها به منظور آموزشی برای زبان‌های برنامه‌نویسی تولید می‌گردد؛ مثلاً کامپایلر PL/۰ توسط Niklaus Wirth برای آموزش در دهه ۱۹۷۰ به کار رفت. به علت سادگی و دلایل زیر هنوز برای آموزش مورد استفاده قرار می‌گیرد: زبان توصیف سخت‌افزار
هر تغییری در وردی فرایند به صورت اتوماتیک یک بروزرسانی در پشته فرایند شبیه‌ساز را راه اندازی می‌کند. هر دو زبان‌های برنامه‌نویسی برم افزار و HDLها به وسیله کامپایلر عمل کنند (در HDLها معمولاً سنتز نامیده می‌شوند) ولی با هدف متفاوت. در HDLها «کامپایل» به سنتز منطقی اشاره، به فراینده انتقال لیست کدHDL به یک لستنت گیت فیزیکی قابل درک، خروجی نت لیست هر فرمی را می‌تواند بگیرد، یک لیست نت«شبیه‌سازی» با اطلاعات تأخیر گیت و یک لیستنت «بدون دست» برای مکان سنتز پست و مسیر، یا یک فرمت طرح کلی مجتمع الکترونیک استاندارد صنعتی (EDIF)(برای تبدیل زیردنباله به یک فایل فرمت JEDEC) کامپایلر
راه‌های مختلفی جهت دسته‌بندی کامپایلرها وجود دارد مثلاً می‌توان آن‌ها را با توجه به ورودی، خروجی، ساختار داخلی یا رفتار زمان اجرای آن تقسیم‌بندی کرد. بهینه سازی حلقه
بهینه‌سازی حلقه در تئوری کامپایلر، فرایند افزایش سرعت اجرا و کاهش سربارهای مربوط به است. این فرایند نقش بسزایی در بهبود عملکرد حافظه نهان و استفاده مؤثر از قابلیت‌های پردازش موازی ایفا می‌کند. در واقع بیشترین زمان اجرای یک برنامه علمی در حلقه‌ها صرف می‌شود؛ و از این رو تکنیک‌های متعدد بهینه سازی کامپایلر برای اجرای سریعتر ایجاد شده‌اند. کامپایلر بهینه‌ساز
اگر این نرم‌افزار برای استفاده در یک یا چند ماشین بسیار مشابه و با مشخصات شناخته شده کامپایل شده باشد ، کامپایلر می تواند کد تولید شده را به شدت به آن دستگاه های خاص تنظیم کند (در صورت وجود چنین گزینه هایی). موارد ویژه مهم شامل کدی است که برای پردازنده های موازی و بردار طراحی شده است ، که برای آن کامپایلرهای موازی سازی ویژه ای استفاده شده است. کامپایلر افزایشی
کامپایلر افزایشی نوعی محاسبات افزایشی در کامپایلرهاست. واضح است، کامپایلرهای معمولی بعد از هر تغییر، دوباره همه ماژول‌های برنامه را می‌سازند درحالی که کامپایلر افزایشی فقط آن بخش از برنامه را که تغییر کرده‌است را دوباره کامپایل می‌کند. کد رایانه
رایانه‌ها فقط می‌توانند دستورالعمل‌های مربوط به کد ماشین را که بخشی از مجموعه دستورالعمل‌های آن‌ها است، اجرا کنند. از آنجا که خواندن این دستورالعمل‌ها برای انسان دشوار است، و نوشتن برنامه‌های خوب به‌زبان ماشین یا سایر زبان‌های برنامه‌نویسی سطح پایین یک کار زمان‌بر است، بیشتر برنامه‌نویسان به کد منبع یک زبان برنامه‌نویسی سطح بالا برنامه‌نویسی می‌کنند. این کد منبع توسط کامپایلر یا مترجم به‌زبان ماشین ترجمه می‌شود تا کامپیوتر بتواند آن را در جهت انجام وظایفش اجرا کند. کامپایلر آبجکت کد را تولید می‌کند که معمولاً به زبان ماشین نوشته شده‌است اما این کد ممکن است به یک زبان سطح متوسط، در سطح پایین‌تری از منبع نیز باشد. اغلب از یک سیستم زمان اجرا برای اجرای آبجکت کد با پیوند دادن آن به کتابخانه‌های متداول استفاده می‌شود. Bytecode سطحی پایین‌تر از سطح زبان منبع است که برای تفسیر کارآمدتر مفسران طراحی شده‌است. بهینه‌سازی برنامه
بهینه‌سازی خودکار (یا کامپایلر بهینه‌سازی، برنامه ای که بهینه‌سازی کد را انجام می‌دهد) خود باید بهینه‌سازی شده باشد، یا به منظور بهبود کارایی برنامه‌های هدف خود یا افزایش سرعت عملیات خود. یک کامپایل انجام شده با بهینه‌سازی «روشن» معمولاً طول می‌کشد طول می‌کشد، اگر چه این معمولاً تنها مشکل زمانی که برنامه‌ها بسیار بزرگ است. پای‌پای
پای‌پای معمولاً سریع‌تر از عمل می‌کند؛ زیرا کامپایلرِ درجاست؛ در حالی که CPython یک مفسر است. اکثر کدهای پایتون به‌جز کدهایی که به CPython وابسته‌اند، به‌خوبی روی پای‌پای کار می‌کنند.PyPy از تکنیکی موسوم به meta-tracing استفاده می‌کند؛ بدین معنا که مفسر را به کامپایلر درجا تبدیل می‌کند. با اینکه مفسر ساده‌تر از کامپایلر نوشته می‌شود، کندتر از آن عمل می‌کند. این روش باعث می‌شود پیاده‌سازی کارآمد زبان‌های برنامه‌نویسی ساده‌تر شود. زبان توصیف کامپایلر
زبان توصیف کامپایلر یک زبان برنامه‌نویسی است که برای توسعهٔ کامپایلرها و بر پایهٔ دستور زبان‌های ضمیمه بنا شده‌است. بهینه‌سازی برنامه
امروزه کد نوشته می‌شود تا به عنوان ماشین‌های بسیاری بتواند اجرا شود. به عنوان یک نتیجه، برنامه نویسان و کامپایلرها همیشه از دستورالعمل‌های کارآمدتر ارائه شده توسط پردازنده‌های جدیدتر یا پیش فرض مدل‌های قدیمی تر استفاده نمی‌کنند. علاوه بر این، کدهای مونتاژ شده برای یک پردازنده خاص بدون استفاده از چنین دستورالعمل‌های تنظیم شده‌است که ممکن است در پردازنده دیگری غیرقطعی باشند، و انتظار تنظیم متفاوت از کد را دارند. کامپایلر افزایشی
این کامپایلر را می‌توان در زمان اجرا بر روی برخی از کدهای منبع یا ساختمان داده‌هایی که توسط برنامه مدیریت شده‌است فراخوانی کرد. سپس یک قطعه جدید کامپایل شده تولید می‌کند که حاوی کد ماشینی است که بلافاصله برای استفادهٔ سیستم در زمان اجرا در دسترس است. فهرست خودسازمان‌دهی‌کننده
مترجمان زبان‌های برنامه‌نویسی همانند کامپایلرها و مفسرها از فهرست‌های خودسازمان‌دهنده به منظور حفظ جدول نمادها در طول ترجمه و تفسیر کد اصلی برنامه استفاده می‌کنند. به‌علاوه فهرست‌های خودسازمان‌دهنده در شبکه‌های اطلاعاتی و عصبی و برنامه‌های خودتنظیم‌کننده نیز مورد استفاده واقع می‌شوند. کامپایل مجدد پویا
بیشتر کامپایلرهای دینامیکی برای تبدیل کد ماشین بین معماری‌ها در زمان اجرا استفاده می‌شوند. این کار اغلب در شبیه‌سازی پلتفرم‌های بازی قدیمی مورد استفاده قرار می‌گیرد. در موارد دیگر، یک سیستم ممکن است از کامپایل مجدد پویا به عنوان بخشی از یک استراتژی بهینه‌سازی تطبیقی برای اجرای یک برنامه قابل حمل مانند جاوا یا NET. Common Language Runtime در قالب بایت‌کد استفاده کند. همچنین دیباگرهای پر سرعت از کامپایل مجدد پویا استفاده می‌کنند تا سربار حافظه را در اکثر تکنیک‌های تخلیه (deoptimization) و سایر ویژگی‌ها مانند dynamic thread migration کاهش دهند. حذف کد مرده
در نظریه کامپایلر، شاخه‌ای از علوم کامپیوتر نظری، حذف کد مرده (به انگلیسی: ) نوعی از بهینه‌سازی کامپایلر (به انگلیسی: ) است، که برای حذف بخشی از کد، که در نتیجهٔ برنامه تأثیری ندارد، استفاده می‌شود. کد مرده شامل بخشی از کد است که هیچ‌گاه اجرا نمی‌شود و یا در صورت اجرا، خروجی آن مورد استفاده قرار نگرفته و در واقع فقط بر روی متغیرهای مرده (متغیرهایی که در بقیه بخش‌های برنامه خوانده نمی‌شوند و از آن‌ها استفاده‌ای نمی‌شود) تأثیر می‌گذارد. به‌طور معمول، کامپایلرها در زمان کامپایل برنامه، به صورت بازگشتی تعیین می‌کنند که کدام متغیرها و بخش‌های برنامه استفاده شده‌اند. متغیرها و بخش‌های استفاده شده علامت گذاری می‌شوند و در نهایت بخش‌های علامت نخورده، از برنامه حذف می‌شوند. اکثر کامپایلرهای پیشرفته، گزینه‌های متعددی را در سطوح مختلف برای حذف کد مرده در اختیار قرار می‌دهند. در سطوح پایین، کامپایلر فقط بخش‌هایی از کد که اجرای آن‌های غیرممکن است را حذف می‌کند. در سطوح بالاتر کامپایلر فضایی را برای ذخیره‌سازی متغیرهای بی‌استفاده در نظر نمی‌گیرد. در سطوح بالاتر از آن نیز، کامپایلر دستورها و توابع بی‌استفاده را شناسایی و حذف می‌کند. پاسکال (زبان برنامه‌نویسی)
کامپایلرها و مفسرهای گوناگون پاسکال برای استفاده عمومی همگان مهیا است: مارگارت هلن هاپر
علوم کامپیوتر به‌طور کلی یک رشته مشارکتیست و روند توسعه آن در اواخر دهه ۱۹۴۰ و اوایل ۱۹۵۰ از این لحاظ تغییری نکرد. در اوایل دهه ۱۹۵۰ هنگامی که گریس هاپر در حال توسعه اولین کامپایلرها بود هارپر و ریچارد کی ریدگوی به او کمک می کردند. هاپر حتی اظهار داشت که «این پروژه به صورت گروهی انجام می‌شود و این گزارش بدون ذکر اعضاء آن منتشر نمی‌شود؛ اعضایی که مسئولین اصلی دستیابی به این نتایج هستند.» علت مهم بودن این مطلب این است که بسیاری از مشارکت هارپر تحت تأثیر شهرت اثر ماتیلدا گریس هاپر قرار گرفته‌است. در سال ۱۹۵۲، هارپر، ریدگوی و هاپر همگی به روی پروژهٔ Remington Rand در مجموعه کامپایلرهای A برای سیستم UNIVAC کار می‌کردند. به ویژه، هارپر و ریدگوی کتابچه راهنمای آن را تهیه کرده و بر روی کامپایلر A-2 کار کردند. کامپایلر بهینه‌ساز
اینها همه کد منبع برنامه را تجزیه و تحلیل می کند. مقدار بیشتری از اطلاعات استخراج شده بدان معنی است که بهینه سازی ها می توانند در مقایسه با زمانی که فقط به اطلاعات محلی دسترسی داشته باشند (به عنوان مثال ، در یک عملکرد واحد) موثرتر باشند. این نوع بهینه سازی همچنین می تواند تکنیک های جدیدی را انجام دهد. برای عملکرد به عنوان مثال inlining ، که در آن یک تماس به تابع توسط یک کپی از بدن تابع جایگزین شده است. کامپایلرهای ++ IBM XL C/C
کامپایلرهای IBM XL از اجزای مدولار شده متشکل از قسمت‌های جلویی (برای زبان‌های برنامه‌نویسی مختلف)، یک بهینه‌ساز سطح بالا آگنوستیک پلتفرم، و بهینه‌سازها/مولدکننده‌های کد سطح پایین مخصوص پلتفرم برای هدف قرار دادن سخت‌افزار و سیستم‌های عامل خاص ساخته شده‌اند. کامپایلرهای ++XL C/C معماری‌های سخت‌افزاری POWER, BlueGene/Q و IBM Z را هدف قرار می‌دهند. پروژه امتیازی کامپایلر
فایل‌های اجراپذیر را می‌توانند به صورت دستی به زبان ماشین نوشته شده باشند؛ اگرچه بسیار آسان‌تر است که یک برنامه را به شکل کد منبع در یک زبان برنامه‌نویسی سطح بالا نوشت که درک آن برای انسان آسان‌تر است. در برخی موارد نیز ممکن است کد منبع به زبان اسمبلی نوشته شود به شکلی که توسط انسان قابل خواندن باشد و همزمان با دستورالعمل‌های کد ماشین ارتباط نزدیکی داشته باشد. یک زبان برنامه‌نویسی سطح بالا توسط یک کامپایلر با به کد ماشین اجراپذیر و یا به نوعی آبجکت فایلِ حاوی کد ماشین اجراناپذیر (غیر اجراپذیر) تبدیل می‌شود؛ به فرایند معادل آن بر روی کد منبع زبان اسمبلی، اسمبلی (مونتاژ) گفته می‌شود. چندین آبجکت فایل به یکدیگر می‌پیوندند تا یک اجراپذیر ساخته شود. آبجکت فایل‌ها -- چه اجراپذیر باشند یا نباشند -- معمولاً در یک مانند فرمت اجرایی و مرتبط (ELF) قرار دارند. آنگاه این ساختارها هستند که مولد کد ماشین هستند؛ به عنوان مثال، آن را به بخش‌هایی مانند (کد اجراپذیر)، داده (متغیرهای ایستا) و (ثابت‌های ایستا) تقسیم می‌کند. دی‌کامپایلر
به طور کلی کامپایلرها قادر به بازگرداندن یک فایل اجرایی به سورس کد آن به شکل دقیق و بی‌نقص نیستند و در اکثر مواقع کدهایی مبهم() می‌سازند. با این حال دیکامپایلرها هنوز ابزاری بسیار مهم در مهندسی معکوس به شمار می‌روند. کارآیی کامپیوتر
حتی در یک ماشین، یک کامپایلر دیگر یا همان کامپایلر با سوییچ‌های مختلف بهینه‌سازی کامپایلر متفاوت می‌تواند N و CPI را تغییر دهد - اگر کامپایلر جدید بتواند N یا C را بهتر کند بدون اینکه وضعیت دیگری را بدتر کند، بنچمارک سریعتر اجرا می‌شود، اما اغلب بین این‌ها یک بده‌بستانی وجود دارد - آیا بهتر است مثلاً از چند دستورالعمل پیچیده که مدت زمان زیادی طول می‌کشد تا اجرا شوند، استفاده شود یا از دستورالعمل‌هایی که خیلی سریع اجرا می‌شوند استفاده شود، اگرچه تعداد بیشتری از آنها نیاز است تا بنچمارک اجرا شود؟ صحت کامپایلر
نسخه ۲۰۰۶ این کتاب بخشی مربوط به آزمایشن دارد، اما اهمیت آن را تأکید می کند: "بهینه سازی کامپایلرها آنقدر سخت است که به جرات می توان گفت که هیچ کامپایلر بهینه سازی شده کاملاً عاری از خطا نیست بنابراین ، مهمترین هدف در نوشتن کامپایلر صحیح بودن آن است." کامپایلر
در اواخر دهه ۱۹۵۰ میلادی ماشین‌های دارای زبان‌های برنامه‌نویسی رواج یافتند و کامپایلرهای آزمایشی ایجاد شدند. زبان فرترن به سرپرستی جان باکوس در شرکت آی‌بی‌ام به عنوان اولین کامپایلر کامل در سال ۱۹۵۷ تولید شد. کوبول اولین زبان کامپایلی با معماری چندگانه در سال ۱۹۶۰ تولید شد. در طی دهه ۶۰ کامپایلرهای زیادی تولید شد اما بر روی کیفیت کامپایلرها کمتر فکر می‌شد. هم‌زمان با تکامل زبان‌های برنامه‌سازی و افزایش قدرت کامپیوترها، کامپایلرها هرچه بیشتر پیچیده می‌شدند. کامپایلر بهینه‌ساز
بسیاری از گزینه هایی که در مورد آنها بهینه سازی ها می توانند و باید انجام شوند به ویژگی های دستگاه هدف بستگی دارد. پارامتر کردن بعضی از این عوامل وابسته به ماشین گاهی اوقات امکان پذیر است ، به گونه ای که می توان تنها با تغییر پارامترهای توصیف دستگاه ، از یک قطعه کد کامپایلر برای بهینه سازی ماشینهای مختلف استفاده کرد. GCC کامپایلری است که نمونه این رویکرد را نشان می دهد. کامپایلر
مهم‌ترین علت استفاده از ترجمه کد مبدأ، ایجاد برنامه اجرایی می‌باشد. برعکس برنامه‌ای که زبان برنامه‌نویسی سطح پایین را به بالاتر تبدیل می‌کند را مترجم‌وارون گوییم. پلاس (زبان برنامه‌نویسی)
اهداف کامپایلر و زبان پلاس عبارتند از: کامپایلر چندگذری
کامپایلرهای چند گذری گاهی اوقات به نام کامپایلرهای گسترده نام‌گذاری می‌شوند که به گذرهایی با دامنهٔ وسیع‌تر اشاره دارند: آنهابه جای دیدن یک بخش کوچک از برنامه می‌توانند کل برنامهٔ در حال کامپایل را مشاهده کنند. در نتیجه دامنه گسترده‌تر به این کامپایلرها اجازه می‌دهد تا کد بهتری نسبت به خروجی کامپایلر یک گذری از لحاظ هزینهٔ زمانی و مصرف حافظه تولید کنند (به عنوان مثال کد با حجم کوچکتر، کد سریع تر). علاوه بر این، برخی از زبان‌ها را به دلیل نوع طراحیشان نمی‌توان در کامپایلرهای تک گذری کامپایل کرد. زبان اسکریپت‌نویسی
به دلیل استفاده از مفسر برای اجرای اسکریپت‌ها، دستورها یکی پس از دیگری و سطر به سطر ترجمه می‌شوند بنابراین زمان بیشتری برای اجرا گرفته و هر زمان که با اروری مواجه شوند، متوقف می‌شوند این در حالی است که کامپایلر قبل از اجرا ابتدا تمام کد را بررسی کرده و در صورت مشاهده خطا، گزارش می‌دهد. ترجمه دوگانه
کامپایلرهای متقابل از کامپایلرهای منبع‌به‌منبع دو ابزار برنامه‌نویسی متمایز هستند. یک کامپایلر متقابل برای توسعه‌ چندپلتفرمی نرم‌افزارهای کد ماشین است، در حالی که یک کامپایلر منبع‌به‌منبع متن کد را از یک زبان برنامه‌نویسی به زبان دیگر ترجمه می‌کند. کامپایلر بهینه‌ساز
در محاسبات ، کامپایلر بهینه سازی است کامپایلر که تلاش می کند برای به حداقل رساندن و یا حداکثر رساندن برخی ویژگی های یک فایل اجرایی برنامه کامپیوتری است. الزامات مشترک عبارتند از به حداقل رساندن زمان اجرای برنامه ، نیاز حافظه و مصرف برق (دو مورد مهم برای رایانه های قابل حمل ). کامپایلر
در این دوره، زبان‌ها به تدریج به وجود آمدند و ماشین‌ها چندان متعارف نبودند. مسئله این بود که چگونه باید کدی را برای یک ماشین تولید کرد. با توجه به اینکه برنامه‌نویسی به زبان اسمبلی رواج داشت، این مسئله وخیمتر شد. استفاده از کامپایلر، برنامه‌نویسی خودکار نامیده شد. طرفداران زبان‌های سطح بالا می‌ترسیدند که کد تولید شده نسبت به زبان اسمبلی کارایی چندان نداشته باشد. اولین کامپایلر فرترن (شریدان ۱۹۵۹) به خوبی بهینه‌سازی شد. توسعه نرم‌افزار سلولی
اکتوپایلر نمونه اولیه کامپایلر آی‌بی‌ام است که به توسعه دهندگان نرم‌افزار اجازه می دهد تا برای پردازنده های سلولی کد بنویسند. اندیان
همچنین، فایل‌های اجرایی برنامه ها، با توجه به نوع کامپایلر می‌تواند متفاوت باشد که این مسئله باعث می‌شود یک برنامه که توسط کامپایلر بیگ اندین کامپایل شده، در سیستم‌های لیتل اندین قابل اجرا نباشد. برخی از کامپایلرها قابلیت انتخاب ایندین توسط کاربر را دارند. برخی نیز به صورت خودکار، حالت ذخیره خود را تغییر می دهند و روی سخت افزارهای مختلف قابل اجرا هستند. در صورتی که کامپایلر از این قابلیت پشتیبانی نکند و برنامه‌نویس بخواهد که فایل کامپایل شده نرم‌افزارش بر روی تمامی سیستم‌ها اجرا شود باید خود دست به کار شود. خروجی برخی زبان‌ها مانند Java و جاوااسکریپت و PHP مستقل از سخت افزار هستند. برنامه‌های کامپایل شده JAVA، در زمان اجرا توسط JRE خوانده شده و با توجه به سخت افزار نوع آن انتخاب می‌شود اما PHP و JavaScript نیازی به کامپایل ندارند و مفسر PHP و مرورگر، آن‌ها را مانند یک فایل متنی خوانده و اجرا می‌کند. هرچند فایل‌های PHP را می‌توان با نرم‌افزارهای مختلف کامپایل کرد و این فایل‌ها و باز هم مستقل از سخت افزار هستند، چون وابسته به خود مفسر php هستند. زبان‌هایی که دارای مفسر هستند، مستقل از سخت افزار هستند، مانند زبان‌های PHP و جاوااسکریپت. این زبان‌ها برخلاف زبان‌های سطح پایین، معمولاً دسترسی چندانی به خانه‌های حافظه نمی‌دهند، هرچند برای زبان‌هایی مانند PHP می‌توان افزونه‌هایی نوشت تا دسترسی به خانه‌های حافظه را ممکن سازد اما در زبان‌هایی مانند JavaScript چنین چیزی به دلایل امنیتی غیرممکن است. کامپایلر افزایشی
نکته منفی این نوع کامپایلرهای افزایشی این است که به دلیل موقعیت مکانی و محدود بودن حوزهٔ تغییرات، نمی‌تواند به راحتی کدی را که تهیه می‌کند بهینه کند. این موضوع معمولاً مشکلی ندارد، زیرا اغلب بهینه‌سازی فقط در حالت آزادسازی انجام می‌شود. از یک کامپایلر افزایشی در طول توسعه استفاده می‌شود، و از یک کامپایلر دسته ای استاندار در آازدسازی استفاده می‌شود. کامپایلر کوچک C
به‌طور کلی، ساختار TCC به جای نتایج بهینه عملکرد بر کوچک بودن تأکید می‌کند. TCC کدها را در یک گذر واحد برنامه تولید می‌کند و اکثر بهینه‌سازی‌های انجام شده توسط دیگر کامپایلرها را انجام نمی‌دهد. TCC هر Statement برنامه‌نویسی را به تنهایی گردآوری می‌کند، و در پایان هر بیانیه مقادیر ثبت و به پشته برگردانده می‌شوند و باید دوباره خوانده شود حتی اگر خط بعدی از مقادیر در رجیسترها استفاده کند (ایجادهای ذخیره بیرونی / بار بین جفت Statement‌های برنامه‌نویسی). TCC فقط از برخی از ثبت‌های موجود استفاده می‌کند (به عنوان مثال، در x86 هرگز از ebx , esi یا edi استفاده نمی‌کند زیرا باید در فراخوانی تابع حفظ شود). بهینه‌سازی برنامه
با کامپایلرهای پیشرفته تر بهینه‌سازیو پیچیدگی CPUهای اخیر، بیشتر است که کد کارآمدتری را از آنچه که کامپایلر تولید می‌کند، بنویسید و پروژه‌های کوچک به این روش بهینه‌سازی نهایی نیاز دارند. بوت‌استرپینگ (کامپایلر)
در طی نصب برنامه‌های کامپایلر برخی اوقات لازم است که برنامه نصب کننده یا نرم‌افزار مدیریت بسته‌ها خودش به‌روزرسانی شود. الگوی رایج برای انجام این کار استفاده از یک فایل بوت‌استرپ کوچک مثلاً (setup.exe) است که نصاب را به‌روزرسانی می‌کند و فرایند نصب واقعی را پس از به‌روزرسانی آغاز می‌کند. برخی اوقات فایل بوت‌استرپ کننده، خود پیش‌نیازهای دیگری که برای نرم‌افزار لازم است را در طی فرایند بوت‌استرپ کردن نصب می‌کند. بهینه‌سازی برنامه
امروزه بهینه‌سازی خودکار تقریباً به‌طور انحصاری به بهینه‌سازی کامپایلر محدود می شود. با این حال، به دلیل اینکه بهینه‌سازی کامپایلر معمولاً به یک مجموعه ثابت و بهینه‌سازی به‌طور کلی محدود می‌شود، تقاضای قابل توجهی برای بهینه سازان وجود دارد که می‌توانند توصیف‌های مربوط به بهینه‌سازی‌های مربوط به مشکل و زبان را بپذیرند و به مهندس اجازه می‌دهد تا بهینه‌سازی‌های سفارشی را مشخص کنند. ابزارهایی که توصیف‌های بهینه‌سازی را می‌پذیرند، سیستم‌های تبدیل سیستم نامیده می‌شوند و شروع به استفاده از سیستم‌های واقعی نرم‌افزار مانند C ++ می‌شوند. کامپایلر-کامپایلر
این ابزار یک تجریه‌کننده بر مبنای الگوریتم LL می‌سازد. این ابزار متن باز می‌باشد و می‌تواند به زبان‌های مختلفی از جمله پایتون و جاوا خروجی را ارائه دهد. گنو بایسون بخشی از پروژه گنو است و با خواندن مشخصات یک زبان مستقل از متن برای آن زبان تجزیه‌کننده می‌سازد. به‌طور پیش فرض، بایسون از LALR استفاده می‌کند اما از GLR هم پشتیبانی می‌کند. وجه تمایز این ابزار استفاده از فرم باکوس نائور گسترش یافته برای توصیف زبان است. اسکنری که Coco/R می‌سازد، مانند یک ماشین تعیین‌پذیر حالات متناهی عمل می‌کند و از قابلیت تشخیص پراگما پشتیبانی می‌کند. پراگما توکن‌هایی هستند که بخشی از نحو نیستند اما در هر جایی از ورودی می‌توانند ظاهر شوند، و دستورهایی مختص کامپایلر هستند. بخشی از پروژه اس‌کیوال لایت می‌باشد. تجزیه‌کننده‌ای که Lemon می‌سازد تجزیه‌کننده ال‌ای‌ال‌آر می‌باشد و خروجی هم به زبان C است. یک (کامپایلر) این ابزار توسط S.C.Johnson در آزمایشگاه‌های بل توسعه یافته‌است. عموماً به همراه لکس استفاده می‌شود. XPL یک زبان برنامه‌نویسی بر مبنای PL/I می‌باشد به همراه کامپایلری به همین زبان و یک کامپایلر-کامپایلر که به کمک آن بتوان کامپایلرهای مشابهی برای سایر زبان‌ها پیاده‌سازی کرد. XPL جزو اولین کامپایلر-کامپایلرها هست که در ۱۹۶۷ با اهداف آموزشی توسعه یافت. کامپایلر بهینه‌ساز
محاسبات غیرضروری و مقادیر میانی را حذف کنید. کار کمتر برای پردازنده ، حافظه پنهان و حافظه معمولاً منجر به اجرای سریعتر می شود. متناوباً ، در سیستم های تعبیه شده ، کد کمتر محصول کم هزینه تری را به همراه دارد. کامپایلر
اکثر کامپایلرها به دو دسته Native و Cross تقسیم می‌شوند. کامپایلرهایی که به منظور اجرای برنامه‌ها کدهای باینری را تولید می‌کنند، کامپایلرهایی با کد محلی یا Native گوییم چرا که تنها در کامپیوترهای یک نوع با سیستم‌عاملهای یکسان قابل به‌کارگیری است. از طرف دیگر ممکن است کامپایلرها کدهای باینری را تولید کنند که در سیستم‌های مختلف قابل اجرا باشد. به این دسته از کامپایلرها که وابستگی به سخت‌افزار ندارند، کامپایلرهای عبوری یا Cross گوییم. برای این نوع کامپایلرها تنها کافی است برای بار اول سخت‌افزار را به آن معرفی نمود؛ بنابراین می‌توان نتیجه گرفت که کامپایلرهای عبوری مفیدتر هستند. این تقسیم‌بندی برای مفسرها به کار نمی‌رود زیرا آن‌ها از نمایش دودویی برای اجرای کد خود استفاده نمی‌کنند. ماشین‌های مجازی در هیچ‌یک از این دسته‌بندی‌ها نمی‌گنجد. هر گاه در ماشین‌های مجازی یکسان قابل اجرا باشد می‌توان آن را Native و هرگاه کامپایلر قادر به تولید خروجی برای پلت فورم‌های مختلف باشد آن را Cross گوییم. معماری رایانه
معماری مجموعه دستورالعمل‌ها (ISA) رابط بین نرم افزار و سخت افزار رایانه است و همچنین می‌تواند به عنوان نمای برنامه نویسان از ماشین مشاهده شود. رایانه‌ها زبان های برنامه نویسی سطح بالا مانند جاوا، C ++ یا بیشتر زبان های برنامه نویسی مورد استفاده را نمی‌فهمند. پردازنده فقط دستورالعمل‌های رمزگذاری شده را به صورت عددی، معمولاً به عنوان اعداد دودویی، می‌فهمد. ابزارهای نرم افزاری، مانند کامپایلرها، زبان‌های سطح بالا را به دستورالعمل‌هایی تبدیل می کنند که پردازنده می‌تواند آنها را درک کند. کامپایلر بهینه‌ساز
اینها یک مورد معمول از کاربردهای خاص است. نرم‌افزار جاسازی شده را می توان به طور دقیق با یک CPU و اندازه حافظه دقیق تنظیم کرد. همچنین ممکن است هزینه سیستم یا قابلیت اطمینان نسبت به سرعت کد اهمیت بیشتری داشته باشد. بنابراین ، برای مثال ، کامپایلرهای نرم‌افزار تعبیه شده معمولاً گزینه هایی را ارائه می دهند که اندازه کد را با هزینه سرعت کاهش می دهد ، زیرا حافظه اصلی ترین هزینه یک کامپیوتر تعبیه شده است. ممکن است زمان کد به جای سریعترین سرعت ممکن باشد قابل پیش بینی باشد ، بنابراین ممکن است حافظه پنهان کد به همراه بهینه سازی کامپایلر که به آن نیاز دارد غیرفعال شود. خطای کامپایل
پیام خطای کامپایل اغلب به برنامه نویسان در دیباگ کردن کد منبع کمک می‌کند. اگر چه تعاریف کامپایل کردن و تفسیر می‌تواند مبهم باشد، اما در کل خطاهای کامپایل تنها به کامپایل کردن ایستا رجوع می‌کند و نه کامپایل پویا. با این حال مهم است بدانید که کامپایل کردن پویا نیز هنوز می‌تواند خطاهایی داشته باشد، اگرچه بسیاری از برنامه نویسان و منابع ممکن است آن‌ها را به عنوان run-time-errors شناسایی کنند. اکثر کامپایلرهای just-in-time، مثل Java، از خطاهای کامپایل کردن به عنوان خطاهای نحوی یاد می‌کنند که آن‌ها را در run-time چک می‌کنند. معماری رایانه با زبان سطح بالا
مشکل اساسی این است که زبان برنامه‌نویسی سطح بالا‌ها فقط مرحله تولید کد کامپایلرها را ساده می‌کنند، که معمولاً بخش نسبتاً کوچکی از کامپایل است و استفاده مشکوک از قدرت محاسبه‌هایی (ترانزیستورها و میکروکدها) است. در حداقل نشانه‌گذاری مورد نیاز است، و معمولاً تحلیل نحوی و بررسی‌های معنایی اولیه (متغیرهای بی‌بند) همچنان انجام می‌شود؛ بنابراین هیچ فایده‌ای برای قسمت جلویی وجود ندارد و بهینه‌سازی نیاز به تجزیه و تحلیل زود هنگام دارد - بنابراین هیچ سودی برای انتهای میانی زبان برنامه‌نویسی
خروجی یک کامپایلر ممکن است با سخت‌افزار یا برنامه‌ای به نام مفسر اجرا شود. در برخی پیاده‌سازی‌ها که از مفسر استفاده می‌شود، مرز مشخصی بین کامپایل و تفسیر وجود ندارد. برای مثال، برخی پیاده‌سازی‌های زبان برنامه‌نویسی بیسیک کامپایل می‌کنند و سپس کد را خط به خط اجرا می‌کنند. آی‌ام‌پی (زبان برنامه‌نویسی)
کامپایلر برای ای پی ام در اوایل سال ۱۹۶۵ به وجود آمد؛ که استفاده می‌شد برای زبان برنامه‌نویسی (سیستم اشتراک زمان CDC-6600)و مورد استفاده در موسسه‌های دفاعی از سال ۱۹۶۷ قرار گرفت. اگر چه کامپایلر ان در مقایسه با زبان‌های غیرقابل توسعه کندتر بود ولی برای کار تولید عملی استفاده می‌شود. مرتب سازی حافظه
کامپایلرهای مدرن گاهی اوقات با استفاده از یک مفهومی به نام قاعده as-if یک گام جلوتر می‌روند، که در آن هرگونه ترتیب مجدد (حتی در بین عبارات) در صورت عدم تأثیر قابل مشاهده نتایج مفهومی برنامه مجاز است. بر اساس این قانون، ترتیب عملیات در کد ترجمه شده می‌تواند به شدت از ترتیب برنامه مشخص شده متفاوت باشد. اگر کامپایلر مجاز باشد در مورد عبارات اشاره گر متمایز بدون همپوشانی مستعار در موردی که نام مستعاری وجود دارد، مفروضات خوش‌بینانه داشته باشد (این امر معمولاً به عنوان یک برنامه نامناسب طبقه‌بندی می‌شود که رفتار نامشخصی از خود نشان می‌دهد)، نتایج نامطلوب تبدیل یک کد بهینه سازی تهاجمی غیرقابل حدس زدن قبل از اجرای کد یا بازرسی مستقیم کد می‌باشد. قلمرو رفتار تعریف نشده تظاهرات تقریباً نامحدودی دارد. کامپایل جلوتر از زمان
یک کامپایلر عادی متنی از زبان برنامه‌نویسی سطح بالا (زبان مبدأ) را به زبانی سطح پایین (زبان مقصد)، مثل اسمبلی یا زبان سطح ماشین یا بین دو زبان برنامه‌نویسی هم‌سطح تبدیل می‌کند. خروجی این برنامه ممکن است برای پردازش شدن توسط برنامه دیگری مثل پیونددهنده مناسب باشد یا فایل متنی باشد که انسان نیز بتواند آنرا بخواند. به این علت فرودبر نامگذاری شده است که کد با زبان سطح بالا را به کد زبان سطح پایین تبدیل می‌کند بدون این که در رفتار کد تغییری حاصل شود. رزلین(کامپایلر)
در این نسخه کامپایلرها از نظر ویژگی کامل نبودند. هر یک از کامپایلرها حاوی ویژگی‌هایی است که برای نسخه های بعدی زبان (C# 6 و Visual Basic.NET 14) برنامه ریزی شده است. و API ها از طریق مدیر بسته NuGet نیز در دسترس هستند. اجرا (رایانش)
سیستمی که یک برنامه را اجرا می‌کند مفسر برنامه نامیده می‌شود. به بیان عام، یک مفسر در واقع آنچه را که برنامه می‌گوید انجام می‌دهد. این با یک مترجم زبان که برنامه ای را از یک زبان به زبان دیگر تبدیل می‌کند در تضاد است. متداول‌ترین مترجمان زبان کامپایلرها هستند. مترجم‌ها به‌طور معمول منبع خود را از یک زبان سطح بالای انسانی به یک زبان سطح پایین (گاهی اوقات به اندازه کد ماشین بومی پایین) تبدیل می‌کنند که برای اجرای مستقیم پردازنده مرکزی ساده‌تر و سریع تر است. ایده این است که نسبت اجراها به ترجمه‌های یک برنامه بزرگ باشد. یعنی یک برنامه فقط باید یک بار کامپایل شود و می‌تواند هر تعداد بار اجرا شود. این می‌تواند فواید زیادی را برای ترجمه در مقابل تفسیر مستقیم از زبان مبدأ فراهم کند. نکته مهم این است که به دلیل کامپایل، زمان توسعه افزایش می‌یابد. در بعضی موارد، فقط فایل‌های تغییر یافته باید مجدداً کامپایل شوند. سپس فایل اجرایی باید مجدداً پیوند زده شود. برای برخی از تغییرات، فایل اجرایی باید دوباره از فایل مخدوش ساخته شود. با سریعتر شدن رایانه‌ها و کامپایلرها، این واقعیت کمتر مشکل ایجاد می‌کند. همچنین سرعت محصول نهایی به‌طور معمول برای کاربر مهمتر از زمان توسعه است. مترجم‌ها معمولاً یک نتیجه انتزاعی تولید می‌کنند که کاملاً آماده اجرا نیست. بیشتر اوقات، سیستم عامل درست قبل از شروع اجرای برنامه، کد هدف مترجم را به فرم اجرایی نهایی تبدیل می‌کند. بهینه‌سازی برنامه
برنامه ای که بهینه‌سازی خودکار را انجام می‌دهد بهینه‌سازی شده‌است. اکثر بهینه‌سازها در کامپایلرها جاسازی شده و در طول تدوین کار می‌کنند. بهینه سازان اغلب می‌توانند کد تولید شده را به پردازنده‌های خاصی متصل کنند. اکس۸۶
وجود دستورها مشترک در پردازشگرها باعث می‌شود که توسعه‌دهنده‌هایی که همگردان "Compiler" برنامه‌نویسی می‌کنند بر روی خانواده‌های کمتری تمرکز کنند و کارشان ساده‌تر شود. به این دلیل که تعداد پردازشگرهایی که آنها باید کدهای سطح بالایشان را به دستورها آن پردازشگرها تبدیل کنند به مراتب کمتر می‌شود. کامپایلر کوچک C
کامپایلر کوچک C (با نام مستعار tCc, TCC یا TinyCC) کامپایلر C پردازنده x86، X86-64 و ARM است که توسط فابریس بلارد ایجاد شده‌است. این کامپایلر برای کار کردن روی رایانه های کند و با فضای ذخیره‌سازی کم طراحی شده‌است (به عنوان مثال در دیسک‌های نجات). پشتیبانی سیستم عامل ویندوز در نسخه ۰٫۹٫۲۳ (۱۷ ژوئن ۲۰۰۵) اضافه شد. TCC تحت مجوز عمومی GNU توزیع شده‌است. TCC ادعا می‌کند که کلیه استاندارد C89 / C90) ANSI C) را پیاده‌سازی کرده‌است، بسیاری از استاندارد ISO C99، و بسیاری از برنامه‌های افزودنی GNU C از جمله زبان اسمبلی درون خطی پیاده‌سازی کرده‌است. کامپایل جلوتر از زمان
پیاده‌سازی کامپایل پویا شامل کامپایل کد منبع یا کد بایت به کد ماشین و اجرای آن است که به صورت مستقیم در حافظه معمولاً انجام می‌شود - کامپایلر پویا به‌طور مستقیم کد را به حافظه منتقل می‌کند و بلافاصله آن را اجرا می‌کند، برخلاف کامپایل جلوتر از زمان که کد ماشین را به صورت خروجی به دیسک منتقل می‌کند و سپس به صورت برنامهٔ جداگانه آن را فراخوانی می‌کند. کامپایلر بهینه‌ساز
بهینه سازی کامپایلر به طور کلی با استفاده از دنباله ای از "بهینه سازی دگرگونی ها" ، الگوریتم هایی که یک برنامه را انجام می دهند و آنرا تبدیل می کنند تا یک برنامه خروجی معنایی معادل که از منابع کمتری استفاده می کند یا سریعتر اجرا می شود ، استفاده می شود. نشان داده شده است که برخی از مشکلات بهینه سازی کد NP-complete یا حتی غیرقابل انکار هستند . در عمل ، عواملی مانند تمایل برنامه نویس برای منتظر ماندن کامپایلر برای انجام وظیفه ، محدودیتهای بالایی را در مورد بهینه سازی هایی که ممکن است اجرا کننده کامپایلر ارائه دهد ، قرار می دهد. (بهینه سازی به طور کلی یک فرایند برای پردازنده و حافظه است. ) در گذشته محدودیت های حافظه رایانه نیز عامل اصلی محدود کردن عملکرد بهینه سازی ها بود. به دلیل همین عوامل ، بهینه‌سازی به ندرت خروجی بهینه می‌دهد ، و در واقع یک "بهینه سازی" ممکن است در برخی موارد مانع عملکرد شود. در عوض ، آنها روش های اکتشافی برای بهبود استفاده از منابع در برنامه های معمولی هستند. دی‌کامپایلر
دیکامپایلرها در پروسه تبدیل یک فایل اجرایی به سورس کد فاز های مختلفی را طی میکنند که در ادامه فازهای مختلف آن را بررسی میکنیم. معماری جریان داده
به صورت عادی کامپایلر ها(compilers) متن اصلی برنامه(source code)را آنالیز می‌کنند تا وابستگی‌های داده‌ای میان دستورها را برای ساماندهی بهتر ترتیب دستورها، در فایل باینری خروجی، بیابد. دستورها به صورت ترتیبی ساماندهی شده‌اند ولی اطلاعات مربوط به وابستگی در فایل‌های باینری ذخیره نمی‌شوند. فایل‌های باینری ای که برای ماشین‌های گردش داده‌ای ذخیره می‌شوند، حاوی این اطلاعات وابستگی هستند. کامپایلر برای نگهداری این اطلاعات به جای استفاده از متغیرها از از برچسب‌های یکتایی استفاده می‌کند. با استفاده از این روش برچسب گذاری به قطعه کد غیر مستقل اجازه داده می‌شود که در پردازش موازی "بدون ترتیب (out of order") اجرا شود. نمایش میانی
زبان میانی مناسب سطح معنایی‌ای نزدیک به اسمبلی دارد و باید بتواند با حفظ معنا در مسیر تبدیل کد زبان منبع به کد زبان مقصد (که عموماً کد اسمبلی است) قرار بگیرد. نمایش میانی‌ای که به درستی این خاصیت را داشته باشد می‌تواند به پودمانی کامپایلر کمک کند. در چنین شرایطی کامپایلر به دو بخش کلی عقب و جلو تقسیم می‌شود که کارشان از یکدیگر مجزا است. به واسطهٔ این جدایی در کامپایلر می‌توان علاوه بر بهره بردن از طراحی ساده‌تر و قابل نگه‌داری‌تر، از یک کد چند بار استفاده کرد و به این صورت هزینهٔ توسعهٔ کامپایلرها را کاهش داد. بخش جلو، که وظیفهٔ ترجمهٔ دقیق حافظ معنا از زبان مبدأ به نمایش میانی را بر عهده دارد، تنها به زبان منبع وابسته است و کاملاً از بخش عقب که وظیفهٔ ترجمه دقیق از نمایش میانی به زبان مقصد را برعهده دارد و به زبان مقصد وابسته است جداست؛ بنابراین می‌تواند برای زبان‌های مبدأ و مقصد متفاوت به صورت مجزا بخش‌های عقب و جلو را طراحی کرد و در نهایت به یکدیگر متصلشان کرد. از آنجایی که زبان مقصد عموماً زبان ماشین است، عموماً بخش عقب به زبان ماشین وابسته است. کامپایلر افزایشی
بسیاری از ابزارهای برنامه‌نویسی از مزایای کامپایلرهای افزایشی استفاده می‌کنند تا محیط برنامه‌نویسی بسیار تعاملی تری را در اختیار توسعه دهندگان قرار دهند. این غیر معمول نیست که یک کامپایلر افزایشی برای هر تغییر کد منبع فراخوانده شود، به گونه ای که توسعه دهنده تقریباً بلافاصله در مورد هرگونه خطای کامپایلرکه در نتیجه تغییر او در کد بوجود آمده، مطلع شود. کامپایلر بهینه‌ساز
اینها در مورد جمله هایی که یک حلقه را تشکیل می دهند ، مانند حلقه "for" (مانند حرکت کد حلقه بدون تغییر ) عمل می کنند. بهینه سازی حلقه می تواند تأثیر بسزایی داشته باشد زیرا بسیاری از برنامه ها درصد زیادی از زمان خود را در حلقه ها می گذرانند. کامپایلر تک‌گذره
کامپایلر تک‌گذره (one-pass compiler) کامپایلری است که بخش های کامپایل شونده را فقط یک بار می‌خواند که در این خوانش فورا هر بخش از کد را به زبان ماشین ترجمه می‌کند. این نوع کامپایلر در مقابل کامپایلر های چندگذره قرار می‌گیرد. کامپایر های چندگذره قبل از تبدیل نهایی کد به زبان ماشین ، آن را به چند نمایش میانی تبدیل میکنند و در هر کدام از این تبدیل ها از همه بخش های کامپایل شونده استفاده می‌کنند. قراردادهای فراخوانی اکس۸۶
برخی تغییرات در بیان cdecl, به ویژه در نحوه بازگشت مقادیر وجود دارد. در نتیجه، برنامه‌های کامپایل شده توسط x86 با سیستم عامل‌های مختلف یا کامپایلرهای مختلف می‌تواند ناسازگار باشد، حتی اگر آن‌ها هر دو از قراردادهای "cdecl" استفاده کنند و به محیط زیر وابسته نباشند. بعضی از کامپایلرها ساختار داده‌های ساده را با طول ۲ ثبّات یا کمتر در جفت ثبّات EAX: EDX برمی‌گردانند، و ساختارهای بزرگتر و اشیاء کلاس‌ها که نیاز به رفتار ویژه توسط رسیدگی کنندهٔ استثنا دارند (مانند سازندهٔ تعریف شده، تخریب‌کننده یا اختصاص دادن) به حافظه برگرداننده می‌شوند. برای انتقال "در حافظه"، فراخوانی‌کننده حافظه را اختصاص می‌دهد و یک اشاره گر به آن را به عنوان پارامتر پنهان می‌دهد؛ فراخوانی شده حافظه را پر می‌کند و اشاره گر را برمی‌گرداند (هنگام بازگشت اشاره گر پنهان برداشته می‌شود). رزلین(کامپایلر)
رزلین (به انگلیسی: Roslyn) مجموعه‌ای از کامپایلرهای متن‌باز و رابط‌های برنامه‌نویسی کاربردی یا ای‌پی‌آی (به انگلیسی: Application Programming Interface به اختصار API) برای تحلیل برنامه‌هایی به زبان #C و Visual Basic .NET است و توسط مایکروسافت ارائه شده‌است. زبان توصیف سخت‌افزار
از سوی دیگر، یک کامپایلر نرم‌افزار کد منبع را به یک کد شی ریزپردازنده خاص برای اجرا در ریزپردازنده هدف تبدیل می‌کند. چون HDLها و زبان‌های برنامه‌نویسی قرض می‌کنند مفاهیم و ویژگی‌هایی از یکدیگر، مرز بین آن‌ها کمتر نامشخص شده‌است. با این حال، HDL خالص برای اهداف عمومی توسعه نرم‌افزار کاربردی نامناسب هستند، همان‌طور که زبان‌های برنامه‌نویسی همه منظوره برای مدلسازی سخت‌افزار مناسب نیستند. با این حال، چون سیستم‌های الکترونیکی رشد فزاینده پیچیده‌ای دارند، و سیستم‌های قابل پیکربند به‌طور فزاینده رایج شده‌اند، تمایل به رشد در صنعت برای یک زبان واحد وجود دارد که می‌تواند برخی از وظایف هر دو طراحی سخت‌افزار و برنامه‌نویسی نرم‌افزار را انجام دهند. System C یک نمونه از سخت‌افزار سیستم تعبیه شده‌است که می‌تواند بلوک‌های غیرجزئی معماری (جعبه سیاه با ورودی سیگنال مدل و درایور خروجی) را مدل کند. کتابخانه زمان اجرا
در برنامه نویسی کامپیوتر، کتابخانه زمان اجرا مجموعه‌ای از روال سطح پایین است که توسط کامپایلر به منظور فراخوانی برخی از رفتارهای یک محیط زمان اجرا، استفاده شده‌ است، از طریق قرار دادن تماس با کتابخانه زمان اجرا، در باینری قابل اجرای گردآوری شده محیط زمان اجرا مدل اجرا را پیاده می‌کند. توابع توکار و دیگر رفتارهای اساسی یک زبان برنامه نویسی. در حین اجرای (زمان اجرا) آن نوع برنامه کامپیوتر، فراخوانی به کتابخانه زمان اجرا باعث ارتباطات بین باینری اجرایی و محیط زمان اجرا می‌گردد. کتابخانه زمان اجرا اغلب شامل ساخته شده در توابع برای مدیریت حافظه یا برای استثناء رسیدگی؛ بنابراین، یک کتابخانه زمان اجرا همیشه مختص به پلت فرم و کامپایلر است. کامپایل جلوتر از زمان
در کامپایل جلوتر از زمان کامپایل زبان‌های برنامه‌نویسی سطح بالا یا داده ساختار یا کدی که کامپایلر برای نشان دادن سورس کد استفاده می‌کند را به کد ماشین تبدیل می‌شود تا فایل باینری بتواند در محل اجرا شود.