طراحی کامپایلر و انواع تحلیل در آن (آموزش صفر تا صد)
هر فرد در حوزه برنامه نویسی حداقل یکبار از کامپایلر استفاده کرده است یا حتماً نام آن را شنیده یا خوانده است. آیا تا به حال به نحوه عملکرد یک کامپایلر فکر کرده اید؟ در این آموزش درباره طراحی ساختار یک کامپایلر بحث خواهیم کرد.
در اصل یک کد باید از سطوح متفاوتی عبور کند تا از یک زبان سطح بالا به زبان اسمبلی تبدیل شود و همه اینها در کامپایلر پنهان است.
شکل زیر نمودار پایه یک کامپایلر را نشان می دهد:
همانطور که می بینیم یک کامپایلر در مجموع از 6 سطح مختلف تشکیل شده است. چهار مورد اول با هم گروه بندی شده اند و فرانت- اند (frontend) نامیده می شوند و دو قسمت آخر نیز با در یک گروه به عنوان بک- اند (backend) قرار می گیرند.
قسمت فرانت- اند هر گونه خطا در کد مانند خطاهای نحوی، دستور زبان یا لغوی را بررسی می کند در حالیکه قسمت بک- اند برنامه را با گروه بندی قسمت های کد برنامه را ساده کرده و آن را تولید می کند.
فرآیندهای داخلی کامپایلر
وقتی یک قطعه کد به هر زبانی بنویسیم و آن را کامپایل کنیم، اولین کاری که کامپایلر انجام می دهد این است که انواع خطا در کد را در تحلیل فرانت- اند بررسی می کند.
تحلیل لغوی در کامپایلر
وقتی یک کد زبان سطح بالا از تحلیل لغوی عبور می کند، جریانی از توکن ها ایجاد می شود اما قبل از توضیح آن باید با پیش پردازنده ها آشنا باشیم. وظیفه یک پیش پردازنده این است که با حذف فایل های هدر، جریان کاراکترها را فیلتر کند و سپس آن را به قسمت تحلیل لغوی بفرستد.
نکته: جریان کاراکترها چیزی نیست جز کاراکترهای صفحه کلید که در کد از آنها استفاده می کنیم؛ مانند:
int a = 23;
printf(” Hello World! “);
اما توکن چیست؟
کد کوتاه زیر را در نظر بگیرید:
a = 10;
در اینجا هر کدام از قسمت های ؛a، =، 10، یک توکن هستند.
در اصل یک توکن بخش مهمی از کد است. چرا مهم است؟ چون کامنت ها و کاراکترهایی مانند فاصله یا خط جدید یا تب ها به عنوان توکن در نظر گرفته نمی شوند.
این توکن ها به جدول نماد منتقل می شوند. نقش جدول نماد به دست آوردن ویژگی های توکن ها یا متغیرها مانند نوع، اندازه ، محدوده و … است. جدول نماد به همه مراحل کامپایلر وصل است همانطور که در نمودار می بینیم.
پس از تبدیل همه کد ها به توکن ها به تحلیل نحوی فرستاده می شود.
تحلیل نحوی در کامپایلر
این قسمت بررسی می شود که آیا کد از لحاظ نحو (یا همان سینتکس یا ساختار گرامری) درست است یا خیر. در اینجا یک تجزیه کننده استفاده می شود و خروجی آن یک درخت تجزیه است چونکه شبیه یک درخت می شود:
اگر خطایی در سینتکس کد وجود داشته باشد، در این مرحله خطا رخ می دهد.
تحلیل معنایی در کامپایلر
تحلیل معنایی درخت تجزیه را بررسی می کند و خطاهای معنایی را پیدا می کند. توجه داشته باشید که این تحلیل به ساختار نحوی اهمیتی نمی دهد اما بررسی می کند که آیا مقدار متغیر مطابق با نوع اعلان شده است، محدوده یک نوع داده خاص فراتر نمی رود یا اینکه متغیرها به درستی اعلان شده اند یا خیر.
حتما بخوانید: چگونه برنامه نویس حرفه ای شویم؟
تولید کد میانی در کامپایلر
این قسمت مرز وسط بین فرانت- اند و بک- اند است، کدی ایجاد می کند که توسط بک- اند قابل درک است یعنی یک کد مستقل از ماشین (مستقل از سیستم عامل). یک کد 3 آدرسه ایجاد می کند کد به 3 عبارت متغیر تقسیم می شود، یعنی اینکه که حداکثر 3 آدرس می تواند در یک دستور وجود داشته باشد، سپس آن را به 2 یا 3 خط کد تقسیم می شود.
تقسیم کد بالا به دو خط:
x = c * d;
a = b + x;
این یک کد 3 آدرسه به سطح بعدی یعنی قسمت بهینه سازی کد ارسال می شود.
بهینه سازی کد در کامپایلر
از اینجا قسمت بک- اند شروع می شود و بهینه سازی کد اولین مرحله از بک اند است. همانطور که از نام آن پیدا است، این قسمت کد را بهینه سازی می کند. چیز زیادی برای گفتن درباره آن وجود ندارد زیرا همه می دانیم بهینه سازی چیست. به عنوان مثال نماد + بسیار ساده تر از نماد * است، بنابراین:
x = 4 * y
کد بالا می تواند به کد زیر تبدیل شود:
x = y + y + y + y
// or
z = y + y;
x = z + z;
تولید کد هدف در کامپایلر
در اینجا تولید کننده کد، نسخه بهینه شده از کد میانی را می گیرد و آن را به زبان ماشین مورد نظر لینک می دهد. کد میانی را به دنباله ای از کدهای ماشین با قابلیت مکان یابی مجدد ترجمه می کند. کد ماشین تولید شده همانند کد میانی عمل می کند.
علاوه بر جدول نماد یک مدیریت خطا نیز وجود دارد که به تمام مراحل متصل است و مسئول رسیدگی به خطاهای تشخیص داده شده توسط فرانت- اند است
در نهایت، کد اصلی نوشته شده به کد اسمبلی یا کد دستگاه تبدیل می شود.
حتما در کنار این مطلب دانلود کنید: آموزش همه زبانهای برنامه نویسی از صفر (رایگان)
آموزش ویدیویی طراحی کامپایلر در 9 جلسه
هر لینکی کار نکرد در بخش نظرات اعلام کنید تا مشکل رفع شود:
درس 1
درس 2
درس 3
درس 4
درس 5
درس 6
درس 7
درس 8
درس 9 (آخر)
۱. مفاهیم پایهای طراحی کامپایلر
-
کامپایلر چیست؟ توضیح دادیم که کامپایلر یک برنامه است که کد منبع نوشتهشده به یک زبان برنامهنویسی سطح بالا را به کد ماشین یا کد قابل اجرا تبدیل میکند.
-
مراحل کامپایل: فرآیند کامپایل شامل چندین مرحله است که هر کدام وظیفه خاصی را انجام میدهند. این مراحل به دو بخش اصلی تقسیم میشوند: Front End و Back End.
۲. مراحل Front End
الف. تحلیل لغوی (Lexical Analysis)
-
وظیفه: تبدیل کد منبع به توکنها (Token).
-
توکن چیست؟ کوچکترین واحد معنادار در کد منبع، مانند کلمات کلیدی، عملگرها و شناسهها.
-
مثال: کد
int x = 10;
به توکنهایint
,x
,=
,10
,;
تبدیل میشود.
ب. تحلیل نحوی (Syntax Analysis)
-
وظیفه: بررسی ساختار دستوری کد منبع و ایجاد درخت نحوی (Parse Tree).
-
درخت نحوی چیست؟ نمایش سلسلهمراتبی ساختار دستوری کد منبع.
-
مثال: بررسی صحت دستور
if (x > 10) { ... }
.
ج. تحلیل معنایی (Semantic Analysis)
-
وظیفه: بررسی معنا و منطق کد منبع.
-
مثال: بررسی نوع دادهها و تطابق آنها در عملیاتها.
۳. مراحل Back End
الف. تولید کد میانی (Intermediate Code Generation)
-
وظیفه: تولید کد میانی که به زبان ماشین نزدیکتر است.
-
مثال: تولید کد سهآدرسی (Three-Address Code) مانند
t1 = x + y
.
ب. بهینهسازی کد (Code Optimization)
-
وظیفه: بهبود کارایی کد میانی با حذف کدهای اضافی و استفاده از تکنیکهای بهینهسازی.
-
مثال: حذف کدهای مرده (Dead Code Elimination).
ج. تولید کد ماشین (Code Generation)
-
وظیفه: تبدیل کد میانی به کد ماشین یا کد اسمبلی.
-
مثال: تولید کد اسمبلی مانند
MOV AX, 10
.
۴. ابزارهای طراحی کامپایلر
الف. Lex و Yacc
-
Lex: ابزاری برای تولید تحلیلگر لغوی.
-
Yacc: ابزاری برای تولید تحلیلگر نحوی.
ب. ANTLR
-
یک ابزار قدرتمند برای تولید تحلیلگرهای لغوی و نحوی.
ج. LLVM
-
یک مجموعه ابزار برای تولید کد میانی و بهینهسازی.
۵. مثال ساده طراحی کامپایلر
الف. تحلیل لغوی
-
ورودی:
int x = 10;
-
توکنها:
int
,x
,=
,10
,;
ب. تحلیل نحوی
-
درخت نحوی:
Declaration ├── Type: int └── Variable: x └── Value: 10
ج. تحلیل معنایی
-
بررسی: نوع
int
با مقدار10
سازگار است.
د. تولید کد میانی
-
کد سهآدرسی:
x = 10
ه. تولید کد ماشین
-
کد اسمبلی:
MOV AX, 10
حتما بخوانید: آموزش صفر تا صد اسمبلی (رایگان)
توضیحات عالی بود
پاسختشکر بابت زحماتتون
سلام وقتتون بخیر از فیلم یک تا شش برای من باز نمیشه
پاسخباید با لبتاب باز کنی
خیلی خوب بود ممنون
پاسخسلام ممکنه جواب تمرین هارو قرار بدید
پاسخ