0% found this document useful (0 votes)
7 views6 pages

CS477 - Module10

تتناول الوثيقة تصميم مولد الكود في المترجم، حيث يقوم بتحويل التمثيل الوسيط (IR) إلى كود هدف مناسب للجهاز. تشمل المهام الرئيسية لمولد الكود اختيار التعليمات، تخصيص السجلات، وترتيب التعليمات لتحقيق كفاءة عالية. كما توضح الوثيقة كيفية التعامل مع التعبيرات والعمليات الحسابية باستخدام شجرة التركيب المجردة (AST) أو الرسم البياني الدائري الموجه (DAG).

Uploaded by

marj00j2021
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
7 views6 pages

CS477 - Module10

تتناول الوثيقة تصميم مولد الكود في المترجم، حيث يقوم بتحويل التمثيل الوسيط (IR) إلى كود هدف مناسب للجهاز. تشمل المهام الرئيسية لمولد الكود اختيار التعليمات، تخصيص السجلات، وترتيب التعليمات لتحقيق كفاءة عالية. كما توضح الوثيقة كيفية التعامل مع التعبيرات والعمليات الحسابية باستخدام شجرة التركيب المجردة (AST) أو الرسم البياني الدائري الموجه (DAG).

Uploaded by

marj00j2021
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 6

‫جميع الحقوق محفوظة لمنصة ‪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‬‬

You might also like