طراحی کامپایلر و انواع تحلیل در آن (آموزش صفر تا صد)
هر فرد در حوزه برنامه نویسی حداقل یکبار از کامپایلر استفاده کرده است یا حتماً نام آن را شنیده یا خوانده است. آیا تا به حال به نحوه عملکرد یک کامپایلر فکر کرده اید؟ در این آموزش درباره طراحی ساختار یک کامپایلر بحث خواهیم کرد.
در اصل یک کد باید از سطوح متفاوتی عبور کند تا از یک زبان سطح بالا به زبان اسمبلی تبدیل شود و همه اینها در کامپایلر پنهان است.
شکل زیر نمودار پایه یک کامپایلر را نشان می دهد:
همانطور که می بینیم یک کامپایلر در مجموع از 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 جلسه
از پیج Jamshid pirgazi: هر لینکی کار نکرد در بخش نظرات اعلام کنید تا مشکل رفع شود:
درس 1
درس 2
درس 3
درس 4
درس 5
درس 6
درس 7
درس 8
درس 9 (آخر)
حتما بخوانید: آموزش صفر تا صد اسمبلی (رایگان)
توضیحات عالی بود
پاسختشکر بابت زحماتتون
سلام وقتتون بخیر از فیلم یک تا شش برای من باز نمیشه
پاسخباید با لبتاب باز کنی
خیلی خوب بود ممنون
پاسخسلام ممکنه جواب تمرین هارو قرار بدید
پاسخ