بسم الله الرحمن الرحيم الصلاة والسلام عليكم ورحمة
الله وبركاته اليوم إن شاء الله احنا بنبدأ chapter
جديد اللي هو chapter الـ code generation الـ code
generation اللي هو المرحلة الشبه الأخيرة الشبه
الأخيرة ليش بقول شبه الأخيرة لأنه عادة ما بيتبعها
optimization احنا فيانا two optimization stages
واحدة بتتم على الـ intermediate code والتانية بتتم
على الـ target code المهم أننا في الـ Chapter 8 ناخد
منه بدايته أو الأهم عنصر فيه وهو الـ Algorithm
اللي بتقوم بعملية Generating الـ code Generating الـ
code هنا بمعنى تحويل من الـ three address اللي هو
الـ intermediate code إلى الـ target code الصراحة ليس
من الـ high level language لأ الـ high level
language بتكون تحول الـ code إلى three address فالـ
code generator بدي ياخد الـ three address code و
يحوله إلى target قبل ما نصل لمرحلة اللي هو الـ
algorithm اللي بتكون بعملية التحويل أو القالية
يعني بدنا نشوف بعض المفاهيم الأساسية طبعا في عندنا
نقطتين أساسيات اللي هم الـ target language شو
شكلها، شو وصفها، إيش الـ instructor احنا بدنا نحول
من three address code إلى assembly code فبنشوف أيش
الـ instruction set طبعا هذا كـ example يعني في الـ
compiler الحقيقي بدنا نكون جاهز أو قادر أن نحول
إلى أي instruction موجودة في الـ machine في الـ
instruction set تبع الـ machine فإحنا عندنا مثال
بسيط بدنا نتعرف علىاللي هو الـ instructions تبع هذا
المثال و بعد كده نطلع على المفهوم الـ basic block و
الـ flow graph هذا المفهوم مهم علشان بلزم في عملية
الـ code generation طيب فاحنا بداية .. يعني أصبح ..
هنطلع على section 8 2 8 2 8 4 و 8 6 ربما نقدر نبدأ
في 8 6 اليوم بس عموما بنقدر نخلصه إن شاء الله في
المحاضرة اللي جاي أنا اللي رغبة أنه أقفص قفز و
اعسع جدا على تمانية ستة منها الحين عشان بس ناخد
فكرة تمهيدية
لشو يعني الـ code generation بضرب على تمانية ستة
على طول ع السريع تمانية ستة في عندي مثال بسيط اللي
هو مجموعة Instructions three address code
Instructions هذه الـ three address code
Instructions هي آتة example تمانية ستة عشر واحد
اتنين تلت أربع خمسة three address Instructions T
سواء نقص B U سواء نقص C هذا الـ code يتحول الى
assembly code طبعا الـ instruction الواحدة هنأ
ليس بالضرورة أن أنها تترجم إلى Instruction واحدة ممكن
أكثر أو غالبا أكثر من واحدة فاطلع على هاي الترجمة
تبع الكود هذا اطلع معايا على الأصفر
اللي أنا حاطيه تحت الخط هذه هي عبارة عن تخيل نفسها
هي نفس الـ example اللي هنأهي A-B U A-C V T U A D D V
V U أنا
على السريع بس بدي أوضح كيف أن الـ instruction اللي
هو عهدة في three letters code بتترجم الى قدة
machine language instructions طلع على سبيل المثال
بص على العمود اللي في المعصر هنا فهي عندي أنا two
variables a و b بيبقى منطلعها من بعض و بتخزن ناتج
في T طبعا هذا بترتب عليه loading للـ variable a في
الـ register أر واحد ثم loading للـ variable b في الـ
register أر اتنين و بعدين كده نحصل الفرق ما بينهم
باستخدام subtract subtract هذه تتخزن النتج في R1
مافي داعي أن أنا أنا أنا أنا أنا أنا أنا أنا أنا
أنا أنا أنا أنا أنا أنا أنا أنا أنا أنا أنا
أنا أنا أنا أنا أنا أنا أنا
أنا عندما أجي هنا في U سوى A-C R1 أعمل retrieval
لـ A من الـ memory الموجودة في R1 صح ولا لأ بس بعمل
retrieval أو loading لـ C و بحطه في R3 بعدها كذا
بدي أطرح فبطرح R1 نقص R3 و بخزن في R1 الآن العملية
هذه جمع T زائد U يعني الـ T و الـ U هدولة إيش هم
الـ T هي ناتجة العملية و الـ U ناتجة العملية و
موجودين هذه القيم في الـ registers فما بروح بجيب
load ولا بجيب من الـ memory ولا شيء على طول R1 وR2
بجمعهم و بخزن في R3 R3 اللي هو كان مخزن فيه مين
الـ C مش هحتاجها بعدين، مافي حاجة للـ C هذا الكلام
احنا أنا وأنت شايفينه و الـ compiler لازم يبقى
عارفه لازم يبقى عارف أن إعادة استخدام الـ registers
لازم تكون بحضر لما أنه ما يروحش يستخدم register
مخزن فيه variable و الـ variable هذا راح نحتاجه
قدام صح؟ وهذا جزء من الـ generating algorithm الـ
algorithm ده بتاخد فعل اعتبار الـ تفاصيل هذه كلها
المهم أننا نستعرض هذا المثال اللي قرر واحد وهو أن
نرى عملية الترجمة ماذا تنطوي على مهام عملية عملية
عملية عملية عملية
عملية عملية عملية عملية عملية عملية عملية
عملية عملية عملية عملية عملية عملية عملية عمل
عمل load بس للـ D و حطها في R2 طب و الـ A كيف أخدت
قيمة احنا هذا عبارة عن assignment نحن قاعدين نعطيه
للـ A value بس ما عجب سيرة الـ A في الموضوع بس عمل
load للـ D و حطها في R2 تمام ما عمل إيش المفروض يعمل
المفروض يعمل store مثلا للقيمة هذه اللي في R2 إلى
يعملها على الـ number location تبع الـ A مش هيك
المفروض يسوي مش بالضرورة يعمل هذا الكلام الآن ممكن
يخليها و لاحقا لما يخلص البرنامج كله إذا والله R2
مش جاء قيمته اللي في الـ memory قديمة بيروح بيعمل
load صح فهو كل اللي سوا حط الـ D في R2 بس عمل شيء
مهم آخر وهي أن هنا R2 سجل في عنده سجلة على الجانب
أن الـ register R2 يحتفظ بقيم الـ D و الـ A ما هم
قيمتين متساويات صح ولا لأ؟ لم يستطع يحتفظ بقيمة
قيم متغيرات مش متساوية لكن لأنه هنا متساوية فهو بس
عمل load للـ D وحطها في R2 وسجل أن R2 أنت أيضا كمان
بتحتفظ بإيه وراح على السجل التبع إيه وقال أن أنت
الآن قيمتك محفوظة في R2 دول السجلين و هذا السجل و
هذا السجل مهمات جدا في أثناء عملية code generation
و لاحظت أن العملية استدعت instruction واحدة بدل
ما يروح يعمل load و يزعلن store وما إلى ذلك Okay
الآن برضه كذلك الحاجة يعني هذا السجل وظيفته أنه
بساعد في توفير عمليات مالهاش لازم هي تهيأ لمن ..
لمن عجب ليجمع U مع V ويخزن في D هو من خلال هذه
السجلات بيعرف أن U مخزن في R1 و V مخزن في R3 فليش
روح يعملهم استدعاء من الذاكرة ويجيب على طول راح
أخدهم من الـ registers وخزن في R1 اللي هو يعلم اللي
هي تبع الـ U اللي هو يعلم أن الـ U مش هتستخدم بعدين
كل هذه المعلومات بيبقى عنده متاحة إيه له أثناء
عملية الـ generation الـ register
آخر
ليش يعني الـ register يحطما هي الـ A عشان نقول نفس
القيم هذا يدخل فيه optimization هو هذا يدخل فيه
optimization لاستخدام الـ registers بمعنى أنه حسن
إدارة الـ register لإن هو عنده registers عدد محدود
فمش على الفاضي الملئان كل ما بدنا نستخدم variable
مروح نجيب بقيمته من الـ memory ونحطه في الـ register
عشان نقدر نجمعه لأ ما هو إذا هو already موجود في
الـ register إذا هو يساوي قيمة أخرى و هم الاتنين ب
.. هذا بسجل عندي في السجل أن هم الاتنين .. القيمة
اللي في R2 هي قيمة A و قيمة D معانا كلها هنا واضح
هذا .. هذا نوع من حسن إدارة استخدام الـ registers
لأنه عنده limited number of registers واضح هنا
أصبح عملية واحدة الآن هيك أخلص عملية أن هي هذه آخر
instruction دي بيستوي visa a due آخر instruction
عندما وصلنا لآخر الاصطناع الآن أريد أن أقفل قليلا
و أعود لنفسي و اكتشف هل لدي Variables القيم
تباعتها موجودة في الـ register و فقط في الـ register
لا أريد أن أخرج و أترك القيم في الـ register بينما
لم أقوم بعمل update لها في الـ RAM
الـ C قيمتها في الـ C و في R تلاتة يعني ال up-to
-date value تبعها موجود في الـ C فما في داعي يعمل
store على الـ C بس الـ C مكان ذكري بينما الـ A
موجود فقط في R2 كذلك الحالة للـ D موجود فقط في R1
الـ V موجود فقط في R3 لأن هؤلاء الـ three values
لازم ينعملوا store ما تطلعش بسيبهم في ال registers و
بعدها تيجي classes تانية تتغير عليهم صح فهو إلى
آخر أشياء on exit خزن بس خزن فقط A و D ما خزنش V
لأنه يعلم أن V مش هيحتاجها بعدين فلو أحملها مش
مشكلة في هذه الحالة في temporary variable مجرد
استخدام علشان ناخد قيم النهائية المهم هذا في الآخر
أنا اللي بقوله احنا لا شرحنا algorithm ولا حاجة
احنا بس وضحنا ايش هي المهام التي يجب أن يقوم بها
ال compiler في عملية ال code generation لما نرجع
ثاني بعد انتهاء المقدمة نعود لنغلتنا نرى ماذا
يفعلون بالضبط لينفذ هذا الكلام بطريقة
تفصيل ودقة نعود إلى سكشن 8.2 نتعرف على target
language اللي هي ايش ال operations ايش ال
instructions ال machine language instructions اللي
بدأ يتم تحويل إليها طبعا هنا ال figure هنا ده بس
عشان يوضح دور ال code generator أن هو بياخد ال
intermediate code اللي تم إنتاجه في مرحلة ال .. في
مرحلة intermediate code generation طبعا ممكن هنا
خط المنطقة ده إن شاء الله لإنه ممكن يكون فيه يدي
optimizer أو ممكن ما يكونش صح؟ يعني الـ Intermediate
code اللي داخل على ال code generator قد يكون
optimized و قد يكون لا المهم هو Intermediate code
وهو بيطلع target program target program هذا قد
يكون optimized أو قد يكون لا إذا بدأنا optimization
فبناخد ال code اللي طلع وبنعمل optimization أول
رقم هو نفس ال code generator يقوم بعمليات ال
optimization من ضمن من ضمن الشغل Okay فهذا الأمر
واضح يعني مش محتاجه الآن نستوعب أيضا كذلك الحالة
أن الوظيفة وهذا الكلام أصبح واضح لنا من المثال
اللي أتى شرحنا أن وظيفة ال code generator تجتمل
على ثلاث وظائف فرعية اللي
هم أولاً instruction selection ايش المقصود أن هو
إذا أنا في يدي T بساوي A ناقص B الناقص هذه بمعنى
أنك تحتاج لتستخدم Subtract صح هذه المقصود بال
Instruction Selection أنك تختار Instruction Target
المناسبة لل Instruction Free Address اللي هو
ترجمتها هذه أول فنة Register Allocation اللي هي أنه
بحكمة وبحذر وبِدقة يستخدم ال registers اللي عددها
محدود بدون ما يفسد ال data اللي فيه صحيح؟ هذا
المطلوب بالبند الثاني ال register allocation
البند الثالث اللي هو instruction ordering طبعا أنا
فيه هذه هنا subtraction بس قبلها بيجي loading لل
A و ال B ف loading قبل ال instruction الواحدة ال
three address بترجم إلى عدة
هذه الوظائف الأساسية لـ Code Generator
هنفلته وهنروح على ثمانية اثنين على طول اللي هو
عبارة عن الوصف لل target machine model نحكي عن
machine model بمعنى machine و ال addressing تبعها
و ال instructions تبعتها و طبيعة ال instructions
يعني أولاً بالنسبة لل addressing ال three address
instructions اللي جاية اللي بنعملها ترجمة هي إما
load and store operations, computation operations,
jump operations أو conditional jumps هذا الـ
instructions اللي سنتعامل معها في ال input
وبالتالي بدنا نشوف ايش ما يقابلها في ال output
كمان ال addresses ال addresses اللي عندنا byte
addressable بمعنى طول ال address تبع أي متغير ال
address تبع أي متغير يتكون من one byte مش أكثر من
one byte هذا بس للتبسيط يعني وما ينطبق على one
byte ينطبق على غيره تمام الآن عدد ال instructions
قليل جدا very limited set of instructions زي ما
هنشوف كمان شوية مجرد اللي هو ال load و ال store و
ال jump و ال mathematical instructions كل ال
operands integers مش هنتعامل مع floating point مش
هنتعامل مع floating point values 30 point values
بيدها مرتبعها من 40 point operations تمام؟ All
operands are integers Most instructions consist of
an operator Operator واحد يليه مجموعة من ال ..
ايش؟ مجموعة من ال arguments اول argument اللي هي
ال target يليها اللي هي ال source يعني مثلا لو
احنا جينا حكينا عن load أول حاجة بعد الـ operation
هو ال target وين بنعمل load على وين على register
كذا أو كذا وبعد هذا بيجي من وين احنا بنعمل load
صح فذلك الحال لو بنعمل subtract عملية طرح أول أول شيء
ال target اللي بنحط الناتج فيه وبعدها كده شو هم
اللي بنطرحه إضافة إلى هذا الكلام سيكون هناك مصطلحات
لازم نعمل jumps و jumps يعني gotos يعني يجب أن
يكون هناك مصطلح للجيمبس طيب الآن ايش ال instructions
احنا قلنا very limited very limited very limited
set of instructions ايش ال instructions اللي بدنا
ناخدها في هذه الاعتبار ال load operations و ال
store operations و ايش كمان؟ و ال computation
operations ثلاثة هدوء ال load operations تعرفينها
اللي هي أن أنا أقول load destination and address
صح هنا two operations ال destination و ال source
ال source عبارة عن address اللي بدنا نجيب منه ونحط
في ال destination ال store عكسه فيه عندي
variable أو في عندي variable وفي عندي address بدي
آخذ القيمة هذه وأحطها في ايش؟ في هذه ال address و
ال computation هتبقى عن operation زي ايش؟ زي ايش؟ زي
ال subtract زي ال add أي أحد من ال operations اللي
شائع وبعدها بيجي destination وبعدها بيجي source
one و source two تمام
يبقى الحكاية ماذا؟ load operations store
operations computation وبعدين فينا ال jumps
conditional jumps و unconditional jumps الجيمبس
هتكون اسمه branch إذا هي unconditional تيجي branch
لحالها PR PR هذا unconditional وبيجي على طول ال
label إذا conditional في عندي ايش ال conditions في
less than zero greater than zero equal zero بدي اسم
ال operation زي B اختصار ال branch ثم اختصار ال
operation نفسها LTZ يعني branch on less than 0 إذا
قيمة ال operation الأولى يعني أقل من 0 بنروح على
ال level وال level ما نروحش و
مثلها لو greater than or equal to 0
قبل ما نطلع على ال addressing modes هذه كانت عبارة
عن وصف لل instruction set البسيط تبع ال target
machine قبل ما نطلع على ال addressing mode بس بدك
تلاقي هذه ال branch من less than 0 لو أنا عندي
شيء زي هيك X less than Y go to go
to L كيف بده يعبر عن هذا باستخدام لازم أجيب ال X و
أضعها في ال register و أجيب ال Y و أضعها في ال
register وبعدين أعمل subtract هيا
نقول R2 وأضع R1 و R2 أطرح R1 ناقص R2 وآخذ الناتج
ب R2 إذا X أصغر من Y، الناتج ده حاجة negative، صح؟
بيحقق less than zero بس بطرها إذا less إذا X أقل من
Y بطرح منها Y بتطلع نتيجة أقل من Zero فخلص ما أجي
بقول هنا branch on less than zero R2 وبأحط ال
label بس بقول الأربع جمل هم الترجمة اللي هنين
جملها الحين هنشوف مثلها ده كمان شوية
الآن الـ Addressing Modes الـ Addressing Modes
عندما نقول إنه في عندي Operations الـ Operations
هي مثلاً الـ Load و الـ Store لتأخذ Addresses ايش
شكل الـ Addresses اللي بتاخدها؟ في عندنا بالبساطة
اللي هو أنه أنا أعطيلها Register يعني عندما أقول
هيك أو أقول
هذا الآن هذا عبارة عن address ال address هذا كيف
أنا أقرأها وكيف بيفهم ال compiler بيفهموا أن خد
المحتوى تبع R2 المحتوى تبع R2 R2 مخزن فيه قيمة خد
القيمة هذه على أن هي ال address وروح على ال
memory location تبعها وجيب ال value وحطه في ايش
في R1 الآن لكن لما انحطت الـ a لما انحطت الـ a أصبح
دي الـ a عبارة عن offset بداية من الـ a ضيف المحتوى
تبع R2 على الـ a هذا هو عبارة عن ايش اسم الـ R2 هي
ال offset الـ a هي ال base مظبوط الـ a هي ال base
والـ R2 هي الـ offset عندما تضيف الـ R2 على الـ A
يصبح لديك موقع وهو على ذاك الموقع خذ المحتوى اللي
فيه وحطه فهو يعمل لودينج على الـ R1 صح فهذا
بتنجرأ وتفهم أنه خذ الـ contents تبع الـ R2 اجمعها
على الـ address A خذ هذا كله على شكل address جيب
المحتوى تبعه وخزنه في أيش؟ لأننا نقول load في R2 و
خزنه في R2 هذه حالة من حلقات الـ addressing أن أنا
أن
أنا
أعمل
register index يعني الـ register صار له index لـ
index ليش؟ لـ array لأن هذا ممكن يشمل الحالة هذه
ويشمل الحالة هذه ويشمل الحالة هذه يعني أنا هنا الـ
A هو عبارة عن الـ base اللي أبدأ منها لكن لو قلت
zero يعني أنا بحط الـ address هذا relative address ولا
لا relative من A صح؟ لكن هذا عبارة عن address مخزن
الـ R القيمة اللي مخزنة فيه هي address مباشر هنا
زي هذا بس المئة هي الـ base كأنه بقوله اضيف مئة على
أو اضيف الـ R على المئة ممكن مئة أو ممكن أي حاجة
تمام فهذه عبارة عن الـ register index addressing
mode
وفي كل الحالات الثلاثة أنا بأخذ اللي برا القوس
بأجمع سواء كانت الـ A ولا الـ zero ولا الـ 100 بتنجمع
على قيمة R وهذا يُتَعامل على أنه عنوان بنروح عليه في
الـ memory بناخد القيمة اللي هناك وبنحطها في الـ
destination
في غيرية كأن هذا الكلام هيته مغطية هنا هنا الموجود
بيه كل هذا تحت التصنيف اللي قلناه هنا في غيرية كأن
أنا أضع اسطرار قبل الـ R يعني أقول ازاي أت هذا
كل ما ينطبق عليه لو أنا وضعت نجمة قبل الـ R يعني لو
أنا جيت قلت نجمة AR أو نجمة
من الـ addressing اللي كنا بنروح نجيب نجيبه ونحطه
في الـ R1 لأ هذا القيمة اللي موجودة في الـ memory
لما بنروح وناخدها وناخدها مش علينا قيمة وناخدها
علينا address لقيمة أخرى صارت هي تشير لسه إلى
مواقع صح فبنجيب الـ content تلقاه ذاك الـ location و
هو اللي بتحط في R1 بنجمع هنا شرع إلى أنه الـ .. الـ
.. الـ .. القيمة هذه ماهيّاش address لسه هي عنوان
لعنوان فا اوكي الحالة الأخرى الـ addressing mode
الأخرى اللي هي استخدام الـ .. الـ hash الـ hash لما
أنا بقول load زي هيك
بأخده على أن هو قيمة بدي أخزن قيمة 100 في R1 مش
أنه مئة هذه عبارة عن وانا اللي اروح عليها اجيب منه
قيمة وأحضرها تمام ما أروحش ناخد هاي على طول تمام
مباشر حي هنا مجموعة examples هذا example واضح
بسيط لترجمة assignment statement الـ assignment
statement هي assignment
وفيها subtraction الـ subtraction هي operation
لازم تتنفس ونتيجة الـ subtraction هو اللي يتخزن في
X طيب الـ subtraction هي اللي ببدأ operations الـ X
والـ Z الـ Y والـ Z ده أنا آسف فبنلاقي عمل أولا
load للـ Y ثم load للـ Z كل واحد في الـ register تأخد
الـ registers دلوقتي اللي براهم وتخزن النتج في
أحدهما أو في واحد جديد بالظبط وبعدين ده القيمة
تتخزن في X X هنا عبارة عن address أنا بالنسبة لي
ولك هو عبارة عن variable name أو identifier بس هو
بالنسبة لـ machine instruction هو address أو
location تمام هذا المثال ليش؟ لـ Assignment أخرى
ولكن فيها array index هذا الـ I ببعض عن index الآن
الـ array هذه هنفترض إنه الوثيقة اللي فيها كل واحد
ثمانية بايت يعني الـ I الواحدة طولها ثمانية فلو
كانت I بتساوي ثلاثة يبقى ثلاثة في ثمانية أول شيء
ننقل I كما قلت هي الخزينة في R1 نضربها في تمام خزين
ويصير هو الـ value الجديد تبع الواحد هذا R1 الآن هو
عبارة عن offset من الـ base A نروح على هذه الـ
location ونخزن ونحمله في R2 بعد هيك الـ assignment
ناخد القيمة هذه نخزن في R2 ونعطيها لـ B نعطيها لـ B
بمعنى أننا بنحطها في الـ memory location تمام
مثل ذلك، لكن لو كانت الـ index على الشمال أولا نحضر
الـ value ونضعها في R1 ثم نجهز الـ location هذا نضع
جهزة J ونضربها في ثمانية R2 أصبح عنوان الـ element
هذا، صح؟ الآن نضع القيمة التي نزلتها من C ونضعها
في هذا الـ location بالـ scroll هذه
الأدرس مايعنيها X تساوي star P P
هي point صح؟ فـ P لما أخدناها أخدناها في R1 الـ R1 هي
عظمها address الآن بيضروا على هذا الـ address هذا
address concrete address مش relative absolute
address فانا مش هضيفه على أي حاجة لا هضيفه على إيه
ولا هضيفه على إيه هضيفه على الزرارة أول واحد إيه
بخزن هذا الآن في R2 الآن R2 يحمي الـ address الآن
بجيب الـ address هذا احنا
بدنا الـ content اللي في P احنا بدنا المحتوى اللي
في P P هي pointer الشيء اللي بتشير إليه فاحنا روحنا
على هذا الـ location وخزنّا القيمة اللي فيها على
R2 الآن R2 بيجب أن نخزنها في X X هنا تساوي إيش X
هي إيش تساوي star P P هيبقى run pointer أمام؟
الصفر لأنه أنا عند P هي في حد ذاتها address ماهيّاش
أنصب في اللو أقصد في address ري بحط A لما أقصد
zero بمعنى أن أنا إيش بدنا ناخدها هي زي ما هي
مانيش أضيف عليها أي حاجة لو ماحطّتش الصفر الآن الـ
R1 الـ R1 مو احنا إيش بدنا نقوله الـ R1 هنا في
حتزاتها يبقى على الـ register ممكن ياخد علينا
address احنا بدنا الـ R1 القيمة اللي فيها يخدها هي
address مش يخدها يعني لو أنا قلت له هي الـ load
ممكن نحط الـ R1 القيمة اللي فيها على R2 لأ احنا
بدنا يروح على اللي في R1 كـ address ويجيب الـ
content اللي فيه يعني مثلا لو R1 يانا بساوي سبعين
ألف أي حالة زي ذلك هل يحط هذا القيمة في R2 ولا
يروح على هذا كعنوان ويجيب أيش اللي فيه هكذا احنا
بنقول له أن هذا address روح
أحد بياخد الـ content اللي فيها على أساس أن إيش؟ على
أساس أن الـ address مش يروح يسلمها زي ما هي الـ R2
أن الـ address يروح على هذا الـ address ويجيب الـ
content اللي فيه ويسلم ويحمل علاقاتنا تمام؟ okay
هذه الـ star P تساوي Y هنا الـ Y الـ
Y هذه في حتزاتها address الـ address هذا اتحمل في
R2 أنا بدي أجيب من هذا الـ address وأحط في هذا الـ
memory location شو هذا الـ memory location؟ R1 P
هنا هبقى عن pointer بقول له أن ده هو الـ pointer هي
ده بيجي سوى Y يعني هي P فانا مش قاعد بقوله خيّرلي
العنوان نفسي لأ بقوله حط العنوان العنوان ده وين
بالشير هذا المحتوى الآن بيجي سوى Y صحيح فاحنا راح
أخدنا P وحطيناها في R1 ماشي بعدين Y وحطيناها في R2
للآن R1 بيستخدمك كعنوان عنوان حطيناه في خانة الـ
destination ويقول جيم اردن اللي هي القيمة الـ
integer value أو كده ويقوله وحطها في الـ location
فلان صح؟ هذا اللي هو المثال تبع الـ F أشكرنا؟ ولأن
أنا بدي أعمل jump إذا كان X أقل من Y بدي أعمل jump
على L كيف بسويها؟ ما عنديش أنا instruction اسمها
jump بالعكس الـ BLTZ الـ Branch on less than zero
فبروح بقى أطرح X نقص Y إذا X فعلا أصغر من Y بهذا
القيمة لازم تبقى أقل من Zero بطرح حاجة صغيرة من
حاجة كبيرة بطرح حاجة صغيرة بطرح منها حاجة كبيرة
بده يطلع سالب
سالب يعني X أقل من واحد في هذه الحالة إذا less
than zero سالب يعني less than zero وده يقفز على الـ
M هنا أدبرة هي الـ L بس مجددا memory location مخزن
في الـ M تمام okay هيك احنا الآن صار واضح أن شو هي
الـ instruction set والـ machine بصفة عامة اللي بدي
نعمل target generation لها بقي بس قضية صغيرة وهي
ربما ما .. ما نحتاجهاش قدام كتير المهم أن كل
instruction لها cost الـ cost بتاعة الـ instructions
كلهم يساوي واحد الـ load الـ subtract الـ store كلهم
يساوي واحد لكن يضعف إليها اللي هو حسب الـ operands
تبعّتها إذا في memory access يضعف واحد آخر بيصير الـ
cost اثنين
فهذه الـ load في حد ذاتها الـ cost بتبقى واحد هل
نضيف عليها كمان ولا خلاص؟ لإجمالي الـ cost بتبقى
واحد بتبقى واحد لأن هذا الـ register وهذا الـ
register فما في إيش؟ ما في access للـ memory فالـ cost
بتاع هذه is one بينما هذه لأنه بروح و بجيب من
memory هي نفس باب الـ load لكن أنا بجيب من memory
فصار الـ cost بتاعها اثنين هذه الـ course طبعا ثلاثة
لأنها عاملة memory location مرتين، صح ولا لأ؟ عاملة
addressing هذه في الأول هي لأ، اثنين أخدنا الـ
content بتاعها، وأخدنا الآن على أساس أنه ينظفنا على
عالمية وجبنا إيش؟ جبنا عالمية وندرس فروحنا على
هذا الـ address لكن أخدنا القيمة اللي مخزنة في هذا
الـ address. هل احنا قيمة نعطيها للـ load؟ لأ، أخدناها
لسه بسبب وجود الـ star أن هي في حد ذاتها القيمة
يعني كمان اه، هي أيضاً address فصارت two memory
accesses مظبوط، فصارت الـ cost الإجمالي تبعها الـ
instruction ثلاثة okay، all right. الآن احنا هذا هو
إجمالي الـ section 8-2. سوف ننطلع إلى 8-4 وهناك فئة
بسيطة وأخرى وبعدها إن شاء الله إذا أضل وجهتي
سننطلع إلى 8-6. 8-4 هو مفهوم الـ basic blocks والـ
flow graphs. الـ flow graphs التابع للـ basic blocks
أن أنا لو عندي
لو أنا عندي three address code زي هيك محتاج
أن أنظر له على شكل أن هو مجموعة من الـ sub blocks. هو
كله كـ block بدي اجزهه تجزئة، هذه بيساعدني في شغلتين
بيساعدني في شغلتين اللي هم هنا ذاكرهم في الـ slide
هذه اللي هو الـ register allocation والـ
instruction selection قدام حنيمين معانا كيف، بس
المهم أنه كيف بدنا نجزئ، ليش بنجزئ؟ لهذه السببين
اللي هو المساعدة في اختيار الـ registers والمساعدة
في اختيار اللي هو الـ instructions
الكود كله يجب أن يكون جزءه
تسلسل متماسك. إذا
لاحظت في يدي jump، الـ jump هذه بتوديني وين؟ على
ثلاثة. الـ jump هذه بتوديني وين؟ على اثنين. يوجد jump
أخرى. هذه بتوديني على ثلاثة عشر
هذا الـ stream من 13 إلى 17، هذا بقدر اعتبرها block
متماسك، أن هالسلسلة بدون ما يصير فيه jump على حاجة
ثانية، لأن السلسلة هذا أنا بقدر أمشي فيه على أنه
كأنه sub program هو لحاله، sub program. كذلك الحال
هذا الجزئي، هذا هيك بقدر آخد عليه أن هي sub program
الآن احنا التجزئة بدنا تمشي على .. لما بدنا نجي
ننظر الـ block الكامل، لأنه sub blocks بدنا نجلس على
اعتبار إيش؟ أن أولاً .. أولاً بدنا نعتبر أن المدخل
الأساسي تبعه أو البداية تبعته هي lead، lead يعني
بداية. لو أنا في عندي jump على أي مكان، هذا المكان
المشروع إليه بدنا نعتبره lead أيضاً
هذا أيضاً lead
اللي قبل الـ lead هي end، اللي
قبل
الـ lead هي end
الـ statement اللي عندها حصلة jump هي أيضاً end، صح؟
إذا في عندي هذا end، يبقى اللي بعديها lead، هذا
الآن end، ويبقى اللي بعديها lead، هي lead وهي end
في نفس الوقت أصبح عندي هذا لحاله، لأن من lead لـ
lead هذا block كامل lead
لـ lead أو lead لـ end، يعني الـ lead جانبنا فيه end
هذا الآن هي كـ block وهذا الآن هي لآخر block ففي
عندنا كـ block؟ ستة. V واحد block one بيحتوي على بس
instruction واحدة. بيحتوي على بس instruction واحدة
بيحتوي على بس instruction واحدة. بيحتوي على بس
instruction واحدة. بيحتوي على بس instruction واحدة
بيحتوي على بس instruction واحدة. بيحتوي على بس
instruction واحدة. بيحتوي على بس instruction واحدة
بيحتوي على بس instruction واحدة. بيحتوي على بس
instruction واحدة. بيحتوي على بس instruction واحدة
بيحتوي على بس instruction واحدة. بيحتوي على بس
instruction واحدة. بيحتوي على بس instruction واحدة
بيحتوي على بس instruction واحدة. بيحتوي على بس
instruction واحدة. بيحتوي على بس instruction واحدة
بيحتوي على بس instruction واحدة. بيحتوي على بس
instruction واحدة. بيحتوي على بس instruction واحدة
بلو طلعنا على الـ leads لوحدها بكفي، لأن هذا الأمر
مرة ثانية. الـ leads إيه قولنا الـ leads؟ اللي هي أي
مكتوبة مشيرة إليها بـ go to. هذه go to بتشير إلى ثلاثة
عشر. في ثلاثة عشر هبقى عن الـ lead go to
هذه بتشير إلى اثنين. في اثنين lead ثلاثة. هذه بتشير
إلى ثلاثة. في ثلاثة lead
الآن الـ gotos نفسها هي نهايات لـ .. لـ blocks فخلاص
أصبح واضح أنه أولاً، لأن هذه lead وهذه lead يبقى هم
الحال كل واحد لأن من بين lead لـ lead هذا block
تمام. فهذا block، هذا block وهذا هيك block لغاية ..
لغاية إيش؟ لغاية الـ lead اللي بعده. إيش الـ lead
اللي بعده؟ أي instruction تالي الـ goto، فهي lead إيه
رأيكم؟ صح؟ هذه الـ قران lead، أي instruction بتالي الـ
goto، يعني الـ instruction المشيرة إليها الـ goto هي
lead، والـ instruction اللي تالي الـ goto هي lead
هذه الـ leads ده يعني خلاص، هذه من هنا إلى هنا هي
block، من هنا إلى هنا هي block، من هنا لـ الـ next lead
هي block، من هنا لـ الـ next lead هي block، من هنا لـ
الـ next lead هي block، ومن هنا لـ الـ next للآخر
خلاص block، بعدين ثلاثة أربعة خمسة ستة. ما هي الـ end؟
أيوه، لأ، الـ end هي أن أنا قلت لحالي أن ما قبل الـ
lead وend، صح؟ okay، الآن هذه الـ blocks بقدر أعمل
منها اللي هو الـ graph. الـ graph أن أنا آجي آجي
أقول block
رقم واحد. صبر شوية، أولاً الـ blocks هذه في التسلسل
الطبيعي اللي من واحدة للي بعدها، صح؟
أصلاً هم متسلسلين في قرائتهم، لكن أيضاً في عندي التسلسل
اللي بالـ jumps اللي هو أن بي ستة متشيرة إلى نفسها
ولا لأ؟ go to ثلاثة عشر، هذه هي ثلاثة عشر هي بداية هذه
لا تشير إلى أحد. مش عارف إليها من قبل، اللي قبلها
اللي قبلها تؤدي إليها. هذه تشير إلى اثنين. هذه اللي هي
مين؟ هذه تشير إلى اثنين، صح؟ وهذه تشير إلى نفسها، صح؟
هي من داخلها لسه، اللي هي هذه تشير إلى نفسها، مفيش
ثاني، لأ. I go to heaven, go to heaven, go to heaven
فهو هذا المعبر عنه هنا على أساس إيش بسميه؟ flow
graph. هذا الـ flow graph طبعا
في عندي في الآخر هنا في exit وفي عندي في الأول في
start أو entry
هذا الشرر، الشرر الثاني فيه يعني loops. هذه هيك loop
صح؟ وهذه loop. أنا أنت بتقولي go to وبروح وفي
الآخر لما برجع بيقولي go to، فهي أيضاً كمان loop
أخرى، هيك، صح؟
فاحنا بنبني نطلع على الـ block الكامل أو الـ code
الكامل على أساس بلوكات sub blocks ونطلع على الـ
sub blocks هذه على أساس graph. كل block عبارة عن
node، node في graph، في الـ graph. الـ nodes هذه تشير
إلى بعضهم أو إلى نفسهم، تمام؟ فأحنا خدنا الـ
instruction set، الـ instruction code كله وقسمنا
إلى blocks. كل block عبارة عن node، وو رصدنا علاقات
بين هذه البلوكات وبعضها، من يشير إلى من. ثم أيضاً
رصدنا أيضاً إذا كان هناك loops بين هذه البلوكات، طيب
هذا الكلام الآن هي
الحكاية الـ loops، خلاص. هذا الكلام هو خلاصة section
8.4 أننا اتعرفنا على كيف Source code له three
others code بنجزه إلى بلوكاته وبنكوّن أن هذه
البلوكات له flow graph. الثامنة ستة الآن اللي هو
بدنا نبص على الـ code generator كيف بده يعمل فيه
عملياً، اللي هو الـ code
أول شيء، قبل أن نشاهد الخطوات، نتذكر أن الـ registers
المتاحة
استخداماتها واقع في واحد من أربع استخدامات، قد تكون
الـ registers تستخدم كـ operands، تدخل في عملية
حسابية. قد تكون الـ registers وظيفتها بس مجرد أن تخزن
فيها value علشان يأخذ الـ value هذا بعد هيك أو هي
ويعطيه لعملية أو لـ store أو لكده، فهو أصبح استخدام
وظيفته بشكل كوسيط يعني أو بشكل مؤقت temporary
يحتفظ بقيمة بشكل مؤقت. ممكن الـ register يبقى وظيفته
يحتفظ بقيمة global value بدي استخدم من قبل أجزاء
مختلفة من الـ code، فبالتالي لازم نحتفظ بعد القيمة
طول الوقت لحد ما نخلص الـ program كله. والحالة
الرابعة اللي هو أن يكون runtime storage management
runtime storage management اللي هو بس عشان خاطر
أثناء العمل أثناء العمل اضطرينا أن نروح
الـ variable إلى الـ memory وناخد مكانه عشان نستخدمه
وبعدين بنرجع الـ memory فهذا بس للـ story runtime
storage management هدولة استخدامات الأربع على ال
register اللي هبنطلع على عملية
الـ register
عملية الـ code generation الـ code generation أول
شيء أن الـ instructions اللي هتكون معانا في ال
example هدا هي load و store و mathematical
instruction صح هاي الـ form تبعهم الـ form هدا واضح
ولا لأ load من memory location على الـ register
store من memory location على الـ register و
operation بتاخد من الـ registers وبتخزن في ال
registers الآن
كذلك بالحالة أن one machine instruction كل عملية
البرنامج كل عملية البرنامج كل عملية البرنامج كل
عملية البرنامج كل عملية البرنامج كل عملية البرنامج
كل عملية البرنامج كل عملية البرنامج كل عملية
البرنامج كل عملية البرنامج كل عملية البرنامج كل
عملية البرنامج كل عملية البرنامج كل عملية البرنامج
كل عملية البرنامج كل عملية البرنامج كل عملية
البرنامج كل عملية البرنامج كل عملية البرنامج كل
عملية البرنامج كل عملية البرنامج كل عملية البرنامج
كل عملية البرنامج كل
عملية الـ address descriptors و الـ register
descriptors هي اللي شفناها لما أنا دخلت على طول
على مثال الترجمة اللي هو هنا هدول
هيك هم الـ register descriptors وهدول الـ address
descriptors
ماذا هو وظيفتهم؟ الـ register descriptor بيقول
لي أن الـ register هذا بيحتوي على قيمة إيه من
المتغيرات مين من المتغيرات يعني هنا هذا وجود الـ a
هنا معناه أن الـ register r1 تحتفظ بالقيمة المتغير
a ليش هذا الكلام حاصل لأنه احنا هنا عملنا load لـ a
في R1 لأنه اتخذنا قيمة a هذه الـ instruction جابت a
وحطتها في R1 أن صار نقدر نسجل هنا أن R1 الآن
بيحمل قيمة a ومثل ذلك أن b على 2 فحطيها المفروض هي
تيجي هنا جابلت بعدين كده أصلا هنا احنا بنعيد
استخدام بعد عملية الطرح بنحط الناتج اللي هو T
بنحطه في مين في R2 ففي الأول بتكون بي موجودة بعدين
بتحول محلها تي مظبوط فهذا الـ descriptor هذا ال
data structure اللي طبعا الـ array صغيرة وظيفتها
أنها تقولي الـ register الفلاني يحتفظ بقيمة مين من
المتغيرات هذا إيش الـ register descriptor و ال
address descriptor مثله بس إيش بيقول لي بيقول لي ال
variable الفلاني قيمته مخزنة في أي location في مين
من الـ locations الـ locations قد تكون إما registers
أو قد تكون memory location فالآن أول احنا ما بدأنا
الـ variable هذا إيه قيمته مخزنة وين في الـ memory
location إيه الـ B مخزن في الـ B الـ C مخزن في الـ
C الـ D و الـ Registers هذه الفاضية لأن مجرد ما
حطينا A في R1 صار لازم أعمل Update للـ Descriptors
هاتي أقول أن الـ R1 اللي أنا صار يحتوي على A ثم
بعدها اللي يبدأ يقول R2 يحتوي على B إضافة إلى ذلك
لازم أقول أن A موجودة قيمتها في الـ memory location
تبعها زائد في R واحد و الـ B قيمتها موجودة في ال
memory location تبعها زائد في R اتنين صح؟ يعني أنا
يجب أن أستمر في تحديد الـ descriptors هذه بعد كل ..
بعد كل instruction بأنفذها أو ب .. أسجلها لازم
أسجل أن وين الـ variable هنا موجود ليش هذا القمر
بلزمني عشان أحسن اختيار الـ registers ما اختارش
register يبقى مشغول مخزن فيه variable و هاتي أمسح
قيمة أحط فيه variable جديد و أمسح قيمة الجديد لازم
يكون في عندي مؤشرات تقولي كل register في إيش
مستخدم و كل variable وين قيمته جاعت وهذا إذا
بتذكروا من خلال هذه المعلومة أنا هنا بعد ما خلصت
قررت أن أعمل store لـ R2 وR1 لأن اكتشفت بعد ما جيت
خلصت اكتشفت من الـ descriptors تبع A أنه هي موجودة
فقط في R2 وأن الـ D موجودة فقط في R1 أن كيف أطلع و
أسيبهم فقرة واحد و اتنين تيجي ورايا حد اللي يتغيره
فلأ فبسبب هذه المعلومة روحت أنا عملت store قبل ما
أطلع okay يبقى وضحك وظيفة الـ descriptors أو غلط
اليها هي مرة ثانية okay
register and address descriptors the code
generation algorithm
register descriptors لكل register يوجد خانة تسجل
الـ variables أو الـ variable names اللي قيمهم
مخزنة في ذلك الـ register
صح هنا بتخزن إيش الـ variable names اللي قيامهم
مخزنة في هذه الدراسة وفي المقابل الـ address
descriptors لكل واحد من الـ إيش الـ addresses يعني
إيش الـ addresses يعني الـ variables بتقول لي هذا ال
variable إيش الـ location أو الـ locations اللي
قيمته مخزنة فيهم اللي ممكن آجي قيمة هذا ال
variable عندهم تمام المفروض أن أضغط على الـ
descriptors نعود لصفحة أخرى نحن
كنا في هذه الصفحة وبعدها نريد أن نشوف هذه الصفحة
ماذا يقول هنا الـ code generation algorithm
considers each tree adders instruction in turn and
لما تشتغل الـ algorithm تجف على كل واحدة من الـ tree
adders instructions What leads are necessary to get
the leaded operands into registers and generate
the loads يعني لهذه الوصفات إذا عندي T بساوي A
ناقص B بدي اتقرر الـ code generation algorithm شو
محتاج؟ loads أرسلت مش leads أكمل عملية load محتاج
عشان أجيب القيم اللي لازم للـ operation قبل ما أنافذ
الـ operation أنا في الآخر بدي أجهزه وأقول
subtract الـ subtract دي بدها إيش؟ بدها parameters
الـ parameters دوله registers هل أنا محتاج أعمل
load لـ a في الـ register و load لـ b في الـ register
أجهزهم قبل ما أنافذ قبل ما أعمل عملية الـ subtract
الـ Algorithm بتتقرر ما إذا كان محتاجة تعمل load
ولا لأ زي ما شفنا هنا لما
شفنا هنا في هذه أي نعم محتاجة load لـA ومحتاجة
load لـB بس في هذه محتاجتش load لـA بس load لـC
فهي بتتقرر ما إذا كان بيلزم تعمل load أو موجود
بالضبط هذا هو أول شيء الشيء الثاني أن أنا برجع
لجوجل add أنه يجهز العمل نفسه بعد ما تقرر إيش
بينزل load و لا لأ بتحط ال .. ال .. ال .. ال .. ال
operation اللي هي الـ subtract أو الـ add أو ما غيره
ثم if there is a need to store أن الـ result هذي
اللي اتخزنها ننتج عملية الـ subtraction is a result
اللي هتجهزه في الـ register في some register هل
محتاج أنا أعمل أسطور لهذا الـ register على ال
memory ولا مش محتاج فهذا الكلام جزء من قالية عمل
الـ algorithm هذا الكلام هو اللي يتطلب عشان أنا
أعرف إيش هل محتاج أعمل loads ولا لأ من ذمني
Descriptors صح أو لا؟ من Descriptors بعرف إذا
والله الـ variable اللي أنا بدأ استخدمه في ال
operation already موجود في الـ register ليش أروح
أملّه load؟ كيف هذه المعلومة بعرفها؟ من
Descriptors كذلك الحالة للـ operation بأرضه وإذا
كان محتاجي الاستورو اللي لأ بقرر من خلال ال
descriptors فالـ descriptors هي عبارة عن data
structures بيسجل فيها المعلومات اللازمة أثناء عمل
الـ algorithm في تشكيل اللي لأ طيب احنا الآن بنقدر
نوجف هنا أن ثماني ست اتنين وبعدين بنبدأ نطلع على
قالية الـ algorithm اللي قاله في الأول بنطلع عليها
بشكل مبسط وبعدين بنخش في تفاصيله شوي شوي خلاص احنا
هيك زي ما اتفجنا بنجف عند اللي هو بداية section 8
6 2 اللي هو بدنا نبدأ فيه في تفاصيل الـ algorithm
بس الآن اتكونت عندنا فكرة واضحة عن المستلزمات اللي
بتحتاجها للـ algorithm والمحاضرة جاءت بنكمل
المحاضرة جاءت بنكمل الـ algorithm كلها إن شاء الله
يعطيكم العافية