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