اگه بخوام یه چنین مفسری بنویسم باید چه مبحثی رو بخونم؟
در این زمینه می تونید به این کتاب مراجعه کنید:
Compilers:Principles,Techniques,and Tools
گویا در جوامع دانشگاهی این کتاب به نام Dragon Book هم شناخته میشه
من خودمم برای علاقه مندی به مبحث خوندم اینارو. البته خیلی مفصله و همه چیزو توضیح داده برای نوشتن کامپایلر. می تونید هر قسمت شو که علاقه داشتید بخونید. همونطور که دوست بالایی گفتن مثلا در تبدیل عبارات محاسباتی بر اساس اولویت با استفاده از یک سری ابزار و عبارات منظم (Regular Expression) یک درخت (Parse Tree) می سازه و براساس اون کد رو می سازه. حالا به جای عملگر های + و × و اینا می تونن تابع هایی که توسط کاربر یا سیستم عامل یا زبان برنامه نویسی تعریف شدن باشن. این برنامه پردازش یک رشته محاسباتی از جمع و ضرب و تفریق و پرانتز اینا رو خودتون هم می تونید با هر زبان برنامه نویسی بدون Regular Experesion و یا با استفاده از تابع هایی که به هم باز می گردند یا با استفاده از دو Stack برای عدد ها و عملگر ها بنویسید.
ٔدر کل چندین مرحله کلی داره کامپایل کردن (خلاصه):
Lexical Analysis که در این مرحله فایل ورودی برنامه به کلمات قابل فهم برای کامپیوتر تبدیل میشه مثلا این:
fn("salam");
میشه ۵ تا عبارت:
fn که یا کلمه کلیدی هست یا نام یک تابع
علامت پرانتز باز
اشاره گر به یک رشته (در این مرحله یک resource ساخته میشه و رشته رو نگه میداره و این کلمه حاوی اشاره گر به اون resource هست)
علامت پرانتز بسته
علامت ;
(فکر کنم کلمه درستش Lexeme بود که من کلمه ترجمه کردم)
این مرحله توسط یک برنامه Lexer و به کمک Regular Experession ها انجام میگیره.
مرحله بعدی Parsing هست که از کلمه ها درخت میسازه (مثلا یعنی از کلمه ها به جمله ها می رسیم) مثل شکل بالا;این مرحله هم باRegular Experession و Context-Free Grammer ها که گرامر یک زبان رو توضیح میدن و شبیه همون Regular Experesion ها هستن و یک برنامه parser انجام میشه.
بعد هم Semantic Analysis که معنی جمله هارو بررسی می کنه و می فهمه و خطا ها هم پیدا می کنه مثلا در C++ اگه در یک متغیر String بخواهیم عدد بریزیم خطای Semantic پیش میاد.
بعد هم بهینه سازی هست که درخت هایی که تا به حال ساخته رو بهینه می کنه.
بعد تولید کد به زبان مقصد.
بعد هم دوباره بهینه سازی کد تولید شده.
حالا در بحث Interpreter مثلا این ۲ بخش آخر از بین میره و بعد از بهینه سازی درخت، درخت اجرا میشه توسط برنامه.