ساختار کامپایلر (Compiler)


08 مرداد 1399

shape
shape
shape
shape
shape
shape
shape
shape

وب مهر

2020-07-29T17:43:09+04:30
ساختار کامپایلر (Compiler)

ساختار کامپایلر (Compiler)

همانطور که در مقالهی قبل گفته شد کامپایلر نوعی نرم افزار است که دستوراتی که برنامه نویس در قالب کد مینویسد را به زبان ماشین تبدیل میکند؛ تا CPU آنها را فهمیده و اجرا کند. این کاری که انجام میدهد شامل مراحلی است که میخواهیم دربارهی هرکدام صحبت کنیم و جزیی تر به این فرایند نگاه کنیم.

مراحل Compiler:

pastedGraphic.png

  • Lexical Analysis (تجزیه و تحلیل واژگان):

 

این فاز در ابتدا مانند یک اسکنر عمل میکند و در آن کدها به صورت مجموعهای از کاراکترها اسکن شده و تبدیل به واژگان معنیدار میشود. تحلیل گر، واژهها را به صورت نشانه (token) هایی به شکل زیر درمیاورد و آنها را به یکدیگر مرتبط میکنند.

 

pastedGraphic_1.png                                                         

Syntax Analyzer (تجزیه و تحلیل سینتکس):

در این فاز tokenهای به وجود آمده در فاز قبل را به صورت ورودی دریافت کرده و بررسی میکند که با کاربردشان مطابقت دارند یا خیر؟ و از آنها یک درخت درست میکند (Syntax tree) و در آن tokenها از لحاظ گرامری بررسی میشوند.

pastedGraphic_2.png

Semantic Analyzer :

این فاز درخت خروجی در فاز قبل را به عنوان ورودی دریافت میکند و وظیفهی چک کردن موارد آن را از لحاظ معنایی، type، label و flow control را دارد. ساختار Token به وسیله مفسر و کامپایلر معنا پیدا میکند و در نهایت Object code تولید میشود. در این مرحله تمامی کدها به دستوراتی تبدیل میشوند که برای پردازنده قابل فهم باشند و در نهایت برنامه اجرا خواهد شد.

 

pastedGraphic_3.png

 

Intermediate Code Generation

 

بعد از اینکه آنالیز معنایی (Semantic) صورت گرفت، کامپایلر شروع به تولید کردن یک کد میانی (Intermediate Code) از روی کد اصلی برای ماشین مورد نظر میکند. زمانی که کد میانی تولید میشود، این کد بخش آنالیز را برای همهی compilerها یکسان نگه میدارد؛ به همین علت هر دستگاه جدید، دیگر نیازی به یک کامپایلر کامل ندارد.                                                                                                                                    

pastedGraphic_4.png                             

Code Optimizer

این فاز کد میانی تولید شده در فاز قبل را بهینه سازی میکند و بر روی آن کارهایی مانند حذف خطوط غیر ضروری در کد و مجموعهای از کارهای دیگر که منجر به اجرای سریعتر برنامه بدون اتلاف منابع (CPU, Memory) میشود، انجام میدهد.

pastedGraphic_5.png

یک فرایند بهینه سازی کد (Code optimizer) باید از سه قانون پیروی کند:

  1. کد خروجی نباید به هیچ وجه معنی برنامه را تغییر دهد.
  2. بهینه سازی باید سرعت کد را افزایش دهد و در صورت امکان، برنامه باید تعداد کمتری از منابع را در خواست کند.
  3. بهینه سازی باید خود سریع عمل کند و نباید روند کامپیال را به تاخیر اندازد.

بهینه سازی (optimization) به دو نوع تقسیم میشود:

بهینه سازی مستقل از ماشین ( Machine-independent optimization)

  • کامپایلر کد میانی را میگیرد و قسمتی از کد را که حاوی ثبت CPU و حافظه کامل نیست را تغییر میدهد. بعنوان مثال:

 

این نوع نه تنها سیکلهای CPU را ذخیره میکند، بلکه میتواند در هر پردازندهای مورد استفاده قرار بگیرد.

بهینه سازی وابسته به ماشین ( Machine-dependent optimization)

  • زمانی انجام میشود که target code تولید شده و سپس بر طبق نوع ماشین تغییر پیدا کرده باشد. این نوع شامل CPU و حافظهی کامل است. این روش تمام تلاش خود را میکند که از حافظه حداکثر استفاده را ببرد.

Target Code Generation

در این فاز تولید کنندهی کد، کد بهینه شده در فاز قبل را به مجموعهای از کدهای ماشین با قابلیت       جابجایی تبدیل میکند.

pastedGraphic_6.png

Symbol Table

یک ساختار دادهی مهم است که کل فازهای کامپایلر و نیز تمام نام شناسههای موجود و نوع آنها در اینجا نگهداری میشوند. این جدول کمک میکند که کامپایلر سریعتر یک شناسه را پیدا کرده و بازیابی کند.

جدول نمادها با توجه به زبانی که در دست استفاده است میتواند اهداف زیر را ارائه دهد:

  • ذخیره کردن تمام اسامی موجودات در یک ساختار و در یک مکان مشخص.
  • بررسی کردن اینکه یک متغیر شناسایی شده است یا خیر.
  • چک کردن اینکه تمامی تکالیف و اصطلاحات در کد منبع از نظر معنایی درست باشند.
  • مشخص کردن دامنهی یک نام.

جدول نمادها صرفا یک جدول است که میتواند هم بصورت جدول خطی و هم ترکیبی(hash) باشد. Symbol table ورودی را برای هر نام در قالب زیر حفظ میکند:

بعنوان مثال اگر یک جدول نماد مجبور است اطالاعات مربوط به جمله متغیر زیر را دخیره کند:

باید به این صورت ذخیره شود:

ساختار کامپایلر را همانطور که مشاهده کردیم بسیار گستره و پیچیده است و برای انجام یک فرایند که تبدیل کدهای برنامه نویسی به کد ماشین است باید مراحلی را طی کند که به این هدف برسد. جالب بود که تمام این مراحل جز به جز به هم وابسته هستند مثل بقیه چیزهایی که دارای ساختاری هستند و برای یک هدف به هم پیوستهاند و هر یک وظایفشان را انجام میدهند. امیدوارم که این مقاله برای شما مفید واقع شود.

بدون نظر

    اولین نفری باشید که نظر می دهد!

نظر بدهید

آدرس ایمیل شما منتشر نخواهد شد. موارد ستاره دار الزامی است. *