آموزش طراحی کامپایلر — مجموعه مقالات جامع وبلاگ فرادرس
یکی از پایهایترین مباحث در حوزه مهندسی کامپیوتر و برنامهنویسی، بحث کامپایلر است. در واقع کامپایلر پلی بین نرمافزار و سختافزار رایانه محسوب میشود و گنجاندن آن به عنوان یکی از دروس استاندارد رشته مهندسی کامپیوتر و همچنین بسیاری از رشتههای مرتبط با رایانه نشان دهنده نقش بسزایی است که کامپایلر در معماری رایانهها دارد. لذا در رشته مطالبی که اخیراً در بلاگ فرادرس تنظیم و منتشر کردهایم به بررسی اجزای مختلف کامپایلرها و معرفی و تشریح تک تک مراحل مرتبط پرداختیم. در تصویر زیر مراحل مختلف فرایند کامپایل یک کد منبع به کد ماشین مقصد را ملاحظه میکنید:
مبانی کامپایلر
ما در سلسله مطالب این مجموعه در ابتدا به مرور مفاهیم مقدماتی و معرفی مراحل کامپایل کردن پرداختیم که میتوانید در مقاله زیر مطالعه کنید.
همان طور که در نمودار ابتدای این مقاله نیز مشخص است، در طی فرایند کامپایل کردن کد منبع سه نوع تحلیل روی کد صورت میگیرد که نخستین نوع آن، تحلیل واژگانی یا لغوی است. مقاله مرتبط با این تحلیل را میتوانید در لینک زیر مطالعه کنید. همچنین از جمله مباحثی که در زمان طراحی فاز تحلیل واژهای کامپایلر حائز اهمیت محسوب میشوند، عبارتهای منظم و اتوماتای نامتناهی هستند که هر دو آنها به تفصیل در بخشهایی با همین عناوین در این مقاله توضیح داده شدهاند:
فاز دوم تحلیل کد منبع در زمان طراحی کامپایلر، تحلیل نحوی یا تحلیل ساختاری نام دارد که این فاز نیز در نوشته زیر به تفصیل مورد بحث و بررسی قرار گرفته است:
انواع تجزیه
یکی از مباحث مهم در زمینه تحلیل نحوی، تجزیه کد است. از این رو در مطلب زیر به معرفی انواع روشهای تجزیه کد در طراحی کامپایلر پرداختهایم:
به طور کلی در فرایند کامپایل کد منبع دو نوع تجزیه (Parsing) به صورتهای تجزیه بالا به پایین و تجزیه پایین به بالا داریم که در دو نوشته زیر هر دوی آنها مورد بررسی قرار گرفتهاند:
هر خطایی که در کد منبع وجود داشته باشد، در مرحله تجزیه کد مشخص خواهد شد. از این رو در این مرحله باید از روشهایی برای بازیابی خطاها استفاده کنیم. روشهای مختلفی که به این منظور میتوان مورد استفاده قرار داد، موضوع نوشتهای است که در ادامه آمده:
سومین فاز تحلیلی کد منبع در زمان کامپایل آن، مرحله تحلیل معنایی است. در این گام کامپایلر به بررسی معناشناختی کد میپردازد و تلاش میکند خطاهایی که در این سطح قرار دارند را شناسایی کرده و رفع نماید:
اگر فرایند کامپایل را به دو بخش اصلی تقسیم کنیم، در بخش نخست تلاش میشود کد منبع به بلوکهای سازنده تجزیه شود و سپس در بخش دوم این بلوکهای سازنده بسته به ماشین مقصد و محیط اجرایی آن به صورت کد مقصد ترکیب میشود. یکی از نکاتی که در این مرحله حائز اهمیت است آشنایی با محیط زمان اجرای کد (Run-Time) است. بررسی محیط زمان اجرا و مؤلفههای آن در نوشتهای که در زیر مشاهده میکنید صورت گرفته است:
محیط Run-Time (زمان اجرا)
در زمان آمادهسازی کد تجزیه شده برای کامپایل جهت ماشین مقصد و در تمام مراحل تحلیلی مختلف از جدولی به نام «جدول نماد» (symbol table) استفاده میشود. بنابراین جدول نماد هم از سوی بخشهای تجزیهای و هم توسط بخشهای ترکیبی کامپایلر مورد استفاده قرار میگیرد. این جدول در نوشته زیر مورد بررسی قرار گرفته است:
پس از آن که کد منبع به طور کامل تجزیه شده و خطاهای آن رفع شد، پیش از آن که به کد ماشین مقصد تبدیل شود به زبان میانی ترجمه میشود. دلیل این ترجمه به کد میانی و مراحل و شرایط آن در نوشته زیر بررسی شده است:
در نهایت نوبت آن فرا میرسد که کد ماشین مقصد را تولید کنیم. اما این مرحله نیز شرایط و الزاماتی دارد که آنها را میتوانید در نوشته زیر مطالعه نمایید:
در آخرین مرحله از فرایند کامپایل، به بررسی روشهای بهینهسازی کدی که برای ماشین مقصد تولید میشود پرداختهایم:
بدین ترتیب در سلسله مباحث طراحی کامپایلر، با تمامی مراحل کامپایل یک کد منبع به صورت برنامه قابل اجرا از سوی ماشین مقصد آشنا میشوید. امیدواریم این سلسله مباحث موجب ارتقای دانش شما از فرایند کامپایل و به طور کلی مفاهیم عمیق برنامهنویسی شود. هر گونه دیدگاه یا پیشنهاد خود را میتوانید در بخش نظرات این نوشته با ما و دیگر خوانندگان فرادرس در میان بگذارید.
اگر این مطلب برایتان مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- آموزش طراحی کامپایلر
- مجموعه آموزشهای مهندسی نرم افزار
- مجموعه آموزشهای دروس مهندسی کامپیوتر
- مجموعه آموزشهای پروژه محور برنامهنویسی
- آموزش گرامرها در طراحی کامپایلر
- آموزش طراحی کامپایلر (مرور و حل تست های کنکور کارشناسی ارشد)
- کامپایلر، طراحی و معماری آن — به زبان ساده
==