جهت تماس با کارشناسان فروش کلیک نمایید

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

شرح : اگر تا به حال برنامه نويسي کرده باشيد شايد به اين فکر کرده باشيد که نشانه ها و اصطلاحات و کلماتي که شما در برنامه استفاده نموده ايد چگونه مورد فهم سيستم عامل و يا نرم افزار نهايي و يا کلا سيستم قرار مي گيرد ؟

اگر بپذيريد که کامپيوتر تنها قادر به درک مفهوم سيگنال هاي پذيرش و عدم پذيرش و يا همان سيگنال ها و اعداد صفر و يک است مي توانيد راحت تر به جواب برسيد درواقع سيستم کامپيوتر شامل مدارهايي است که اين مدارها فقط به دو سيگنال صفر و يک و يا فعال و غير فعال و يا روشن و خاموش حساس است و به هيچ وجه قادر به درک الفاظ و زبان طبيعي نمي باشد و حتي از کاري که قرار است انجام بدهد نيز خبر ندارد و مدارهاي الکتريکي بر اساس کدهايي که در حافظه قرار مي گيرد ( کلمات حافظه ) و در نهايت پردازش هايي که توسط پردازنده در واحد کنترل و ALU بر روي آن ها صورت مي دهد اعمالي انجام مي شود . اما ان چه که در اين جا مورد توجه است همان شکل گيري صفر و يک ها در نتيجه يک برنامه به زبان فرضا #C مي باشد . اين کاري است که کامپايلرها انجام مي دهند .

روش کار کامپايلرها

مکانيسم کلي کار کامپايلرها به اين صورت است که برنامه مبدا را خوانده و يک شکل مياني از آن ايجاد نموده و سرانجام آن را به زبان ديگري مانند اسمبلي تبديل مي کند و زبان اسمبلي نيز از شکل مياني برنامه شکل قابل فهم سيستم و يا همان صفر و يک ها را ايجاد و آن ها را در قالب Memory Word براي سيستم و سخت افزار مهيا مي نمايد . لذا تبديل شکل ابتدايي برنامه مقصد به يک شکل اجرايي سيستمي از وظايف کامپايلر ها مي باشد . البته بايد توجه کنيم که کامپايلرها بر اساس قواعد و گرامر زبان مبدا اقدام به توليد زبان مقصد مي نمايند
کامپايلر نويسان براي سهولت در طراحي ، اجزاي کامپايلر را به بخش هاي زير تقسيم بندي مي کنند که هر يک عملي را انجام مي دهد :

تحليل گر لغوي ( Lexer )

در واقع طولاني ترين پروسه را انجام مي دهد ، با زبان مبدا مستثقيما در تعامل بوده و مستقل از زبان مقصد مي باشد . تحليل گر لغوي با خواندن زبان ورودي ان را به مجموعه اي از نشانه هاي قابل فهم براي تجزيه کننده تقسيم بندي مي کند . ميدانيم که جملات يک زبان از رشته هايي از نشانه ها تشکيل شده است و دنباله اي از اين کاراکترهاي ورودي که يک نشانه را تشکيل مي دهند يک لغت ( Lexeme ) ناميده مي شوند .
 توضيحات ، فضاهاي سفيد و فاصله ها توسط تحليل گر لغوي ناديده گرفته مي شود ، سپس نشانه هاي توليدي را در جدولي به نام جدول نمادها قرار مي دهد و اشاره گري براي دسترسي پارسر به آن ها را بر مي گرداند . تشخيص شناسه ها و کلمات کليدي نيز از جمله مواردي است که Lexer بايد آن ها را نيز تشخيص دهد و از ساير نشانه ها تميز دهد .
بنابراين به طور خلاصه Lexer کاراکترها را از ورودي مي خواند ، آن ها را به صورت لغت دسته بندي مي کند و نشانه هاي ايجاد شده توسط لغت ها را به همراه مقادير خصيصه آن ها به مرحله هاي بعدي کامپايلر منتقل مي کند.نشانه هاي توليد شده در پارسر و يا تجزيه کننده مورد استفاده قرار مي گيرد .

  تحليل گر ساختار دستور (Parser)

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

 تحليل گر معنايي (Syntax Analyzer )

فاز تحليل معنايي برنامه مبدا را براي پيدا کردن خطاهاي معنايي بررسي کرده و اطلاعات مربوط به نوع داده ها را در درخت تجزيه حاشيه نويسي مي کند مثلا بررسي مي کند که يک رشته حرفي با يک عدد جمع نزده شده باشد و مانند آن . مجاز بودن نوع داده ها نيز در اين بخش بررسي مي شود . در واقع در زمان تحليل معنايي ، کامپايلر ساختارهايي را کشف مي کند که از نظر ساختار دستوري صحيح هستند اما در رابطه با عملي که انجام مي دهند بي معني هستند .

 توليد کننده کد مياني

در اين بخش يک شکل مياني قابل فهم اسمبلر و يا يک نمايش مياني صريح از برنامه مبدا توليد مي کند که مي توان آن را برنامه اي براي يک ماشين انتزاعي در نظر گرفت ( مفهوم انتزاعي به معناي قابل فهم بودن براي انسان است نه ماشين . ) و بايد داراي دو ويژگي سهولت توليد و سهولت تبديل به برنامه مقصد باشد .
نمايش مياني مي تواند شکل هاي گوناگوني داشته باشد مانند صفر ، يک ، دو ، سه و چهار آدرسه .در ساختار فرضا سه ادرسه در هر ثبات مي توان سه ادرس را شامل عملگر ، عملوند اول و عملوند دوم قرار داد . محاسبه عبارات ، نظارت بر ساختارهاي جريان کنترلي و احضار رويه ها نيز در اين بخش توسط مولد کد مياني صورت مي گيرد .

 بهينه ساز کد(Optimizer)

کدي که توليد مي کنيم بايد دو شرط صرفه جويي در حافظه و در زمان اجرا را برآورده کند . گاهي وقت ها کد ما بسيار پيچيده است و با اعمال جايگزيني ها و حذف و درج ها مي توان آن را ساده تر و کاراتر نمود . تغيير ساختارهاي آدرس دهي نيز مي تواند کد را بهينه تر سازد . سرعت اجرا نيز بايد در نظر گرفته شود .

 توليد کد

آخرين فاز کامپايلر ، توليد کد مقصد مي باشد که معمولا شامل کد ماشين جابه جا پذير يا کد اسمبلي است . تخصيص حافظه به هر يک از متغيرهاي برنامه در اين فاز انجام مي شود . آن گاه هر يک از دستورهاي مياني به يک دنباله از دستورهاي ماشين که همان کار را انجام ميدهند ترجمه مي شوند . يک جنبه مهم آن ، جايگزيني متغيرها در ثبات ها مي باشد .


مطالب بيشتر: حمله Replay چيست؟

بهينه سازي کامپايلر

 بهينه سازي از مهمترين وظايف يک کامپايلر است که معمول بعد از توليد کد مياني آغاز مي شود. هميشه هنگام کامپايل يک برنامه براي پخش نهايي از بهينه سازي استفاده مي شود. هرچند گاهي اوقات بهينه سازي مانع اصلي بعضي اهداف است و بايد کنار گذاشته کردن يک کد بهينه شده دشوارتر و شايد غيرممکن شود چرا که debug شود. به عنوان مثال به منظور بهينه سازي بسياري از کدها حين کامپايل ممکن است جابجا شده باشند يا اصل option ساختار آنها عوض شده باشد. به همين دليل بسياري از کامپايلرها اجازه نمي‌دهند کردن و بهينه سازي همزمان فعال شوند. همچنين گاهي کد کامپايل debugهاي مربوط به يکسان ولي خصوصيات (instruction) شده قرار است روي پردازنده‌هايي با دستورالعملهاي مختلف از حيث زمان بندي، سرعت دسترسي به حافظه و ... اجرا شود که در اين صورت کامپايلر نبايد بهينه سازيهاي خاص يک ماشين را روي آن اعمال کند. تکنيکهاي مختلف بهينه سازي مي‌توانند وابسته به زبان منبع، وابسته به ماشين مقصد يا مستقل از هر دو باشند. اغلب روشهاي بهينه سازي مستقل از زبان منبع مي‌باشند. همچنين براي بسياري از الگوريتمهاي بهينه سازي وابسته به مقصد، مي‌توان خصوصيات ماشين مقصد را با يکسري پارامتر معرفي کرد و خود الگوريتم براي مقصدهاي مختلف دست نخورده بماند. اهداف کلي يک کيمپايلر هنگام بهينه سازي بصورت خلصه در زير آمده است که کامپايلر بر اساس نوع بهينه سازي مورد نظرش، به آنها اولويت مي‌دهد: جا مي‌گيرد وپردازنده براي cache کم کردن حجم کد: هرچه حجم کد کمتر باشد راحتتر در دسترسي به آن نياز به تعداد کمتري مراجعه به حافظه دارد. کم کرد ن محاسبات : تغيير کد به گونه‌اي که محاسبات کمتري داشته باشد وقت پردازنده را کمتر مي‌گيرد. پرهيز از پرشهاي شرطي و غير شرطي : پردازنده‌ها در برخورد باانشعابها و پرشها نمي استفاده کنند و در نتيجه زمان بيشتري در اينگونه مواقع تلف مي‌شود. pipelining توانند از کامپايلر بايد کد را به گونه‌اي تغيير دهد که حتي المکان تعداد کمتري انشعاب و پرش داشته باشد. نزديک کردن ارجاعات مشابه : بخشهايي از کد که يک داده خاص را از حافظه مي خوانند بهتر است کنار هم باشند تا دسترسي به داده سريعتر براي آنها انجام گيرد و کامپيوتر مجبور به مراجعه مکرر به حافظه نباشد. ترتيب دهي مناسب داده‌ها در حافظه : ثباتها بايد حاوي داده‌هاي پراستفاده تر باشند. موازي سازي: ترتيب دستورها در حافظه بايد به گونه‌اي باشد که به پردازنده حداکثرامکان پردازش موازي دستورات را بدهد.

  ساير خدمات شرکت طراحي سايت بهپردازان