جلسه سیزدهم
مقدمه
برای اجرای برنامههایی که به زبانهای برنامهنویسی سطح بالا نوشته میشوند، لازم است کد برنامه به زبانی تبدیل شود که کامپیوتر قادر به درک آن باشد. این کار معمولاً توسط کامپایلر یا مفسر انجام میشود. طراحی این ابزارها یکی از موضوعات مهم در حوزهٔ طراحی زبانهای برنامهنویسی است.
۱) کامپایلر چیست؟
کامپایلر برنامهای است که کد منبع نوشتهشده به یک زبان برنامهنویسی را به کد ماشین یا کد سطح پایین تبدیل میکند.
ویژگیهای کامپایلر
- کل برنامه را قبل از اجرا ترجمه میکند.
- خروجی آن معمولاً یک فایل اجرایی مستقل است.
- پس از کامپایل، اجرای برنامه سریعتر انجام میشود.
مزایا
- سرعت اجرای بالا
- تشخیص بسیاری از خطاها در زمان کامپایل
- امکان بهینهسازی کد
نمونه زبانها
C، C++، Go، Rust
۲) مفسر چیست؟
مفسر برنامهای است که کد منبع را خطبهخط خوانده و همان لحظه اجرا میکند.
ویژگیهای مفسر
- ترجمه و اجرا همزمان انجام میشود.
- معمولاً فایل اجرایی جداگانه تولید نمیکند.
- خطاها هنگام اجرا مشخص میشوند.
مزایا
- توسعه و آزمایش سریعتر
- مناسب برای اسکریپتها و برنامههای کوچک
- انعطافپذیری بالا
نمونه زبانها
Python، JavaScript، Ruby
۳) تفاوت کامپایلر و مفسر
روش اجرا
- کامپایلر: ابتدا ترجمه کامل، سپس اجرا
- مفسر: ترجمه و اجرا بهصورت همزمان
سرعت اجرا
- کامپایلر: معمولاً سریعتر
- مفسر: معمولاً کندتر
مدیریت خطا
- کامپایلر: خطاها پیش از اجرا گزارش میشوند
- مفسر: خطاها هنگام اجرای برنامه مشخص میشوند
خروجی
- کامپایلر: فایل اجرایی تولید میکند
- مفسر: مستقیماً برنامه را اجرا میکند
۴) مراحل اصلی کار یک کامپایلر
تحلیل واژگانی (Lexical Analysis)
در این مرحله، کد منبع به واحدهای کوچکی به نام توکن تقسیم میشود؛ مانند شناسهها، اعداد، عملگرها و کلمات کلیدی.
تحلیل نحوی (Syntax Analysis)
در این مرحله بررسی میشود که توکنها مطابق قواعد گرامری زبان قرار گرفتهاند یا خیر. نتیجه معمولاً یک درخت نحوی است.
تحلیل معنایی (Semantic Analysis)
در این مرحله معنی دستورات بررسی میشود؛ مانند سازگاری نوع دادهها و تعریف بودن متغیرها.
تولید کد میانی (Intermediate Code Generation)
کد برنامه به یک شکل میانی تبدیل میشود که مستقل از ماشین است.
بهینهسازی کد (Code Optimization)
کد میانی بهینه میشود تا کارایی بهتر و مصرف منابع کمتر داشته باشد.
تولید کد نهایی (Code Generation)
در نهایت کد ماشین یا کد سطح پایین تولید میشود که قابل اجرا روی سختافزار است.
۵) ساختار ساده یک مفسر
مفسر نیز معمولاً چند مرحله مشابه دارد، اما تولید فایل اجرایی انجام نمیدهد. مراحل معمول عبارتاند از:
- خواندن کد منبع
- تحلیل واژگانی
- تحلیل نحوی
- تفسیر مستقیم ساختار برنامه و اجرای دستورات
۶) مثال ساده از کار مفسر
فرض کنید برنامهای شامل یک عبارت ساده باشد:
a = 3 + 5
مراحل تفسیر ممکن است به شکل زیر باشد:
شناسایی توکنها:
- شناسه: a
- عملگر انتساب
- عدد: 3
- عملگر جمع
- عدد: 5
بررسی ساختار عبارت طبق قواعد زبان
محاسبهٔ عبارت
- 3 + 5 = 8
ذخیرهٔ نتیجه در متغیر a
۷) زبانهای ترکیبی (Hybrid)
برخی زبانها ترکیبی از کامپایل و تفسیر را استفاده میکنند.
مثال
Java
- ابتدا کد به بایتکد کامپایل میشود.
- سپس توسط ماشین مجازی (JVM) اجرا یا تفسیر میشود.
Python نیز ابتدا به بایتکد تبدیل شده و سپس توسط مفسر اجرا میشود.
۸) اهمیت طراحی مفسر و کامپایلر
- امکان اجرای زبانهای برنامهنویسی
- بهینهسازی عملکرد برنامهها
- کشف خطاهای برنامه
- فراهمکردن بستر برای ایجاد زبانهای جدید
۹) جمعبندی
- برای اجرای برنامهها باید کد سطح بالا به زبان قابل فهم برای ماشین تبدیل شود.
- کامپایلر کل برنامه را ترجمه کرده و فایل اجرایی تولید میکند.
- مفسر کد را خطبهخط ترجمه و اجرا میکند.
- طراحی کامپایلر شامل مراحل تحلیل واژگانی، نحوی، معنایی، تولید کد و بهینهسازی است.
- برخی زبانها از ترکیبی از این دو روش استفاده میکنند.