فهرست مندرجات
کامپایلر در برابر مفسر (Compiler vs. Interpreter)
تعریف کوتاه
کامپایلر (Compiler) نرمافزاری است که کد منبع یک برنامه را به نمایش دیگری از برنامه، مانند کد ماشین، کد میانی یا بایتکد، تبدیل میکند. هدف و نوع خروجی به زبان برنامهنویسی، کامپایلر و تنظیمات آن بستگی دارد.
مفسر (Interpreter) نرمافزار یا بخشی از محیط اجراست که دستورهای برنامه یا نمایش میانی آن را اجرا میکند. مفسر ممکن است کد منبع را مستقیماً پردازش کند یا ابتدا آن را به شکل دیگری تبدیل کند.
تفاوت اصلی این دو مفهوم در نقش آنها در فرایند اجرای برنامه است، نه صرفاً در اینکه یکی کل برنامه را پیش از اجرا پردازش میکند و دیگری خطبهخط جلو میرود.
معادل فارسی
- Compiler: کامپایلر؛ گاهی «ترجمهگر» یا «برنامهٔ کامپایلکننده» نیز گفته میشود.
- Interpreter: مفسر؛ گاهی «برنامهٔ تفسیرکننده» نیز به کار میرود.
- Compilation: کامپایل یا ترجمهٔ برنامه.
- Interpretation: تفسیر و اجرای برنامه توسط مفسر.
در متون فنی فارسی، «کامپایلر» و «مفسر» رایجاند و معمولاً از ترجمهٔ لفظی آنها قابلفهمتر هستند.
کامپایلر چگونه کار میکند؟
کامپایلر کد منبع را پردازش میکند و آن را به خروجی مورد نیاز تبدیل میکند. در یک زنجیرهٔ ساخت متداول برای زبانهایی مانند 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 |
این جدول تفاوتهای رایج را نشان میدهد، نه قانونی مطلق برای تمام زبانها و پیادهسازیها.
آیا زبانها کامپایلشده یا تفسیری هستند؟
اصطلاحهای «زبان کامپایلشده» و «زبان تفسیری» برای سادهسازی مفیدند، اما همیشه توصیف دقیقی از نحوهٔ اجرای یک پیادهسازی مشخص نیستند.
برای نمونه:
- C: معمولاً با کامپایلرهایی مانند GCC به کد ماشین ترجمه میشود و سپس فایل خروجی اجرا میشود.
- Python: در CPython، کد منبع به بایتکد تبدیل میشود و مفسر آن را اجرا میکند.
- Java: کد منبع معمولاً با `javac` به بایتکد JVM تبدیل میشود؛ ماشین مجازی جاوا میتواند بایتکد را تفسیر کند یا بخشهایی از آن را با کامپایل در لحظهٔ اجرا (JIT) به کد ماشین تبدیل کند.
- JavaScript: موتورهای مدرن میتوانند از ترکیبی از تفسیر و کامپایل JIT استفاده کنند.
پس بهتر است بهجای برچسب زدن مطلق به یک زبان، دربارهٔ پیادهسازی، ابزارها و مدل اجرای آن صحبت کنیم.
تفاوت با اصطلاحات مرتبط
کامپایلر در برابر مفسر
کامپایلر معمولاً مسئول تبدیل برنامه به نمایش دیگری از آن است، در حالی که مفسر مسئول اجرای برنامه یا نمایش میانی آن است. یک سامانه میتواند هر دو را داشته باشد؛ برای مثال، CPython ابتدا بایتکد تولید میکند و سپس آن را اجرا میکند.
کامپایلر در برابر اسمبلر (Assembler)
کامپایلر کد یک زبان برنامهنویسی را به نمایش دیگری تبدیل میکند. اسمبلر دستورهای زبان اسمبلی را به کد ماشین یا فایل شیء تبدیل میکند. در بسیاری از زنجیرههای ساخت، خروجی کامپایلر به اسمبلر داده میشود.
کامپایلر در برابر پیونددهنده (Linker)
کامپایلر کد را ترجمه میکند. پیونددهنده فایلهای شیء و کتابخانهها را به هم مرتبط میکند تا خروجی نهایی مورد نیاز ساخته شود. این دو ابزار نقشهای متفاوتی دارند، هرچند ابزارهایی مانند GCC میتوانند چند مرحله از زنجیرهٔ ساخت را پشت یک فرمان اجرا کنند.
مفسر در برابر محیط اجرا (Runtime)
مفسر بخشی از سازوکار اجرای برنامه است. محیط اجرا مفهوم گستردهتری دارد و میتواند شامل مفسر، کتابخانههای زمان اجرا، مدیریت حافظه و اجزای دیگر باشد.
کامپایل در برابر کامپایل در لحظهٔ اجرا (JIT)
در کامپایل سنتی، ترجمه معمولاً پیش از اجرای برنامه انجام میشود. در JIT، کد در زمان اجرای برنامه کامپایل میشود؛ مثلاً ماشین مجازی میتواند بخشهایی از برنامه را که زیاد اجرا میشوند به کد ماشین تبدیل کند.
اشتباهات رایج
- «کامپایلر همیشه کل برنامه را یکجا ترجمه میکند.» این توصیف برای بسیاری از ابزارها سادهسازی بیش از حد است؛ کامپایل میتواند مرحلهای، ماژولار یا در زمان اجرا باشد.
- «مفسر همیشه کد را خطبهخط اجرا میکند.» این تعریف دقیقی نیست. مفسر ممکن است ابتدا کد را به نمایش میانی تبدیل کند و سپس آن را اجرا کند.
- «پایتون کامپایل نمیشود.» در CPython، کد پایتون به بایتکد تبدیل میشود؛ سپس مفسر بایتکد آن را اجرا میکند.
- «هر برنامهٔ کامپایلشده بدون هیچ وابستگی اجرا میشود.» فایل اجرایی ممکن است همچنان به کتابخانههای مشترک، سیستمعامل سازگار یا اجزای دیگر نیاز داشته باشد.
- «کامپایلشده همیشه سریعتر از تفسیری است.» کارایی به پیادهسازی، الگوریتم، بهینهسازی، بار کاری و محیط اجرا بستگی دارد. کامپایل JIT نیز میتواند عملکرد را تغییر دهد.
- «هر زبان فقط یکی از این دو روش را دارد.» یک زبان میتواند چند پیادهسازی با مدلهای اجرای متفاوت داشته باشد.
جمعبندی
کامپایلر و مفسر دو مفهوم مرتبط اما متفاوتاند. کامپایلر کد را به نمایش دیگری تبدیل میکند و مفسر برنامه یا نمایش میانی آن را اجرا میکند. در پیادهسازیهای واقعی، این نقشها میتوانند در یک زنجیرهٔ اجرا با یکدیگر ترکیب شوند؛ بنابراین برای فهمیدن نحوهٔ اجرای یک زبان باید پیادهسازی مشخص آن را بررسی کرد.
