كلیه اطلاعات این سایت مربوط به شركت طراحی سایت - شركت نرم افزاری بهپردازان می باشد


موضوع مقاله : منظور از کامپایلر چیست :

شرح : اگر تا به حال برنامه نويسي کرده باشيد شايد به اين فکر کرده باشيد که نشانه ها و اصطلاحات و کلماتي که شما در برنامه استفاده نموده ايد چگونه مورد فهم سيستم عامل و يا نرم افزار نهايي و يا کلا سيستم قرار مي گيرد ؟
اگر بپذيريد که کامپيوتر تنها قادر به درک مفهوم سيگنال هاي پذيرش و عدم پذيرش و يا همان سيگنال ها و اعداد صفر و يک است مي توانيد راحت تر به جواب برسيد درواقع سيستم کامپيوتر شامل مدارهايي است که اين مدارها فقط به دو سيگنال صفر و يک و يا فعال و غير فعال و يا روشن و خاموش حساس است و به هيچ وجه قادر به درک الفاظ و زبان طبيعي نمي باشد و حتي از کاري که قرار است انجام بدهد نيز خبر ندارد و مدارهاي الکتريکي بر اساس کدهايي که در حافظه قرار مي گيرد ( کلمات حافظه ) و در نهايت پردازش هايي که توسط پردازنده در واحد کنترل و ALU بر روي آن ها صورت مي دهد اعمالي انجام مي شود . اما ان چه که در اين جا مورد توجه است همان شکل گيري صفر و يک ها در نتيجه يک برنامه به زبان فرضا #C مي باشد . اين کاري است که کامپايلرها انجام مي دهند .
مکانيسم کلي کار کامپايلرها به اين صورت است که برنامه مبدا را خوانده و يک شکل مياني از آن ايجاد نموده و سرانجام آن را به زبان ديگري مانند اسمبلي تبديل مي کند و زبان اسمبلي نيز از شکل مياني برنامه شکل قابل فهم سيستم و يا همان صفر و يک ها را ايجاد و آن ها را در قالب Memory Word براي سيستم و سخت افزار مهيا مي نمايد . لذا تبديل شکل ابتدايي برنامه مقصد به يک شکل اجرايي سيستمي از وظايف کامپايلر ها مي باشد . البته بايد توجه کنيم که کامپايلرها بر اساس قواعد و گرامر زبان مبدا اقدام به توليد زبان مقصد مي نمايند
کامپايلر نويسان براي سهولت در طراحي ، اجزاي کامپايلر را به بخش هاي زير تقسيم بندي مي کنند که هر يک عملي را انجام مي دهد :
الف) تحليل گر لغوي ( Lexer ) : در واقع طولاني ترين پروسه را انجام مي دهد ، با زبان مبدا مستثقيما در تعامل بوده و مستقل از زبان مقصد مي باشد . تحليل گر لغوي با خواندن زبان ورودي ان را به مجموعه اي از نشانه هاي قابل فهم براي تجزيه کننده تقسيم بندي مي کند . ميدانيم که جملات يک زبان از رشته هايي از نشانه ها تشکيل شده است و دنباله اي از اين کاراکترهاي ورودي که يک نشانه را تشکيل مي دهند يک لغت ( Lexeme ) ناميده مي شوند .
 
توضيحات ، فضاهاي سفيد و فاصله ها توسط تحليل گر لغوي ناديده گرفته مي شود ، سپس نشانه هاي توليدي را در جدولي به نام جدول نمادها قرار مي دهد و اشاره گري براي دسترسي پارسر به آن ها را بر مي گرداند . تشخيص شناسه ها و کلمات کليدي نيز از جمله مواردي است که Lexer بايد آن ها را نيز تشخيص دهد و از ساير نشانه ها تميز دهد .
بنابراين به طور خلاصه Lexer کاراکترها را از ورودي مي خواند ، آن ها را به صورت لغت دسته بندي مي کند و نشانه هاي ايجاد شده توسط لغت ها را به همراه مقادير خصيصه آن ها به مرحله هاي بعدي کامپايلر منتقل مي کند.نشانه هاي توليد شده در پارسر و يا تجزيه کننده مورد استفاده قرار مي گيرد .
ب) تحليل گر ساختار دستور (Parser) : پارسر بر رسي مي کند که ايا مي توان دنباله اي از نشانه هاي ايجاد شده را توسط گرامر زبان مورد نظر توليد نمود يا نه . در واقع پارسر مهم ترين عمل را در طراحي کامپايلر انجام مي دهد و آن توليد دنباله از از رشته ها توسط گرامر زبان مبدا مي باشد . به طور کل هنگام تحليل ساختار دستور ، نشانه هايي که در زبان مبدا قرار دارند را به عبارت هاي گرامري دسته بندي مي کنيم به طوري که کامپايلر بتواند مجددا با استفاده از آن ها خروجي را ترکيب بندي کند . عبارت هاي توليد شده را توسط درخت تجزيه نمايش مي دهند که در ختي است که فرزندان هر گره عبارات سمت راست قوانين گرامر و پدر آن ها سمت چپ هر گره مي باشد و گره هاي برگ مشتمل بر پاياني ها مي باشند و يک دنباله از آن ها يک رشته از گرامر را نشان مي دهند .
ج ) تحليل گر معنايي (Syntax Analyzer ) : فاز تحليل معنايي برنامه مبدا را براي پيدا کردن خطاهاي معنايي بررسي کرده و اطلاعات مربوط به نوع داده ها را در درخت تجزيه حاشيه نويسي مي کند مثلا بررسي مي کند که يک رشته حرفي با يک عدد جمع نزده شده باشد و مانند آن . مجاز بودن نوع داده ها نيز در اين بخش بررسي مي شود . در واقع در زمان تحليل معنايي ، کامپايلر ساختارهايي را کشف مي کند که از نظر ساختار دستوري صحيح هستند اما در رابطه با عملي که انجام مي دهند بي معني هستند .
د) توليد کننده کد مياني : د راين بخش يک شکل مياني قابل فهم اسمبلر و يا يک نمايش مياني صريح از برنامه مبدا توليد مي کند که مي توان آن را برنامه اي براي يک ماشين انتزاعي در نظر گرفت ( مفهوم انتزاعي به معناي قابل فهم بودن براي انسان است نه ماشين . ) و بايد داراي دو ويژگي سهولت توليد و سهولت تبديل به برنامه مقصد باشد .
نمايش مياني مي تواند شکل هاي گوناگوني داشته باشد مانند صفر ، يک ، دو ، سه و چهار آدرسه .در ساختار فرضا سه ادرسه در هر ثبات مي توان سه ادرس را شامل عملگر ، عملوند اول و عملوند دوم قرار داد . محاسبه عبارات ، نظارت بر ساختارهاي جريان کنترلي و احضار رويه ها نيز در اين بخش توسط مولد کد مياني صورت مي گيرد .
هـ) بهينه ساز کد(Optimizer) : کدي که توليد مي کنيم بايد دو شرط صرفه جويي در حافظه و در زمان اجرا را برآورده کند . گاهي وقت ها کد ما بسيار پيچيده است و با اعمال جايگزيني ها و حذف و درج ها مي توان آن را ساده تر و کاراتر نمود . تغيير ساختارهاي آدرس دهي نيز مي تواند کد را بهينه تر سازد . سرعت اجرا نيز بايد در نظر گرفته شود .
و) توليد کد : آخرين فاز کامپايلر ، توليد کد مقصد مي باشد که معمولا شامل کد ماشين جابه جا پذير يا کد اسمبلي است . تخصيص حافظه به هر يک از متغيرهاي برنامه در اين فاز انجام مي شود . آن گاه هر يک از دستورهاي مياني به يک دنباله از دستورهاي ماشين که همان کار را انجام ميدهند ترجمه مي شوند . يک جنبه مهم آن ، جايگزيني متغيرها در ثبات ها مي باشد .