جميع الحقوق محفوظة لمنصة KBS Education
واليُسمح بنشر أو تبادل هذه الملفات (شرعا ً وقانوناً) لغير المشتركين في الدورة
Compiler Design
Module 10 summary
The final phase of a compiler is code generator
الل بيحول الكود من شكل متوسط
ه الـ ، Code Generatorي األخية يف الـ Compilerي
ر "المرحلة o
الل يشتغل".
النهائ ي
ي )(Intermediate Representation - IRللكود
It receives an intermediate representation...
الـ Code Generatorبياخد نسخة من الكود يف شكل الـ IRومعاها معلومات إضافية موجودة يف جدول o
المتغيات وحاجات تانية
ر اسمه Symbol Tableزي أسماء
Produces a semantically equivalent target program
األساس ،لكن بيكون مكتوب
ي يعي عن نفس المعن للكود
الل بيعمله هو إنه ينتج كود جديد ر
"الشغل ي o
الل هيشتغل عليه".
بطريقة تناسب الماكينة أو الهدف ي
Code generator main tasks:
ه:
وظايف الـ Code Generatorاألساسية ي o
Instruction Selectionيختار التعليمات المناسبة لتنفيذ الكود بأفضل شكل. ▪
Register Allocation and Assignmentيحدد أي Registerيستخدمها وأي بيانات تتحط فيهم. ▪
تأخي ) (Stallsأثناء
Instruction Orderingيرتب التعليمات بحيث يحقق كفاءة عالية وما يحصلش ر ▪
التشغيل
Issues in the Design of Code Generator
Most important criterion: produce correct target code
نهائ صحيح ويشتغل صح".
"أهم حاجة يف تصميم الـ Code Generatorإنه يطلع كود ي o
Input to the code generator
الل بتدخل للـ Code Generator:
"الحاجات ي o
الـ ( IRالتمثيل الوسيط) وجداول الـSymbol Table. ▪
افياضات زي : مع ر ▪
الل جاي من الـ Front-endفيه تعليمات منخفضة المستوى (Low-level
إن الكود ي ▪
ر
) ،IRوالـ Machine Instructionsتقدر تتعامل معاها مباشة.
األخطاء النحوية ) (Syntacticوالمعنوية ) (Semanticتم التعامل معاها بالفعل". ▪
The target program
https://kbseducation.com/
0550602949 / 0557715267
جميع الحقوق محفوظة لمنصة KBS Education
واليُسمح بنشر أو تبادل هذه الملفات (شرعا ً وقانوناً) لغير المشتركين في الدورة
النهائ هيشتغل عل أجهزة زي)CISC ، RISC (Reduced Instruction Set Computer ي الينامج
" ر o
الل بتعتمد عل الـStack.
) ،(Complex Instruction Set Computerأو األجهزة ي
يف النقاش هنا ،بنستخدم جهاز شبيه بـ RISCمع إضافة شوية خصائص من"CISC. o
Intermediate representations span the gap...
الل
النهائ ي
ي الل بكتبه ) (Source Languageوالكود
الل ربيبط ربي الكود ي
"الـ ( IRالتمثيل الوسيط) هو ي o
الماكينة تشغله (Target Language).
النهائ. ▪ بيكون قريب ر
أكي للكود
ي
بيعتمد بشكل أقل عل نوع الجهاز(Machine-independent). ▪
بكتي من التحسينات ) (Optimizationsعل الكود".
بيسمح ر ▪
Implemented via syntax directed translation...
"الـ Syntax Directed Translationهو أسلوب ترجمة بيعتمد عل الـ ( Parsingتحليل الكود) o
وبيستخدم القواعد اللغوية لتسهيل تحويل الكود".
The code generated by the compiler...
الل بيطلعه الـ Compilerهو كود ، Objectبيكون مكتوب بلغة برمجة منخفضة المستوى زي
"الكود ي o
"Assembly Language.
The source code written in a higher-level language...
الل بنكتبه بلغة برمجة عالية المستوى بيتحول للغة منخفضة المستوى عشان يتحول لكود
"الكود ي o
والل الزم يحقق شوية حاجات أساسية زي :
،Objectي
ينقل المعن الكامل والصحيح للكود المكتوب. ▪
يكون الكود الناتج كفء من ناحية استخدام الـ CPUوإدارة الذاكرة". ▪
Supporting Functions
Code Generation Functions
الينامج.
إيه المقصود هنا؟ بنستخدم دوال معينة ) (functionsعشان نعمل كود مختلف لكل عنرص يف ر •
ا
زي مثل :
decl_codegen:بيعمل كود للترصيحات)(declarations o
https://kbseducation.com/
0550602949 / 0557715267
جميع الحقوق محفوظة لمنصة KBS Education
واليُسمح بنشر أو تبادل هذه الملفات (شرعا ً وقانوناً) لغير المشتركين في الدورة
stmt_codegen:بيعمل كود للتعليمات)(statements o
للتعبيات)(expressions
ر expr_codegen:بيعمل كود o
Scratch Registers
يعن إيه scratch registers؟ دول مساحات مؤقتة يف المعالج بنستخدمها عشان نحفظ قيم مؤقتة ربي
ي •
العمليات.
بتالف registerمش مستخدم وتحجزه.ر
scratch_alloc: oي
معي.
scratch_free:بتفك الحجز عن registerر o
scratch_name:بتجيب اسم ال -registerا
بناء عل رقمه. o
الل بتظهر أثناء العمليات.
ليه بنعمل كده؟ عشان نوفر أماكن للـ intermediate valuesي •
Labels
الل بنحطها عل أماكن معينة يف الكود ،وده بنحتاجه
ه زي العالمات (أو التسمية) ي
ه الـ labels؟ ي
إيه ي •
لما نستخدم jumpsأو conditional branches.
label_createبتعمل labelجديد. o
label_nameربيجع اسم الـ labelده عل شكل نص. o
Mapping Symbols
المتغيات )(symbols
ر الكبية ،الزم نربط أسماء
ر اليامج
ليه بنحتاج نعمل Mapللـ symbols؟ يف ر •
بمواقعهم يف الذاكرة)(memory locations
symbol_codegen: o
الينامج.
الل يف ر
المتغي عام) ، (globalاالسم بيكون نفس االسم ي
ر لو ▪
محل) ، (localالزم نحدد موقعه عل الـstack
ي المتغي
ر لو ▪
ر
منطق ومرتب. نبن الكود بشكل
ي الـ Supporting Functionsدي أدوات بتساعدنا ي
Generating Expressions
Perform a post-order traversal of AST/DAG •
رياض ،الزم تعدي عل الـ Abstract Syntax Treeي تعبي
علشان تعمل code generationألي ر
يعن
)(ASTأو الـ ) Directed Acyclic Graph (DAGباستخدام طريقة الـ ، post-order traversalي
تزور العقد الفرعية ) (subtreesاألول وبعدين تزور العقدة الرئيسية.
https://kbseducation.com/
0550602949 / 0557715267
جميع الحقوق محفوظة لمنصة KBS Education
واليُسمح بنشر أو تبادل هذه الملفات (شرعا ً وقانوناً) لغير المشتركين في الدورة
Emit instructions for each node during traversal •
التعبي ده لـ
ر الل محتاجها لتحويل
وأنت بتعدي عل كل ، nodeبتطلع التعليمات ) (instructionsي
أكي حسب محتوى العقدة.Assembly Code.كل عقدة بتنتج أمر أو ر
Post-order Traversal
Left-right-root •
رً
وأخيا العقدة الرئيسية. اليمي، الل عل الشمال األول ،بعدين
ر الطريقة دي معناها تزور العقد الفرعية ي
الل بتجمعهم.
الهدف هو معالجة كل التفاصيل الفرعية قبل ما توصل للعقدة ي
To generate assembly code for an expression:
Add a reg field to AST/DAG node structure •
الل
كل Nodeيف الشجرة أو الجراف بتضيف ليها مكان اسمه regعشان تخزن فيه رقم الـ registerي
هيستخدم القيمة دي.
Emit instruction and update reg field •
الل هيحمل القيمة الناتجة جوه
أول ما تزور أي ، Nodeبتطلع التعليمات الالزمة وتحط رقم الـ registerي
reg
Call scratch_free when done •
الل
تائ ،بتستخدم functionاسمها scratch_freeعلشان تفرغ الـ registerي لو Nodeمش محتاجها ي
كان شغال عليها .ده بيساعدك يف إدارة الموارد بفاعلية.
ازاي توليد الكود يف معالجات X86باستخدام الـDAG Directed Acyclic Graph
Suppose we want to generate X86 code...
التعبي c = a + 3 - bباستخدام، DAG
ر الفكرة هنا إننا عاوزين نحسب •
هglobal integers المتغيات a, b, cي
ر وبيقولك إن
الخطوات:
MOVEQ a, R0: .1
هنخزن قيمة aيف الـ RegisterاألولR0 o
MOVEQ $3, R1: .2
الثائR1
نخزن الرقم 3يف الـ Registerي o
ADDQ R0, R1: .3
المخزنتي يف R0و R1ونحط النتيجة يفR1
ر القيمتي
ر نجمع o
https://kbseducation.com/
0550602949 / 0557715267
جميع الحقوق محفوظة لمنصة KBS Education
واليُسمح بنشر أو تبادل هذه الملفات (شرعا ً وقانوناً) لغير المشتركين في الدورة
MOVEQ b, R0: .4
نخزن قيمة bيفR0 o
SUBQ R0, R1: .5
نطرح قيمة R0منR1 o
MOVEQ R1, c: .6
المتغي c
ر ننقل النتيجة النهائية من R1إىل o
A post-order traversal...
الل بيور بيه العقد ) (Nodesيف DAGأثناء التوليد : ر
• هنا بيتكلم عن اليتيب ي
Visit a node: .1
نخصص Registerجديد ونخزن فيه قيمة a ▪
Visit 3 node: .2
نخصص Registerجديد ونخزن فيه الرقم 3 ▪
Visit IADD node: .3
الل استخدمناهم.
القيمتي من الـ Registersي
ر نضيف ▪
Visit b node: .4
نخزن قيمة bيف Registerجديد. ▪
Visit ISUB node: .5
نطرح القيمة المحسوبة من قيمة b. ▪
Visit c node: .6
المتغي c.
ر ننقل النتيجة النهائية إىل ▪
Basic Arithmetic
العمليات الحسابية البسيطة زي الجمع والطرح والرصب بتستخدم أوامر زي ADDQللجمع و IMUL •
للرصب.
ر
ريجيسي لو عندك ) ،c = a * (b + 10أول حاجة ر
بييجم األجزاء دي عن طريق جمع القيم وتخزينها يف •
) ،(Registerبعد كده ينفذ العملية الحسابية.
https://kbseducation.com/
0550602949 / 0557715267
جميع الحقوق محفوظة لمنصة KBS Education
واليُسمح بنشر أو تبادل هذه الملفات (شرعا ً وقانوناً) لغير المشتركين في الدورة
Generating Code for a DAG
ازاي تتعامل مع العمليات المتداخلة ،زي )a = f(10, b + c •
أول حاجة بيحسب القيمة لكل طرف من أطراف العملية)(Left-hand child o
بعد كده بيعمل Pushللقيم دي عل الستاك ) (Stackقبل استدعاء الدالة)(Function o
ر
ريجيسي. لما الدالة ترجع قيمة ،بيتم تخزين النتيجة يف o
Generating Statements
توليد الكود الخاص بـ Statementsزي العمليات المنطقية والـControl Flow •
الل بيعمل switchحسب نوع الـ
بيستخدم Skeletonبسيط يبدأ بـ ،stmt_codegenي o
Statement
التعبي Expressionهيولد له كود باستخدام expr_codegen
ر لو كان o
https://kbseducation.com/
0550602949 / 0557715267