ماشي بسم الله الرحمن الرحيم الصلاة والسلام علي
أشرف المصريين اليوم إن شاء الله احنا بدنا نكمل
اللي بدنا فيه chapter 6 اللي هو الـ intermediate
code generation كنا المواضيع اللي بدنا فيها اللي
هو 6.1 و 6.2 ولسه ماوصلناش لـ 6.3 اللي هو الـ types
and declarationتعرفنا على الـ three address code و
التفاصيل المتعلقة به خلينا نطلع على آخر أشياء
رأيناها في الـ three address code كنا حكينا عن الـ
names و الـ instruction types نروح على الـ slide تبع
الـ instruction types تذكروا هذه الأنواع
instruction forms الآن
أعتقد أن هذه آخر أشياء حكينا فيها اليوم نكمل الحديث
عن الـ three address code من هنا هي section 6.2 ونبدأ
في 6.3 إن هنا احنا الملاحظة اللي في الـ slide ها دي
أنه احنا الـ labels أو الـ labeling لما بيكون فيه
أدات و سكشن وبعديك بيجي في got والـ got ها دي بدها
ترسلني أو ترسل الـ flow of control إلى نقطة معينة
في الـ code فأمام واحد من اثنين الـ label بتفتح
بأسلوب من اثنين أما أن احنا بنستند إلى أن كل
instruction أصلاً لها number فبالتالي الـ number هذا
هو الـ label فلما بقول go to بقول go to الرقم الرقم
هو رقم الصفرو
بنقمش كل الـ instruction برقم بنحط labels بس عند
اللزوم بمعنى أنه أنا عارف أن الـ instruction هذه
هييجي لها قفص من مكان آه من مكان ما فهو اللي بحط
لها الـ label والـ label هذا هو اللي بستخدمه مع الـ
go to يعني نفس الـ symbol هي هنا الـ symbol الـ
symbol Lممكن أعمل X أو V أو أي سيمبول هو الرمز
اللي هستخدمه كـ label واستخدمه في الـ go to
فبالتالي أنا أبني أسلوبين لـ two ways of assigning
labels to three address code بستند إلى وجود ترقيم
للـ instructions بالتالي رقم الـ instruction هو الـ
label أو بيكونش فيه ترقيم أنا بحط label و ..
symbolic label وهو اللي بـ .. استخدمه في الـ go to
statement واضح؟ هذه الملاحظة أساسي جدا في شغل الـ
instructions لأنه احنا قلنا ميزة الـ three address
code على الـ syntax tree إيش كانت إذا بتذكروا أن الـ
syntax tree عملياً بتمكنني أن أنا بتقدملي بديل كويس
لمثالة الـ intermediate representation ولكن نقطة
ضعف الـ syntax tree أنها ما بتساعدني في الـ control
flow مافيش عندي وسيلة إن أقول في الـ syntax tree إنه
بعد ما يخلص الـ execution في هذا الجانب ينتقل إلى
الجانب الآخر صح؟ مظبوط؟ مافيش في الـ syntax tree
إمكانية وميزة الـ three address code على الـ syntax
tree هي هذه النقطة بالتحديد okay فعشان هذه النقطة
بتاعة يتم يجب أن يكون فيها أسلوب محدد للـ labeling
إما استناداً إلى ترقيم الأسطور أو استناداً إلى
labelsأنا بدي أضعها طبعاً مش أنا اللي بدي أضعها الـ
compiler هو اللي بدي أضعها الـ compiler هو اللي بدي
أشكل الـ instructions هذه وهو اللي برضه بيضع الـ
labels okay الآن الـ three address instructions إيش
الوعاء اللي ممكن احنا نخزن فيه الـ instructions
ممكن عدة في منها اللي هو الـ quadruples الـ
quadruples تعرفوا كلمة tuple tuple يعني الـ record
في الـ database في الـ table بيسموه tuple صح عبارة
عن مجموعة من الـ fields دائماً بيجوا مع بعض صح فاحنا
هنا عندنا برضه نفس الشيء واحد اثنين ثلاثة أربعة
مكونات دائماً بيجوا مع بعض فهذه الـ أربعة quad أربعة
quadruples تمام فبالتالي أنا مقدر أخزن الـ
instructions الـ compiler بيخزن الـ instructions
أثناء عملية الـ code generation intermediate code
generation بيخزن الـ three address instructions في
array أو arrays الـ array هذه مكونة من أربعة أعمدة
العمود الأول زي ما أنتم شايفين لإيش للـ
operation أول شيء قبل الآن احنا .. احنا الـ
expression زي هذه هي عبارة عن statement statement
assignment statement عندي الـ a على الـ left hand
side وعندي الـ assignment وعلى يمينها إيش
expression لأن ترجمة هذه الـ statement هي مجموعة الـ
instructions الـ three address code instructions
هذه صح؟ في الأول زي ما تشوفين الـ minus جاية لعملية
الضرب الـ c بدأ ناخد الـ negative تبعها بتخزن في T1
بعدين T1 هو اللي بتضرب في B بتخزن في T2 بعدين
بنعمل نفس الشيء في المرة الثانية صح minus C بتخزن
في T3 T3 بتضرب في B بتخزن في T4 لأن T4 وT2 هم طرفي
الـ expression بالضبط بنجمع وبنجمع T4 وT2 في T5 وT5
هو اللي بينعطى هذا الـ free address code هذا الـ
free address codeبيتخزن في قرية Quadrope القرية
Quadrope القرية هذه صيغة القرية هذه أن أول عمود
محط فيه operation أي operation الـ assignment ولا
اللي لأ طبعاً مش الـ assignment الـ operation اللي
فيها العملية الحسابية اللي بتخوم العملية الحسابية
فإن دي هنا minus هذا كلمة minus minus minus minus
minus minus minus minus minus minus minus minus
minus minus minus minus minus minus العملية
الحسابية الـ unary operation اللي بتعطيني الـ
negative تبع المتغير صح فهي الـ minus إيش الـ
argument الأولى يعني الـ operand الأولى الـ C إيش
الثاني
العمود الأخير للـ result العمود الأول للـ operation
والثاني اللي في النص للـ operands طبعاً مش كل الـ
operations بتاخد two operands وفي بعض ما بتاخدش
operands بالمرة okay فـ .. فهذه بالأساس اللي هو الـ
.. الـ quadruple أو الـ quadruple array اللي ممكن
تستخدم في تخزين
الـ three address code الآن عندي
الـ
unary كما قلت تعالوا الـ unary operators زي هكذا
ما بتستخدمش arg2 صح؟ الـ operators زي الـ param
تذكروا هذه لا تستخدم R2 ولا تستخدم الـ addition تتذكر
البرامج احنا قلنا لو أنا مثلاً عندي function بدي
أستدعي function F بقيها متغير نستخدم call و F و
نضع in هنا in عدد الـ parameters يعني هذا المتغير
بأول شيء بسلمه ببرامج مثلاً متغيره X برامج X بعدين
هنا بقول call F بعدد واحد parameters طبعاً الـ output
تبع F بأخده باليساوي في المتغير اللي بديه فهذه
parameter هتيجي في الـ quadruple هتيجي في العمود
الأولاني parameter والـ x هيجي في الـ arg one مظبوط
وبعدها كده اللي هستخدمه لفي result لا في argument
الثاني ولا في result صح هذا اللي بيقوله هنا operand
letters like في القرآن used لا مستخدم الـ article
ولا الـ result الـ conditional and unconditional
jumps put the target label في الـ result يعني لو
بقول go to بقول go to وبحط الـ label في الـ result
الآن إذا هي unconditional فـ go to بدون أي إذا هي
conditionalقيمة المتغير اللي بتعتمد عليه الـ
condition يعني بيجي في arg1 تمام
فهي الـ quadruple في بعديك حاجة اسمها الـ triple الـ
triple أبسط من الـ quadruple هي تبسيط للـ quadruple
هي نفس الـ quadruple بس حذفنا من عمود الـ result زي
ما أنت شايف صح في الـ operation وفي الـ arg1 وفي الـ
arg2 بس مافيش result بدي عن الـ result بما أن أصلاً
الـ result هي عبارة عن يعني مثلاً نرجع تاني هنا الـ
T1 هي نتيجة إعداد الـ Instruction الـ T2 هي نتيجة
إتهادة الـ Instruction الـ T3 هي نتيجة إتهادة الـ
Instruction خلاص بستخدم رقم الـ Instruction بدل ما
أستخدم الـ temporaries هذه فايتوا هنا إيش اللي صار
minus C إلى B الـ B اللي نضربها مع مين معناه إيش
الـ Instruction صفر محطوط بين قوسين إشارة إلى إنه مش
الصفر نفسه اللي بتضربه في الـ P بده الـ instruction
اللي واقع على index 0 نفس الأشياء هنا هذا اللي
قلناه اللي هي في الآخر لما نجيب T2 زائد T4 T2 هي
ناتج instruction number 1 وT4 هي ناتج instruction
number 3 إحنا هيك بنكون إيه؟ وفرنا اللي هو عمود أو
استغنينا عنها عن عمود الـ result triples في حالة اسمها
الـ indirect triples indirect triples هي triples في
الأخرها هي triples بس واحنا أضفنا إليها اللي هو
إيش الـ array الثانية هذه الـ zeros والـ ones هي عبارة
عن pointers إلى الـ instructions طبعاً استفدنا منهم
هذه الـ instructions موجودة وبتؤدي الغرض ماذا لو
أضف ريت تاني فقط
مجرد pointers على الوصفات
السبب في ذلك أن ال optimization stage ربما يحصل
فيها إيش ال compiler في ال optimization ربما يحتاج
يُحلف يضيف يُبدل instructions من مكان لمكان هذه
الأمور لما بعملها لو أنا عندي linked list و بشيل و
بهدبس مجرد ما بفك pointers و بضع بال pointers لأن
بكون عندي array و بدي أشيله record بدي أعمل shift
لكل اللي بعده يرجعه غلبه صح؟ بدي أعمل insert بدي
أطلع حد لكلهم و بعدين أحطهم و بعدين أرجحهم بعدهم
مظبوط؟ يعني processing overhead عالي جدا حكاية
الحدف والإضافة و هذه الحدف والإضافة و shuffling ..
shuffling يعني شيء من مكان لمكان إذا بحتاجه في ال
optimization ما مشكلة فهنا أنا بس إيش بسوي أنا
عندي ال instructions فليقول مخزنين بأي شكل وأشكال
لما بدي مفترض أبدل هذا أحط الجبل وهذا أرجحها تحت
مجرد بس بغير رقم instruction في ال instruction الرئيسي
صح أو لا نعمل instruction ونعمل instruction في كل مكان
و بعدين نغير ال pointers في داخل ال instruction صح
فال indirect triples الغلط منها بالأساس هو إيش
تمكين عمليات التعديل على ال reordering لل instruction
في مرحلة اللي هو ال optimization في شيء في الآخر
برضه كمان في form آخر اللي هو single assignment
form static single assignment form single
assignment إيش يعني افترض أن أنت عندك هنا three
address code مجموعة three address code
instructions P بتساوي A زَي ال B Q ساوي P ناقصيه
بعدين أنا خلصت من ال P هذه استخدمتها في عملية
الطرح وخزنت ناتج في ال Q ال P هذه أنا مش ممكن
أستخدمها أعيد استخدامها أنا استخدمت هنا Q ضربت في D
و أنا خسرت النزل في P و بعد كده أخد ال P طبخت من
ال E هذا اسمه multiple assignment يعني أنا استخدمت
المتغيرة و ال name في أكثر من مرة استخدام في
single assignment لأ لازم المتغيرة أستخدمه single
time only one time only فبالتالي هنا بكون عندي ..
زي أنا عندي هنا P بدا أستخدمه منكم و بقول P واحد
بعد ذلك لاحقا أقول P2 يعني اعمل اعمل حسابي أن ما
.. و هذا برضه أيضا له غرض في ال optimization فاحنا
الآن ال single assignment form هو عبارة عن free
address code ولكن ال variable او ال name اللي
بيستخدمه مرة واحدة فقط هذا الكلام بي .. ممكن
يُدخِلني في إشكالية صغيرة وهي أنّه في الـ if statement
لأنّه لما بدي أقول if و
هدى flag متغير بدأت على قيمته اللي هو x بالساوية
ناقص واحد else a else x بالساوية واحد لأن هدى لو
بدي أترجمها three address code بداجة بقول flag
flag
مفترض الفلاج ماخدة قيمتها في درجة أقول if false
مثلا آه flag روح
على من x
فالس
خليها بس تساوي واحد و تسلب واحد بس شجرك عشان
تظهر تكون مساوي يعني أنا
قلت لك ال false flag روح على ال auto
neutralizer صح؟ الـ false في الـ go to meet دلوقت
صح؟ إذا الـ false X قصيرة بقى إذا مش false فتكمل
تعمل ال X مرتين فبقى نعمل go to meet و أنا بقى
بخفز عنها هيك ممكن؟ مش بغض النظر ال go to مظبوط
ولا ليه المهم إنه حتى لو أستخدم ال X مرتين هو لبسي
ال X مرتين فهذا ينافي لأن قصي الأساسية تبع ال
single assignment أن أنا ال X أخدت إيش مرض .. أخدت
.. يعني أستخدمك مرتين صح؟ Okay فال .. ال .. ال ..
البديل عندك اللي هو دي هي اسم الـ Phi function أنّه
باجي مقول هنا أي flag خلاص أي flag ناخد ال value
تبعته طب .. طب هجيت ال .. فما نقول ال .. ال flag
فوق سقوطه لعشرة أو لعشرة و تلاتة مشكلتك أنا
استخدمت ال X مرة واحدة يعني هجيت حط ال X بساوي
واحدة صح؟ هو في ال .. في ال control في ال .. في ال
execution ال X أخدت قيمة مرة واحدة لكن في ال
instructions ال X ظهرت مرتين ما أعيش أقول مشروط
الأساسي أن أنا ما أعيش استخدامها أنّه استخدمت مرتين
فالبديل عن ذلك اللي هو احنا نيجي نعطي flag ال
value تبعها وبعد كده نيجي نقول x3 بساوي فاي x1 لأ
sorry نقول x1 بساوي minus one و x2 بساوي 1 بعد ذلك
X3 بساوي Phi X1 و X2 على هذا الأساس Phi هي
الاستثناء الوحيد اللي ممكن يضع فيه ال variable
المرة
التالية فX3 تأخذ قيمتها إذا كان flag هذا true تأخذ
X1 إذا كان false تأخذ قيمتها من X2
تمام هذه نهاية ال section ستة أو اثنين اللي هو
كافة ما يتعلق بال three address code عندك ممكن في
ال exercises أو في امتحان أو كده بيجيلك expression
ويقولك والله أعطيني three address أعطيني syntax
three تقابل عنه أعطيني quadruples أعطيني triples
أو اندراج أو اندراج triples ممكن برضه كده يتطلب
منك expressions فيها .. فيها إيش؟ reference أو فيها
function كوه .. هاي ال function كوه زي اللي
بتاعتها و حكيته هذا مثلا لأن هذا ما تاكتيش تسوي
ما تاكتيش تقول و الله في الأول y زائد واحد تعطيها T
واحد سوى y زائد واحد بنفحكوا لأن؟ بنفحكوا لأن؟ بعد
هيك أجي أقول Param T واحد بعد هيك أقول أجي أقول إيش
T2 بيساوي call F D 1 one اللي هو يعني parameter
واحد فقط اللي هو ال parameter اللي أنا حطيته قبل
استخدامها بعدين أجي أقول إيش X بيساوي T2 زائد 2
هذا اللي هو الترجمة لهنا الواقع هذا بقى عن
assignment statement تحتوي على expression و ال
expression يحتوي على function call البرامج الواحدة
تحترق على البرامج الواحدة البرامج الواحدة تحترق
على البرامج الواحدة البرامج الواحدة تعني
expression
سكتش ستة تلاتة سوف نتطلع على كيف نعود لموضوع ال
types و ال declarations بس المرة هذه لما احنا
شوفناها لما احنا حكينا في ال types و ال
declarations في الماضي كان عشان نشوف كيف نستخدم ال
definitions syntax directed definitions أو syntax
directed translation schemes في تحديد ال type تبع
ال declaration يعني عندي مثلا declaration زي كده
integer x أو integer 2x3
a طبعا ال type تبع هذه ال declaration اللي هو أصلا
بدنا نعطيه ال identifier هذا أو ال type تبع هذه ال
declaration اللي نعطيها ال x كان احنا شوفنا
examples قبل هيك لمجرد التحديد اللي هو الـ type
باستخدام SDD باستخدام attributes مرة شوفنا
attributes هذه Central size و مرة شوفنا inherited
الآن بدنا نرجع لنفس الموضوع بس لغرض آخر لغرض آخر
اللي هو determining
ال storage بدنا نحك .. بدنا نشوف كيف ممكن يكون ال
definition نستخدمها أو ال semantic rules نستخدمها
في حساب ال storage و في حساب هو ال address ال
address هو الموضوع اللي بدي يجي فيه ال variable و
كذلك الحال إذا القمر بلزم إذا في بعض ال
declarations بلزم أنّه نعمل type conversion و كيف
ال compiler ممكن يعمل insert ل type conversion
instructions okay
هذه مثال اللي احنا مضيناها لها بالحكاية و كان
الغلب منه زي ما قلنا اللي هو أنّه احنا نحسب
ال value تبع ال T attribute إذا بتذكروا لو أنا
عندي declaration أو type ال T attribute لشيء زي
هيك كان عبارة عن ال expression هذا كلمة array جوس
جبنا عدد النوع هذا قد يكون basic و قد يكون لسه more
complex إذا هو complex زي الحالة هذه هو array of
تلاتة of h in integer تمام هذا ال expression هو
قيمة ال T attribute الآن احنا بدنا إضافة إلى هذا
ال T attribute بدنا نتخيل W attribute W attribute
اللي هي ال width ال size هذا الكلام قد يكون كبير في
الـ memory بعتمد على الـ integer ليس الـ array of
integers الـ two-dimensional array of integers فقد
يكون كبير الـ integer إذا كانت أربعة مثلا معناه
ذلك بدنياش أربعة أربعة في تلاتة و أتناشر في اتنين
و أربع و عشرين صح؟ صح؟ فهذا الـ compiler يجب أن
يعمل حسبه برضه باستخدام الـ semantic rules بدي
اشتريها فهي هنا مثال عندي ال declaration زي هيك
هذه ال declaration a declaration has a form T و
identifier followed by semicolon followed by more
declarations يعني أنا ممكن تيجي أقول مثلا integer
X وبعدين أحصل semicolon وعمل كمان declaration أخرى
where غير وغيرها الـ D هي نفسها بقى ممكن تبقى
سيميكولون هذي تبقى اسم إبسلون وهذي إبسلون خلاص
يكون دي بس declaration واحد أو اثنتين أو ثلاثة بس
ال type هذا ممكن يبقى basic أو ممكن يبقى complex
ال complex هذا عبارة عن أصل basic followed by هذا
شاهدناه قبل قليل الـ
B هذه ممكن تبقى integer وممكن تبقى float إذا هو
complex يعني integer مثلا وبعدين هو الـ ghost
اللي جواته number وربما كمان more كمان واحدة صح؟ هذا
ما شفناه قبل كده صح إن ال type ممكن يبقى array أو
ممكن يبقى record أشوف نموذج ال record ال record
مبسطة كلمة record بعدها Calibrate بعدها D والـ D
هذه هي أي single أو multiple definition single
variable أو multiple variables ما في شيء جديد
الجديد هو إنه احنا هذه ال definitions نشوف كيف
احنا ممكن ندخل فيها semantic
actions اللي تقوم بعملية ايش ايش قلنا احنا بدي لكل
declaration احسب ال type واحسب ال width ال type
هي نفس الكلام اللي كان جمله
هذا ليس جديد يعني نفس ال productions هذه واللي
أنا حاطط تحته خط هو نفس ال semantic actions اللي
كانت مرت علينا قبل كده اللي وظيفتها كانت إنه
تحسب ال time الاستجابة هو حسبه ال width و
حسبه ال width برضه مش معقدة
واضح جدا إذا كان والله ال basic ك integer فهنعطيه
float في سبيله أربعة على أساس إن ال integer أربعة
byte إذا float نعطيه ثمانية يعني إذا شيء complex
بدنا نضرب نضرب الرقم هذا فيه هش في ال size تبع ال
ال basic صح؟ صح
هنا ال width تبع ال parent بتساوي ال value تبع هذا
الرقم مضروب فيه في ال width تبع ال child صح؟
خلينا
نطلع على ال .. ال .. ال
dependence graph
2 في 3ish واسمها a مثلا لأن احنا ما نيه بهذا الجانب
عشان نحسب ال type وال size تبعه ال type واضح إنه
عبارة عن array 2 of array 3 of integer الوقت هذا
كيف نحسبه تيه لأن استجدت؟ ال 24 يعني كيف نحسبه؟
بالأصل احنا هذا بننظر له على إنه T بتكون من ال basic
وال complex ال basic هو integer وال complex هو
عبارة عن .. لأ
لسه عبارة عن ghost بعدين number بعدين second ghost
بعدين كمان complex complex هذا الثاني هو عبارة عن
ال ghost ال number والجثث الثاني وكمان Complex
Complex هذا عبارة عن إبسلون صح؟ مصبوط هيك ال
parsing هذا ال integer هو عبارة عن .. هذا ال
number هو عبارة عن الاثنين وهذا هو الثلاثة الآن
بناء على ال parsing تبع هذا ال grammar بناء على
هذا ال grammar احنا لما نتعرف على ال size تبع هذا
بنتعرف على الـ B بنتعرف على الـ B بنتعرف
على الـ B بنتعرف على الـ B بنتعرف على الـ B بنتعرف
على الـ B بنتعرف على الـ B بتعرف على الـ B بتعرف
على الـ B بتعرف على الـ B بتعرف على الـ B بتعرف
على الـ B بتوع ال integer بعدين كنا نبدأ نرد و
نرجع ثاني ال type هذه ال T attribute وتبدأ
نرحلها لل parent لأن في نفس ال .. ونفس الكارثية
ال size لأن ال width ال width تبع هذه اللي هو
الأربعة لأن هذه ال width تبع حاجة كم؟ أربعة
الأربعة اللي هتترحل هنا ليش؟ علشان تنضرب في
الاثنين
لتنضرب في اثنين فقط إذا كانت كل القصة integer of
اثنين لكن إذا لسه في كمان ثلاثة معناته ال width
هذه الأربعة تترحل أيضا كمان لهنا عشان تنضرب هنا
فهي عملية للأربعة تترحل إلى ال width تبع ال C لأن
هنا لما نصل إلى نقل إبسلون
بنرجع ال W هذه اللي هي الأربعة بتنضرب في الثلاثة
هي الأربعة أصلا أترحلت لهنا وأنا هنا ولا على
المستوى أنا بكون مالي عملية على ال rule هذا ال
rule هذا بتقول لي خد ال width تبع ال child ال
width تبع ال child اللي هو احنا مشينا وبنزل فيه
لما وصلنا ل ال W خلاص ثبت على إنه أربعة الآن خد ال
width تبع ال child واضربه في ال number أربعة في
ثلاثة اثنا عشر صار ال width على هذا المستوى اثنا عشر
لأن الاثنا عشر هذه نرجع واضرب ال width تبع هذه الآن
برضه ال width تبع ال child نضربه في ال number اللي
هو أربعة وعشرون الآن في الآخر أربعة وعشرون تترحل إن
هي لل parent
أمانيا في البداية ال width تبع ال B هذا ال N هنا
يقصد بها ال B ال basic type ال width تبعها أربعة
الأربعة هذه هي ال 4 ك width وال type وال T ك type
ال integer ترحله على ال C و ثم ترحله على ال C
child ثم ترحله على ال C الأخيرة صار عندي ال C
الأخيرة لما اكتشفنا إنها epsilon
هذه الأربعة أترحلت لفوق عشان تنضرب في الثلاثة وهذه
ال integer أترحلت لفوق عشان تأتي ضمن التركيبة هذه
التركيبة 12 هذه أترحلت لفوق عشان تنضرب في الاثنين
عشان ناخد ال 24 وهذه أترحلت لفوق عشان تأتي ضمن
التركيبة اللي فوق
زي ما هم على الـ dot على الـ T dot width و T dot
type بيكون هنا حسبنا طلب عنا ال type attribute و
ال width attribute ال width هذه بتقول لي جداش size
جداش بالضبط size لهذا المتغير ال tribe تبعه بيك أنا
شايف أنا أنا هندي ال tribe تبع هذا المتغير وهندي
ال size اللي لازم لهذا المتغير
عندما تكون ال declaration جاية ضمن مجموعة ال
declarations يعني في مكان ما في البرنامج فيه دي
declaration و
بعدين فيه declaration ثانية دي declaration وفي
مكان آخر دي declaration ثانية integer X وفي مكان
آخر دي declaration آخرها multiple أو sequence of
declarations كل declaration بالإضافة إلى ال size
تبعها إلى ال size تبع المتغير ملزمني أيضا كمان
أعرف أين بدي أحطه افترض إنه بحط المتغير بعد آخر
متغير أنا عندي أنا ال data section ايه ال program
ايه ال data بدي اصفط الليش لصفط المتغيرات الـ A
أخذت 24 بايت المتغير
الجديد اللي يجب أن أعمله هو X يجب أن يأتي بعد ال
24 بايت وليس إن أرمي حد فيك أينما يأتي بداخل ال
data section صح أو لا؟ فأنا لازم يبقى في عندي حاجة
اسمها offset اللي يتأشر لي أين يجي يتخزن ال next
declaration بالأصل أول declaration بتيجي على
offset 0 offset 0 بداية من من ال data section بعد
ما أحسب هذه ال declaration كده ال size تبعها كده
ال width تبعها نضيفها على offset .. نضيفها على
offset جديد صفر زي ال 24 تبع 24 جلد الآن هذه ال
declaration الثانية تبدأ عند ال offset تبعها عند
24 لو أجي بعدها كمان declaration أخرى offset بالضبط
فهي كل هذه بطل حسبت ال offset بحطها أيضا في ال
semantic action ال semantic action صار فيه ثلاث
حسابات من حسبها أولا ال dot type attribute ال width
attribute وال offset attribute كل هذا الكلام يتم
محالجته باسماتيك اكشن أو rules أو إذا كنت تريد أن
تعمل SDD أو rules آخر شيء أريد أن أقوله بعد موضوع
ال sequence of declarations قلنا ايش النقطة
الأساسية في ال sequence of declarations اللي هي إن
نغير ال offset عشان نغير ال offset value عشان كل
new declaration تبدأ من حيث انتهت ال declaration
اللي
قبلها هذا القمر أحيانا بلزم إنه بلزم
إنه يتبنى من نقطتين النقطة الأولى اللي هي إن لو أنا
هندي ال declaration قبل لو أنا هندي ال declaration
ل record زي هيك شو استجدت؟ ما استجدتش شيء لأن ال T
هذه record افتح جوس و D سكر جوس لأن D شو هي؟ ليس
أكثر من .. مش أكثر من الكلام اللي كنا بنحكيه الـ D
هذه إما single أو multiple declaration قد يكون
بعضها simple أو basic يعني أو قد يكون compound فما
استجدتش أي حاجة كل الكلام اللي حكيناه قبل شوية
بينطلق على الـ D هذه اللي جاي من ضمن تعريف الـ
record لأن الـ record شو هو بالأصل مجموعة من الـ
variables مظبوط الـ variables هذه قد يكون بعضها
basic قد يكون بعضها ishيعني ممكن تحتوي على الرقم و
لا لأ فكل الكلام اللي حكيناه بيجي ضمن التعريف تبع
الرقم في الـD هذا النقطة الأولى النقطة الثانية
اللي هي أنه أنا ممكن يكون في عندي مثلا الـ scope الـ
variables هذه اللي بينعملها الـ declaration الآن
هتكون لـ scope محدد مدناش يختلط مع الـ scope
تبع الـ declarations الأخرى في scope تانييعني أنا
ممكن أعرف X في هذا الـ current scope و يمكن في عندي
X ثاني في another scope هذا الـ scope تبع function
و في عندي scope ثاني لـ global أو scope ثاني لـ
function أخرى صح ف أنا ممكن أتخيل أن كل scope له الـ
data section تبعه الـ data section Stack و أنا الـ
variables اللي بتم تعريفهم يجوا يجوا يجوا يجوا
يجوا يجوا يجوا يجوا يجوا يجوا يجوا يجوا يجوا يجوا
يجوا يجوا يجوا يجوا يجوا يج
مؤشر بداخل الـ stack هنا ليس بداخل الـ global data
area تبع البرنامج كله على أساس ماذا قلنا؟ على أساس
نقول لك كل scope فيه Data Area منفصلة الـ data area
منفصلة من الـ data area منفصلة من الـ data area
منفصلة من الـ data area منفصلة من الـ data
area منفصلة من الـ data area منفصلة من الـ data area
منفصلة من الـ data area منفصلة من الـ data area
منفصلةهذه المقاطع الأولى هي أن الـ record تعريفه لا
يضيف أي شيء جديد على الكلام الأولى اللي حكيناه
بالنسبة للـ type و بالنسبة للـ width و بالنسبة للـ
offset الـ offset ممكن يتأثر ماذا كان احنا .. يعني
تتغير حسبتك ماذا كان نحن نحسب لكل البرنامج و لا
نحسب له scope محدد okay
section 64
expressions من حيث أنه لو أنا عندي expression الـ
expression هذا الـ code الإجمالي تبعه بدي تكون من
الـ code تبع الـ sub expressions الفرعية يعني احنا
الآن نكون عندي grammar و الـ grammar هي بتقول لي أن
هو الـ expression أحد صيغته أنه يكون عبارة عن two
expressions مجموعين مع بعض أي واحد و اثنين أو يكون
مثلا two expressions مطروحين لبعض بالنقص في هذا
الحالة الـ translation تبع الـ E الإجمالية هي عبارة
عن الـ translation تبع الـ E للsubstitution الأولاني
و وراها طول الـ translation تبع الـ expression
الثاني، مظبوط؟ خلتوا هنا أعمل الـ E dot code بساوي
E واحد dot code و لاحقا هطول وراها إيش؟يعني مثلا
هذا هيك أنا
برجع للجوا عشان أجيب الـ example اللي فيه الـ
expression اللي هو هذا هذا expression هي
الترجمة تبعته صح ولا لا بقدر أتخيل أن هذه هي الـ
dot code هذا هذا كله هو الـ dot code attribute تبعت
الـ expression أنا عندي كل هذا على بضع عبارة عن إيش
statement الـ statement هذه ماخدة الـ form
identifier و جاي ورايا يساوي و جاي ورايا إيش
expression هذا الـ expression الـ dot code attribute
تبعته هيك صح هذا افترض أنه أنا عندي expression هذا
هيك
two expressions مجموعين في البعض صح ولا لأ مش
نفترض هو هذا الواقع فهذا عمليا هو عبارة عن وين
الجزء من هذا الـ code اللي هو ترجمة النص الأولاني
لعند وين لعند هنا ت واحد اثنين كيف ت واحد اثنين ت
واحد اثنين وين النص الثاني ت ثلاثة و تربعة وهذا مش
معناه؟ لأ هذا ما بيش معناه بالكثير تمام طيب الترجمة
الإجمالية خلّي بالك لأ احنا الـ expression بيقف عن
هنا هذا راجع للـ assignment هذا تابع للـ assignment
صح أو لا؟ حدود الترجمة تبع الـ expression واقفة عن
هنا هذه اتبالة علشان الـ assignment يعني الآن الـ
dot code تبع الـ expression كله هي عبارة عن الـ dot
code هيّت و احنا عندنا إيش بيقول هاي E واحد ها هادي
الـ dot code لـ E واحد لـ E واحد حلو؟ و هادي الـ E
اثنين الـ E اثنين الـ E اثنين الـ E اثنين الـ E اثنين
الـ E اثنين الـ E اثنين الـ E اثنين الـ E اثنين الـ E
اثنين الـ E اثنين الـ E اثنين الـ E اثنين الـ E اثنين
الـ E اثنين الـ E اثنين الـ E اثنين الـ E اثنين الـ E
اثنين الـ E اثنين الـ E اثنين الـ E اثنين الـ E اثنين
الـ E اثنين الـ E اثنين الـ E اثنين الـ E اثنين الـ E
اثنين الـ E اثنين الـ E اثنين أو الـ instruction هذه
الأخيرة فهذه الـ statement أو الـ instruction
الأخيرة T5 هي عبارة عن instruction موظفتها إنها
تجمع محصلة القيمة T2 هي أجمع القيمة اللي حصل تحصيل
الـ expression الأولاني T2 هي يعني قيمة B مضروبة في
نفس القيمة C كله في الأخصة في T2 ومثل اللي هي T4
مجموحةهدول الـ two هد ادرس ولا مش ادرس هدى مش ادرس
هدول مش names و الـ names احنا بنقول عنهم هم تسمية
لـ address فنسميهم addresses فهد بنسمي الـ E اثنين dot
address وهد بنسمي E واحد dot address وهد بطبع
طبعا E هو E dot address E dot address يعني إيه؟
الـ address اللي بده الصوب في القيمة النهائية تبعت
الـ expression كلها حلو؟ فأصبح من هذا المنطلق أنه
أنا عشان لما يكون في عندي expression جالي مركب بين
two expressions مجموعين مع بعض فالـ E dot code تبع
هذا الـ expression بساوي E واحد dot code ملحوم
مورمو على طول الـ E2 dot code ولكن لازم برضه ألحق
وراها على طول Instruction إضافية بتقول الـ E dot
address بيساوي E1 dot address زائد بعدين ملحوم
معاها علامة الزائد ملحوم وراها الـ E2 dot address
هذا هو اللي حاصل عندنا هنا في الآخر
وينها slide هيتها امسح ال .. هيتها مش محتاج امسح
الـ E dot code وراها الـ E واحد dot code وراها الـ E
اثنين dot code وراها الـ generate هذي إشارة عن
function وضفتها تاخد الأنصر هذه لو تكون منهم
instruction إحدى مثل ذلك بدك تفكر لأن لو هنا ناقص
E1 مجرد إنه احنا بدنا الـ E1 الـ dot code هو هو
ما فيش اللي بنضيفه على حد ولا بناخد منه شيء بس بعد
كلام نعمل instruction في الآخر اللي هو E dot
address بساوي ونحط كلمة minus وساوي الإدريس E1 من
هنا نجرب الإشارة هنا في الحالة أن E1 بين قوسين لا
ولا شيء الـ E بياخد الـ E dot address تاخد الـ
address E1 و الـ dot code هو هو لأن لو الـ
expression هو مجرد identifier ما في ترجمة و الـ
address E هو نفس الـ identifier الـ E Dot Address
يساوي اللاكسيب الـ Identifier يساوي يعني بيكون
مثلا عملنا T مثلا 11 و T1 يساوي 11 و T1 يساوي 11 و
T1 يساوي 11 و T1 يساوي 11 و T1 يساوي 11 و
T1 يساوي 11 و T1 يساوي 11 و T1 يساوي 11 و T1 يساوي
11 و T1 يساوي 11 و T1 يساوي 11 و T1 يساوي 11
و T1 يساوي 11 و T1 يساوي 11 و T1 يساوي 11
و Syntax Directed Definition يحتوي على semantic
rules و أضيف الـ semantic rules هذه ترجمة ترجمة
بمعنى تشكيل أو بناء أو إنتاج اللي هو الـ three
address code instructions تبعت إيش تبعت expression
بنركب على هذا الكلام الـ generation تبع statement
و بنركب منه الـ generation تبع اللي هو بجيئة الـ ..
الـ .. الـ .. الـ constructs الأخرى اللي في البرنامج
okay وبعد ذلك أصبح واضح أن الـ Translation هي عملية
تراكمية بتنبنى من الـ Sub-translations تبع كل
واحدة من العناصر المتعاملة بالنسبة لي الـ Example
هذا يطلب منك كيف أن تأخد هذا الـ statement الصغير
و تطلع منها الـ three address code التلاتة دول الـ
three other code instructions المحاضرة الجاية
بنحكي إن شاء الله في الـ incremental translation و
بنكمل section ستة أربعة إن شاء الله يعطيكم العافية