موسيقى
بسم الله الرحمن الرحيم والصلاة والسلام على أشرف
المرسلين، احنا اليوم إن شاء الله بنكمل نفس الموضوع
الـ Translation of Expressions كنا بدأنا في المحاضرات
الماضية، المحاضرات الماضية طلعنا على كيف الـ
Expressions بيتم بناء الـ Translation تبعها بشكل من
خلال من خلال الـ Rules المضافة على الـ Grammar، و كان
عندنا مثال بسيط جدا، وهو هذا المثال اللي تم ترجمته
بناء على إيش؟ بناء على الـ Definition هذا، الـ
Definition هذا بيحتوي على الـ Productions وبيحتوي
على الـ Semantic Rules أيضا، كده كحلل طلعنا مش بس
على الـ Example هذا، طلعنا ورجعنا ورا كمان على الـ
Example اللي أصلا بدأ معانا في بداية الـ Chapter
اللي هو كان لـ .. لـ .. لـ .. لـ توضيح يعني الـ Free
Address Code، من حيث المبدأ هذا الـ Example شوفنا
كيف أنه الـ Code تبعه، الـ Translation تبعته، هذا الـ
.. هذا الـ .. هذا الـ Translation للـ Statement هذه
الـ Statement هذه هي ترجمتها الكاملة، الـ Three
Underscore Instructions هذه جزء منها، الـ Two
Statements الأولانيين هم عبارة عن ترجمة للشق الأول
من الـ Expression هاي، الـ Expression هاي الشق الأول
وهاي الشق الثاني اللي بنسميه E1، وهذا E2، وما
بينهم علامة الزائد، كلهم مع بعض هم Expression، و
Expression هذا الـ Value تبعهم راح في الـ Assignment
لمين؟ لـ الـ Identifier هدول، Two Statements أو Two
Instructions هم الـ Dot Code تبع إيه؟ تبع E1، و
هدول اللي هم الـ Dot Code تبع E2، والإجمالي اللي
هو هذا هيك اللي هم الاتنين معاهم الـ Statement هذي
هم الـ Dot Code تبع الـ E كله مع بعض، كل الكلام هذا
يعني الـ E Dot Code مع الـ Statement الأخير، مع الـ
Instruction الأخيرة هي الـ Dot Code تبع الـ S، الـ S
اللي هي الـ Statement اللي هي الـ Assignment
Statement، صح هذا الكلام؟
بناء أو تم تركيب أو تم Generating لهذه الـ Three
Headers Code Instructions من خلال الـ Rules الـ
Semantic Rules، هي تم، برجع تاني أنا على الـ Example
طبعا ستة أربعة من خلال اللي هو الـ Rules هذه الـ
Semantic Rules اللي قلت قطبي أو أرفقت بي الـ
Productions
في إحدى مبدئية في Translation of Expressions، في الـ
Translation of Expressions، الغرض هنا اللي هو To
Translate Expressions into Free Address Code، وهذا
أصلح، واضح هنا، And Expression Like كلام هذا Will
Translate into Instructions، Instructions With At
Most One Operator Per Instruction، برضه هذا الكلام
واضح، يعني لما نرجع على المثال الصغير هذا اللي هنا
هذه الـ Instructions، Three Others Code Instructions
At Most، لما تقولي At Most One Operation، هاي هنا، و
هنا كم Operation عندنا، وهنا كم Operation، وهنا
كم Operation، هنا Operation واحدة اللي هي الـ Minus
هنا Operation واحدة اللي هي Plus، هنا Operation
مافيش Operation، عشان أنا كنت بقول At Most One، At
Most One يعني يمكن واحد ويمكن مافيش، مظبوط هذا
تفسير الكلمة هذه اللي هي
النقطة الثالثة هي الـ Array References
الـ Type، مش الـ Type Checking، الـ Type يعني بدنا
نحسب الـ Type تبع الـ Declaration عشان لغرض الـ
Checking، عشان لما نكون في عندي Two Variables أو
Two Expressions وجايين في جزء من Expression كبير
بنتأكد إن الـ Type هذا والـ Type هذا متكافئين علشان
ما يكونش في خلل في الـ Type، فكنا شوفنا كيف بيهي تشكل
الـ Type تبع الـ Array، إنما الـ Array References يعني
أنا الآن المنطقة فيها دي Double أو Two Dimensional
Array، بقدرش أحط الـ Two Dimensional Array في الـ
Three Address Code، الـ Three Address Code بقدر أحط
One Dimensional Reference، إذا بتذكروا في الـ
Addressing هنا، بالرجع تاني على الـ Instruction
Forms، في عندي برجع برجع أنا Okay Okay، Index Copy
Instructions، ممكن أعمل زي هيك Single Single
Dimension ويجي الـ Reference هذا على يمين يساوي أو
على شمال، مش مشكلة إنما في الـ Double References أو
آسف، الـ Two Dimensional أو More Multiple
Dimensional لازم أنا أفك الـ Reference إلى Direct
Reference، الـ Direct Reference هذا الـ Complex
المركب أفكه إلى Direct Reference، ليش؟ يعني أنا
عندي الـ Array جاي في الـ Memory بغض النظر هي إيش
تشكلتها، أقول مثلا عندي Array Three تلات أسطر في
تلات أعمدة أو أربع أعمدة، هذه معرفة هكذا صح، تلات
أسطر في أربع أعمدة، أنا بدي الـ Element هذا، هذا الـ
Element الـ Reference تبعه واحد واحد واحد واحد واحد
أنا لأن ما بقدر أدخل هذا الكلام على Free Address
Coding Instruction لازم أفكه إلى
كيف أنا، احنا طبعا احنا عارفين إن الـ Two
Dimensional View هذا، هذا Logical Only إنما
Physically الـ Memory عبارة عن Sequence Of Bytes، صح
يعني كل الـ Array هذه تبقى على شكل Bytes
الآن الـ Element تبع الـ Array هل هي Integer ولا
Float، على حسبها إذا كانت Integer كل أربعة Bytes هم
Element واحد، مظبوط، مظبوط ولا لأ؟ الـ أربعة اللي بعديهم
الـ Element الثاني، آه هذا E واحد، هذا E اثنين، الآن
أول أربعة Elements لسه كلهم مع بعض بشكل إيش؟ الـ إيش؟
الـ Row، السطر مظبوط، الأولاني
صح ولا مش صح؟ هذا الكلام بيعتمد هل هو احنا أصلا
بنطلع على الـ Array دي Row Major ولا Column Major
Row Major ولا Column Major، إيش يعني معناتها؟ خلينا
نروح هنا في عند الـ Slide بتوضح فكرة الـ Row Major والـ
Column Major، أنا بقفز بعيد شوية وهرجع له تاني
بس عشان أوضح المفاهيم، هنا عندي أنا الـ Array هذا الـ
Element، إذا أنا باخدهم سطر سطر يعني أنا بحول أنا
بعمل Flattening للـ Array بسطحها، هلأ سطحها سطر ورا
سطر، والعمود ورا عمود صح هيك؟ أما أخدهم سطر يعني الـ
Element هذا هو عمّار عن 00، اللي بعده 01، اللي بعده
02، اللي بعده 03 صح؟ اللي بعده هذا إيش؟ 10، لأ هذا
الآن Row Major، لكن لو Column Major Zero Zero كان هذا
صح، Zero Zero، لكن اللي بعده One Zero مظبوط؟ فهنا
بدنا نأخده على أساس الـ Row Major، فالـ Row Major
فهذا الـ Slide بتوضح الفرق ما بين الـ Row Major والـ
Column Major، فالـ Row Major معناه ذلك أنا الآن لما
يكون في عندي، لما يكون في عندي درجة تانية على اللي
هو قضية الـ Array References، الـ Array References
لأ، ديشن إن أنا يالك دورة 6 أو 4، احنا
لسه بنوضح فيه إيش المغزى من هذا الموضوع، إنه أنا
الآن الـ Compiler لما يكون الـ Code بيحتوي على بقول
مثلا X بيساوي A 11، أو لأ، احنا بدنا نخليها Variable
IJ لأن I و J قيمهم ربما تحددت في السابق، إنما هي
هتتحدد بس في الـ Run-Time، أما في الـ Compile-Time
لسه مش معروفين، فالـ Run-Time يكون أخدوا الـ I والـ J
الـ Values تبعتهم، اللي قال بناء عن I والـ J أنا الـ
X بدي أخد الـ Value تبعها من وين؟ هي عبارة عن هذه
Array Of Integers، هي عبارة عن أربعة Bytes بس وين
هذول الأربعة Bytes بالظبط؟ بدي Pointer يشاور على
أول واحد فيهم، صح؟ صح، فكيف الـ Compiler، الـ Compiler
لازم يحلل هذا الـ Reference يحلله علشان في الآخر
يعطيني Pointer محدد على الـ Element اللي بده ياخده، و
يعطيه للـ X، وتحليل هذا الـ Multidimensional
Reference ممكن يأخذ مجموع من الـ Three Address
Instructions، سنرى قليلا كيف هذا يعمل، بس خلاصة
الفكرة إن Array Reference زي هذا، أو إذا كان برضه
كمان More Than Two Dimensional، إذا Dimensions اضافية
Will Expand into a Sequence of Three Address
Instructions، 3 Address Instructions، بس علشان في
الآخر أحصل على الـ Value اللي تبقى الـ Index اللي
بده يجيب لي مباشرة الـ Element، Sequence من ثلاث Address
Instructions That Calculate An Address Of The
Reference، تمام، Section ستة أربعة عاملين، احنا شوفنا
صراحة إن هدول ضايقين، بدنا نشوف كيف هذا عمليا بيتم، كيف
النقطة التانية هذه بتتم، Okay، فاحنا شوفنا هذا الـ
Code، Okay، مظبوط، هذا اللي احنا بدأنا فيه اللي هو
عندي Expression، والـ Expression بتكون من Two Sub
Expressions ما بينهم ازايد، وشوفنا مثال عليه هذا، و
زي ما قلت أنا شوف ارجع إن أنا ثاني على ال example
اللي في بداية ال chapter كمثال آخر Okay لأن عند ال
incremental translation ما حكينا عنه صح incremental
translation بساطة شديدة هي نفس الكلام اللي احنا
شوفناه هنا أنا رجعت ال slides اللي ورا نفس الكلام
هذا بس لأن لو أنت طلعت على ال dot code ال dot code
attribute الشي اللي بتخزن فيها الترجمة و ال dot
code تبع ال parent بتأخذ من ال dot code تبع ال
children بتراكم
الجن يتكوّن بإدارة واحدة وهذه الإدارة بتلصق بي
بالـ
output تبع الجن تبع ال generator function في الـ
incremental translation اللي بيحصل أن الجن بتروح
تلحم أو تعمل append للمنتج تبعها على ال dot code
تبع ال parent يعني هيّا تو ال slide بدّيك تركز الآن
هنا إيش في عندي؟ في عندي أول السطر هذا وبعدين
السطر هذا صح؟ ال dot address ساوي ال new temp
وبعدين على طول تيجي ال gemالـ out متوحّم يُنصف
بالـ out بالذي جابه للإتنين لكن في الـ incremental
translation في الـ incremental translation هي نفس
...مقابل ذلك السطرش فيه عندنا يعني الجن ما بتعطيش
لحده يعني عندي هاي line ثم colon خلاص ال dot
address أخدت نيوتن بعدين الجن أجد عملتها بالكلام
يعني عملت السطرة طب السطرة رد وراح عمليا هنا دور
الجن مختلفة عن دورها في المثال الأولاني دور الجن
أن تعمل السطرة تبعها وتلسقه بال إيش وتلسقه بال dot
code تبع ال إيه في الأولاني لأ في الأولاني احنا
بناخد منها output بناخد
منها ال output تبعها تبع الجن بنلسقه بال dot code
E2
وE1 احنا بنركب ال dot code تبع ال E بنركبها من
التلات عناصر هذوله هذا مخزن هذا عندي attribute
بناخدها و بناخد ال attribute التاني و بناخد ال
output تبع ال Gen وبنركبهم مع بعض في code إجمالي
إنما هنا لأ هنا ال gen هي لحالها ال code تبعها إن
هي تروح على ال dot code تبع ال E و بس تعمل append
طيب ال dot code تبع ال E من اللي بيشكله هدولة
اتنين كل واحد منهم هيشكل جزئية منه ويلحقها باللي
موجود صح بيصير هنا ترقمي incremental طب إيش اللي
استدعى أن أنا أعمل incremental ما أعملش بالأسوب هذا
أن هنا بيصير فيه نوع من تنقيح ال dot code هذه في
الأمثلة اللي احنا بنشرحها بتبقى عدد بسيط من ال
instructions لكن في ال compiler الحقيقي بيبقى ال
dot code شيء كبير أو عدد هائل من ال three address
instructions فإن أن أنا آخد من هنا و آخد من هنا و
أجمع هذا too much shuffling يعني بيصير فيه تنقيح
لكمية كبيرة من ال data و تلحيمها إنما لو أنا بس
بدّي بعمل append ما بيصير فيه تنقيح ل data كتير ما
بيستهلك memory و space كتير إن بس مجرد أنا وين فيه
attribute موجودة في ال memory بس بروح بعملها ليه
append تخيّل هذه concatenate لو أنت بتخيّل اعملها
العملية دولة مش هي operation معناته هي operation
أنت بتعطيلها بتعمل passing أنت ل value و passing ل
value عشان هي تروح تلحمهم في إيش في string إجمالي
صح لأ أنا لأ بعمل passing ولا بعملاش على طول ال
dot code بتروح على ال attribute و بتعمل عليها
append فهي
الفرق ال incremental translation في الآخر أنه احنا
نقول in the incremental approach الجن not only
constructs ال instruction اللي هي مسئولة عنها إلا
أيضًا it appends the instruction اللي هي عملتها to
the sequence of instructions اللي generated حتى
الآن اللي generated حتى الآن في ال dot code
attribute تبعت ال expression اللي هي بتضيف عليه
فهي توفيق باختصار شديد ليه؟ هتلاحظ أن ال gem
بتعطينا address جديد و ال gem بتشتغل ما بتطلع
output بل بتروح على طول على ال attribute اللي هي
بدها تلصق عليها و بتلصق عليها و انتهى الموضوع okay
لأن بدنا نيجي على موضوع ال three addressing
addressing اللي هو كنا كان النقطة التالتة في ال
slide اللي في بداية ال section عملية ال addressing
ال addressing لو أنا عندي one dimensional
addressing صفة
عامة أي address في array هو ال base دي هي ابقى عن
ال address تبع ال array نفسها ال array نفسها هي
نفسها موجودة في موضوع موجودة في موضوع فبداية
الموضوع هذا هو ال base
من ال base هذه باش بناء على ال reference جداش اللي
معطى في ال code بناء عليه بنقفز على الموضوع
المطلوب فإذا كان أنا بحكي عن آية a of تلاتة معناه
أنك بتقفز تلاتة تلاتة a شعار دلوقتيتلاتة bytes ولا
تلاتة elements؟ تلاتة elements صح؟ أنا بتخلي بالك
أن ال referencing في ال array في بعض اللغات بيبدأ
ب zero وبعض اللغات بيبدأ ب one خليني أنا أعتمد أنه
بيبدأ ب zero فتلاتة يعني ال element الرابع، مظبوط؟
فأنا بدّي أقفز تلاتة elements وأبدأ على بداية
الرابع، مظبوط؟ صح؟ طيب ال element هذا جداش ال size
تبعه؟ هل هو byte واحد ولا أكثر إذا هو integer
بنفترض أنه أربعة bytes أنا ما أقدرش أقول أقفز تلاتة
...لأ تلاتة ضرب ال goods بتاع ال element الواحد
مش احنا متفقين هنا أن ال element أن هدولة bytes
فإذا هو integer أربعة if هو
integerالـ I هي التلاتة تبدأ تنضرب لسه في الوصفة
تبع ال integer نقول أربعة فأنا أقفز تلاتة في أربعة
من أتناش هاي أول تلاتة هاي أول أربعة كمان أربعة
وهي التالت وأنا الآن بدأ أشاور على بداية الأربعة
صح ولا لأ صح هذا إذا one dimensional إذا two
dimensional إذا two dimensional إذا two
dimensional كل ما دول الأربعة يكون لسه هم السطر
الأول هذى أنا لأن ما بحكي عن هذا A of I بالساوية
واحد J بالساوية واحد طبعا أنا حاطيتهم هنا كيساوية
بس عشان التوضيح أن ما هي من احنا نكتب واحد واحد أو
J أو I فأنا قاعد بحكي أن الواحد هذى معناته إيش
السطر إيش ال root ثاني على أساس أننا بدّينا ال index
0 ال root ثاني ال element الثاني صح أن الواحدة اللي
بدأ تنضرب في ال width ال a ده بدأ يفلّط السطر
الأولاني وبعدها كفر السطر الثاني بدأ يفلّط العمود
الأولاني وبعدها العمود البعدي فالواحدة ده اللي
بدأ تنضرب في ال width تبع ال raw صح يعني هذا تفكيكه
الآن يصير أنه I سوى واحد ضرب كم هو ال width ال raw
width بعدين أضيف على ذلك الواحد التانية خلينا نقول
هنا ال reference النهائية أو ال offset بعدين كم
أضيف عليه ال الواحد التالي الـ J دعونا نضع I هنا I
ضرب الـ Raw width زائد الـ J ضرب الـ Column Width
صح ولا غلط يعني الآن الـ I بسوا واحد واحد ضرب
اتناش مش اتناش اتفجنا أن هذولا أربعة ... لأ ستة عشر
واحد اتناش اتناش اتناش اتناش اتناش اتناش اتناش
اتناش اتناش اتناش اتناش اتناش اتناش اتناش اتناش
اتناش اتناش1 ضرر ال column width كده ال column ال
element الواحد و ال width تبعه عساس أنه integer
أربعة صح بيطلع بيطلع بيطلع بيطلع بيطلع بيطلع بيطلع
بيطلع بيطلع بيطلع بيطلع بيطلع بيطلع بيطلع بيطلع
بيطلع بيطلع بيطلع بيطلع بيطلع بيطلع بيطل
و احنا دلوقتي بنقشر على بداية هذا الأنصار هذه
الحسبة هي اللي بتسويها ال compiler كمبولر بتسويها
عشان يطلع 24 عشان 20 تدخل على ال A فيوم يكون في
عندي أنا expression بقول أن X مثلا بيساوي A of I J
هذا ال reference بدهو يعمل مجموعة من ال three
address code instructions اللي تحسب ال 20 هذه
علشان
نروح على الموضوع 20 علشان ناخد ال value علشان ننسخ
وعن ال X واضح؟ لأن هنا ال I1 و ال W1 و I2 و W2
يقابلوا ال I1 يقابلوا ال I في المثال التابعي اللي
أنا شرحتهو ال w1 قابل ال row width ال i2 قابل ال j
و ال w2 قابل ال column width ال column width هي ال
element width لأن لو في قد يعني لسه كمان dimension
تالت أو رابع أو خامس لعدد k dimension نفس القصة هذه
بتتكرر بس في كل واحدة الـ w و الـ w الـ w1 و الـ w2
تختلف صح الـ w الأخير هو الـ width تبع الـ element
النهائي الـ data type النهائي الـ w اللي قبلها هي الـ
width تبع البعد الأخير الـ w اللي قبلها هي الـ width
تبع البعد اللي قبله صح؟ okay الآن احنا هنطلع على
example يوضح كيف الـ compiler بيحسب اللي هو الـ
reference النهائي في الـ array افترض
ان الـ array reference افترض
ان لدي expression زي هذه هذا عبارة عن expression مش
يعني فهذا statement ولا لأ هذا assignment
statement تحتوي على identifier وتحتوي على ايش على
اليمين array reference عشان اتكلم السؤال جديد، اللي
جيت في الـ column width هنا أربعة، مش الـ column
width ككولم كله و الـ element بس .. الـ column width
اللي هو .. الـ column هنا width انا اقصد بي اللي هو
الـ element الواحد، كداش الـ size تبعه، أكم بايت،
فلإن فعندي انتجة فهو أربعة، نعم، طبعا، بس ليش في
الأول الـ raw اللي ما حصلنا الـ raw width عشان .. الـ
raw width أنا عندي هنا أربعة عامدة طيب في أربعة
rows أربعة أعمدة ستة عشر أربعة في أربعة ستة عشر
أربعة في أربعة الـ element نفسه لأ انا مثلا اخد
عندك هذا الـ element هذا الـ element ايش الـ
reference تبعه a of اتنين في اتنين صح لأن الأتنين
الأولى هي اتنين ايش اتنين integer ولا اتنين سطر
اتنين سطر الاتنين التاني هو اتنين element اتنين
element يعني انتجر يعني انا فلتت في السطر الأول
فلتت في السطر التاني وانا الان واقف على السطر
التالت هذا اتنين الأول اتنين التاني هو اللي فلت
العمود الأول العمود التاني وانا واقف على العمود
التالت هنا الاتنين يعني تلاتة والاتنين مصبوط عشان
الـ reference بدم الـ zero فانا الآن هذاهذا بيقول
إنه وين وين بالظبط موقعه في الـ .. في الـ .. في الـ
.. في الـ .. في الـ sequential في الـ one dimensional
representation للـ array موقع إنه أنا الأثنين هذه
بيضربها في الـ size تبع السطر الواحد 16 لأ أنا بحكي
عن هذا الـ size تبع السطر الواحد أه نعم الـ 16 16 في
اتنين اتنين و تلاتين تمام انت تخيل كل واحد اللي هو
عبارة عن اربع بيتات صح يبقى انا الان مشيت اربعة
اتنين وتلاتين بايت وصلت لهنا او اللي هي هاله صح
الان بيقوللي بعدك اتنين في ايش اتنين في اربعة
ثمانية اتنين في اربعة ثمانية هيته لان مشيت الاربعة
دلوقتي و الاربعة التالية انا هنا فهذا الـ reference
صح
ولا لأ هذا يكون القضية اللي بيسويها الـ compiler الـ
compiler بده يحسب الـ reference هذا و بده يحسبه على
أساس الـ I و الـ J فبدي أعمل three address code
instructions اللي تؤدي في الآخر إلى temporary
variable قيمة الـ temporary هذا هي الـ reference كتر
يعني اعطيك فاهمة سريع انه
عنا هذا الـ expression يعني هذا الـ expression
خلّيني أقنّص الكلام كله خلّيني أقنّص الكلام كله
خلّيني أقنّص الكلام كله خلّيني
أقنّص
الكلام كله خلّينof j لان احنا بنتفق على ان هذه
قرية ربما تلتة في أربعة تلتة في أربعة of integers
الـ integer يعني أياش أربعة بايت الان هذا الـ x هذا
الـ statement هذا الـ statement ولا مش statement
تحتوي على identifier يساوي و أياش expression الـ
expression هذا بنعتبره الـ الـ الـ الـ
بنحن على الـ grammar هذه الـ الـ الـ الـ can have the
form ايش او
can have
the form الـ فرعية و بعدين ايش اجواس الحين هنرجعلها
الـ grammar هذه بس انا اللي بدى اوصله اللي هو انه
هذه الكلام هيك كله هو يترجم إلى هذا وقع
الأمر .. أنا اسف .. وقع الأمر .. هذا هو بس اللي
عند ..
شايف؟ كل الـ expression هذا الترجم أو الـ expression
هذا اللي هو واحده الترجم إلى الخمس .. إلى الخمس
instructions دول كيف؟ أول شيء
بالإيش؟ أنا بضطر أن أحذف واحد من الأعمل عشان يمشي
مع الـ .. 12 تمام؟ اللي هي هنا تلاتة في تلاتة في
تلاتة الـ 12 هي الـ width تبع الـ row تلت columns في
أربعة الـ 12 هذا الآن مخزن في T1 بعدين J في أربعة
تخزن في T2 تخزن في T2 تخزن
في T2 تخزن في T2 تخزن في T2 تخزن في T2 تخزن في
T2 تخزن في T2 تخزن في T2 تخزن في T2 تخزن في T2
تخزن في T2 تخزن في T2 تخزن في T2 تخزن في T2
تخزن في T2
T3 A of T3 هذا الـ value بتخزن في T4 هذا الـ value
هو land لان خلاص T4 تنجمع مع الـ C و بتخزن الناتج
في T5 بعد ذلك T5 هو اللي بينعطل إلى الـ X الشغلانة
الأساسية اللي بدى يعملها الكمبيوتر هي انه يصل إلى
هذا عشان انا قلتلكوا حاطيت علامة استفهم بين الجثين
عشان هو يصل الى T3 لازم يعمل التلات أسطر هدول هدول
التلات أسطر هدول الـ code بدي أعمل generation الـ
compiler بدي أعمل generation لهدول التلات أسطر من
خلال الـ .. من خلال الـ semantic actions هذه الـ
semantic actions هذه أُضحكت بمين بالجرامة خدوا
واحدة واحدة على المثالهنا عندي الـ expression هذا
اللي هو C زائد بنعمله parsing بناء على الـ grammar
هذه هذه هي كله هو S صح؟ وهذا identifier يساوي
expression نظبط؟
نظبط؟ ايه؟ okay
بظبط طيب لأن الـ expression هذا الـ expression
هذا واحد من الـ forms بتوعه انه L فانا في عندي هذا
S عبارة عن identifier متقوه بيساوي ومتقوه ب E صح
الـ E هذه عبارة عن L الـ L هذه عبارة عن مش one
dimensional لأ two dimensional في L و في بعد ذلك
bracket في بعد ذلك E و في بعد ذلك bracket هذا الـ L
هو أيضا identifier E لأ bracket E
براكت هذا الـ identifier ايش الـ c هي الـ
x هو الـ identifier انا اسف ان هذا الـ x مظلوم انا
اسف صح احنا
نخبط شويزي هذا الـ expression الكبير هو عبارة عنهي
عبارة عن two expressions E زائد و E واحد و E اتنين
هذا الـ E اتنين هو اللي L و
E واحد مش الحال هيك مش الحال
الـ okay لان بعد الـ C بالـ E تنيني و فيه L بتوقف الـ
I دي هدا ايه؟ هدي ايه؟ الـ E هادي هي الـ I هي
identifier اللي هو تقلبها لك الـ E هادي اللي جوا الـ
brackets اللي هي واحدة من الـ forms بتانها
identifier فهي identifier الـ I و هدي تاني
identifier
احنا نيجي نتبأ الـ parsing لما بيمشي أول اشي بيجي
عند هنا طبعا هذه X
بناخد الـ expression نبدأ من هنا وهنا نرجعها في
الأخر الـ X نطلع على الجزية هذه فالـ E الأولانية الـ
E واحد تاخدت عنها Identifier C فاتبخت الـ ايش الـ
semantic action هذه الـ semantic action هذه كل اللي
بتقوليا انه الـ E dot address أنا E هذا الـ E لأننا
على هذا المستويس الـ E تخلط علينا identifier الـ E
هذه الـ address تبعها تبع بقى عن ايش؟ تبع بقى عن
ايش؟ تبع بقى عن ايش؟ تبع بقى عن ايش؟ تبع بقى عن
ايش؟ تبع
احنا الآن في هذا الـ rule عند الـ rule بتقول الـ E
can have the form identifier بالنسبالي على هذا الـ
rule الـ E هدى اتعمل بارسنج على اساس انها
identifier الـ identifier هو الـ C فالـ action
بيقوللي الـ E dot address هو اللاكسين تبع الـ
identifier ال identifier هو الـ C اللاكسين تبعه هو
الـ C فهذا هو اللي بيروح لـ dot address attribute
تبع الـ E ليه هذا؟ الآن بعد هي كالـ E في اللي بعدها
ليه هذا؟ هذا الآن الـ L اتاخدت على انها identifier
يليه ايش bracket يليه x إذا بناء على الـ rule هذه أول
شيء في عندي attribute الـ L dot array اللي هي الـ L هذه
الـ dot array ايش بيساوي ايش بيقول اللي اعملها
اللاكسيم
هي attribute ثانية اسمها dot type ايه بتساوي
بتساوي الـ type تبع الـ element الواحد من هذه الـ
array لاحظ أن احنا بنحكي عن الـ array هذه مش الـ
array هذه هذه الـ array الكبيرة هنا
ايش؟ هنا هذه الـ array الصغيرة مظبوط؟ مظبوط؟ الـ
element هنا هو عبارة عن أسطر الواحد ولا الـ integer
الواحد integer الواحد طبعا integer الواحد لأنه مش
عارف عن الـ element نفسه بس بس element هو في قلد
بعضه هنا element ما هو هو بياخد من الـ element لأنه
هو بس بده الـ 4 bytes عشان يضروفهم هنا تحته بس
ده بلك شغل الـ واحد هنا الـ element هو الـ element
من الواحد الواحد هذه هي هي ايش
هي الـ child الـ واحد هي الـ child يعني أنا في عندي
أول شيء الـ identifier هو مش بضرب الـ base ضرب الـ
width هو بضرب الـ base ضرب الـ width هي هنا في
جيارات في القلب لو أنت ملاحظ بياخد الـ base تبع الـ
element الواحد بس الـ integer قداش حجمه من اللي
مييجي يعمل جيارات بيقول الـ dot address بساويهو نفس
ضرب الـ dot type dot width اللي هو نفس الحاجة اللي
احنا كنا نسويها قبل شوية عشان نجيب بالضربة هذه الـ
width دي اه اه طيب هو برضه هنا في عنده كلمة و عنده
ثانية المستوى هذا هو شغال كل قرية لحالها في عنده
مستويين في عنده مستويين في المستوى الأولاني اللي هو
اللاصق لاسم الـ ايش الـ identifier اسم القرية و في
مستوى الـ L الثاني اللي هو مش ملاصق هذا الآن هذا الـ
upper level صح ولا لأ احنا عندنا هنا بدأنا حياته
هذا الـ L في عندي الجزء الأول اللي هو الملاصق للـ
identifier و الجزء الثاني يعني هذا في الأول أخذناه
هذا هو عبارة عنه هذا كله هيك أي L اتفرعت إلى L واحد
ومش بعدين
هذه الـ L الثانية اتفرعت إلى identifier بعدين I
بعدين
هي اللي هي مراسقة لمين الـ identifier هي عبارة عن
الـ array الكبيرة يعني أنا بتخيل الـ two dimensional
array علينا الـ two علينا الـ array انها one
dimensional array of قد ايش أسطر السطر الواحد قد ايش
element يعني أنا الآن في هذا المستوى أنا بحكي عن
الـ array الكبيرة صح بقى الآن الـ width تبع الـ array
الكبيرة الـ element يا عزيزي الـ element تبع الـ
array الكبيرة هو عبارة عن array of integers هذه
السطر array of integers يعني هذه الـ type هذه الـ
type هذه الـ type عبارة عن array of ثلاثة of ايش؟
ثلاثة of ايش؟ of array من ثلاثة of integers صح؟
الآن احنا بنحكي عن هذا هذا هو الـ type
هذه ال ال ال ال ال ال ال ال ال
ال ال ال ال ال ال ال ال ال ال ال ال ال ال ال ال
ال ال ال ال ال ال ال
ال ال ال ال ال ال ال ال ال ال ال ال ال ال ال ال
ال ال
الـ element اللي هنا هو عبارة عن السطر السطر الـ
width تبعه 12 مظبوط فالآن الـ الـ dot address الـ
type أولا الـ type هو الـ type هو الـ array ثلاثة of
integer بعدين
في الـ attribute الثالثة الدق أدرس ايش بيقول لي جيب
new a new temporary مظبوط أخذنا الـ temporaries قبل
هيك هذا أول واحد بس دي اهجز 12 بت في الـ .. لأ
temporary temporary T1 T2 T3 تي
واحد الـ temp هذه وضعتها تعطيني T1 T2 T
ثلاثة احنا لسه أول temporary هي T1 الآن بدي أكون
three address code instructions بتحط الـ three
address code instructions في الجدولة أول واحدة هذه
و قول لي جيب الـ L.address T1 بحط بعدها علامة
المساوي بعدين الـ E.address انهي E احنا على أي
مستوى هذه الـ E تبعتنا صح؟ قصده الـ I ايش الـ address
تبعتنا؟ الـ I كيف عرفت؟ لما نلاقيها انها عملت
parsing عملتها على هذا الأساس صح؟ تمام هي الـ E dot
address هي تكسيب الـ identifier الـ identifier
تبعتها هو الـ I بعدين
خلصنا؟ الـ generator خلصت؟ لأ لسه فيه ميجي علم تضغط
بعدين الـ width تبعت tribe الـ tribe احنا اتفقنا ان
هو الـ element هذا هكذا هذا الـ type ماهو الـ width
تبعه؟ لو 12 لو 3×4 3×1 أنتجة 12 خلصت خلصت الـ
generator هذا أول free address code instruction
الآن خلصنا من هذا المستوى كله نرجع لفوق لهنا لهذا
المستوى خلصنا من هذا المستوى نرجع لهذا الآن هنا
ما في عندي ايه هو اللي هو بتدخش على هذه هذا .. هذا
terminal بتدخش على هذه هذه أن الـ E dot address
هتاخد ايش الـ J بالظبط صح خلصت الآن من هنا الآن أنا
هنا هنا على أساس ايش أن الـ can have the form هذا
صح مش هذا أشياء ده الـ level هيته أنا
رسمته مرة ثانية هنا الـ L هذه اتفرع منها أنا
احنا في الـ J احنا خلصنا الـ R احنا
الآن اصلا احنا بعد هذه و بعد هذه احنا هنا لسه احنا
هنا اصلا وهذه نور واحدة كلها هي الـ
L صح؟ احنا الآن لسه هنا الـ L هذه الـ L هذه عبارة
عن الـ sub هذا و مع الـ expression اللي بنقصه يعني
اللي هو اللي هو هذا مصبوط ببناء على هذا ايش في
عندي الـ L هذه الـ
L هذه الصغيرة اللي قدامك مبينة إجت محشورة هنا بدا
أريحها شوية هاي الـ E 2 برفعها لفوق و بعدين الـ
L بدا تيجي هنا و هذا الـ N برا كلهم بدون ما ياخدوا
منها زيك صح؟
صحيح؟ هذه الـ L الآن هي لها عدة attributes مثل هذه
عدة attributes ايش عدة attributes بتاعتها؟ بناء
على هذه الـ action الـ dot array بيساوي
pointer لـ child هذه الـ dot array تبعته هي الـ a
بعدين الـ dot type
my rate of the letter of integer ثم الـ T ماهو هذا
الـ T؟ هذا ليس attribute تابع للـ L هذا variable
اعتبره local variable الـ T ماذا يعني؟ الـ new temp
يعني نأخذ من الـ temp
T2 لأن T1 أعطتنا بعدين الـ dot address الـ dot
address ايش بيساوي temporary جديد temporary temporary
temporary temporary temporary temporary temporary temporary
temporary
temporary temporary temporary temporary temporary temporary
temporary temporary تيم
يساوي هي يساوي و حط بعدي الـ E dot address انهي E
عاد الـ E دي تحتنا احنا لسه على مستوى هذه فما أعرفش
اللي الـ E هذه مصبوط الـ E ايش بدهوا منها بدهوا الـ
address اللي هي J بعدين علامة الـ dot بعدين الـ dot
الـ L dot type الـ L dot type اللي هي array
Okay الـ width تبع هذه الـ array هذه الـ array
الصغيرة الـ width تبعها شو الـ elements تبعونها
integers ايش الـ width تبع الـ integer الواحد 4
خلصت
الـ generator الأولى مظبوط مظبوط الـ generator
الثانية بقول لي جيب الـ L dot address الـ L dot
address T3 بعدها يساوي بعدها الواحد dot address هاي
الواحد وين dot address الواحد T1 و اجمعه و لا
اضربه و لا اجسمه اجمعه هاي اد الزائد مع T من T لـ
T2 خلاص T2 ابن جهة الآن T3 حاصل جمع T1 و T2 okay
الآن احنا بنكون خلصنا بنخرج من هذا المستوى إلى مين
إلى هذا المستوى
بالظبط لأ لسه من هذا إلى هذا اثنين اللي هي ايش هي
e canada form L لأن
هنا على هذا المستوى بيقول
ليعمل نيوتن في الـ dot address تبع هذه نيوتن
اللي هي T4 بتكون أربعة
ويعمل generate لـ statement جديدة shoot ال
statement الجديدة جيب الـ address هذا T4 بعدين
يساوي بعدين الـ array base هاي الـ array اللي هو ال
A وبعدين حط ايش احط نبس مربع bracket بعدين الـ dot
address الـ dot address T3 صح؟ وهنسكر، مظبوط؟
يبقى الآن عندنا هنا اكتملت حسبة أو تحويل ال
multidimensional reference إلى one dimensional
reference إلى single dimensional reference، صح؟
وهذا الـ T4 هو الـ address اللي مخزن فيه مش بس ال
reference لأ الـ value اللي مخزن في الـ array عند
هذا الـ reference هذا الـ value ماذا نحتاج منه؟
نجمعه على الـ C الآن نكون خلصنا من هذا ال
expression نطلع فوق على هذا ال level هذا ال level
اللي هو الـ expression المتكون من الـ two
expressions هذولة صح؟ عند هذا ال level اللي هو
احنا بنكون هنا بيقول يعمل temp جديد E dot address
خد temporary جديد ليه T5
بتبدأ بـ T5 ويليها يساوي ..بعدين أخد E1 dot
address ..ها E1 dot address الـ C ..بعدين أحط
..بعدين علامة T ..الزائد ..بعدين أخد E2 dot
address التي هي T4 E2 اه E2 التي هي T4 هنا بيكون
احنا ..ووصلنا الى الـ expression كله الآن بيجي ال
assignment الـ assignment بيكون احنا اصلا ال
identifier هذا الـ S هذه احنا بيكون نطلعه على هذا
المستوى على طول في generate statement بتاخد مرة
واحدة بتقول خد اللاكسين تبع الـ identifier الـ X و
بعدين يساوي الـ E Dot Address هذه الـ E Dot Address
تبعها T خمسة فهذه
القصة الآن سواء لأ و .. يعني هي جاية كـ example
لحالة عندي الـ address two dimensional لكن لو كانت
one dimensional نفسها بتصبط لأنه مش هتغلق الى هذا
المستوى هنجف عند هذا المستوى وهنفذ هدولة ولو تلاتة
dimensional هتشعب مش بس على كمان مستوى الا كمان
مستوى تالت واعمل الجصة دي على .. هو لما قال ان
احنا نحط T على الـ J درب أربعة .. الـ T .. اه لما
حكي ان احنا نحط الـ T .. اهما نعمل جيارات ل
temporary جديد ونحط فيه كان المفترض هنا في
الجيارات ان احنا نبذل T .. أنهي الجيارات الجيارات
الأولى .. الأولى اه المفترض بدل ما احنا حطينا T
اتنين هنا المفترض حطينا T صح؟ حسب الـ rules تبعته T
يعني احنا حطينا T اتنين اه بس في المفترض حطينا
ايش؟ T هي T هادية ببعض متغير سميها
بس هو بده .. بده .. بده متغير .. بده temporary يحط
..يحط ع شجع بينما يجيب بينما يجيب كمان temporary
التاني بده two temporaries بس واحد .. واحد هتلزم
في attribute والتاني مالوش attribute ت .. لأ مخصصة
اللي هو فحطه في .. في .. في temporary variable
باردة تاني مرة بقوم أكيد انه بغض النظر عن ال
dimension لو two dimension ولا تلاتة ولا أكتر نفس
العملية بس بتتشعب بيصير levels هذا الـ slide بس
مجرد شرح نفس الـ attributes اللي اتعاملنا معاها
الـ address والـ address array والـ address type
واضحين الآن صار مش محتاجين نجرس عادي هنا
الـ example هذا هو نفسه اللي أول شرحناه صح؟ صح؟
نفسه على أساس أن هذا الـ expression كله تخزن في T5
بعد ذلك أنا زوّلت عليه الـ X بتساوي T5 هذا الـ slide
بينوقف هنا عند type checking للمحاضرة اللي جاي
بنخليها بس في شغلة صغيرة بده أقولها وهي أن ال
project تبعنا أنت الآن مطلوب أن تكتب الـ script
وظيفة الـ script هي أن نعمل parsing يعني الـ one
handed parsing مافيش generation مش هنعمل
generation لا translation يعني فأنت بتكتب ال
script وبعدين بتعطيله input وهو بيفحصلك ال input
هذا هل مطابق للـ grammar ولا فيه errors syntax إذا
وصلنا لهذا المرحلة مرحلة الـ parsing وكل شيء تمام
وبعد ذلك بدنا نعمل translation هنجي على نفس ال
script هذا اللي أنت كتبته وانتقمه بـ actions مثل
هذه الـ actions اللي تقوم بعملية الـ translation
اللي تقوم بعملية تكتير واحدة بناء اللي هو الـ three
underscore instructions الشغل بيجي step by step في
الأول نكتب الـ grammar ونكتب الـ script بحيث انه
بيفحص الـ syntax بشكل وبيعمل parsing بشكل سليم
تأكدنا ان كل شيء تمام بعدين بنبدأ انطعم هذا ال
script بـ actions اللي تتولى عملية بناء الـ code بعد
ذلك سنرى
كيف يتحول الـ code إلى target code مباشرة أكثر
ثمانية