کامپایلرها برنامههای سطح بالا (خوانا برای انسانها مانند C، C++، Fortran) را به زبان ماشین (فایلهای اجرایی یا executables) ترجمه میکنند. کامپایلرها برنامهها را به لحاظ گرامری وارسی میکنند اما کاری با ایرادهای منطقی برنامهها ندارند. فایلهای اجرایی ترجمه شده قابل انتقال نیستند. برای مثال زمانی که یک برنامه را برای Windows کامپایل میکنید، یک فایل اجرایی خواهید داشت که بر روی Linux قابل اجرا نیست. کامپایلرها علاوه بر ترجمه کردن، زیر برنامهها [1] را با هم پیوند (link) میدهند.
زبانهایی مانند C، C++، Fortran کامپایلر دارند. در این حالت ابتدا کل برنامه به زبان ماشین ترجمه میشود. اما زبانهایی مانند Python و Java کامپایلر ندارند و در عوض Interpreter دارند که برنامه را خط به خط میخواند و به زبان میانی [2] تبدیل میکند و بلافاصله اجرایش میکند.
پیش از پیدایش کامپایلرها، مردم از زبان assembly برای انتقال محاسبات به ماشینها استفاده میکردند. مشکل این بود که کار با assembly خیلی خیلی طاقتفرسا بود و مجموعه دستورات و اعمال بسته به نوع ماشین متفاوت بودند. به همین دلیل مردم به زبانهای سطح بالا روی آوردند. اما زبانهای سطح بالا نیاز به کامپایلری داشت تا مجموعه دستورات و اعمال را از برنامه سطح بالا استخراج کند و به زیان assembly تبدیل کند.
اولین کامپایلرها با زبان assembly نوشته شدهاند و به تدریج پیچیدهتر شدهاند. اولین اسمبلرها (assemblers) به صورت دستی نوشته شدهاند. همین اسمبلرها برای اسمبل کردن اسبملرهای پیچیدهتر استفاده شدهاند. این فرایند مرحله به مرحله در علوم کامپیوتر bootstrapping نامیده میشود. طی این فرایند است که کامپایلرهای خود کامپایل شونده تولید میشوند.
سمت چپ، یک کد C و سمت راست ترجمه کد به زبان assembly. رنگها به شما کمک میکند که هر بخش از کد C را با بخش متناظر assembly تطبیق دهید. برای اطلاعات بیشتر این اینجا را ببنید.
یک نرمافزار معمولا از تعداد زیادی زیر برنامه تشکیل شده است که باید جداگانه کامپایل و سپس با هم لینک شوند. ↩︎
زبان میانی هنوز برای ماشین قابل اجرا نیست و نیاز به یک مرحله ترجمه دارد. ↩︎