Transcript Position
به نام خدا 1 طراحی کامپایلرها 40-414 مدرس :غالمرضا قاسمثانی برگردان فارس ی اسالیدها :شایان افراسیابی دربارهی درس oمنبع اصلی Compilers: Principles, Techniques & Tools, 2nd ed., Aho, Lam, Sethi, and Ullman, 2007 oارزیابی 1 مورد درصد نمره (از )20 امتحان میانترم %35 7 امتحان پایانترم %35 7 تمرینها و کوئیزها %10 2 پروژه عملی %20 4 آموزش درس کامپایلر oآیا موضوعی قدیمی نیست؟ بله ،و به خوبی تبیین شده است الگوریتمها ،روشها ،و تکنیکهای آن در مراحل اولیهی شکلگیری علوم کامپیوتر طراحی شدهاند کامپایلر وجود دارد ،و در حال حاضر تعداد زیادی کامپایلر تولید میکنند تعداد زیادی ابزار که به صورت خودکار oپس چرا باید این درس را بخوانیم؟ 2 ً کامپایلر کامل را خودتان نمیسازید ،اما با وجودی که احتماال هیچوقت یک ً مثال: تکنیکهایی که در این درس میآموزید کاربردهای زیادی دارند؛ • ساخت مفسر برای زبانهای اسکریپتی • اعتبارسنجی ( )validationفرمها • و غیره اصطالحات oکامپایلر ً برنامهای که یک برنامهی «قابل اجرا» به زبان مبدأ (معموال زبانی سطح باال) را به ً برنامهی «قابل اجرای» معادل به زبان مقصد (معموال زبانی سطح پایین) ترجمه میکند oمفسر ()Interpreter برنامهای که یک برنامهی قابل اجرا را میخواند و نتایج حاصل از اجرای آن را تولید میکند ً این کار معموال به معنی «اجرای» برنامه است ً oاین درس عمدتا دربارهی کامپایلرهاست ،ولی در بسیاری از موارد ،همین مباحث برای مفسرها هم مطرح میشود 3 یک کامپایلر برنامهی مقصد کامپایلر برنامهی مبدأ خطاها خروجی 4 برنامهی مقصد ورودی یک مفسر برنامهی مبدأ خروجی مفسر ورودی oترجمهی خط به خط برنامه oاجرای بالفاصلهی هر خط ترجمهشده 5 oاجرا کندتر است زیرا ترجمه تکرار میشود ً oولی معموال خطاها را نسبت به کامپایلر بهتر تشخیص میدهد یک کامپایلر ترکیبی ()Hybrid خطاها مترجم برنامهی مبدأ برنامهی میانی ()IR خروجی 6 ماشین مجازی ورودی دستهبندی کامپایلرها oاز لحاظ ساخت: تکگذره چندگذره oاز لحاظ نوع کد تولیدشده: 7 مطلق (مثل ).com قابل جابهجایی (مثل ).exe مراحل کامپایل برنامهی مبدأ تحلیلگر لغوی تحلیل تحلیلگر نحوی تحلیلگر معنایی مدیریت جدول عالیم تولیدکننده کد میانی بهینهساز کد ساخت تولیدکنندهی کد بهینهسازی جزیی 8 برنامهی مقصد 1 2 3 4 FrontEnd مدیریت خطا 5 6 7 BackEnd تقسیم به Front-Endو Back-End کد مقصد BackEnd کد میانی ()IR Front -End خطاها oنگاشت کد مبدأ به کد میانی در Front-End oنگاشت کد میانی به کد مقصد در Back-End oسادهسازی پرداخت کد و تغییر کد مقصد ()retargeting 9 oامکان وجود چند Front-End کد مبدأ )1( Front-End تحلیلگر نحوی درخت تحلیل تحلیلگر لغوی نشانهها کد مبدأ خطاها oتحلیلگر لغوی نگاشت نویسهها به مجموعهای از «نشانهها» -- )Tokens(-واحد پایهی نحو y 10 id + x id x = x=x+y id مثالی از نشانهها: حذف فاصلهها ( tabها ،فضاهای خالی ،و توضیحات) • ساخت دستی تحلیلگر لغوی به جای استفاده از ابزارهای خودکار (مثل )LEXممکن است end برای افزایش سرعت الزم باشد do / * - + id num )2( Front-End درخت تجزیه تحلیلگر نحوی نشانهها تحلیلگر لغوی خطاها oتحلیلگر نحوی 11 تشخیص نحو «مستقل از متن» هدایت تحلیل وابسته به متن ساخت کد میانی ()IR تولید پیغام های خطاهای با معنا تالش برای اصالح خطا ابزارهایی مثل YACCمیتوانند فرآیند ساخت آن را خودکار کنند کد مبدأ )3( Front-End oبرای توصیف نحو زبانهای برنامهسازی از گرامرهای مستقل از متن استفاده میشود 12 >::= <expr> <op> <term> | <term ><expr >::= <number> | <id ><term ::= + | - ><op )4( Front-End oتجزیهگر نحوی سعی میکند یک برنامه را به x+2-y اجزای نحوی تعریفشده expr در گرامر تقسیم کند oتجزیه نحوی یا پارس را term expr op میتوان در قالب یک درخت تجزیه ( Parse )Treeو یا درخت نحو x id - term op expr 2 num + term ( )Syntax Treeنمایش داد x 13 id )5( Front-End تر در قالب درخت انتزاعی oدرخت پارس را میتوان به صورت فشرده نحو ( )Abstract Syntax Treeنمایش داد o ASTمیتواند به عنوان IRبین Front-Endو Back-Endبه کار رود y x+2-y 14 + id 2 num x id )1( Back-End کد مقصد انتخاب دستور تخصیص ّثبات IR خطاها oترجمهی کد میانی ( )IRبه کد مقصد oانتخاب دستور مناسب برای هر عمل در IR oتصمیمگیری در مورد آنچه در هر لحظه باید در ّثباتها ذخیره شود 15 )2( Back-End کد مقصد بهینهسازی جزیی تولید کد خطاها oتولید کد فشرده و سریع oاستفاده از انواع آدرسدهی های موجود 16 IR )3( Back-End کد مقصد بهینهسازی جزیی تولید کد خطاها oمنابع محدود oدشواری تخصیص بهینهی منابع 17 IR بخش تحلیل در فرآیند کامپایل oشامل سه مرحله: تحلیل لغوی • پیمایش چپ به راست کد برنامه برای شناسایی نشانهها (یک نشانه ،توالیای از نویسههاست که در کنار هم معنا دارند) ی تحلیل نحو • گروهبندی نشانهها در دستههای بامعنا تحلیل معنایی • بررس ی صحت اجزای بهدستآمده 18 ی مرحله او ل :تحلیل لغو oسادهترین تحلیل oشناسایی نشانهها که پایهایترین واحدهای سازنده هستند Position := initial + rate * 60 نشانهها oفاصلهها ،نویسههای رفتن به ابتدای خط جدید ،و غیره نادیده گرفته میشوند 19 تحلیل نحوی یا پارس:مرحله دوم گرههای درخت پارس به کمک گرامر زبان برنامهسازی ساخته میش وندo assignment_statement identifier expression := Position expression + expression identifier expression inital identifier number rate 60 Position := initial + rate * 60 * expression 20 مرحله سوم :تحلیل معنایی oیافتن خطاهای معنایی =: =: + * intToReal 60 + initial rate * 60 تبدیل نوع Position initial rate Position := initial + rate * 60 oوارس ی نوعها ،و مجازبودن عملوندها؛ دو تحلیل مهم در این مرحله 21 مراحل و فعالیتهای مکمل تحلیل oایجاد و نگهداری جدول عالیم حاوی اطالعاتی (در مورد ذخیرهسازی ،نوع ،محدوده ،و آرگومانها) برای هر ً نشانهی «بامعنا» (معموال شناسهها) ساختار مناسب ،در مرحله تحلیل لغوی ،ایجاد ،و مقداردهی اولیه میشود داده جدول عالیم در مراحل بعدی تحلیل و ساخت ،استفاده ،یا بهروز میشود oخطا پردازی شناسایی خطاهای گوناگون مرتبط با تمام مراحل کامپایل چگونگی برخورد با خطاها بعد از شناسایی 22 بخش ساخت در فرآیند کامپایل oتولید کد میانی کد «انتزاعی» مقصد که مستقل از ماشین است تسهیل فرآیند تولید کد «نهایی» مقصد که وابسته به ماشین است oبهینهسازی (پرداخت) کد یافتن راههای بهتر برای اجرای کد جایگزین کردن کدهای تولیدشده با کدهای بهینه oتولید کد نهایی تولید کد قابل جابهجایی وابسته به ماشین oبهینهسازی جزیی 23 با دیدی محدود ،کد نهایی تولیدشده را بهبود میدهد مروری بر کلیت فرآیند کامپایل ()1 Position := initial + rate * 60 ی تحلیل لغو 60 خطا پرداز * id2 + id3 ی تحلیل نحو 60 =: + * id3 =: id1 id2 جدول عالیم id1 تحلیل معنایی * intToReal id3 60 تولید کد میانی 24 id2 initial rate =: + Position id1 مروری بر کلیت فرآیند کامپایل ()2 تولید کد میانی کد سهآدرسه خطا پرداز )t1 := inttoreal(60 t2 := id3 * t1 t3 := id2 + t2 id1 := t3 بهینهسازی کد Position t1 := id3 * 60.0 initial id1 := id2 + t1 rate تولید کد نهایی MOVF id3, R2 MULF #60.0, R2 MOVF id2, R1 ADDF R1, R2 MOVF R2, id1 25 جدو ل عالیم