موسيقى
بسم الله الرحمن الرحيم والصلاة والسلام عليك أشرف
المستخدمين اليوم إن شاء الله بنكمل المحاضرة أو
الموضوع اللي بدأنا فيه المحاضرة الماضية اللي هو ال
control flow أو flow of control بمعنى كيف بالـ
control flow statements أو components أو
constructs بيتم التعامل معاها في الـ translation في
الترجمة، فشوفنا أنه عندي أنا الـ control flow
statements بالصفة العامة بصفة عامة سواء كان f
statement أو loop statement هتتضمن على إيش؟
Boolean expression النهج الجناقي هو Boolean value
true or false
بعد ذلك بيجي جزء من الـ structure الكاملة تبع الـ
statement الكامل، الـ boolean expression ترجمة تبعها
بتيجي جزء من تلات حالات هذه، لو أنا عندي الـ if
statement بدون else، فالـ code أو ترجمة تبع الـ
boolean expression بيليها ترجمة تبعت الـ statement
ولكن ما بينهم BGH label، هذا الـ label وظيفته أنه لو
كان الـ code هذا النتيجة النهائية تبعه الـ true
فبنكمل وإلا بنخرج برة، لو عندي if statement فيها
else فبكون الهيكلية كالتالي، لأنه نفس الشيء في هذه
الـ code في الأول بتيجي الإجراءات الخاصة بها الـ
code تبع الـ Boolean expression، بعد ذلك الـ label
أو الـ code تبع الـ statement اللي هي جواب الـ true
وبعدين وفي بينهم ash اللي هو الـ label تبع الـ true
وفي الـ code تبع الـ statement الـ false
هنا في عندي conditional jump، الـ conditional jump
هذه بتقفز وين؟ إذا كان true بتقفز هنا وإذا كان false
conditional jump ثاني بتقفز على الـ false، ولازم
يبدأ برضه كمان في label في الآخر علشان
لو هذه علشان
هذه لما تخلص عشان الـ true part لما يخلص يقفز
عشان ما يمرش على الـ الـ الـ الـ الـ الـ الـ الـ الـ
الـ الـ الـ الـ الـ الـ الـ الـ الـ الـ الـ الـ الـ
الـ الـ الـ الـ الـ الـ الـ الـ الـ الـ الـ الـ الـ الـ
الـ بوليس فشن هذا لو true يروح عليها لو false يخفص
لبرا، وهي لما نخلص لازم يكون في label أو يكون كله
go to على بداية الـ condition go to begin which هي
بداية الـ condition عشان يتفحص مرة أخرى، طبعا هذه الـ
structure احنا هنرجعلها كمان شوية بس في الأول بنشوف
الـ boolean expressions كيف الترجمة تبعها آلية
تحويل الـ boolean expressions إلى three address
code instructions، هذا الكلام بيستند
إلى grammar، grammar معاها semantic rules، syntax
directed definition نفسه بقى كمان الـ statements
الـ control statements بصفة عامة مثلا كانت if بدون
else أو while أو غير ذلك برضه الها grammar معاها
الـ productions، احنا اتفقنا إن نشوف الترجمة تبع الـ
boolean expressions ثم الترجمة تبع الـ control flow
statements، الـ boolean expression ممكن يبقى شكله
إشي زي هيك صح؟ السطر هذا .. السطر هذا عبارة عن
expression؟ لأ هو عبارة عن if statement
تحتوي على expression، الـ expression موجود هنا اللي
هو بين دوسينها، احنا الآن بننظر بس لهذا الجزء اللي
هو عبارة عن Boolean expression، هذا عبارة عن if
statement بدون else ولا لأ، هننظر إلى الـ Boolean
expression كيف هذا بتتم ترجمته، ترجمته في الآخر
هتنتج بالكلام هذا يعني هدولة الـ three address code
instructions هم الترجمة تبع الـ boolean expression
هدولة
السطرين هتتم على الـ boolean expression عشان تتم
ترجمة الـ if statement كاملة، بس السطرين هدولة اللي
أجوا بالزيادة صح؟
عشان برضه للتأكيد على ذلك بدي أرجعكم للـ structure
تبع الـ if statement اللي مالهاش else هي بتحتوي على
إيش؟ ترجمة الـ boolean expression ثم ترجمة الـ
statement، قبل الـ statement في label وبعد الـ
statement في label آخر، صح؟ هذا بالظبط هو اللي عندي
هنا بس الـ statement هي كلها بجرد x بساوي 0
هذا كله الـ B code وهذا الـ S code وهذا
الـ label اللي قبلها وهذا الـ label اللي بعدها هذه
العناصر نفس العناصر اللي في الـ structure دي مضبوط؟
تمام، الآن احنا بدنا نركز على هذين الجسمين كيف يمكن
ترجمة هذا الـ expression إلى هذه الـ sequence of
three letters code instructions على أساس إيش؟ على
أساس الـ definition هذا اللي هو grammar مع
semantic rules، أول حاجة طبعا بدنا نعملها بدنا نعمل
parsing لليش؟ للـ expression هذا، الـ expression
نعمله إيش؟ parsing ماشي أحد، فاحنا الآن بدنا ناخد
الـ if statement كلها، الـ if statement اللي هي هذا
الجزء، خلينا نكتبه هنا if x less than 100 or x
greater than 200 and x not equal to y
هذا الـ if statement يجب أن يتم عمله parsing بناء
على الـ grammar اللي عندنا تبع الـ if statement ثم
أيضا كذلك الحال الجزء اللي هو الـ boolean condition
يجب أن يتم عمله parsing بناء على الـ grammar تبع الـ
boolean expressions، فمن بالنسبة للـ statement الـ if
statement، الـ parsing تبعها جاي على هذه الـ
production، وهذه الـ production للأصل الـ S هي عبارة
عن part of a program يعني صفة إجمالية، الـ P is ..
الـ S is a statement و الـ statement هذه تحتوي على if
تحتوي على جوس تحتوي على B موضوع الـ expression جوس
و إيش؟ S واحد و S واحد، الـ S واحد هذه اختصارا X
بالساوية كتاش انفجار، الـ B هذه بدها ينعملها parsing
إلى .. طبعا بنا ناخد الشقة دي على أنه B1 و الشقة
دي كلها على أنه B2، ففي هن دي B1 خلينا نبعده شوية
هنا كمان عشان نخلي واسعة لـ B1 والشقة التانية
اللي هو B2، اللي بينهم إيش؟ الـ R بتنين، هذا شقل في
بتنين واحد و بتنين اتنين، وبينهم إيش؟ الـ end، لأن
الشقل أولًا، الـ B عبارة عن إيش بناء على الـ grammar
تبع الـ boolean expressions relation between two
expressions
relation expression two، هذا الـ expression يعني هذه
بي واحد، فبالتالي الـ E واحد هي الـ X و الـ relation
operator هو الـ less than و الـ E هي الـ B، الآن ننتقل
لهذا الشقر الثاني، B2، الجزء الأولاني منهم B21 هو
عبارة عن هذا الجزء
اللي هو في عندي برضه كمان expression و relational
operator و expression، الـ expression الأولاني هو x
و relational operator هو الأكبر من، و الـ expression
الثاني مغلبتين، نيجي على هذه اللي هي D2 يعني
عبارة عن إيش؟ expression relational operator
expression x relational operator not equal وإيه إيه
الـ expression اللي هو الواحد اللي بدنا نسوي إنه
بدنا إضافة
إلى parsing، بدنا نفّذ اللاشق، الـ semantic rules الـ
semantic rules الآن تنفيذة بضغط على الجانب اللي هو
الـ dot true و الـ dot false attributes بياخدوا قيم
والجانب الثاني إن الـ dot code attribute اللي هي
الترجمة بتاخد three address code instructions
بنعمل generation فيها بنعمل three address code
instructions، احنا الآن لو جينا عملنا جدول عملنا
جدول بالشكل هذا
ولا من غير جدول، جينا قلنا لكل واحد من هدولة إيش
الـ attribute تبعها، خلينا نبدأ من فوق، فوق على طول
الـ S، نرجع ثاني على الـ grammar تبع الـ statements الـ
S فيها attribute dot next، الـ dot next هذه بتاعة
label، هذا بيجي من الـ function اسمها NewLabel
NewLabel هي هذه الـ function لإني أكتب هنا
NewLabel بتعطيني labels الواحد، الاثنين، التلاتة،
الأربعة، أو جدنا بيهم
أول production بتستخدم بينتج عنها استدعاء لـ new
label فالـ label بتعطينا الـ label الأول يعني
فتعطينا يا إما بينتج عنها next attribute تبع الـ S
فأنا ما بضعّف هنا dot next يساوي edge الواحد خلاص
الـ author بتبعه فهنا بضبط كذلك الحالة بتقول إن الـ
واحد أنا بروح لـ S dot next كويسة؟ الآن بعد ذلك الـ
F statement الـ S هذه اتخذت علينا F statement بدون
else فهذه الصيغة تبع الـ F statement بدون else وهذا
الـ production مترتب عليها استدعاء آخر لـ new label
تلعّبيني L2 وبنسجله لمين؟ لـ B.true هذه الـ B لها B
.true بسبب الـ L2
الـ true يبقى راح لـ V dot الـ true V dot false
بيساوي الـ واحد فأيوة الـ V dot false بيساوي S1 dot
next ويساوي S dot next فهذا S dot next راح لـ V dot
false مظبوط؟ بيسجلوا هنا dot false بيساوي إيش الـ
واحد الـ واحد okay
هذه هي الانتاجات الاثنين ارتّبت بعدها كأننا بحاجة
إلى عمل بارسينج لـ B بحاجة إلى عمل بارسينج لـ B
بحاجة إلى عمل بارسينج لـ A بحاجة إلى عمل بارسينج لـ
A بحاجة إلى عمل بارسينج لـ A بحاجة إلى عمل بارسينج
لـ A
بحاجة إلى عمل بارسينج لـ A بحاجة إلى عمل بارسينج لـ
بارسينج لـ A بحاجة إلى عمل بارسينج لـ A بحاجة إلى الـ
Grammar تبع الـ Boolean expressions الـ Grammar
تبع الـ Boolean expressions في عندي اللي هو الـ
production هذه بناء على الـ production هذه بدي أشكل
الـ dot code attribute تبع الـ B1 فالـ B1 الآن الـ dot
code تبعها بدي يجي على شكل
التركيبة من العناصر هذا وهذا والاوتوماتا تبع الجن
هذي والجن هذي هذول الاثنين E1.Q وE2.Q هذول فاضين
لأنه بناء على الـ grammar خليني نرجع بناء على
grammar تبع الـ expressions إذا الـ expression هو
عبارة عن identifier وهذا هو الحالة اللي عندي أنا
E1 عبارة عن identifier فبالتالي إيه نعمل الـ dot
code الـ dot code تبعتها فاضي وكذلك لو كانت الـ E
number زي هنا الـ E عبارة عن number برضه هتكون الـ
dot code تبعتها فاضي عمليًا لما برجع الـ grammar
تبعت الـ Boolean expression اللي هي هذه فالـ dot
code تبعت E1 والـ dot code تبعت E2 نل سترينك نل
سترينك بلحمهم مع الـ output تبع الـ gen فبيظهر يعني
بس الـ output تبع الـ gen والـ output تبع الـ gen
الثاني هذول الـ two lines هتكون two instructions
الـ instruction الأولى هتكون تبدأ بـ F بعدين E1 dot
address طبعًا الـ E1 dot address والـ X الاكسين
بعدين بيجي relational operator بتنزل زمانية الـ
less than بعدين الـ E2 dot address اللي هو المية بعد
ذلك بدي أضع go through وأكتب الـ B dot through الـ
B عندي هنا هي هذه الـ B واحد الـ dot through تبعها
لما سجلنا هوش الـ dot through تبعها بيجي لما نطبق
اللي هو الـ production تبع الـ or الـ B واحد هنا هو
هذا صح؟ فهذا الضبط متبعة هي ضبط متبعة الـ parent الـ
اثنين والضبط
false تبعته إيش الضبط false تبعته new label يعني
هاي سلعقة لها new label فبناخد الـ ثلاثة اللي هم
جاي على الدور الـ ثلاثة راحلين للـ بي واحد ضبط false
okay حلو بنكتب هذا الـ B.true الـ B.true اللي هو L2
بس
okay هاي الجملة الجملة الثانية الـ Gen الثانية الـ
Gen على طول الـ GoTo فاش F ولا إشي الـ
Unconditional Jump على B.false اللي هو لسه الـ L3
نحكي عنه الـ L3 okay هذا هو الـ B1.E نفس القالية
وبناء بناء على نفس الـ production بتكون الـ dot code
تبع B 2 1 إيش بتوقع يكون برضه F X greater than me
10 go to عد مين الآن go to بدي go to الـ B dot true
من الـ B اللي هاندي هادي إيش الـ dot true تبعه الو
بيتنقل مش عارف إيه خلّيني أشوف الـ production تبع
الـ end إيش بتقول لي بتقول لي الـ بيضلها تضطروا new
label نيو لابل نيو لابل يا عبد الدنيا ياخد الاربعة
ويعطيها لمين لـ بيه اثنين واحد تضطروا بيه اثنين واحد
بدون نقطة إيش أخدت الاربعة وهذا الـ الاربعة بينزل
هنا تمام؟ وبتقول ليه هذا السطر السطر الثاني بيبدأ
بروتوم وبيضط فالس بيضط فالس بيضط
فالس بيضط فالس بيضط فالس بيضط فالس بيضط فالس بيضط
هذا هو B2 الذي هو الـ B dot force الـ force تبعه من
الـ force تبع الـ pyramid الـ force تبع الـ pyramid هو
الـ واحد فهذه
الـ force تنزل الـ force الـ واحد لهذا الـ واحد سواء
الـ واحد وبعد أن تنزل هنا في الـ instruction go to
الـ واحد خلاص نعمل لهذه الـ واحد هذه
نفس الأشياء هيكون في عندي f وهيفوقها dx not equal
الآن وبعدين y بعدين go to الـ label اللي بدي أجي
هنا إيش V dot true هاي الـ V إيش الـ dot true تبعها
دلّيني نشوف بدي أجي من الـ rule من الـ production تبع
الـ and هو V2 V dot true تبعها الـ true تبع الـ
parent
الـ B2 هنا الـ dot الـ true تبعها نحن بدنا الـ dot
true بيجي من الـ true تبع الـ parent الـ dot الـ true
بيجي من الـ true تبع الـ parent اللي هو L2 تنزل على
الـ true تبع الـ child اللي هي L2 وبتنزل هنا في الـ
وقت
بعدين تيجي الـ goto بدها الـ force تبعت هذه الـ force
تبعت هذه هتيجي من الـ force تبعت هذه على الـ rule الـ
force هتيجي من الـ force تبعت الـ parent حلو في إيه
الواحد الواحد يبقى هنا حفظه الواحد okay الآن
لما .. هذا هيك اللي هو الـ dot code هذا بي اثنين
اثنين dot code خليني أكتب بي اثنين اثنين و dot code
وهذا بي اثنين واحد و dot code بي اثنين واحد و dot
code الآن احنا اللي بدنا نطلعه هو من وين نطلع من
هذول الاثنين ونكون هذا وبعدين من هذا مع هذا نكون
هذا صح فنكون هذا بناء على الـ end الـ rule ثابت الـ
end الـ rule ثابت الـ end بتقول لي كون الـ dot code تبع
الـ بي بي واحد من بي اثنين واحد يليها بي اثنين اثنين
وبينهم label إيه label بي
واحد ضبطه وبي واحد هي هذه ضبطه متبقى حقيقية اربعة
هل هذا صحيح أنت شوف الـ code اللي هو كتبه هنا بي
اثنين واحد عندي
آه لسه احنا هنا لأن
هذا هيش يركب فوق الـ code تبع الفرع
الثاني عندي fx greater than 200 go to الاربعة وإلا
go to الواحدة هذا سيأتي فوق مين فوق هذا فهذا
الآن كله سيأتي مسبوك بمين أو يعني لو احنا لما نعمل
أيوه
لما نطلع فوق الـ or بتقول لي خدوا هذا كله بالـ code
تبعنا بالـ 2واسم مسبوك بين الكتب اللي راحت بينهم
بواحد dot force مين بواحد هذي الـ dot force بعد الـ
الـ تلاتة فبتيجي الـ تلاتة وبعدين فوقه اللي هو
الكتب اللي بيواحد اللي هو fx هيك اكتملت الترجمة
اكتملت الترجمة لأ ما اكتملتش الـ dial أيوة بتطلع
فوق على الـ f statement الحين هذا اكتمل الـ Boolean
expression الترجمة تبعته بدي أطلع على إيش الـ F
statement بتقول لي جيب الـ code تبع الـ Boolean
expression وركبه فوق الـ code تبع الـ statement شو
الـ code تبعت الـ statement هو بيقول لي إذا الـ
statement عبارة عن assignment فهي الـ assignment الـ
code تبعت الـ statement يعني X بساوي Zero هي يعني
فهذا الكلام اللي ييجي بعد ولا قبل
هذا الـ S بتيجي بعد صح الـ code تبقى الـ S يعني هذا
الكلام اللي هو احنا
الآن عندنا إيش إن هذا الـ code كله هذا الـ code كله
بتيجي اللي هو B بتيجي بعدين من الـ S واحدة الـ code
اللي هي X بالساوية Zero صح بناء على expression هاي
S1 بس بينهم label بيضبطرون الـ B هالي اللي هي هالي
الضبطرون تبعها L2 صح؟ L2 تمام؟
فهذا اللي بيطلع عندنا مطابق لـ .. هاي L2 هاي بعد الـ
code تبع B هاي الـ code تبع S وهاي بينهم الاثنين
فاكت خلصت ما خلصتش لأن الـ S هي في حتة ذاتها الـ S هي
في حتة ذاتها إيش part والـ production تبع الـ part
بتقول ليه حط الـ code تبع الـ S وبعدين حط الـ label
تبع الـ أسلوب next فهذا كله بيجي بعدين label ال
واحد S أيوة S .next S.next لو الواحد الواحد الآن
عشان يطلعني برا ال statement عشان إذا ال condition
كانت false طيب
هيك الآن احنا بنصل لنهاية عملية الترجمة الترجمة
لمين؟ ل flow control statement احتوت على Boolean
expression المثال اللي معانا هذا أنتج كان عبارة عن
هذه ال statement و هذه الترجمة أو ال translation
اللي طلعت معانا هذه الترجمة للمحاضرة الجامعة طالعة
على إنه لو لاحظت إنه في gotos مالهاش لازمة يعني
هنا لما أنا بقول fx less than 100 goto ال 2 طب مين
ال 2؟ هذه ال 2 طيب okay قفزنا okay هذا .. هذا
منطقي؟ منطقي لأن هنا إذا إكس إذا تحتج هذا شرط بناء
على ال parsing هذا الشرط هذا هو جزء من ال or و إذا
الجزء هذا تحتج خلاص ما زال مينيش أفحص بجيت لأجسام
فبقدر أنتقل على طول على تنفيذ ال statement و فعلا
الـ 2 بيوديني على تنفيذ ال statement صح؟ حلو
هذا شيء كويس بس هو إيش بعد ذلك بيقول لي بيقول لي
إذا .. طبعا إذا هذا مش true ال false بيجي هنا هذه
تقول الـ goto الـ 3 طب ما أنا already قلت الـ 3
بعدي على طول هي الـ 3 إيش لازمة الـ goto هذه إذا
كان الـ 3 هو الـ next هيك هيك فهذا إشكاليته المشكلة
الثانية أن هنا يقول لي if x أكبر من 200 goto الـ 4
هي الـ 4 طب ليش ما هو حطيها if not أو if false و
قال لي goto الواحد
فأنا بس إذا false بقفز وإذا هي true بكمل تكميل
أحصل وأحصل الجهار ال go to هنا في الأخبار أو يعني
في مجالنا ال optimization أنه احنا مش optimization
هو بيسميها redundant go to المحاضرة الجاية إن شاء
الله بيشوف كيف بناء على تغيير بنعمل تغيير في الـ
الـ rules في ال semantic rules بحيث ما تعطينيش اللي
هو redundant ماشي الحال يعطيكم ما يعرفوا