Lecture 1- Compiler Definition and Structure
Lecture 1- Compiler Definition and Structure
میثم روستائی
1
زبانهای برنامهنویسی
➢ نرمافزارها به وسیله زبانهای برنامهنویسی نوشته میشوند.
2
انواع زبانهای برنامهنویسی :زبان سطح ماشین
➢ بدیهی است درک و یادگیری برنامهنویسی به زبان ماشین بسیار مشکل و زمانبر است.
3
انواع زبانهای برنامهنویسی :زبان اسمبلی
➢ برنامه زبان اسمبلی برای اجرا شدن باید ابتدا با استفاده از مترجمی به نام اسمبلر به زبان ماشین ترجمه شود.
4
انواع زبانهای برنامهنویسی :زبان سطح باال
➢ زبان سطح باال به زبان انسان (زبان محاورهای) نزدیکتر است و ساختارهای پیچیده مانند شرط و حلقه دارند
(مانند C++ ،Cو )...
➢ این برنامهها به صورت مستقیم قابل اجرا نیستند و برای اجرا شدن بایستی توسط ابزاری به نام کامپایلر به زبان
ماشین ترجمه شود و یا توسط مفسر اجرا شود.
5
کامپایلر
➢ کامپایلر ابزاری است که برنامه نوشته شده به زبان سطح باال (زبان مبدا) را گرفته و سپس آن را به زبان ماشین
(زبان مقصد) ترجمه میکند.
برنامهمبدا
شکل:عملکردکامپایلر
6
مفسر ()Interpreter
➢ مفسر ابزاری است که به جای اینکه مانند کامپایلر ابتدا کل برنامه زبان سطح باال را به زبان ماشین ترجمه کند و
سپس آن را اجرا کند ،مستقیما و به صورت خط به خط کدها را اجرا میکند.
خطا
واکشییک اجرای
برنامهمبدا
دستورالعمل دستورالعمل
پایان
شکل:عملکردمفسر
7
کامپایلر و مفسر
➢ برنامه ترجمه شده توسط کامپایلر خیلی سریعتر از اجرا توسط مفسر است.
▪ بین نسخه کامپایل شده و ماشین هیچ واسطی وجود ندارد اما مفسر همیشه برای اجرای برنامه الزم است.
➢ برای اجرا فقط یک بار کامپایل برنامه کافی است اما برای اجرای برنامه توسط مفسر ،همیشه به مفسر نیاز است.
8
استفاده ترکیبی از کامپایلر و مفسر
➢ با توجه به اینکه کامپایلر و مفسر هر دو مزایا و معایب خود را دارند ،ترکیب آنها میتواند عملکرد بهتری داشته باشد.
➢ زبان جاوا ابتدا برنامه نوشته شده به زبان جاوا را به یک زبان میانی کامپایل میکند.
اجرای
دستورالعمل
9
اولین کامپایلر
➢ کامپایلر خود یک برنامه کامپیوتری است که کد نوشته شده به یک زبان سطح باال را میگیرد و آن را به زبان
ماشین ترجمه میکند.
➢ برنامه کامپایلر خود توسط یک زبان نوشته شده و بنابراین برای اجرا باید کامپایل شود .بنابراین برای نوشتن هر
کامپایلر به وجود کامپایلر دیگری نیاز است.
➢ اولین کامپایلر به زبان اسمبلی نوشته شده و با اسمبلر به زبان ماشین ترجمه شده است.
10
اجرای برنامه زبان سطح باال
فایلبرنامه
➢ پیش پردازشگر :اضافه کردن فایلها و کتابخانهها ،پردارش دستورات ماکرو
پیشپردازشگر و پیش پردازنده
برنامهمبدا
کامپایلر
برنامهاسمبلی
اسمبلر
برنامهبهزبانماشینجابجاپذیر
بارکنندهوویرایشگرپیوند
برنامهبهزبانماشینمطلق
11
اجرای برنامه زبان سطح باال (ادامه)
فایلبرنامه
➢ پیونددهنده /بارکننده :بعد از تبدیل برنامه به کد ماشین ،بایستی تمامی موارد الزم
پیشپردازشگر مثال کدهای الزم برای اجرای دستور printیا گرفتن ورودی از کاربر نیز به برنامه
اضافه شوند که این وظیفه بر عهده پیونددهنده است.
برنامهمبدا
➢ سپس تمام برنامه بر روی حافظه اصلی بارگذاری و برای اجرا آماده میشود .این
کامپایلر
وظیفه را Loaderانجام میدهد.
برنامهاسمبلی
اسمبلر
برنامهبهزبانماشینجابجاپذیر
بارکنندهوویرایشگرپیوند
برنامهبهزبانماشینمطلق
12
ساختار کامپایلر
➢ فرض کنید Nزبان برنامه نویسی و Kماشین با معماری مختلف داریم .طبیعی است برای اجرای هر برنامه بر روی یک
ماشین یک کامپایلر مجزا الزم است .در این صورت بایستی N×Kکامپایلر طراحی کنیم.
کد نهایی برای کد نهایی برای کد نهایی برای کد نهایی برای
ماشین 2 ماشین 3
…
ماشین 1 ماشین K
شکل:نحوهکامپایلیکبرنامهبرایاجرارویکامپیوترهایمختلف
13
ساختار کامپایلر (ادامه)
➢ به جای این ،از یک تکنیک ساده استفاده میشود .تجزیه کامپایلر به دو
برنامه مبدا
بخش جلوبندی و عقببندی
کد میانی
عقببندی
برنامه نهایی
شکل:جلوبندیوعقببندی
14
ساختار کامپایلر (ادامه)
برنامه مبدا ➢ در این صورت به N+Kکامپایلر نیاز است.
کد میانی
➢ همانطور که گفتیم ساختار درونی کامپایلر را میتوان به دو بخش عمده تجزیه کرد:
➢ جلوبندی که عملیات تحلیل ( )Analysisو عقببندی که عملیات ستتز ( )Synthesisرا انجام میدهد.
16
فاز تحلیل
➢ هدف فاز تحلیل دریافت برنامه ورودی و تجزیه آن به اجزای اصلی و سپس اعمال یک گرامر به آن است.
➢ در این بخش خطاهای برنامه شناسایی میشوند و پیغام مناسب برای کاربر نمایش داده میشود.
➢ در این مرحله یک کد میانی تولید میشود که توسط مرحله سنتز مورد استفاده قرار میگیرد.
➢ در این بخش از روی کد منبع یک ساختمان داده به نام Symbol Tableساخته میشود که در فاز سنتز از
آن استفاده میشود.
17
فاز سنتز
➢ ورودی فاز سنتز ،کد میانی و جدول نمادها است که توسط فاز تحلیل تولید شده است.
18
ساختار داخلی کامپایلر با جزئیات بیشتر
➢ تحلیلگر لغوی
➢ تحلیلگر نحوی
➢ تحلیلگر معنایی
➢ تولید کد میانی
➢ تولید کد مقصد
19
تحلیلگر لغوی
➢ تحلیلگر لغوی متن کد شده به زبان مبدا را به صورت جریانی از کاراکترها دریافت کرده و لغات تشکیل دهنده معنادار
برنامه را استخراج میکند .به این لغات lexemeگفته میشود .برای هر lexemeیک خروجی به صورت زیر تولید
میشود:
20
تحلیلگر لغوی (ادامه)
➢ فرض کنید اولین خط برنامه به صورت زیر باشد:
➢ تحلیلگر لغوی کلمه positionرا به عنوان lexemeاز نوع شناسه ،شناسایی میکند و جفت > <id, 1را برای
آن در نظر میگیرد .عدد 1نشان دهنده مدخل قرارگیری این شناسه در جدول نشانه است.
➢ سپس عالمت = شناسایی میشود که نیازی به توصیفگر ندارد و به صورت >‘=‘< ذخیره میشود.
➢ سپس شناسه ،initialعالمت ،+شناسه rateو عالمت * مانند باال شناسایی میشوند.
21
تحلیلگر لغوی (ادامه)
➢ در نهایت خروجی تحلیلگر لغوی برای قطعه کد زیر
➢ بدیهی است کشف خطاهای در سطح تعریف لغات در این مرحله انجام میشود.
;Temp#:=10
;t ≔ 123.423.34
;str ≔ ′𝑎𝑙𝑖′
22
تحلیلگر نحوی
➢ فاز دوم کامپایلر تحلیلگر نحوی یا پارسر است.
➢ وظیفه تحلیلگر نحوی بررسی درستی جایگاه هر یک از lexemeهاست.
➢ فرض کنید جمله I School goo toبرای ترجمه داده شده باشد .در این صورت تحلیلگر لغوی کلمه gooرا به
عنوان یک اشتباه و خطا در نظر میگیرد.
➢ فرض کنید عبارت I School go toداده شده ،در این حالت تحلیلگر لغوی هیچ خطایی را شناسایی نمیکند
ولی تحلیلگر نحوی متوجه عدم تبعیت این جمله از گرامر انگلیسی میشود و خطا تولید میکند چرا که این جمله
از ساختار جمله خبری در انگلیسی تبعیت نمیکند.
1–A≔>B
;≔2–A B
3–if (a=b then
;4–program a
begin
;)’writeln(‘hello
ed
23
تحلیلگر نحوی (ادامه)
➢ تحلیلگر نحوی خروجی تحلیلگر لغوی را گرفته و در
position = initial + rate ∗ 60
صورتی که ترتیب lexemeها صحیح باشد ،از آن یک
ساختار درختی تولید میکند که به آن درخت تجزیه
Lexical Analyzer
(درخت گرامر یا درخت نحو) گفته میشود.
𝑖𝑑, 1 = 𝑖𝑑, 2 + 𝑖𝑑, 3 ∗ 60
Syntax Analyzer
=
25
تحلیلگر معنایی (ادامه)
➢ بررسی و هماهنگی پارامترها
{ )𝑏 𝑡𝑛𝑖 𝑖𝑛𝑡 𝑠𝑢𝑚 (𝑖𝑛𝑡 𝑎 ,
;𝑏 𝑟𝑒𝑡𝑢𝑟𝑛 𝑎 +
}
{ )( 𝑛𝑖𝑎𝑚 𝑡𝑛𝑖
;𝑖𝑛𝑡 𝑏 = 12, 𝑐 = 13
;𝑓𝑙𝑜𝑎𝑡 𝑖 = 34.0
;)𝑐 𝑏 = 𝑠𝑢𝑚(𝑖, 𝑏,
;𝑟𝑒𝑡𝑢𝑟𝑛 0
}
26
تحلیلگر معنایی (ادامه)
➢ بررسی و کنترل نوع )(Type Checking
;𝑙𝑎𝑒𝑟 𝑣𝑎𝑟 𝑓:
;𝑟𝑒𝑔𝑒𝑡𝑛𝑖 𝑓𝑜 𝑎: 𝑎𝑟𝑟𝑎𝑦 1. . 10
𝑛𝑖𝑔𝑒𝑏
;𝑓 ≔ 2.3
;𝑎 𝑓 ≔ 12
𝑑𝑛𝑒
27
تحلیلگر معنایی (ادامه)
➢ تبدیل نوع و تعریف مجدد متغیر
;𝑖𝑛𝑡 𝑎 = 10
;𝑓𝑙𝑜𝑎𝑡 𝑏 = 12.3
;𝑐 𝑡𝑎𝑜𝑙𝑓
;𝑏 𝑐 = 𝑎 +
28
تحلیلگر معنایی (ادامه)
=
𝑖𝑑, 1 +
𝑖𝑑, 2 ∗
𝑖𝑑, 3 60
Semantic Analyzer
=
𝑖𝑑, 1 +
𝑖𝑑, 2 ∗
𝑖𝑑, 3 𝑡𝑎𝑜𝑙𝑓 𝑜𝑡 𝑡𝑛𝑖
60
29
تولید کد میانی
➢ پس از بررسی در مراحل تحلیل لغوی ،نحوی و معنایی تولید کد میانی آغاز میشود.
➢ کد میانی زبان یک ماشین مجازی است و هر کامپایلر میتواند زبان میانی خاص خود را داشته باشد .با
این حال این کد باید خواص زیر را داشته باشد:
▪ سهولت تولید کد زبان میانی
▪ سهولت ترجمه به زبان مقصد
➢ یکی از انواع زبانهای منطقی ،کد سه آدرسته است که در آن تمامی دستورات حاوی عملگر انتساب (=)
هستند.
➢ به جز عملگر انتساب حداکثر یک عملگر دیگر مجاز است.
30
)تولید کد میانی (ادامه
➢ مثال
=
𝑖𝑑, 1 +
𝑖𝑑, 2 ∗
𝑖𝑑, 3 𝑖𝑛𝑡 𝑡𝑜 𝑓𝑙𝑜𝑎𝑡
60
𝑡1 = 𝑖𝑛𝑡𝑡𝑜𝑓𝑙𝑜𝑎𝑡(60)
t2 = 𝑖𝑑3 ∗ 𝑡1
t3 = 𝑖𝑑2 + 𝑡2
id1 = 𝑡3
31
بهینه سازی کد میانی
➢ بهینه سازی از نظر کاهش فضای ذخیره سازی یا افزایش سرعت
Intermediate Code Generator
)𝑡1 = 𝑖𝑛𝑡𝑡𝑜𝑓𝑙𝑜𝑎𝑡(60
t2 = 𝑖𝑑3 ∗ 𝑡1
t3 = 𝑖𝑑2 + 𝑡2
id1 = t3
Code Optimizer
32
تولید کننده کد
➢ این فاز کد بهینه شده را به کد اسمبلی ترجمه میکند
𝑡1 = 𝑖𝑑3 ∗ 60.0
id1 = 𝑖𝑑2 + 𝑡1
Code Generator
33
جدول نماد و اداره کننده خطا
➢ جدول نماد یکی از اجزایی است که در تمامی فازهای کامپایلر مورد استفاده قرار میگیرد.
➢ برخی فازها ممکن است جدول نماد را بروزرسانی و برخی دیگر ممکن است از آن برای پردازش خود استفاده
کنند.
➢ بخش اداره کننده خطا نیز با تمامی بخشها در ارتباط است .این بخش مدیریت خطاهای تولید شده در
فازهای مختلف را به عهده دارد.
34
ویژگیهای یک کامپایلر خوب
➢ تولید کد صحیح
➢ پیروی از مشخصات زبان مبدا (شناسایی همه ساختارهای نحوی و لغوی)
➢ امکان پردازش برنامههای بزرگ
➢ سرعت کامپایلر (ارتباط مستقیم با زمان تولید نرم افزار)
➢ اندازه کامپایلر (کاهش هزینه ذخیره سازی موجب کاهش اهمیت این مورد شده)
➢ مدیریت خطا و گزارش صحیح خطا (علت خطا ،فایل حاوی خطا ،شماره خط ،توصیهای برای رفع خطا)
➢ بهینه سازی
➢ قابلیت حمل (قابلیت حمل خود کامپایلر ،قابلیت حمل کد تولید شده)
35
پرسش و پاسخ
36