کامپایلر (Compiler) نرمافزاری است که کد منبع یک برنامه را به نمایش دیگری از برنامه، مانند کد ماشین، کد میانی یا بایتکد، تبدیل میکند. هدف و نوع خروجی به زبان برنامهنویسی، کامپایلر و تنظیمات آن بستگی دارد.
مفسر (Interpreter) نرمافزار یا بخشی از محیط اجراست که دستورهای برنامه یا نمایش میانی آن را اجرا میکند. مفسر ممکن است کد منبع را مستقیماً پردازش کند یا ابتدا آن را به شکل دیگری تبدیل کند.
تفاوت اصلی این دو مفهوم در نقش آنها در فرایند اجرای برنامه است، نه صرفاً در اینکه یکی کل برنامه را پیش از اجرا پردازش میکند و دیگری خطبهخط جلو میرود.
در متون فنی فارسی، «کامپایلر» و «مفسر» رایجاند و معمولاً از ترجمهٔ لفظی آنها قابلفهمتر هستند.
کامپایلر کد منبع را پردازش میکند و آن را به خروجی مورد نیاز تبدیل میکند. در یک زنجیرهٔ ساخت متداول برای زبانهایی مانند C، مراحل ممکن است شامل پیشپردازش، کامپایل، اسمبل و پیونددهی (Linking) باشند.
برای مثال، برنامهٔ زیر را در فایل `hello.c` ذخیره کنید:
#include <stdio.h> int main(void) { printf("Hello, world!\n"); return 0; }
با نصب کامپایلر GCC میتوان برنامه را در لینوکس به این شکل ساخت و اجرا کرد:
gcc hello.c -o hello ./hello
در این مثال، `gcc` کد را پردازش میکند و فایل اجراییای با نام `hello` میسازد. سپس سیستمعامل آن فایل را اجرا میکند.
نکته: جزئیات دقیق مراحل ساخت به ابزارها، گزینههای استفادهشده و پلتفرم بستگی دارد. کامپایل همیشه به تولید یک فایل اجرایی مستقل منتهی نمیشود.
مفسر مسئول اجرای برنامه در یک محیط اجرایی است. بسته به پیادهسازی زبان، ممکن است کد منبع را پردازش کند، آن را به نمایش میانی تبدیل کند یا بایتکد تولیدشده را اجرا کند.
برای نمونه، فایل `hello.py` را با محتوای زیر بسازید:
print("Hello, world!")
سپس در محیطی که Python نصب است اجرا کنید:
python3 hello.py
در پیادهسازی رایج CPython، کد پایتون ابتدا به بایتکد تبدیل میشود و سپس مفسر بایتکد آن را اجرا میکند. بنابراین این تصور که پایتون هیچ مرحلهٔ کامپایلی ندارد، درست نیست.
| ویژگی | کامپایلر (Compiler) | مفسر (Interpreter) |
|---|---|---|
| نقش اصلی | تبدیل کد به نمایش دیگری از برنامه | اجرای برنامه یا نمایش میانی آن |
| زمان انجام کار | ممکن است پیش از اجرا یا در زمان اجرا باشد | معمولاً هنگام اجرای برنامه فعال است |
| خروجی | ممکن است کد ماشین، فایل شیء، بایتکد یا نمایش میانی باشد | ممکن است خروجی مستقیمی تولید نکند و برنامه را اجرا کند |
| فایل اجرایی مستقل | در برخی زنجیرههای ساخت تولید میشود | لزوماً تولید نمیشود |
| وابستگی به محیط اجرا | به نوع خروجی و پلتفرم بستگی دارد | معمولاً به پیادهسازی مفسر یا محیط اجرایی نیاز دارد |
| نمونه | GCC برای C | مفسر بایتکد در CPython |
این جدول تفاوتهای رایج را نشان میدهد، نه قانونی مطلق برای تمام زبانها و پیادهسازیها.
اصطلاحهای «زبان کامپایلشده» و «زبان تفسیری» برای سادهسازی مفیدند، اما همیشه توصیف دقیقی از نحوهٔ اجرای یک پیادهسازی مشخص نیستند.
برای نمونه:
پس بهتر است بهجای برچسب زدن مطلق به یک زبان، دربارهٔ پیادهسازی، ابزارها و مدل اجرای آن صحبت کنیم.
کامپایلر معمولاً مسئول تبدیل برنامه به نمایش دیگری از آن است، در حالی که مفسر مسئول اجرای برنامه یا نمایش میانی آن است. یک سامانه میتواند هر دو را داشته باشد؛ برای مثال، CPython ابتدا بایتکد تولید میکند و سپس آن را اجرا میکند.
کامپایلر کد یک زبان برنامهنویسی را به نمایش دیگری تبدیل میکند. اسمبلر دستورهای زبان اسمبلی را به کد ماشین یا فایل شیء تبدیل میکند. در بسیاری از زنجیرههای ساخت، خروجی کامپایلر به اسمبلر داده میشود.
کامپایلر کد را ترجمه میکند. پیونددهنده فایلهای شیء و کتابخانهها را به هم مرتبط میکند تا خروجی نهایی مورد نیاز ساخته شود. این دو ابزار نقشهای متفاوتی دارند، هرچند ابزارهایی مانند GCC میتوانند چند مرحله از زنجیرهٔ ساخت را پشت یک فرمان اجرا کنند.
مفسر بخشی از سازوکار اجرای برنامه است. محیط اجرا مفهوم گستردهتری دارد و میتواند شامل مفسر، کتابخانههای زمان اجرا، مدیریت حافظه و اجزای دیگر باشد.
در کامپایل سنتی، ترجمه معمولاً پیش از اجرای برنامه انجام میشود. در JIT، کد در زمان اجرای برنامه کامپایل میشود؛ مثلاً ماشین مجازی میتواند بخشهایی از برنامه را که زیاد اجرا میشوند به کد ماشین تبدیل کند.
کامپایلر و مفسر دو مفهوم مرتبط اما متفاوتاند. کامپایلر کد را به نمایش دیگری تبدیل میکند و مفسر برنامه یا نمایش میانی آن را اجرا میکند. در پیادهسازیهای واقعی، این نقشها میتوانند در یک زنجیرهٔ اجرا با یکدیگر ترکیب شوند؛ بنابراین برای فهمیدن نحوهٔ اجرای یک زبان باید پیادهسازی مشخص آن را بررسی کرد.