بسم الله الرحمن الرحيم الصلاة والسلام عليكم ورحمة
الله ورحمة الله ورحمة الله ورحمة الله ورحمة الله
ورحمة الله ورحمة الله ورحمة الله ورحمة الله ورحمة
الله ورحمة الله ورحمة الله ورحمة الله ورحمة الله
ورحمة الله ورحمة الله ورحمة الله ورحمة الله ورحمة
الله ورحمة الله ورحمة الله ورحمة الله ورحمة الله
ورحمة الله ورحمة الله ورحمة الله ورحمة الله ورحمة
الله ورحمة الله ورحمة الله ورحمة الله ورحمة الله
ورحمة الله ورحمة الله ورحمة الله ورحمة الله ورحمة
الله ورحمة الله ورحمة
الله ورحمة الله ورحمة الله وربتم عملية الـ
Generating Intermediate Code بالتحديد الـ
Intermediate Code اللي شفناه هو الـ Three Address
Code Instructions طبعاً أول شيء شوفنا كيف الـ
Three Address Code Instructions هذي Can be
generated ممكن تشكيلها ليه؟ الـ Types and
Declarations Declaring ال variables شفناها للـ VM
ال variables بسيطة وشفناها للرئيس كذلك الحالوشوفنا
كيف ال expressions mathematical expressions are
translated يعني ايش translated يعني three address
code generation three address code instructions
are generated وبعد كده والان ان شاء الله بنشوف كيف
اللي هو مسألة type checking وإيش بيلطوي عليها من
من توليد أو تشكيل أو generating three address
instructionsوهي ليها أيضا ال control flow
statements control flow statements يعني ببساطة ال
if statement مثلا و ال looping statements while و
repeat وما إلى ذلك فخلينا نروح على بداية ال
section 5 عشان نشوف ايش اللي ايش
اللي أمامنا طبعا
6 أربعة كان اللي هو ايش قلناه
translation expressions حكينا فيه كله طلعنا على
كيف ال syntax directed definition وشوفنا ال
example بسيط هذا وشوفنا example أكبر منه وشوفنا
اللي هو ال addressing array elements كيف ال array
elements لما تبقى ال array multidimensional كيف
نحسب ال address تبع العناصر ال arrayو آخر إشي كان
اللي هو ال example هذا بالظبط هذا ال example اللي
هو بتتشكل
من خلاله مجموعة three address instructions اللي هي
عبارة عن اللي هي بتحسب يعني ال address تبع ال
elementالان ستة كام سأله ال type checking في ال
type checking ال compiler أمامه وظيفتين أساسية
اللي هو أنه يفحص ال type تبع اللي هو ال different
components اللي في ال source code different
components هذه سواء كان variable صغير ولا كان
expression ولا كان function call ولا أي جزية من
جزية البرنامج في الآخر احنا بنعرف ال type تبعها
لأنها قد تدخل في some largerكمبونت يعني هي ككمبونت
انتجر و ال expression و ال function ممكن يدخل في
بناء كمبونت اكبر منها فلازم يبقى يعرف ال type ال
compiler يبقى يعرف ال type تبعها من أجل انه يتأكد
انه هي جاية بال type المناسب في المكان المناسب ف
to do type checking ال compiler needs to assign a
type expression لو عندي اناexpression على سبيل
المثال فيه الـ type attribute الـ type attribute
هذه الـ value تبعها ايش هو ال value تبعها عبارة عن
type expression type expression فهذا دور ال
compiler انه يعطي لكل component سواء كانت
expression سواء كانت variable سواء كانت ايش ما
كانت جزئية من جزئية البرنامج يعطيها ال type
attribute تبعتها تمام ال compiler must thenبعد ما
يعرف أو يحدد الـ type تبع ال expression تبع ال
component لازم ت determine that these type
expressions conform مطابق على ال logical rules
اللي على أساسها بيه نتأكد ماذا كان ال component
هذه جاي في مكانها الصحيح ولا لأ فاحنا عندنا الصفة
عامة لو عندى انالو عندي مجرد identifier او لو عندي
expression او لو عندي function call كل
هذه ال components لازم يبقى معروف في ال type طبعا
احنا نشوف كيف ال type ال identifiers و ال
expressions كيف بينحسب لو ال function calls ال
function calls احنا فيها انواعينهنا في بعض اللغات
تعمل declaration أو تشترط وجود declaration يعني
أنا لا أستطيع استخدام أي variable أو أي function
إلا إذا عملت declaration لها ففي هذه الحالات إذا
كان لدي declaration وعندي function ال type هو ال
type اللي declared يعني انا بيعرف function في ال C
إنتجر X خلاص هنا نعرف ال return type تبع ال
function هو ال type تبعها ال return type هي بتلجأ
integer فال integer هذا هو ال type تبعها لأن بعد
كده لما أنا أستدعيها أقول مثلا Y بيساوي Y زائد F
of X هذا ال operator على الطرف اليمين و على الطرف
الشمال بده two operands من نفس النوعفإيش نوع هذا
الـ Ship؟ هذا الـ Y-Identifier وهذه F، إيش نوعها؟
نوعها اللي هو الـ Return Type تبعها، مظبوط؟
فالمسألة واضحة، على هذا الأساس، هم بيقولوا إذا كان
.. إذا كان F is a function ف .. او .. او .. فالـ F
of X الـ Type تبع T هو الـ Return Type تبع F إذا F
معرفة إنها بتاخد متغير Xمن نوع S وبتعطي output من
نوع T إذ جاء هذا ال expression استدعاء ال function
على هذا المتغير ال type تبع هذا الكلام هو T خلاص
قضية بدهية فمافيش فيها اي تعقيد لما نكون في عندى
لما نكون في عندى انا functionأو لغة ما بتسمح ب ..
بتسمح بعدم التعريف يعني أن أستخدم verbs بدون
declaration ففي هذا الحالة ال return type تبع ال
function ال return type تبع ال function أخر
statement في ال function يعني F و أخدت متغير وبعد
كده return some variable S ال variable S يعني ال
return type تبعه هو ال type تبع ال function فاحنا
we can implyالتي نستطيع أن نستخدمها كـ return type
تبع الـ function حتى وإن كانت مش فاهمولها
declaration من خلال الـ return type تبع أخر
statement فيها هذا بالنسبة للـ type في حالة ال
functions يبقى صار واضح لنا كيف التعامل مع ال
identify وال expressions وال functions من أحد ال
return type طيب okay بما أنهقضية تحديد ال type تبع
ال component صارت معروف كيف نعالجها الآن حددنا ال
type تبع two components ولكن وجهنا انهم جايين في
عملية ضرب مثلا ولكن ال type تبعهم مختلف في هذا
الحالة لازم نعمل type conversion ال type
conversion هذاغالبا ال programmer ممكن يكون ماكد
باله من اختلاف ال types فهو يحط cast instructions
يحط cast instructions عشان يعمل explicit
conversion ال programmer لكن في حاجات زي ذلك ال
programmer مش هيحط explicit conversion لأنه عارف
ان ال compiler ايش هسوي هيعمل implicit conversion
مظبوط ولا لأ؟هنا هذا integer وهذا float عملية
الضرب لازم تأخد equivalent types فهذا ليس
equivalent فلازم يصير conversion ال programmer مش
هيعمل هذا الكلام لأنه عارف ان ال compiler هيسويه
ال compiler كيف بيسويه هذا هو السؤال فاحنا قادم
نطلع في ال section هذا على كيف يتم ال conversion
طبعا بتتم بمعنى انه بينعمل generation لالـ three
address code instruction تتولى عملية ال conversion
اللي هي ببساطة typecast بهذا الشكل بهذا الشكل
الاتنين هي اللي بدأت تتحول صح؟ صح؟ ليش؟
ال float بصيرش انتقال
انتجار بيضيع ال fraction cost بالظبط احنا بصفة
عامة ك rule ك type conversion rule ك type
conversion rule عامة احنا بنحول من الأضيق إلى
الأوسع ال integer انت تاوم قولت انتجار ال integer
هو الأضيق و ال float هو الأوسع فاحنا بنحط .. بنعمل
conversion conversion هو إضافة اللي هو ال type
costing هذاهذه الاصطناعات لازم تسبق هذا
الامر
طيب اللي احنا بدنا نشوف هذا الكلام بدنا نشوف هذا
الكلام كما شوية بنشوف كيف بتتعمل اللي هو ال type
conversion instruction بس قبل بدنا نحكي على اللي
هو ال symmetrical اللي associated with ال
expressions بمعنى ان انا الان عندي expression و
احدى صيغته ان هو يتكون من two expressions ما بينهم
عملها متزايدبدنا الـ type تبع ال expression
الإجمالي وقولنا هذه هي مظيفة ال compiler في هذا ال
section في هذا الإطار اللي احنا بنحكي فيه إطار ال
type checking ان هو بده يفحص ال type و بده يعمل
type conversion إذا لازم الأمر فعلا ففي الشكل
الأولاني اللي هو يفحص ال type يفحص ال type بمعنى
أنه يعطيكالـ dot type attribute يعطيها ال value
تبعه فإيش ال value الإجمالي تبع ال value تبع ال
expression الإجمالي ال value تبع ال dot attribute
تبع ال expression الإجمالي نقدر نقول زيكي إن والله
إذا E1 عبارة عن إنتجة و E2 عبارة عن إنتجة يبقى ال
expression الإجمالي ال type تبعه إنتجة
هناك ما يتقلب بيه وهو إعطاء الـ dot type ال value
تبعها ال dot type مين تبع ال expression أجمالها
إذا كان هناك اختلاف فهي لازم تحويله لكن دعنا نحن
نتحويلها على شجة قليل الآن أجلناها بس مجرد أننا
نرى كيف إذا لو أن الأولاني
integer والثاني integer بالإجمال ال integer إذا
كان الأولاني float والثاني integerماذا نعطي للـ E
-type؟ نعطيه float بس
هذا الكلام برضه يتضمن اننا هنعمل conversion هنعمل
conversion ونعطيها float صح؟ بتانة اه في حالة
التانية طبعا الان هذا مثال بسيط بس عشان اوضح فكرة
ان انا بحط ال type ال type attribute بعطيها قيمتها
بهذا الأسلوبو وين بحطها لكان كإيش ك semantic rule
تدخل مع مين مع ال grammar في syntax directed
definition صح ولا لأ okay يعني بحدد ال time بهذا
الأسلوب العملية ال conversion في الأول احنا بدأنا
نتفهم ان ال conversion دايما بيبدأ من الأضغط بيكون
في اتجاه من الأضغط إلى الأوسع
فالفكرة هذا بيوريلي يعني إيش أنا أضيق و إيش أوسع
هذا narrowing يعني لو أنا حولت من double ل float
أو من float ل long أو من long ل integer أنا بضيق
صح narrowing و العكس اللي هو إيش ال widening
widening يعني لما أنا بحور من byte إلى short من
short إلى integer من integer إلى long و ممكن من
integer إلى float يعني مش ضرورة إيش بشكل مباشرلأ
بالتدريب ممكن اختصر بشكل على طول مباشر فهذا اسمه
widening صح؟ الآن احنا ال widening بتمن الأضرق إلى
الأوسع الآن دور ال compiler انه يحدد من الأضرق من
الأوسع و يوسع اذا في اختلاف اذا في اختلاف اذا انا
بحكي عن expression و ال expression هذا يتجول من
two
أضغط من التاني يتوسع إلى ال type التاني يتوسع يعني
بيحصل فيه explicit type conversion explicit هو على
مستوى ال three address code بس بالنسبة لل
programmer هو implicit صح تمام فاحنا الآن بيحنا
نتخيل two functions ال function الأولى اسمها max
ال max هذه بنعطيها two typesTWO TYPES وبنعملها
بحيث ان هي تتطلع على ال two types دولة و تعطيني
مين مين مين الأكبر صح مين الأكبر حجمها من ناحية ال
size في ال memory خلي بالك ان ال types هذه تي واحد
تي اتين ممكن تبقى simple types integer float او
تبقى complex type زي array ofأو array of two of
array of three of integer صح زي المثال اللي هنا
فهي وظيفة TMAX هذه فقط انها بتعطيني تقوللي مين من
الاتنين اللي دخلوا عليها مين من ال two types اللي
عطينا هياهم ال size تبقى أكبر بناء على الإشارة
اللي بدي تجيني منها بقى كرمر اعمل widening
widening لمين؟للي ايش للكبير طبعا للصغير اذا ماكس
تاكس two types تاكس two types T1 و T2 يعني انا
تخيل معايا E1 و E2 هدولة عندي ال attributes سبقتهم
ولا
لا هم ممكن اعطيهم لمين لماكس وهي اللي بتقول ليهمي
لاكبار هي and returns the maximum or least upper
bound of the two types in the widening hierarchy
it declares an error إذا T1 و T2 is not in the
hierarchy إذا ما بتعرفش أي واحد منهم أو إذا .. إذا
.. إذا .. إذا .. إذا .. إذا .. إذا .. إذا .. إذا
.. إذا .. إذا .. إذا .. إذا .. إذا .. إذا
بطلّه لي مين إذا هم equal بطلّه لي أي واحد منهم
وإذا واحد منهم أكبر من التاني بطلّه لي الأكبر الان
بعد ذلك بقدر أجي أقول widen لمن؟ للصغير ال widen
function بعطيها address بعطيها للصغير و بعطيها ال
type الكبير اللي انا بدي اتحول
ليش بأعطيها address؟
ليش بأعطيها address؟ إيش يعني address؟ اتذكر
معايا إنه احنا لما كنا في ال examples اللي قبل
بالدرجة
على ال example في
البداية في البداية كان معانا exampleترجمة لـ two
expressions إذا
تذكروا كان هذا اللي هو ال code وهذا
E2 not code بعدين
أخدنا ال T2 اللي هي ناتجةأحنا اعتبرنا هذا
E1 وهذا E2 بينهم الذات تمام اعتبرنا ان السطرين
الأوليات هم ترجمة ال E code تبع ال dot code تبع E1
و السطرين التانيات هم ال dot code تبع E2 و بعدها
بيجيش السطر اللي بده
يحط نتيجة عملية الجامعة هذا كله هيك لان هنا متين
بعدها كان هذا الصقر الأخير هو اللي هو ال
assignment أخدنا ال T5 عشان نعطيها لإيه T5 هي إيش
ال address تبع ال expression كله T2 هي ال address
تبع expression واحدتذكروا مرة معانا كان فيها حاجة
اسمة E.code E واحد ال code و E واحد dot address و
E اتنين برضه dot address هذه address هي عبارة عن
ال temporary او ال name او ال variable اللي بيتجمع
في ال value تبع هذا ال expression او ال sub
expression اذا هو sub expression مظبوط فانا الان
عندي E اتنينهو اللي بتجمع فيه ال value تبع هذا
expression وهنا هذا T2 وهذا T4 طيب لو انا لو
كان في عندي T4 ال type تبقى غير عن T2 يعني هذا
مثلا integer وهذا float فانا بدي اعمل التحويل على
هذا float وهذا integer بدي احوّل T2 بدي احوّل هذا
بدي اعمل تحويل على بنيان T2 فT2 هو ال address اللي
بدي أسلمه ل ويدن هقول ل ويدن T2 و أعطيها ال tribe
تبعه اللي هو بدي نكون integer و أقولها حولي ليه
إلى float واضح ليش احنا بنعطيها address؟
اللي ال type تبعه integer فى الآخر بيصوب فى مين فى
ال address فلانى فانا هو هذا اللى هحاوله مش هعمل
تحويل لكل الأسطر انا هخلل الأسطر كلها تتصفى فى
الآخر فى هذا ال T و هذا ال T ال value ال value
تبعه اللى عمل ال conversion و انا هفدرش على إيش
على ال slide هذى
Wieden generates type convergence if needed to
widen an address A of type T into a value of type
W إذا و الله أنا ما أعطيها T و W نفس النوع و قعد
بقولها Wieden A من integer ل integerهترجع ل a هو
هو واش وما تغيرش اي حاجة لكن لما بقولها a من
integer ل float معناته وايدن مسئولة انها تعمل
generate ل instruction زي هذه هي
اللي بتعمل هذا ال instruction وايدن وتعطيلي T1
اللي أخده وحطه لاحقا في ال instruction اللي بعد
و اي اي وايدن اترتيز ايه اتسلف اذا T وW اتسلف في
نفس الوقت اخرى تعمل تعمل تعمل تعمل تعمل تعمل تعمل
تعمل تعمل تعمل تعمل تعمل تعمل تعمل تعمل تعمل تعمل
تعمل تعمل تعمل تعمل
عطيني temporary صح فreturns an address بتاخد
ال address اللي انا بدي احوله و ال type تبعه و ال
type اللي ايش انا بدي احوله عليه اليه فهي بتفحص
اذا T بساوي W نفس ال type هنا هذا type checking
الـ T هذا و الـ W هذا قد يكون Simple يعني إيه الـ
Integer في لوتك أو قد يكون Complex أو Compound أو
Array الـ Compiler لازم يكون قادر أو الـ Wider
لازم يكون قادر على إجراء المقابقة أو المقارنة بين
الـ Types سواء كانت Simple Types ولا Complex Types
فإذا هم الإثنين مميزين .. مميزين .. مميزين ..
مميزين .. مميزين .. مميزين .. مميزين .. مميزين ..
مميزين .. مميزينسأعود إلى أنه لا يوجد أي تغيير لأن
إذا كان هناك اختلاف فبنشوف الاختلاف كيف هل تي
انتجر و تاني float إذا كان ذلك فنعمل new temp
ونستحدث هذه ال instruction نعمل new temp فليكن تي
تلاتة ونضع هذا ال temp تي تلاتة يساويو نكتب كلمة
float بين بلوسين مسكّر و نضع ا ا اللي احنا طالبين
تحويله الادرس اللي احنا طالبين تحويله و نضع ا ا ا
ا ا ا ا ا ا ا ا ا ا ا ا ا ا ا ا ا ا ا ا ا ا ا ا ا
ا ا ا ا ا ا ا ا ا ا ا
ممكن أعمل الـ function اللي هي minimum زي function
ال max و أصبح دايما أعطي ال minimum لل T و أعطي ال
max لل W max type لل W و ال minimum type لل T و
اسفز بالD و أيضا دايما بتعمل و أيضا دايما بتوسع
ماهي الفكرة أنا بدي أن ال T هي ال minimum و بدي أن
أعطي ال W ال max ال T تقضيها ال minimum وها ال max
و بتصبح بتوسع اه دايما هو احنا ايش اللي بيصيح غيطه
احنا اللي عندنا هنا انه اناهي بصفة عالمية ال
production هذه ال grammar ال rule هذه حطينا معاها
meaning semantic action اسم مش rule ال semantic
action هذا يشتمل على عدة خطوات أول خطوة تحديد ال
type تحديد ال type بدل ما كنا بنقول اي واحد اذا اي
واحدو E2 فساوي كده لأ احنا ولناها ل Max Max هي
اللي بتفحص ايش ال type تبقى E1 و ايش ال type تبقى
E2 و بتعطيني ايه الكبير من بين الاتنين و هذا
الكبير هو تصير هو ال type تبع E تبع ال expression
الإجمالي صح بظبط هيك منطقي semantically correct
semantically correctالان خلصنا من هذا type
checking و type expression assignment يعني احنا
assigned ال data type attribute تبعت ال expression
لان لو هم مختلفين او كده بالك max لو هدول اتنين
نفس ال typeهتعطيني ال type هو اللي نفسه لو في
اختلاف هتعطيني الكبير سواء هذا اللي كان كبير او
هذا اللي كان كبير بعدين بنخش على قضية ال
conversion قضية ال conversion بنقول له انت مغمض
why then؟ why then مين؟ why then الاش ال address
تبع ال expression الأولى يعني اوسع ليش؟ لل E ده ال
type لل expression الإجمالي تذكر ال expression
الإجمالي هو اللي أخدال expression الجمالي أخذ
الأوسع أنا جاهز من جلده واسع هذا للأوسع طب إذا كان
هو نفسه هو أي واحد هو اللي كان أوسع عادي بسيطة
وايدن مش هتعمل ولا حاجة مش وايدن أول حاجة بتفحص
فانا بدل ما أفحص برا وايدن خلت عملت فحص جوا وايدن
بدل ما أفحص أنه والله اتطلع لهل يا ثرة أي واحد هو
اللي كان كبيرإذا هو كبير استدعى ويدن .. إذا هو
الصغير استدعى ويدن عشان توسع وإذا هو الكبير
ماتستدعيهاش لأ بدل ما أعمل هذا الكلام قلت تعالي
ويدن تعالي واسعي هي لحالها هتفحص إذا والله ماتحتاج
توسيع ماتوسع مش محتاج ماتسويش محتاج تشغيله هيك
ايه؟ هيك واحد منهم هيكون الكبير يعني ما اي واحد ..
ما .. ماعرفش يمكن مايكونوش يمكن .. يمكن الأثنين
تنتجواطبعا لو هدولة التانية انتجر هده
هيبقى integer تمام؟ هده الان انا قاعد بقولها وسعى
من integer ل .. integer انتجر مش هتسوي ولا شيء ال
address هده هو نفسه ا واحد يعني هده ال pointer
يشير الى ايش هده هيشير الى نفسه وهده برضه مش هتوسع
ولا حاجة يعني هم التانية انتجر قاعد بقولها من
integer ل integer
الـ max دورة بس ان يفحص من ال max و ال widen بس
تعمل ايش تعمل توسيع و خلاص فصلنا الشغل نعم انت
ممكن تحطه كله في هذا لكن لو الان هذا مفترض integer
و هذا float او هذا long هذا اللي انا هيصير float
لان هنا حابب اقولهاواسعى من integer لان ال E1 هو
ال integer من integer الى float انا مابعطيها هنا
ال time من integer الى float فهذا هتروح توسع و
تعمل تنساش هتعمل generation ليش ال three address
instruction تستحدث فيها temporary و ال temporary
هذا هو اللى اتخيل انت الآن هتكون عملته E1 بساوي
float
E1 E1.type لا أعرف ما هو ال temporary تبعه هذا هذا
في الآخر هو ال temporary صح؟ لأنك ستعطيني E1 هذا
ال E1 ستشتغل هذا لن يعمل أي شيء لأنني أستخدم E2
.type E2 هو ال float أقول أنه سأوسف من float إلى
floatالان بعد هكذا هذا المهم اللي هو انه بما ان
مستحيلاتنا هذا انا الان قبل ما اعمل عملية الجامعة
انا بدي اعمل عملية الجامعة بدي اقول انه ال E dot
address اللي هو هيبقى temporary برضه ده ساوي ايش
lot E1 ده هو ال A1 اه هذا هيجي T1 هنا و الت ا و
بعدين زائد و E2 هذه هتبقى E2 dot address
بمعنى آخر هنكون عملنا التحويل خدنا نتج التحويل في
temporary ال temporary هذا هو اللي هدخل في عملية
الجامعة code بسيط elegant يعني معمول بشكل مرتب و
بيقدر الغرض و بقدر ايش اعمله عدة استخدام
Okay فاحنا ده عمليا عمليا في section 6 5 بنكون
شوفنا كيف ال compiler بيعمل ال checking و ال
conversion بيعمل checking بمعنى انه يفحص ال type
يتأكد ان ال types على ما يجب ان تكون عليه و اذا لم
تكن على ما يجب ان تكون عليه بيعمل conversion okay
علشان ايه تكونعشان يمشي ال compilation فهذا الان
النقطة التانية او ال section التانية اللي هو ال
translation اللي علاقة بال control flow statements
control flow statements بتبقى اشي زي
بتكون with else أو بدون else و loop ال loop while
وال repeat و ال .. إيش ماكان في الأخر في كل الحلقة
سواء ال F و ال loop في يدي condition Boolean
expression إذا تحقق بمعنى إذا قيمته كانت trueسيحصل
فيه action معين وإذا لم يتحقق سيحصل فيه action
مختلف من هنا ال control flow يعني التحكم في تدفق
ال code فأحنا الآن أصبح ترجمة ال flow of control
statements جزئية تانية جزئية متعلقة بترجمة ال
statements اللي بدو ينتقل اليها ال execution
وجزئية قبلها اللي هي ترجمةالـ Boolean Expression
الـ Boolean Expression هي أداة فيها ذات و هو
expression بدّوا يعملوا translation احنا شوفنا
expressions قبل الحكاية بس كانت mathematical
expressions ولا لأ اللي فيها علامة فيها جمع وضع و
طرح و .. انما Boolean expressions الـ Boolean
expressions ماشوفناش أصلا ال grammar تبعها كيف ال
grammar تبع ال Boolean expression؟
ممكن يبقى or وهو عبارة عن expression يتكون من this
junction ل two other expressions او conjunction ل
two other expressions او negation ل one expression
او يبقى فيه عبارة عن relational operator ما بين
two expressions ال two expressions هدولة
mathematical expressions يعني هذا expression
mathematical قيمته وهذا قيمته من اللي هو أكبر أو
يساوي أو أقل على أساس ال boolean value او تبقى
كلمة true ك token او كلمة false طيب في هذه الحلقات
المختلفة كيف يمكن ال translating ال boolean
expressionلاحظ مرة تانية لان انا قلت انه انا عشان
اعمل ال translation لل control flow statement اللي
هي ال F كلها و لل Y كلها ازم اش ينعمل translation
لل boolean expression و ال statement و يتركب هذا
كله في ايه؟ في هيكلية مع بعض اللي تعبر عن ال
statement برجع رجوع انا اذا في حالةF Statement
بدون else يأتي كود الـ Boolean expression في الأول
و
بعدها كود ال statement لأن هذا ال statement مثل ال
statement الأخرى التي رأينا أنثى مختلفة فيهابس الـ
Boolean expression هذا بدي برضه كمان بدي two
attributes معاه واحدة dot true واحدة dot false
عشان أحط فيهم pointers على وين بده ينتقل التنفيذ
إذا كان ال Boolean expression true و وين بده ينتقل
إذا كان ال Boolean expression false صح ولا لأ؟
تمام؟ يعني تنساش هذا ال Boolean expressionعبارة عن
expression وإيه الترجمة تبعته وإيه ال code ال code
اللي هو مجموعة ال three address instructions ففيها
هنا ال code اللي هو الترجمة تبع ال condition ال
boolean condition هذا ال code مخزن في ال dot code
attribute تبع ال b ال b أيضا كمان مش مبقولالـ B
.true attribute والـ B.false attribute هذولا ال
two attributes هذولا pointers هذه attribute تحتوي
على text ال text هو ال translation تبع ال bullying
expression هذولا attributes تبع عن pointers واحد
منهم يشير إلى وين بده يبدأ ال execution إذا كان ال
condition true وين هيبدأ هنا يعني هذه ال dot true
بتشير إلىهنا ايش هي هنا اللي هو بداية ال code تبع
ال statement فإن احنا قاعدين نقول if if if بي then
ال statement صح؟ و ال false بديشير على اول
statement بعد اول line او اول instruction بعد ال
yes بعد ال statement بالظبط okay فانا هاي اللي
بذبني يوم انا بعملTranslation لـ Statement بهذه
الصيغة FBS معناته أنني أكوّن الـ Translation
الإجمالي لـ S بهذه الهيكلية أولاً الـ Translation
لـ Condition ألحقها بالـ Translation لـ Statement
ولكن برضه أريد أن أكون عامل .. أعطي Value للـ
Pointers الـ Dot صحيح والـ Dot خاطئ
بنحكي عن هذه الصيرة في عندي else معناه ذلك بعمل
نفس الشيء بس انا هنا في عندي two statements S1 و
S2 S1 هي اللي بتتنفس إذا ال condition هدا true
ولكن إذا false بتتنفس S2 ابجي أنا الآن اتضبط ال
true تبع ال B بتشير إلى إيش؟ صح؟الى الاول line في
ال S1 code S1.code و لما ينتهي هذا ال code على طول
ستعمل jump وانا مغمط على مين؟
هذه هي الهيكلية اللى بدى يعملها ال compiler اللى
بدى يعملها ال compiler إيه ده في الحالة التالية في
حالة وجود ال else في حالة loop مش if في حالة loop
زي ال while loop فيها اندي انا ال condition وفيها
اندي statement بده تنفذ بشكل متكرر فهي بدي يجي ال
code ال code تبع ال boolean expression بعدين ال
statementبعدين هنا go to begin which هي أول
instruction في الـ boolean فحص الشرط بالظبط عشان
نرجع نفحص الشرط إلا لو الشرط هذا مش متحقق ال dot
false بتشارع عليه على أول statement بره أول
instruction بره ال statement بره ال while
statement كلها هذه الهايكامية الآن عشان احنا ال
compiler يعملها لازم في الأوليكون عامل ال dot code
تبع ال B و بيجي هذا ال dot code كله في موقعون
العراب فيش في الصيغة الكبيرة اللي هي ال statement
الكلية فاحنا الآن بدنا نطلع على ال B كيف ال
translation تبعها بيتم ماشي عشان بعدين خلاص هذا
كله نرحله معانا على ال translation تبع ال
statement الكلية
هذا الفيجور 6.37 وهو generating free address code
for Boolean expressions اللي جابله اللي انا فلدته
بس هرجعله syntax derivative definition برضه for
generating code لكن for flow of control statements
flow of control statements بتحتوي على Boolean
expressionsيعني بروح على سبعة و تلاتين طبعا
لأنه عبارة عن syntax directed definition فهو فيه
أنه هنا ال productions و لكل production شو هي ال
rules؟ ايه اللي بيتنفس؟
ايه لها؟ okay لو أنتي ال boolean expression احنا
قلنا هذه حالات اللي ممكن نتوقع ال boolean
expression يبقى بنيتهممكن يكون bonus عبارة عن or
لتو expressions وممكن يبقى and وممكن يبقى not ل
one expression وممكن يبقى relational operator ما
بين two mathematical expressions صح وممكن يبقى
true او false طبعا ممكن يبقى ghost بس
هنا ما انتوا احنا مش هنعمل اي حاجةهيبقى ال
attributes تبقى بيه هي ال dot force تبقى هو هو ال
dot true تبقى هو هو و ال dot code تبقى هو هو مافيش
أشياء حقيقة يزيد أو ينقص عليه عشان ذلك مش .. مش
ورد هنا okay فلو كان عندي هو ال expression مركب من
two expressions وبينهم or okay
احنا في القلاصة
إنه أنا بدي آجي أقول ال .. ال B1 بنحط ال code تبعه
يليه
إيش ال code تبع B2 بس
بينهم إيش في هذا
label
هذا ال label شو وظيفته وظيفته انه انا لانها or
لانها or فيفترض ان انا بفحص بالظبط بفحص b1 بس كان
true خلاص بقدر اقفز وما اكملش مانفلش مانفلش ال
code هذا بس بشوفش b2 الا لو كم بي واحد false ايوة
بس اذا بي واحد false بكملفهذا ال label b1.false
إذا هو .. نعم إذا هو b1.false إذا b1 كان false
ماعرف أقولك b1.false يساوي new label okay new
label .. new label هذا وين بده يروح؟
فانا الآن اللي هيحصل انك انك انت هيبقى ال code
تبقى D1 D1 في
اخر في اخر statement لها if نفترض انه ال value
النهائي تبقى D1 صدفة temporary كنقمة 7 if T7
is true هيقفز على بره على طول مظبوط اذا T7 false F
false ها اكتب F false T7 go to P1
هذه القفزة موجودة في كود B1 موجودة
في كود بي واحد يعني بي واحد ترجمة تبعته انه إذا هو
فوق ضمن الترجمة تبعته ضمن ال instructions تبعتهم
في statement في الآخر بده تقول ان هو إذا انه صب ال
value كله في الاخر في T7 بده نفحص T7 إذا T7 true
بدنا نقفز إليش إلي برا إذا false بدنا نروح على وين
ال shop التاني و أحس أن هذا ال statement بيوحدة
true بيوحدة وين بتوديني يعني لو هذا لو T7 ال true
يعني بيه كلها true بعد ذلك خلصنا بدنا نقفز برا وين
برا؟ برا اللي هي أول statement أنا كله بيهأول
statement بدأ تتنفذ بعد إذا كان هذا true ف ال dot
true تبع بيه كله هي اللي بتتخزن ك dot true ل بيه
واحد انت ذاكر ان هذا هييجي ال بيه ضمن if statement
او while statementفالـ B هذا الـ dot true تبع إذا
هو true سينتقل ال execution هنا وهذا اللي بدي أن
ينتقل ال execution أيضا هنا إذا كان إذا الـ B هذا
متكون من two child born expressions إذا هذا لحاله
true فبدي أيضا أبقى على M عشان هي كذا أحنا أعطينا
ال dot true تبع ال childتاخد نفس ال dot true تبع
actual parent واضحة؟ فاحنا أهم حاجة أن نربط ال
pointers تبع ال false و ال true تبع ال B1 و B2
اللي هو ال child expressions أو sub boolean
expressions و بعد هيك نكون ال translation
الإجمالية تبع ال expression الإجماليهذا في حالة ال
or في حالة ال and طبعا هذا الكلام اللي هو إنه إذا
هذا true أقفز على طول و أخرج على طول هذا بيسميه
short circuit صح ولا لا بيسميه short circuit إنه
أنا ما أعملش فحص لكل ال disjunctions طب ما هو هي
or disjunction فأي واحد منهم true خلاص بوفر علي
أفحص الآخرالان نفس الاشي في short cut لل end بس
العكس يعني لو واحد منهم طلع false بخرج وما بحتاجش
افحص بجيت ال sub expressions ال sub boolean
expressions صح؟ راهز ان التركيبة تبعت ال code
هنا بيوة حدق ال true أخدت ال new label ال new
label اللي هو DG في النص هذا اللي في النص جاي
علشان إيش جاي علشان إذا والله هذا ال true أفحص أما
إذا false أطلع بديش أكمل بدي أطلع برا عشان هيك إذا
هو true بكمل الفحص عشان هيك إذا هو trueعشان هي أجت
على إضافة true attribute تبع بي واحد إذا true بدى
أتقل إلى ال new label هذا بدى يجي هنا فإذا بي واحد
ال true بدى أقفز بدى أروح عليه عشان أكمل فحص اللي
هو بي اتنين وإذا في كمان برضه بي تلاته طبعا هذا
الأمر انت عارف هو nested يعني هذا يعني لو أنا عندي
تلات شروطهيجم هادا
هيجم متكون من ايش P1A and P1B وبعدين هادا فالان
البنيه هادى بتسمح بال nesting بتسمح ان انا تتكرر
ال graphية تتفرع لصديق اللي هو ال conditions من
بعضهافواضح ليش هذا الان dot true أخد ال new label
علشان إذا هذا true فعلا يكمل على البعد إذا false
إذا false بيطلع تماما يطلع تماما يعني يروح على ال
statement اللي بعد B مش مش بيروح على S1 بيروح على
ال statement اللي بعد ال S اللي بعد ال S تماما
اللي هو على طول اللي بعد ال B تماما okay بيطلع برا
على البصير بي دوت فوكس بي واحد دوت فوكس بي دوت
فوكس بي اتنين not true بيساوي بي دوت فوكس بي اتنين
not true بيساوي بي دوت فوكس بي اتنين not true
بيساوي بي اتنين not true بيساوي بي اتنين not true
بيساوي بي أتنين not true بيساوي بي أتنين not true
بيساوي بي أتنين not true بي
إذا هذا كان بيشار على false و true هذا بيشار على
عكسه و لأ okay الآن لو عندي relational expression
أنا relational expression في هندي إله ترجمة
والتاني إله ترجمة الآن ال value النهائي تبعها و ال
value النهائي تبعها في مين في ال dot address
تبعتهم صح؟
هذا إله dot address وهذا
إله dot address إذا أنا عمليا ماذا أفعل؟ بدي أعمل
instruction اللي تأخذ مقارنة بين هذين الأثنين صح؟
مقارنة على أساس relations of if
إذا هذا .. إذا المقارنة هذه true إذا E1.address
relation up E2.address go to ال true تبع ال B ما
هو أصلا ال B هذا جاء زي ما قلنا في expression ال B
أو في ال statement كبير فبدنا إذا هذا كله true
بدنا نروح على
أو الهي برمو فإذا
هذا ال expression ال address تبعه فعلا بال
relation operator هذا يعني افترض ان هذا اكبر منه
فإذا هذا ال temporary تبعه T5 مثلا اكبر من T7 يبقى
فعلا متحقق هذا الشرط يبقى بدنا
ال jump تودينا على ال
be true أو ال not true تبعة ال expression كله وإلا
بنياها تودينا
على ال false يعني بعمل ال two statements ولا بعمل
واحدة منهم كعمل generator لتنتين ولا واحدة
تنساش ان انا لازم في الأول برضه اركب ال dot code
تبع ال expression و ال dot code تبع ال expression
التاني صح؟ اه بتيجي .. اه عشان في الأول يتكزن
القيم تبعتهم في temporaries يعني هذا ال expression
E1 dot code عبارة عن مجموعة instructions في الآخر
في temporary و T5 هو اللي بيحتوي على ال value تبع
هذا ال expressionو لحمت على طول خلفه ال code تبع
مين في واحد dot code و ايه اتنين dot code فهكذا
اتجارت للاتنين عشان تجيب نتائجها الان هذا إجمالي
تبعه صفر في T5 وهذا ال T11 الان انا بدأ اقول if T5
اهوال relational operator اللي داخل معاه هو نفسه
بدي أن أنزله هنا T11
ايش أسوي go to ال
B dot ال true هل ايضا اعمل واحد تاني اقول اللي هي
هذه go to B false
التانتير لازم يكون موجودة لأنه زي ما بنقول هنا هذا
هيتنفذ هسط بال value تبقى في T5 هذا هيتنفذ هسط بال
value في T11 هنا هتحصل مقارنة إذا فعل T5 حقق مع
T11 حقق ال condition فهيروح على ال true طبعا وإلا
هيروح على ال false فهدول ال two اللي لازم يكون
موجودة عشان وجه ال flow ofcontrol على الناس واحدة
منهم موجودة واحدة منهم موجودة بس معناته انا مش
عارف يمكن ال instruction اللي هنا تبقى هي اللي انا
بديها ال false وممكن لأ لازم انا يبقى محدد بالظبط
الوجهة تبعته من خلال بوته طب هو ليش عمل flow
control بناء على كل
ممكن يبقى عبارة عن two mathematical expressions
بين القارن اللي .. لأ أنا .. أنا هش قصدي يعني مثلا
في ال .. في ال binary operators اللي هو ال and و
ال or أولا من ي .. تمام و ال unary operator
استخدمهم على أنه قولي ال expression قولي ال
expression بدي أخزن قيمة في مكان فلان و خلاص،
ماشي؟ أما هنا في آخر واحدة image array
هذه three address code instructions احنا لما حكينا
في ال three address code instructions قلنا انه
فيها أنواع في ال jumps و ال jumps في conditional و
unconditional فهذه قبعا conditional jump نوع من ال
three address instruction فيها دي F يعني هو
مابتعاملش مع ال true و ال false فهي مابتعاملش مع
ال true و ال false و ال false على انهم بس value
بناء على ال relationهو اتعامل معاهم هنا في هذه
الحالة الـ Boolean expression هو عبارة عن two
mathematical expressions كل واحد له قيمته بنقارن
ما بين قيم تبعتهم ب some kind of relational
operator زي ال greater than equal or less than
وإذا بناء على ال relational operator بتحدد if true
or false يعني مثلا هذا مفترض هذا كان قيمته في
الآخر تلاتة وهذا قيمته أربعةوهذا أكبر منه، تلاتة
أكبر من أربعة؟ لأ، false فإحنا
اللي بنقوله إنه الـ Boolean expression الـ Boolean
expression قد يتكون من two Boolean expressions
بينهم and أو or أو قد يتكون من mathematical
expressions بينهم relational operators في مثل هذا
الحالةهذا الـ Relational Operator لازم ينزل زي ما
هو في الـ three address code لازم ينزل زي ما هو
أنا ماعرفش شو هيكون انا مش عارف شو هيكون هيكون
اكبر من اصغر من يساوي not equal less than or equal
greater than or equal مش عارفه بنزل زي ما هو في
الـ
باخد ال address تبع ال expression الأولاني وال
address تبع ال expression التاني وبحط بينهم ال
relational operator يعني بناء على هذا ال boolean
value اللي هيطلع ب .. إذا هو true بقوله go to true
ال S إذا وصل هنا يعني هذا مش .. مش true إذا على
طول بقوله روح على false
فهذه التلات حالات لـ Boolean expression خلاص هي
بتكون اكتملت ال dot code أو الترجمة يعني تبع الـ
Boolean expression وين ما بتحل وين ما حلت هذه الـ
Boolean expression في some larger construct بتتاخد
زي ما هي وبينبنى عليها الترجمة تبع ال larger
constructفهو إذا كان هذا الكلام نتركه للمحاضرة
التالية بس في الصفة اهمة إذا أنا عندي statement
عبارة عن F مافيش فيها S ممكن يكون عندي F معانا S
ممكن يكون في عندي while ممكن يكون عندي حالات أخرى
من ال control flow statements بيجي ال dot code
تبقى ال B شكف واحدة بنزليالي label يالي كده صح
فهذا الجزئية بتكون التعامل معاها وبتيجي ال output
تبعها اللي هي ال dot quota بتلبيه ال expression زي
ما هو في ال statement يعطيكم العافية