۱۳۹۸ فروردین ۱۸, یکشنبه

نکات تستی کنکور کامپایلر - مقدمات

مفسر: پیاده سازی آسان. سهولت اشکال زدایی. قابلیت انعطاف بالا. سرعت اجرای پایین برنامه. نیاز به مفسر. دسترسی به کد منبع.
کامپایلر: اجرای برنامه مستقل از کامپایلر. حفاظت از کد منبع. عدم تکرار کامپایلر. زمانبر بودن اشکال زدایی. قابلیت حمل پایین. پیاده سازی مشکل.
برنامه اولیه -> پیش پردازش-> برنامه منبع->کامپایلر->برنامه اسمبلی->اسمبلر->کدماشین->بارکننده/پیوند دهنده-> کدماشین نهایی(کد قابل اجرا
تحلیل گر لغوی(اسکنر)-> تحلیل گر نحوی(پارسر) -> تحلیلگر معنایی-> تولیدکننده کد میانی-> بهینه سازی کد میانی->تولید کد نهایی->بهینه سازی کد نهایی->برنامه نهایی.
اسکنر: دید محدود و فقط با کلمات سر و کار دارد. تعداد خطاهای لغوی کمه. تمامی خطاهای لغوی تو زمان کامپایل پیدا میشن. تنها مرحله ای است که با کد ورودی سر و کار دارد. از زبانهای منظم استفاده میکنه.
پارسر: معمولا اکثر خطاها پارسر هستند. زمان کامپایل تشخیص داده میشه. از زبانهای مستقل از متن استفاده میکنه.
تحلیلگر معنایی: هرچند حساس به متن هست ولی معمولا از گرامر مستقل از متن استفاده میکند ولی کنترل معنایی استفاده میشه. هم در زمان کامپایل خطا میده و هم در زمان اجرا.
کنترل نوع عملوند و عملگر. کنترل استفاده نشدن از متغیری که تعریف شده. کنترل متغیری که استفاده شده ولی تعریف نشده. پرش به برچسبی که وجود ندارد. کنترل تعداد پارامترهای ظاهری و پارامترهای واقعی توابع.
کنترل معنایی ایستا: کنترلهای زمان کامپایل مانند کنترل نوع در زبانهای نوع دهی قوی.
کنترل معنایی پویا: کنترل زمان اجرا مثل کنترل محدوده اندیس آرایه.
به تکنیک بهینه سازی کد نهایی peephole گفته میشه روش مدونی نداره ولی شامل :‌تخصیص بهینه ثباتها. انتخاب دستورالعملهای سریعتر. استفاده از مدهای آدرسدهی. حذف load و store. ساده سازی جبری و بهینه سازی جریان کنترل است.
چهار نوع خطا داریم: خطای لغوی(در زمان کامپایل توسط اسکنر). خطای نحوی(در زمان کامپایل توسط پارسر). خطای معنایی(هم در زمان کامپایل و هم در زمان اجرا). خطای منطقی(در زمان اجرا مثل تقسیم بر صفر. حلقه نامحدود. فراخوانی تابع بازگشتی یا ارجاع به حافظه از طریق آدرس پوچ.)
اگر کامپایلرها را بخش بندی کنیم و n زبان برنامه نویسی و m ماشین مختلف داشته باشیم باید n+m کامپایلر نوشت در صورتی که بخش بندی نکنیم باید n*m کامپایلر نوشت.
کامپایلرهای چند گذره در مقابل تک گذره:
۱‍. سرعت کامپایل پایین است.
۲. میزان حافظه مصرفی پایین است.
۳. ساختار کامپایلر پیمانه ایست و اصول مهندسی نرم افزار به خوبی رعایت شده است.
۴. سادگی طراحی.
۵. امکان بهینه سازی کد بسیار بیشتر است.
۶. سرعت اجرای برنامه بالاتر است.
۷. کامپایل کردن برخی زبانهای برنامه نویسی توسط تک گذره امکان پذیر نیست.
کامپایلرهای JIT شبیه مفسرهای هستند با این تفاوت که بلوکی از کد که ترجمه شده در جایی از حافظه قرار میگیرد تا اگر دوباره با آن کار داشتیم دوباره ترجمه نشود.

هیچ نظری موجود نیست:

ارسال یک نظر