خلونا اليوم ان شاء الله نبدأ ال chapter الأول
المقدمة اليوم ان شاء الله بنحاول ندخل بتفاصيل أكثر
على مساق ال compiler وتحديداال compiler نفسه، إيش
ال phases بتكون منها، إيش طبيعة كل خطوة من الخطوات
الموجودة، أنا إيش هستفيد من كل خطوة و أنا بحتم
كتير في الموضوع أنا إيش هستفيد من كل خطوة لأنه أنا
قلت قبل هيك، مادة ال compiler مش بس مجرد حوّل منها
إلى له لأ قلنا فيها techniques فيها methods أنا
ممكن أستفيد منها لنفسيفي ال career تبعي في البرمجة
تبعتي لما أخلص و هحاول دائما كل ما يكون فيه إشي
جديد ممكن تستفيد منه برا ال compiler أنوحله و
أخليكي تشعر بهذا الكلام أنه واقع و حقيقي عشان ذلك
أنا بقول مادة ال compiler هي مادة مفيدة للجميع
لغاية النظر اللي احنا ماخدينها ك application من
high إلى low طيب الآن أنا بس بدي أبدأ أسأل سؤال
الآن في عندنا حاجة اسمها compilerوفينا حاجة اسمها
interpreter سمعتوا فيهم إيش ال compiler أو إيش ال
interpreter أو إيش الفرق بين الإتنين؟ أه إيش
رأيكم؟ واحد إيش؟ فصلوا
أكتر، مين عارف تفسر أكتر؟ إيش الفرق بين ال
interpreter و ال compiler؟مش مشكلة اه انه ال
compiler بيعطيني source .. بيكون عنده source
program بيطلعلي اللي هو ال output program ال setup
program ال interpreter بييجي بيعطي هذا ال program
ال output عندي بيعطي input و بيطلعلي output انه
برنامج .. البرنامج تابع يصير يشتغلطيب الكلام يعني
قريب كتير لكن احنا خلّينا نوضّح إيش ال compiler
بالظبط، إيش قالية عمله، إيش ال interpreter بالظبط،
إيش قالية عمله، إيش ال advantages تبعت هذا و تبعت
هذا طبعا زي ما قلنا المرة اللي فاتت ال compiler
باختصار هو عملية ترجمة لل language من source
programالى language أخرى اللى هى فى حالتنا ال
target اللى هو ال machine code هى باختصار يعنى
بروح بس إعادة كتابة code من صورة ألف إلى صورة باق
هى ال compiler يعنى هيحوللى من ال high level
language لإيش للمachine أو للهو language طيب بعد
ما يحول هذا ال target اللى طلع هو اللى هينعمله
execution هو اللى هيصير يقرأ ال inputsوبناء عليها
يطلع ال output يعني عملية أنه يقرأ ال inputs متى
بتصير في الآخر خالص يعني هو مجرد إعادة كتابة ل
code كان مكتوب ب language معينة عادت كتابتها ب
language تانية ثم بدأ يقرأ ال inputs عشان يطلع ال
outputs وطبعا في الغالب يكون هذا ال target code
سريع جدا ليش؟ لأن هذا لغة ال machine في النهاية
بصير على طول بشوف ال inputs على طول ايش بعمل ال
process بتطلع عندى على طول ال outputs طيب السؤال
شو هو ال interpreter لأ ال interpreter بيختلف شوية
ال interpreter مش انه بروح بترجم ال interpreter
ممكن نوصفه بهذا الشكل ال interpreter بيقوم بقراقة
ال source و في نفس الوقتبقرأ ال inputs و بيعمل ال
process المطلوبة و بيحاول يطلع ال outputs يعني مش
زي أول احنا روحنا ترجمنا و بعد ما ترجمنا هذا ال
code اللي طلع هو اللي قرأ ال inputs و عم يطلع ال
outputs لأ من البداية ال source موجود ال inputs
موجودة بيحاول ال interpreter يفهم ايش المطلوب و
بيروح بيطلع ال outputs طبعا عشان يقدر يفهم ايش
المطلوب و ايش اللي بيصيربشتغل sequential بشتغل
statement by statement يعني بروحش مرة واحدة يقرا
كل ال code زي ما بيعمل ال compiler بترجمه كله بعد
ما يترجمه سريع من ال execution لأ من الأول بمسك ال
statement الأولى بشوف إيش ال inputs اللي فيها بشوف
إيش المطلوب منها و بحاول بالمقابل يطلع ال output
mapping لل output عشان هي أنت بتلاحظي أن ممكن
interpreter في التنفيذ يكون أبطأ من ال target اللي
طلع من ال compilerليش؟ لأنه جاعة بتطلع على أكتر من
شغلة في نفس الوجه إيش ال source، إيش المغزة، إيش
المطلوب، إيش ال input، إيش بدري يطلع ال output
شغلة تانية إيجابية موجودة في ال interpreter لإنه
جاعة بيشتغل step by step خليني أقول statement by
statement لإنه ممكن يكون أكثر دقة في كشف الأخطاء
صح بيكون عندي أخطاء؟الكمبيلر بيكشف أخطاء و ال
interpreter بيكشف أخطاء لكن بتلاحظ أن ال
interpreter أكثر دقة ليه؟ لأنه قاعد بمسك ال
statement بيشتغل عليها بيشوف أيش فيها صح أيش فيها
غلط بعد ما يخلص بيروح بال statement اللي وراها و
هكذا عشانك أحنا بيقدر نقول ك summary أن ال
interpreter صح أبطأ شوية من ال target اللي بيطلع
من ال compiler لكنه أدق في كشف الأخطاء لأنه قاعد
بيشتغل معايا statement by statementلما أجى أتكلم
أنا على ال compiler ال compiler في المقابل ال
target اللي بيطلع منه سريع جدا أسرع بكتير في
التنفيذ في ال execution من ال interpreter لكن
للأسف دقته في كشف الأخطاء مش بنفس دقة ال
interpreter بعدين حتى أنت بتلاحظي أيام ما كنتي
تكتبي بال Java أو غيره لما كنتي تنسي مثلا فاصلة
منقوطة بتلاقي بيروح بيطلعليك كم بيه من الأخطاء
مرات مع أن انت بتستغربي لما تحط الفاصلة منقوطة في
كل الأخطاء هذي بتكون راحتفبتلاقوش دائما دقيق في
تطليع الأخطاء الموجودة لأن في عندنا إشكالية في ال
compiler أنه أو مش إشكالية challenge أنه مش عند
أول خطأ انت كاتباه في ال code يوقف البرنامج و يوقف
ال compilation و يطلع بصيرش زي هيك بتلاقي بيكمل
بسجل ايش الغلط اللي صار و بيحاول ايش يكمل و يكمل و
يكمل لكل ال code بيحاول يطلل ال expectation
للأخطاء اللي انت وقعت فيها بتلاقي في الغالب منها
كتير صح بتلاقي مرات كتير غلط مش بالدقة اللي هو
ذكرها فبتضل هذه الشغلة نسبية على حسب ال code اللي
انت كتبه فهي باختصار الفرق بين ال compiler و ال
interpreter طبعا زي ما تشايفين عبر عن ال compiler
قال طبعا هذه الرسمة مش هيك هي ال compiler من هنا
من هنا نبدأ شايفها قال لك ال compiler بيشتغل على
ال source بيروح بترجمه ل target و زي ما انت شايفها
ماعملش execution ولا عمل process لل inputs ولا اي
حاجة هو بس مجرد translator راح مسك code مكتوب
بhigh level مثلا وراح ترجمه على طول ل code مكتوب
بال machine code او ال assembly codeالأن هذا ال
target program في خطوة تانية هو اللي بيصير إيش ال
executable file اللي هو هيصير يقرأ ال input و
بسرعة يقدر إيش يعمل ال process و يطلع ال output،
هي ال compiler إذا طلعتها رسمًا لتحت تحت ال
interpreter شايفها اختلاف بسيط إنه لأ من البداية
ال inputs موجودات ال source موجود statement by
statement بيحاول يقرأ الموجود و يفهم و يروح يطلع
ال outputs على طولهذه باختصار الفرق بين الاتنين
هدول طيب في أحيانا بعض الأنظمة أو ال systems اللي
ممكن تستخدم الأتنين معانا زي الجابا تستخدم ال
compiler و تستخدم ال interpreter طيب شوف مثلا
الجابا إيش تسوي تعالوا نطلع كده الجابا لما بتجرى
ال source programبتروح بتترجمه في الأول لحاجة
بيسموها byte code اللي هو ال intermediate
representation code حاجة بيسموها byte code أيش قصة
ال intermediate و ليش سبب وجود ال intermediate
هناخده اليوم بس لاحقا كمان شوية لما اتكلم عن ال
structure تبع ال compiler المهم هو لغة وسيطة خليني
أقول simple شوية قريبة على لغة ال machine وقريبة
برضه على لغة ال high يعني حلقة وصل في المصدرالمهم
زي ما تشايفين انه في ال Java بيستخدم في الأول زي
compiler زي translator بروح بس بعيد كتابة ال
source على شكل ايش byte codes بعد ما بكتب ال byte
codes بيجي موضوع ال interpreter او ال virtual
machine اللي هي بتشوف ال byte codes و بتشوف ال
inputs و بتعمل ال process و بتطلع جوا مندي ال
output عشان ايه كدا طبعا هو ليش طلع ال byte code
لأن زي ما انتوا عارفين ال Java ممكن يعملها run على
أكتر من ال machineليش؟ لأنه هو من الأساس ما راحش
ال compiler يطلع ال machine language بتاعة ال
machine هو لو عرفه لو طلع ال machine language
مباشرة صار مبطبط بنوع ال machine اللي هو بيشتغل
عليها فبيصير ال compiler ال macintosh غير ال intel
غير غير غير .. بس هو مش هيك اشتغلهو راح ال
compiler إيش سوى؟ راح طلع حاجة وسيطة سموها ال
bytecode هذا ال bytecode مفهوم لل machines
المختلفة و بعدين بيصير من خلال interpreter عادي
يقرأ ال bytecode و يقرأ ال input و يروح يفهم أيش
ال output اللي بدي اطلعطبعا في المقابل لما ال
compiler تبع الجهاز هيشتغل بهذه الطريقة أنه عمل
compilation translation بعدين عمل عملية
interpretation بيكون الموضوع أبطأ من compiler ال
C++ مثلا ليش؟ لأن compiler ال C ماعندوش هذا الكلام
على طول بدخل ال source بتطلع إيش في الآخر ال
target compilation مرة واحدةفعشان هيك في ال Java
بيستدركوا و بعض الأنظمة في ال Java بتعمل حاجة
بيسموها just-in-time compiler برضه في ال Java just
-in-time compiler أيش بقصد فيها؟ بقصد فيها ال
compiler العادي بيقول أنا مافيش داعي لما أطلع ال
bytecode أعمل interpreter مافيش داعي أعمل process
لل input طب ها إيش أعمل؟ عشان أكون أسرعجال على طول
خلاص حتى ال byte code بحولها لمين؟ للمachine و
بعدين بعمل على طول ايش؟ عملية ال input زي ال
compiler العادى ليش طب هو عمل هذا الكلام؟ عشان
يكسب السرعة عشان يكسب السرعة فزي ما تشايفين هنا هي
ممكن نقراها هنا
طبعا زي ما قال ال java language processors combine
compilation and interpretation as shown in figure
1 4 بس أنا بهمني يمكن السطر هذا اللي هان حاول
أكبره عشان تشوفوه شوية شايفين
إيش بقول راجزوا هنا in order to achieve faster
processing of inputs to outputs عشان يعمل اشي أسرع
من اللي كان موجود انه compilation بعدين
interpretation اش سوى get some java compilers
مالها called just-in-time كاسم just-in-time
compiler للجابا اش بيعمل ماله راجزي translate the
byte codesinto machine language immediately before
they run the intermediate program to process the
input يعني في الحالة الأولى اللي جابلي شوية قبل ما
يعمل ال just-in-time إيش كان بيسويه في ال byte
code كان بياخد ال byte code مع ال input
interpreter عشان يعرف ال output الآن إيش التغيير
اللي صار في ال just-in-time قالك هذا ال byte code
قبل ما يعمل process لل input بتحولللمachine و
بعدين يتحول للمachine خلاص زي و زي compiler C++ أو
غيره بيعمل ال process بيشوف ال inputs و بيعمل ال
process و بيطلع ال outputs طب ليش هو عامل زيك؟ بس
المغذة .. المغذة من هذا الكلام أنه يزيد السرعة لإن
هو عارف لما بيعمل هيك على مرحلتين بده ياخد منه وقت
و احنا قبل شوية قلنا انه حتى ال interpreter بياخد
وقت أكترمن ال target فهذه كانت أحد الوسائل عشان لو
هو بده يسرق موضوع ال compilation ل code الجابر طيب
احنا الآن برضه جابر برضه ما أدخل على تفاصيل ال
compiler لأن كل محاضرتنا بعد شوية هركز على ال
phase الساعة ال compiler بس بدي أخلص المقدمة هاي
نطلع تانيعال compiler من فوق شوية شوف وين ال
compiler موجود لما انا بكون عندي برنامج طبعا بيصير
على البرنامج معالجة مظبوطا لأ من الالف الالية بدنا
نشوف وين ترتيب ال compiler موجود او ايش انواع
المعالجة اللي بتتم طبعا زي ما انتوا شايفين اول ما
بدأ عندي ال source program كتبني حاجة اسمها
preprocessor اه ايش رأيكوا ايش بيعمل ال
preprocessor او لشو ال preprocessor هذا
ايش بيعمل؟ لشو
بيعمل؟ preprocessor لأ او قريب مش .. مش .. مش دقيق
اه ايش ال preprocessor بيسوي المشكلة
دي ربالكوا رابعة و خمسة ماخدين برمجة سنة تانية و
مش عارفين ايش ال preprocessor او ايش بيعمل ال
preprocessor في ال codeماشاء الله عليكم كنت برمجه
بيعدل على ال code بيهيأه او .. بيهيأه كيف بيهيأه؟
يعني بيعمله modify عشان يقدر بعد كده يدفع كيف
يعمله modify؟ ايش اللي بري بروسفر؟ اه مشاء الله
عليكم شطريتك لسه
هو ماحكاش على ال compiler هو ماوصلش ال compiler
شوفوا الآن انا طيب بدي اذكركم شغلة معينة انتوا
الآن لما تكتبوا اي codeمش قبل ما تبدو تكتبوا ال
main بتستعينوا ب libraries فوق Iostream.h ومش عارف
أيش و بصر أيش و include ومش بتحطوا هذه الشغلات؟
ليش كنتوا تحطوا هذه الشغلات؟
إيش يعني اتعرف على ال foundation؟ يعني فيها أكيد
functions, methods بتلزمني كمان شوية فلازم أحط ال
library فوق اللي بدي أخد منها عشان أستفيد منها
يعني ممكن أنا في ال code تبعي أستخدم ال function
في ال math لازم أكون حاطط مثلا فوق ال math.h عشان
أقدر أخد ال function هذه منها وإلا كيف بدي أخد ال
function؟فعشان كنت مابتعمل اي code اي برنامج دايما
بتحط فوق قبل ما تبدأ ال libraries اللي انت
هتحتاجيها او هتاخدي منها بعض الأشياء صح ولا لا؟
الان شغل ال preprocessor ايش بيسوي لازم في النهاية
ال code يكون كامل اللي بده يروح لل compilation
باللي استخدمتيه فلازم يروح يجيب كل المقاطع هذه تحت
الأكواد اللي موجودة في ال libraries المختلفة عشان
يجمعها في code واحد فهذه مهمة ال preprocessorاللي
مرات بالـ C++ مكتوبه زي sharp include يعني معناه
أن هذا ال library أنا بدي منها شغلات فبيجي هذا ال
processor كل الشغلات اللي انت بدك تستخدميها بيروح
بيسحب منها نسخة مش نسخة بياخدها و بيحطها في ال
code تبعه يعني هل يُعقل أن أنا مثلا أجي في ال code
تبعي أستخدم function من ال mathو أروح أكتب فوق
Math.h وفي لحظة أنه تجميع ال code مايجيبليش إياها
هل يعقل أن ال code يتنفذ بدونها؟ أكيد لازم أي شيء
أخدته هو قطعة من ال code اللي أنا عاملهوبالتالي
لما بتتكلم عن برنامجي بشكل كامل متكامل لازم كل هذه
القطع اللي أخدتها من هنا و من هنا و من هنا تكون
مجمعة في code واحد و إلا كيف يبقى برنامجك يشتغل في
النهاية؟ و الله برنامجك بيروح ال machine يطبق بس
ال code اللي انت كتبتيه و يهمل ال functions اللي
انت جبتيها؟ طبعا مستحيل انت أخدت function هي صح حد
كاتبها في مكان ما لكن لازم تتاخد و تنحط في code و
تنعمل execution عشان تنفذ المهمة اللي من وراها
عشانك ال preprocessor هذا وظيفته يجمع كل المقاطع
كل الأشياء كل ال functions كل ال methods اللي انت
استخدمتيها على أساس ان ال code يبدو في النهاية
code واحد بعد ما بيصير عندك code واحد بيجي موضوع
ال compilation أو موضوع ال compileالموضوع ال
compiler مش بسوي زي ما قلنا بده يروح يحولها من ال
high level language لل low level language وقلنا
بالنسبة إيه احنا ال compiler هذا كنز كبير ليش؟
لأنه بدونه ماكانش فيه إمكانية أنه نحصل على high
level language ماكانش فيه إمكانية أني أبرمج
بأريحية دايما بحب أذكرك كنت كيف تبرمجي بال
assemblyاتخيل انا كنت كاتبلك بالجابة loop four
four while array وقلتك يالا اتفضل اعملي ليها بال
.. بال assembly هتتعب كتير و انت تعمل في ال loop و
في ال four و في ال array و مش عارف مين صار لأ
بتحسيها معقدة جدا بسبب وجود ال compiler صارت
الأمور أسهل صرت انا اعمل loop اعمل اللي بديه في ال
high level language و بعدين ال compiler هو لحاله
اللي بمسك الاشي و بروح بعيد كتابته بال assembly او
بال low level machineأو مش ال language عشان هيك
احنا بنعتبر ان ال compiler هدا ايش اجا الكنز عشان
ايش يريحني في عملية البرمجة بعدين يمكن الاشي
الغريب انه كل ما بتتطور البرمجة كل ما بتتحسن هي
بتتحسن ليش؟ علشان تسهل عليا البرمجة اكتر لكن للأسف
الطلاب بيشوفوا انه اتعقدت اكتريعني أنا متأكد معظم
اللي قاعدين بيقولك اوف برمجة اتنين كتير معقدة و
صعبة inheritance و polymorphism و abstraction و مش
عارف مين و overloading و أبصر ايه صح ولا .. مع أنه
هذا انحط ليش انحط مش عشان يعقد الأمور هذا انحط
علشان يسهل عليكي عمليات البرمجة يخليها more
flexible يخليها أسهل بكثيروبالتالي لو ما كان عندى
compiler بيقدر هذه ال features يتعامل معها ويروح
يحولليها ل machine language كان انا ما استفدت من
كل هذه ال advantages الموجودة كان ما استفدت من كل
هذه الأرياحية الموجودة اذا موضوع وجود ال compiler
سهل علي كتير لغات البرمج أن انا اتعامل معاهم لأنه
صار كل التعقيدات ان كيف هذا ال high level ينعد
كتاب تقوله مش انا كمبرمجكمبيوتر أو برنامج بقرا
برنامج و بطلعه لبرنامج تاني أنا بس مطلوب مني الآن
كمبرمج أستخدم ال features هذه بشكل كويس و أبرمج
بشكل كويس و أعمل كل اللي بدي أعمل برمجة اللي أنا
بدي إياها فدائما اتذكروا هذا الكلام يعني وجود ال
compiler شيء مهم و عمل نقلة في عمليات البرمجة و في
لغات البرمجة و دائما هنلاقي في علاقة واطيدة بين ال
compiler .. هنحكي عنه لاحقا في المحاضرات القادمة
علاقة بين ال compilerوبين لغات البرمجة وبين ال
hardware وتأثيرات على بعض أي تطور لازم ينقص hand و
hand كيف؟ بعدين هناخد أمثل علي ان شاء الله المهم
حتى الآن بنحب نوضح أهمية وجود هذا ال compilerو
برجع كمان بذكر كمان مرة ما ينحصر تفكيرك ان ال
compiler بس من high ل low مش هيك احنا مثال ماخدينه
خلال المساخ من high to low انت ممكن ت compile من
أي صورة ألف إلى أي صورة با هذا خلاص compiler هذا
بده عيد كتابة هذا بده ترجمة خلاص هذا compiler لكن
احنا من باب التثيل و من باب ان انت اخدت قبلك برمجة
و كنت تعمل compilation بنحاول ناخد و نعكس ال
techniques هذه على من high level لlow level أو ل
machine language تمام طيب بقى لما احنا ال compiler
بيطلعلي ال machine أو بيطلعلي ال assembly بيجي
عندي شو ال assembler ال assembler معروف حول ال
assembly للغة ال machine الأصفر الوحيد طبعا أحيانا
كتير في كتب بتدمج ال assembler هذا خلاص جوا ال
compiler مرة واحدة لأنه شغله في غاية السهولة
مقارنة بشغل اللي بيكون فيه ال compiler ولا أي شي
عملية mappingإيش هذه مقابلها بال binary إيش ال
register مقابله بال binary فعملية ال assembler في
غاية السهولة لا شيء بالنسبة لشغل ال compiler فعشان
أيه كمارات إيش خلاص بينعمل ضمن مهام ال compiler و
ال compiler بروح بطلّيلها على طول ال machine
طلّعلي assembly ما خلاص مش مشكلة ال assembler سهل
بروح بيحوليها ل ال machine طيب الآن بعد ما عملنا
تحويل لل source الكبير هذا program من high level
languageل machine language شو قصة linker و loader
لشو ال linker و لشو ال loader بيجزق ال code ..
بيجزق ال code .. بيجزق ال code .. بيجزق ال code ..
بيجزق ال code .. بيجزق ال code .. بيجزق العشان
نتحمل .. طيب لحتى الآن في ناس بيقولوا بيجزء و في
ناس بيقولوا بيجمع .. بيجمع على كل حوار أنا
حاكيتلكوا يا هدا في ال .. في العمارة بتذكر بس
الذاكرة عندكوا شوية بدها شد ولا كده؟ طيب على كل
حوار خلينا بس قبل أن نقول إيش ال linker و الloader
أنا بدي أسأل سؤال، الآنلو كودي كان كله كتلة واحدة
خلاص كله اللي اتجمع من هنا و من هنا و من هنا لو
كان .. لو فرضنا انه كان كتلة واحدة و عملتله
compilation و بعد ما عملتله compilation اجيت اعمل
التعديل طفيف في .. في .. في ال code اللي انا عملته
هذا قبل شوية و بدى نعمله compilation مرة تانية
للأسف الشديد اذا كان واحدة واحدة هينعاد ال
compilation لكل البرنامج من جديد حتى لو أنا لعبت
في block صغيرليش؟ لأن انت في النهاية ماسكاش شك في
واحدة كتلة واحدة فهذه مشكلة أن يكون كله كتلة واحدة
ليش؟ لأن كل تعديل بدأ ترجع كل process من جديد صح
ولا لأ؟ عشان هيك العملية ماتكون ككتلة واحدة في
الآخر بيكون ال code هو عبارة عن blocks مقطع هذا
جزئية مستقلة بذاتها ماعمله compilation هذا مستقل
ماعمله compilation هذا مستقل ماعمله compilation
لكن بالتأكيد لازم يكون في linker يربطهم مع بعضكيف
يربيطهم مع بعض؟ يعني ييجي يقول مثلا بعد الجزء هذا
المفروض ييجي الجزء هذا بعد الجزء هذا المفروض ييجي
الجزء هذا بعد الجزء هذا ييجي الجزء هذا وكذا يعني
مش بالضرورة زي ما انت متخيل أنه يكون مكتوب كله تحت
بعضهلأ ممكن يكون هو عبارة عن أجزاء مكتوبة في أماكن
متفرقة لكن لازم يكون في حد يعرفني مين بعد ال part
أول وين part two طب بعد part two وين part three
اللي هي ال object files هذه وين وين وين وين وين
ليش؟ علشان يكون وكأنه كتلة واحدة فبصير انت بتعدلي
في block بصير بس عيد ال compilation ل block جبت
block جاهز خلاص هذا جاهز ماحدش بلعب فيهفي هذه
الفكرة .. في هذه الطريقة efficient كتير ليش؟ لأن
بوفر عليا الوقت بوفر عليا الجهد ومش كل شوية بدي
أقعد أعمل compilation تاني لكل ال code بس في
المقابل لازم ال linker يكون موجود عشان نعرف تسلسل
ال code تسلسل أجزاء ال code مين ورا مين كيف ورا
مين إلى آخرين فبكون هذه مهمة ال linker طبعا بعد ال
linker بيجي عمليةالـ loader إيش ال loader؟ هي
عملية تحميل لهذا البرنامج لمرحلة التنفيذ لازم
يحمله في ال memory في الجزء المخصص للتنفيذ إذا
تتذكروا أيام العمارة قلنا لو أنا عندي معلومة من 32
بت أصفر وحيد كيف بدنا نعرف إن هذه المعلومة هي data
ولا instruction؟ كيف بدنا نعرف؟
هذه كيف نعرف نوع ال instruction اللي هي أول خمس
بالتالت لأ احنا بنقول كيف نعرف من الأساس الحين
المعلومة كيف تتخزن مش تتخزن بالتالت أصفر وحيد
المعلومة ال data و ال instruction كيف تتخزن مش
برضه اتنين و تلاتين بيت من الأصفر وحيد الآن أنا
لجيت هذه موجودة في موقع ال 32 بيت طب شو يعرفني هل
هي هذه data ولا هل هي هذه instruction كيف نعرفها
حسب وين موجودة هل هي موجودة في قسم ال instructions
اللي هو بيأشر عليهم ال pc اللي هو بيتحرك بشكل
automatic ولا هو موجود في جزء ال data صح ولا لأ؟
إذا معناته الكلام أنه في جزء مخصص لل executionعشان
يجيبش ال loader يحمل ال code في الأماكن بتاعة
التنفيذ بتاعة ال instructions إن هنا instructions
بتتنفذ هذا ورا هذا ورا هذا فهذا ال loader لازم
يحمل في الأماكن الصحيح افرض و روحت أنا ال code كان
مكتوب في جزء data أيش دي عرفنا ان ال instruction و
ال execution بتتنفيذ فلازم يعملي التحميل وين يتحمل
علشان ال pc يجف عليه و يبدأيش ياخدهم instruction
after instruction وينفذهمطبعا على كل أحوال احنا
هذا بشكل عام نتكلم لكن احنا focused هنكون ونركز
على موضوع ال compiler فقط الآن اللي هنسويه خلال
الوقت اللي قادم بدنا نمسك هذا ال compiler ونشوف شو
التفاصيل المملة اللي جوا طبعا خدوا ال gigabyte
أه كنت بتسأل اتفضل لا
لا
هذا مختلف كليا ليش اقولك ليش الآن طالما ان اناغيرت
صورة ال code من الف إلى با اعادت كتابته لسه
ماعملتش process ماعملتش execution ماعملتش اي حاجة
طالما غيرت شكله من شكل إلى شكل اعادت كتابته من
صورة إلى صورة هذا compiler خلصنا انتهى هاي ال
compilerفيش execution عشانك إنت لما بتشتغل في
الجابة إيش بتسوي في الجابة؟ بتعملي في الأول
compile بعد ما يخلص ال compile إذا فيش أخطاء
بيقولك هذا جاهز لل execution بتعمل execution إيش
عن execution؟ يعني إيه؟ لل inputs و عن ال process
و طالع ال output فهذا بيكون سريع جدا ال
interpreter ماعندوش هذا المبدأ إنه ترجم و ماتترجمش
على طول بطخوا فيها ال code امسكها ال statementإيش
بقصد فيها؟ إيش ال input اللي فيها؟ إيش ال output
اللي فيها؟ زي مين؟ زي ال script languages ال
script languages زيك أنت بتروح تكتب ال comments
تبعتك بتلاقيه على طول إيش طلع ال file حتى لو في
غلط بتلاقيه إيش بسابقة فاضية لإنه قاعد بيقرا
statement statement و بيحاول يطلع ال input و يفهم
إيش ال output اللي عاجبالها لإنه ال structure واضح
بس مين اللي بيحول؟بحولش، بعيد كتابة، code مكتوب،
كتب code تاني equivalent له، نفس المعنى، نفس
المفهوم، لكن بلغة تانية، زي ما أنت كنت تكتبي، لو
ما كنت أقولك في ال assembly أكتبي ال code الجابة
هذا بال assembly، مش كنت تكتبي و ترجمي و تكتبي بال
assembly، هاي ال computer بيسوي، بكتبه من جديد، بس
غلط تكتبي غلط، غلط تكتبي حاجة مختلفة عن ال code
الأساسيففي challenge أنه لازم يكتب code equivalent
شبهه نفس المعنى نفس ال meaning و efficient تمام؟
خلصت
break؟ خلصت تمام؟ سنظل نديكوا break كل شوية عشان
إيش تقدروا تستوقعوا اللي جاي تجلجوش ال breakات
كتير ان شاء اللهأه بس استوعبوا هذا هي بس استوعبوا
صحيح؟ بس استوعبوا طيب و بعدين أديت break لأهمية
الكلام اللي هحكيه الآن الصحي يعني كل شغلنا في
المصاد summarize في الكلام اللي هحكيه الآن طيب
خلونا نبدأ الآن section 1-2 اللي هو ال structure
تبع ال compilerمن إيش بتكون هذا ال box تبع ال
compiler عشان نستوعب الموضوع بشكل simple الحين هو
ال compiler إيش في النهاية؟ عبارة عن برنامج مؤقت
بيقوم بقراءة برنامج و إعادة كتابته ببرنامج آخر،
هاي باختصار القصة كلها ال compiler كمان مرة برنامج
software بيقرأ برنامج مكتوب ب language معينةو بعيد
كتابته بصورة تانية او ب language تانية ضمن شروط
انه لازم ال code اللي نعاد كتابته يكون efficient
يكون ال performance تبعه عالي يعني انا اديكي مثال
لما كنا نقولك اكتبي من ال high level بتاع الجابا
اكتبي assembly هي كانت تطلع code assembly و التاني
كان تطلع code تاني بس يمكن code التاني افضللأن
هستخدمت رجسترات أقل يمكن code التالتة أفضل لأنه ما
استخدمتش loops كتيرة مااخدتش وقت كتيرة فالمشكلة
أنه في أكتر من codeفي إعادة الكتابة لازم ال
compiler يحاول يكتب أحسن code و أفضل code يعني
ييجي human بعدين مايكتبش أحسن منه فهذه challenge
كبيرة أنه مش بس أني أكتب code و خلاص أنه يدوب بس
الحاجة أعيد كتابه لأ بدك تكتبه يكون على أفضل صورة
ممكنة في كتابتهوهذه مش ..اشي مش بسيط شغل التانية
أنه لازم تقدر تكشف الأخطاء لأنه احنا ممكن نكتب
برنامج يكون فيه أخطاء لازم ال compiler يعمل
expectation صحيح قدر الإمكان إيش الخطأ اللي
المبرمج وقع فيه عشان يحاول يعطيه رسالة فهذه كلها
challenges في ال compiler عشان نقدر نعمل هذا ال
software الكبير تبع ال compiler أو نحل هذه ال
problem الموجودة تم تقسيم ال compiler إلى phases
الى steps الى خطوات مثلا سبعة خطوات تمان خطوات عشر
خطوات هنشوف التفاصيل المهم تقسيمه لخطوات طب كيف
بده يشتغل بيصير مثلا بقول خليني أقول بلاش خطوات
عشان نستخدم الصورة خليني أقول مثلا خمس أفراد وقفوا
جانب بعض أنا وظيفتي المهمة رقم واحد بخلصها بعد ما
أخلصها يعطيني العافية بيجي الشخص التاني يكمل step
number twoوالشخص التالت step number three فتجسيمته
ل sub problems بتسهل المشكلة العامة عشان يجمع
نستغرب إذا شفنا ال compiler أساسا مقسم إلى phases
أو إلى steps عشان نسهل الأداء الكلي تبعه والأن
نحاول ندخل بتفاصيل هذه ال stages بتفاصيل هذه ال
phases ونشوف إيش كل step بتعمل أو إيش كل phase
بتعمل لو جرّنا نطلع تحت على ال structure تبعه
هنلاقي طبعا هذه صفحة كاملة بس هنرجع شايفها كل هذه
خطوات شايفها كل المربعات هذه كل مربع شايفاه كل
مستطيل شايفاه هذا عبارة عن step أو phase وهذا
هيمثل chapter في الكتاب لاحقا يعني هذا بس أول واحد
ال lexical له chapter مستقل في ذاته ال syntax له
chapter مستقل ال semantic له chapter مستقل فكل
واحد فيه شغل كتيراحنا اليوم يمكن يدوب خلال
المحاضرة نقدر نشرح ال books هذا و هذا و هذا للرابع
يدوب نوصل اليوم و المرة الجابة نكمل ان شاء الله
طيب خلونا ها نشوف ال steps الموجودة و نتكلم تحديدا
على أول phase او على أول step إيش بصير طبعا انت
لما بتكون يكتب ال code تبعك بال Java و لا بأي
language و لما تكون يكتبها أكيد فاتحة editor معين
file معين و بدأتي تكتب ال code تبعك فيه صح ولا لا؟
أي ملف للجابة عبارة عن ايش في النهاية لما تفتحيه؟
هو characters في الآخر كله لو داجة تطلع من الالف
إلى الياء تجميع ال characters صح ممكن في بعضها لا
معنى لما نكتب I مع F هذه keyword مثلا لما أكتب رقم
عشرة هذه number مثلا لكن أنا أقصد الملف لما أجيب
أطلع فيه بشوف أنا مجرد characters من الأول للآخرو
في ممكن في بعض ال languages characters ما تكونش
مسموح نستخدمها مثلا ال dollar sign ممكن نستخدمها
في أماكن .. في أماكن ما نستخدمهاشمثلا الاسترليني
sign هذه ممكن تلاقيها مستخدمة في أماكن في أماكن لأ
فمش بالضرورة ان تلاقي كل ال characters اللي عندك
في ال keyboard لازم تلاقيها جوا الملف اللي بتكتب
فيه Java مش انت ال Java فيه characters محددات
الفاصلة العادية الفاصلة المنخوطة ال brackets فيه
أشياء معينة المهم الخلاصة ان اي ملف انا بفتحه في
النهاية هو عبارة عن ايش stream of characters طيب
ايش المطلوب بتوقع أول خطوة في ال compilerالمنطق
إيش بيقول؟ بيقول عشان أنا أقدر أعيد كتابة code
لازم في الأول أفهمه وعشان أنا أفهمه لازم أقدر
أقراهصح؟ لازم يكون عندي فهم أن ال I و ال N و ال T
ال Int هذه Keyword واجتماع أشوفها في ملف Java INT
أفهم إنه بنقصد فيها Keyword واجتماع أشوف كلمة
while باسمها W H I L E واجتماع أشوفها مكتوبة في
الملف أفهم إنه هذه Keyword واجتماع أشوف مثلا I F F
فهذه مش Keyword هذه Identifierفلازم يكون في عندى
طريقة في الأول أني أقدر أستوعب كل ال characters
المكتوبة و أقدر أشوف إيش الوحدات اللي بتعنيها و
هنا إيش بنقصد بالوحدة ال token لما أقول كلمة token
أنا بقصد فيها وحدة إلها معنى إلها مفهوم و قد يكون
لها attribute و قد لا يكون بمعنى .. بمعنىالان افرض
و انا باجرى فى ال characters لجيت رجم واحد وراه
سفر و وراه نقطة و وراه سفر و وراه فراغ الان هذه
الواحد سفر نقطة سفر هذه الها معنى الها مفهوم هذه
بالنسبة لي number صح ولا لأ فهذا ال token اسمه
number لكن له كمان attribute له value شو ال value
تبعته ليه العشرة فممكن يكون مع ال ايش مع ال token
value لما اجى اقول لجيت مثلا I F F Fهذا بالنسبة
ليه identifier صح وحدة واحد اسمها identifier لكن
برضه لها attribute شو ال attribute؟ ال character
المكونات للكلمة هذه شوفتي كيف؟ طب لو شوفت كلمة
while هذا عبارة عن إيش؟ هذا عبارة عن keyword طب
مين هذا ال keyword؟ اللي هي while مش if مش do مش
عارف مين صح ولا لأ إذا اللي بنوصله الآن أن هذا
الملف اللي أنا بتطلع فيهمكوّن من tokens وكل token
ممكن يكون له attribute وممكن مايكونهوش attribute
زي ايش بقصد مايكونهوش attribute يعني افترضي انا
لجيت كلمة X تساوي عشرة خلاص ال X قولنا identifier
ال attribute تبعها X صح؟ يساوي طب ما هذا خلاص
اليساوي هو token قائم بذاته واحدة قائمة بذاتها
معناه مساوي فببعدت للناس بقوله لجيت يساوي طب إيش
بده اكتب له attribute فمافيش إله attributeشوفتي
كيف؟ طيب افترضي لجيت مثلا x زائد عشر الزائد هاي
هذا token قايم بذاته اسمه زائد صح ولا لا؟ فانا لما
اقول للناس لجيت زائد خلاص فضل هاي زائد مافيش الوقت
to review لكن في بعض ال languages ممكن يشتغل
بطريقة مختلفة قليلا كيف يعني؟ يعني لما يلاقي زائد
ايش يقول؟ يقول لجيت وحدة اسمها operatorفي الحالة
هذه كلمة operator بتكفيش طب مايكي تكون ناجس، ممكن
تكون ضاد، ممكن تكفيش، شوفتي ولا لأ؟ فلازم في
الحالة هذه ألاقي مع كلمة operator ألاقي attribute
يشير إيش هي ال operator يعني هذه بتعتمد ع طريق
تعريف ال tokens الخلاصة بدي أقولها إن هذا الملف
مكون من tokens قد يكون لتكن الواحد attribute أو
أكثر أو قد لا يكون له أي attribute وهذه الأمور راح
نشوفها إن شاء الله بالتفصيل بعدين في حينههي
باختصار طيب الآن السؤال إيش بدها تسوي مرحلة ال
Lexical Analyzer؟ يعني هو حاطط في المسفطين الأول
ال phase الأساسية Lexical Analyzer وممكن نسميه
scanner إيش وظيفته؟ إيش بيسوي؟ قال هذا وظيفته
كالتالي بفتح الملف بقعد يقرأ من الملف character
character character character من الالف إلى الياء
وكل ما يلاقي tokenيقول يا جماعة لقيت token و هاي
ال attribute تبعته و يعطي العافية خلاص و خلص شغله
بيبعت ال token لمين؟ للشخص التاني انا يا عم لقيتلك
token اتفضل لقيتلك integer اتفضل لقيتلك x
identifier لقيتلك يساوي لقيتلك number خلاص هاي
شغلهأكتر من ذلك يعطيه العافية، إذا الشخص الأول أو
ال phase الأولى فقط وظيفتها أنه يبدأ يقرأ في
الملابس وكل ما يلاجي من البداية token إله معنى،
إله unit، إله مفهوم يبعته للناس اللي ورا يقوله خد
كمل شغلك أنا خلصت، مش بس technical بيسوي وإذا لجى
فراغاتnew lines، tabs، حاجات مالهاش، داعي بنظف،
بشيلها، بتعبش اللي ورا فيها، comments، يعني في بعض
ال language اللي بنعمل هنا slash نجمة إنه هذا
comments، خلاص ليش أبعدها للناس اللي ورا يقعدوا
يشتغلوا على الفاضي، خلاص كله إيش، باعتبره مش
موجود، فبنظفوا، إذن هي ال phase الأولى باختصار ال
lexical يقومفقط بتنظيف ال code من ال spaces و ال
tabs و ال new lines و التعرف على ال tokens و
إرسالها لل stage اللي وراها بس هي باختصار عشان هيك
ممكن نسميها scanner بيسموه scanner مره أخرى طيب
الآن السؤال طب هذا كيف بده يقدر يشتغل عشان بتفهمك
الآن ليش أنت ممكن تستفيد من مساح ال compiler في ال
career تبعك في برمجتك مستقبلا الآن تخيلي حالكبديك
تعملي code يروح يدخل على code ال Java و يحاول
يتعرف على ال units و ال tokens اللي فيها بتقدر
تعمل هذا ولا لأ؟ ممكن تيجي تعصر تفكيرك طب كيف بدي
أعمل؟ يعني هتلاقي الأمور مش سهلة هتيجي تقولي طب لو
لجيت I وراها F وراها فراغ بدي أقوله ماشي لجيتلك
keyword اسمها F طب المشكلة مافيش keyword واحد في
عندك ولا 70 ولا 80 keywordF وY وD ومش عارف مين
ومين ومين صح ولا لأ و ال identifiers كتيرة و ال
numbers كتيرة فلما تيجي تفكري طب كيف بدي أعملها
هتلاقيها مش سهلة لكن أنا مابقولش لك مش هتقدري ممكن
بطريقة معينة تعمل ان شاء الله meet if else كل ما
تلاقي if كله لجيت keyword if else if لجيت do لجيت
do if else if if مالجيتش هدول number مالجيتش هدول
يعني بتقدري انك في الآخر تعملي code لكن تخيلي نيجي
نتعلم في ال compilermethods systematic جاهزة كيف
ملف فيه characters يقطع لك إياه ل units و أنت تحدد
ما هي ال units اللي بدك إياها فهناك طرق ثابتة فهذا
العلم اللي هتاخديه انت بس في هذا الشبطر مش
بالضرورة طول حياتك تستخدمه على ال compiler هاي
الفكرة ممكن أنت تستخدميه مستقبلا في أي application
انت بتبرمجي أو بتعمليه خلاص و وقت ما يجي على بالك
ملف بدك تفتحيهو بدك تقطعي بتلجأي على طول لمين؟
للطرق اللي هتتعلميها ان شاء الله في ال lexical
عشان هيك انا بقولك دايما ان ال techniques و ال
methods اللي هتتعلميها في ال compiler مش بالضرورة
تحصليها في ال compiler استفيدي منها لنفسك حتى
تقدري في المستقبل تستخدميها في برمجتك فهذه كلها
معارات كلها skills مفيدة جدا انكوا تتعلموها و
تتعرفوا عليها ان شاء اللهوهذا طبعا هنشوفه مش اليوم
لكن هنشوفه لما نوصل ال chapter بتاع ال lexical
ونتكلم فيه بالتفصيل هيكون فيه مشاكل كتير طبعا،
هيكون فيه methods معينة، بدنا نشوف كيف نتعامل معها
وكيف يكون efficient و البطء و السرعة، فيه قصص كتير
هنشوفها بعدين حتى ال lexical هذا في الآخر هنلاقي
فيه tool جاهزةtool جاهزة خلاص أنا بس بديله تعريف
بشكل mathematical أو بشكل رياضي أديله تعريف ال
token كيف شكله ويطيه العافية هو جاهز وبيشتغل بعمل
اللي بيقطعلي الملف على طول يعني الحين احنا هنتعلم
شغلتين كيف نعمل احناعملية الـ scanning أو عملية
التقطيع وبعد هيك هنتعلم ان هناك tool جاهزة فبتصير
انت في المستقبل وين انت شغالة script مش script مش
عارف ايش وين شغالة حاجة عبالك تقطعي ملف لسبب ما يا
بتستخدم ال tool الجاهزة يا بتعمل التكنيك اللي
تعلمناه وتخلصيه مثلا هذا هيكون إيجابيات انك تستفيد
من الكلام اللي موجود شرف ال compiler طيب هيك ال
step الأولىخلصت، شوف ايش بيقرأ، بيقرأ character
stream اللي هو من وين موجود؟ في الملف بتاع ال Java
ولا الملف ال C ولا ال C++ اللي بدنا نعمل ال
compilation بيفتح الملف، بيقعد يقرا إيش؟ stream of
characters لكن إيش بيطلع؟ stream of tokens خلاص،
بيطلع وحداتفال stage اللي وراها بتاخد الاشي جاهز
ايش الوحدات اللي لجاهم ويعطيها العافية يعني مثلا
احنا لو كاتبين زي هيك انتجار مثلا X تساوي عشرة
فاصلة منقطة هاي اللي كاتبوا طبعا ال lexical هيمشي
بالترتيب I and T فراغ X فراغ يساوي فراغ واحد سفر
فراغ هيك هيمشي على الكللكن ايش هيبعت للي ورا؟ هيك
هيبعت هيقول keyword انتجة identifier
قيمته X assignment اللي هو اللي يساوي، خلاص
assignment هيبعت يقوله number قيمته عشرة فاصلة
منقوطة، هي اللي جيته، يعطيني العافية، هيك خلص شغله
مين؟ الأفندي الليكسي كانت الان مين اللي هيستقبل ال
tokens بالتدريج؟الـ Stage اللي وراها اللي هو الـ
syntax analyzer طيب ال syntax analyzer إيش بيعمل
ال syntax analyzer إله وظيفة محددة بده يتأكد إن
هدول ال tokens اللي جاياتمخدين أو يخضعوا لل syntax
بتاع ال language ولا لأ؟ يعني مكتوبين
syntactically بشكل سليم ولا لأ؟ أيه بيتحقق منه ال
syntax؟ من اسمه syntax analyzer يعني قاعد يتأكد من
ال syntax بتاع ال language كيف يعني؟ يعني بيشوف هل
بيظبط معي في ال language ييجي keyword انتجة وييجي
وراها variable وييجي وراها يساويوييجي وراها رقم
ويجي وراها فاصلة منقوطة هل هذه مسموح فيها في ال
language ولا لأ؟ هذا مين بتأكد منه؟ ال syntax
analyzer إذا لجاها مسموحة بيقول للي ورا اتفضل أنا
خلصت هذه مافيش فيها مشاكل هذه مكتوبة بشكل سليم
اتفضل كمل طب لجا غلط يعني أنا ماكتبتش فاصلة منقوطة
زي الجابة كتبت فاصلة عادية ال syntax مش هيسويهيشوف
أه هال بظبط keyword انتجار وراها identifier وراها
يساوي وراها number وراها مثلا فاصلة عادية لأ بظبطش
مش معرفة هيك ال language عندي بوقف عندها في error
بيكملش للي ورايا يقولوا لجيتلك كذا وكذا وكذا في
مشكلة هنا لازم تتصحح المشكلة فبروح بالدنيا إيش أنه
في errorو بسيط بسيط بيكمل طبعا في ال tokens بواقفش
البرنامج لكن بمسك ال tokens اللي بعدين بفحصها لأنه
قلنا الحلو في ال compiler أنه مش عنده أول خطأ
بيطلع من كل البرنامج خلاص لاجأ خطأ في ال tokens
هذول اللي أجوا في ال statements هذول اللي أجوا
بيكمل في ال statement اللي وراها عشان إذا في أخطاء
تانية يطلعها والله أنت بتلاقي أنت أول خطأ بيطلع لأ
بيكمل كل ال code و هذه أحد ال challenges اللي
موجودة في ال compiler أنه يقدر يكمل طبعا كيف يكمل
مايكملش هذا هناخده في chapter لحاله بعدين
استراتيجيات التكميل المهم الفكرة تبعتنا الآن انه
باختصار ال syntax هيستقبل ال tokens ويتأكد انهم
مظبوطين ضمن ال language تبعتي ضمن ال syntax تبعي
ولا لأ اذا جاهم مظبوطين خلاص بقول انا خلصت ويعطيني
العافية اتفضل اللي ورايا هينمسلمك tokens مكتوبين
صح بناء على ال language في غلط بقول stop في غلط و
بيكمل في اللي وراهي باختصار اللي بيصير، تمام؟ طبعا
الان واحدة بتسأل او ممكن انا اسألها اقولها طب
تخيلي طلبت منك انت شاطر في البرمجة وقلتلك يلا
اعمليلي حاجة زي هيك في عندك خريطة معينة ل syntax
مثلا وحدن كاتبلك units ويلا طبقيلي هدي مع هدي شوفي
هدي راكب على هدي ولا لأ انت هتلاقيها عملية مش سهلة
كمانلو انت مش باخد ال compiler بقولش اللي مستحيل
تعمليها ممكن تعمليها لكن هتستنفع ليه تفكيرك كيف
أعمل .. كيف أعمل الخريطة؟ طب كيف أقارن؟ طب كيف
أسوي ال model؟ صح ولا؟ طب إيش رأيك لما أقولك أنا
خلال ال syntax analyzer هعلمك ال model الموجود
أصلا في العلم اللي بيعمل الخريطة و بوصفها ومش بس
هيك و هعلمك إذا في إشي جاي كيف تطبقيه مع إشي موجود
و تقولي صح ولا غلط فتخيل اتعلمتي هذه ال techniques
و هذه ال methodsوفي المستقبل إحتجتي تقارن الشيء مع
شيء أو مع خريطة هتلاقي العلم هدفها دي بشكل كبير
عشان ذلك أنا برجع بركز و أقولك حتى كل ال
technology اللي بدك تتعلميها هان أو هان أو هان أو
هان كله هتستفيدي منه بعدين كمان مانوش بالضرورة في
ال compiler هو جابهم جيرهم عشان يعمل step معينة في
أحد ال steps في ال compiler لكن أنت كنت تستخدميها
بشكل منفصل و مستقل في شي معينفانت تذكري دايما، لأن
هذا وارد جدا ديلي بالك، خصوصا اللي بيرمجه، اللي
بيرمجه في freelancing أو أي حاجة، وفي الآخر أنتم
معظم شغلكوا هيكون برمجة وديلي بالك، أنا هنا مش
ضروري تكون بيئة البرمج سبعتك Java، يمكن تكون
بتبرمجي Python أو أي حاجة، المهم الفكرة، لما ييجي
على بالي، بدي أعمل مدل لشيء معين، و بدي أتأكد إن
الونكتب أو ال units اللي جاية تطابق هذا الشيء ولا
لاكيف بديك تعمليه؟ هذا بيعلمك methods، بيعلمك
ideas، بيعلمك أفكار لكن تطبيقها الآن ممكن يكون في
أي language، في Python، في Secrets، ماعرفش اللي
بيكون، يعني ماتفكري كمان أنه أنا مش هستفيد من
التكنولوجيا إلا في الجابع، لأ لأ لأ، مالاشة لأ،
أنت بتتعلمي هنا ideas، أفكار، methods و قد
تستخدميها في أشياء أخرى، فهي اللي بديك تفهميه في
النهاية، بديش تطلع من المثاقبس مجرد مجايرة الإشي
أجدكم بالر و السلام عليكم و إلا واش استفدتي من
المصاقر لأ كل تكنولوجيا بتاخدها .. كل مثل بتاخدها
خديها .. فهميها إليك للمستقبل عشان تقدر تستفيدي
منها و تشتغل عليها و الحلو ماتنسيش أن حتى كل واحدة
فيهم إلها tool إيش يعني tool؟ يعني إش جاهز ليش
تتعبى حالك؟ تقول خلاص هات ال tool و إشتغلي okay
طيب إذا ..الـ Syntax اللي عايزاها باختصار خريطة
معروفة in advance داخل الـ syntax اللي عايزاها
عرفها اللي هي ال syntax بتاع ال language يعني لازم
هذا انا افهم شو ال syntax بتاع ال language اقوله
هاي شكل ال F هاي شكل ال Y هاي شكل ال D هاي شكل ال
C هاي هاي هاي هاي يعرفوا in advance و بعدين اللي
كتبوا المبرمج اللي أجاله من ال Lexical Catochins
يشوفوا ينطبق ولا لا ينطبق إذا ينطبقانت صح، كمل،
إذا لا ينطبق، في خطأ طبعا يمكن مفاجأة أو إشي كويس
إنه هتلاحظ إن ال model المستخدم هان حاجة مرت عليكي
زمان واختيها وسهلة في ال data structure، موضوع ال
tree، مااخدتوش قبلكي tree؟استفدتم منه العلم قبل هي
كده بس ماشي يمكن انتوا دايما زي هي مشكلتك و
بتاخدوا العلم على جده لكن مابيش حاولي انك تستفيدي
منه في شيء معين اللي هنتعلم في خلال مساخنا كيف هذه
ال tree بقدر من خلالها اطابق هل المكتوب يطابق
الخريطة ولا لا من خلال ال tree اللي انا اتعلمت لكن
مش عارف كيف استخدمها فهذا الكلام ممكن تستخدمي كمان
مستقبلا كيف ال tree هي فالحلو انه في models موجودة
انت أخدتيها alreadyلكن مش عارف كيف تعاملي معاها،
مش عارف كيف تستفيدي منها، كيف تستغليها، هذا
هيساعدك ان شاء الله طب هنا إيش بيقولليه؟ بيقوللي
ال syntax analyzer إيش بيطلع؟ syntax tree صح ولا؟
طب كيف يعني؟ أنا بدي أديكي مثال هيك مبدأي بسيط
علشان بس أوضح الفكرة و بعدين نكمل افترضي أنه أنا
في ال language تبعتي X language مثلا أنا هيك حر،
بدي هيك شكل ال F
خلاص أنا هيك بدي ال F طبعا ممكن تختلف من language
إلى language بس أنا بفترضها في ال language اللي
بتكلم عنها الآن هيك شكلها، تمام؟ يعني شكلها
الحقيقي لو بدي أعملها Tree ال statement هيك شكلها
بيجي F بيجي فتح ال course بيجي تسكير ال course
بيجي ال bracket هذا بيجي هيك هيك فرضتها أنا خلاص؟
أجى المبرمج اللي بيشتغل اللي جابولي ال tokens
تبعاته كتب زي هيك كتب Fكتبها صح المبرمج كتبها صح
الآن ال lexical إيش هيسوي؟ ال lexical هيبعتله ال
syntax يقوله ل gate أول إيش F تمام؟ الحين أو الآن
ال syntax إيش بيحاول يسوي؟ بيحاول يعمل عملية تشجير
إذا جدر يعمل شجرة زي اللي كانت عنده معناها كل
الكلام اللي أجى مظبوط كل ال tokens أجت مظبوط أو
مطابقة إذا ما جدرش يعمل الشجرة معناه فيه خلل طب
كيف بيعمل الشجرة أديكي مثال جال ال statement أول
شي قلتله فيه F طب هو متعرف أنه ممكن ال statement
ترجل F صح؟ فبتنزل رجل ال F الآن المبرمج إيش كتب
بعد هيك؟ قص هل ممكن يجيخص .. اه بيجي .. هي راح
إيش؟ نزل الرجل هاي طب افترضي كان في غلط هنا كان
كاتب مثلا تعجب مثلا مثلا أي حاجة كاتب غلط الآن
الرجل هذه مالها مش هتقدر تنزل ليش؟ لأنه هي عشان
تنزل لازم يكون إيش؟ تسكيرة هي كانت صح لكن هو إيش
كاتب؟ تعجب فبطلت الشجرة جادرة تكمل ليش؟ لأنه مش
جادرة تنزل بناء على اللي هو متعارف عليه إذا الشجرة
مش هتكملفطالما ما طلعتش لتري .. هد هتعلموا بعدين
بالتفصيل كيف نعمل بشكل برمجي لكن الفكرة إذا ما
طلعتش لتري ليش ما طلعتش؟ معناه كاتب غلط مش كاتب
مطابق للاشي اللي هو متعرف عليه عشان ايه كأبعرف أنه
فيه غلط، بيكملش لتري لكن افترض طب كاتب صح هنزل رجل
عادي و أجد هدي هتنزل هدي عادي و أجد هدي هتنزل هدي
عادي و أجد هدي هتنزل هدي عادي صح؟ خلصت لتري؟ معناه
هو كاتب إيش؟صح ومطابق فهو باختصار عشانك انت ترى
ايش قالك؟ قالك ال output ايش؟ subtextual صح دخل
tokens هو هيحاول يعمل شجرة من ال tokens إذا كملت
معاه الشجرةمعناها كل المكتوب صحيح عشانك طلعت معاه
الشجرة بالكامل، إذا مافيش عندي مشاكل، إذا سليمة
الشجرة هذه ما طلعتش، ليش ما طلعتش؟ لأنه مش قادر
يشجر، مش قادر يعمل ال parsing هذا، ليش؟ لأنه كاتب
غلط، كاتب حاجة مختلفة عن الطريقة اللي أنا متعلم
أشجر فيهافهي باختصار طبعا كمان مرة كيف التفاصيل
بعدين في chapter بس أنا الآن بحاول أديكي الفكرة
العامة كل اللي بدي أتعرف إيه أنه syntax analyzer
بياخد ال tokens بيحاول يقارنهم مع اللي هو متعرف
عليه ال syntax تبع ال language قليل المقارنة كيف
بالتم من خلال عملية parsing أو عملية تشجيرإن جدر
المكتوب لأجاني من الملاف الـ tokens ينعمللهم شجرة
معناه مكتوبين صح مطابق لل syntax اللي أنا عارفه ما
طلعت الشجرة لأي سبب من الأسباب معناها مش مكتوب
بشكل مطابق لل syntax اللي أنا متعرف عليه معناه هو
كاتب خارج ال syntax تبعي معناه فيه problem معناه
ما طلعت الشجرة عشان هيك مستحيل نقول أن ال syntax
طلع صح إلا إذا نتيجة الشجرة طلعت معاه صحهذه
باختصار الآن لكن كيف التفاصيل بعدين؟ كيف بعمل
الخريطة؟ كيف بوصف الخريطة؟ كيف بعمل ال model؟ كيف
طب ال tokens بيجوني بالظبط؟ كيف طب أنا بعمل مقارنة
ان ال tokens اللي أجوني بنعملهم بارسنج من الشجرة
ولا لا؟ هذه التفاصيل الفنية بعدين هنشوفها لما في
وجته احنا الان بنتكلم بس ايش بنعمل في step number
two؟ لكن زي ما قلت فيه شبتر كامل متكامل بكل
التفاصيل بعدينتستعجلوش، خدوا الآن الفكرة العامة
لكل ال compiler إيش بيعمل، إيش بيسوي طيب .. أه ..
فضل .. طيب
أه ..
لأ .. بيقولش مش هيكملالان في شيئين مستقلين مختلفين
عن بعض نشلت بجميعهم في بعض الشيء الأول واحد جاعت
بيقرا بالملف و بيرميله token .. token .. token ..
token .. مارويش دعوة مابيجفش كل ال tokens اللي
بيقوله اتفضل التاني بيحاول ياخد ال token و يشجر
ياخد ال token و يشجر .. ياخد ال tokens و يشجر فهمت
كيف؟ الان ال tokens هدول اللي بيجيهم ممكن يكونوا
من أكتر من ال statement يعني ممكن الشجرة هذه
ماتظبطش الشجرة اللي راح تظبطممكن الشجرة التالتة
تظبط، الرابعة ماتظبطش، شوفتي كيف؟ فالاشي اللي
بظبطش معاه بيعرف أنه هنا فيه مشكلة في ال syntax
بتاع هذا المكان، فبيأشر عليه، بيقول فيه error، ال
expectation تبعه أنه كاتب بدأ التعجب مثلا ghost أو
العكس، بيصير يعمل expectation لل error، و بيكمل،
مش بيوجف، بيكمل يفحص ال stream of tokens كلهم اللي
جاياتفبيقفش احنا قلنا هذه ال challenge موجودة في
ال compiler مش ان هو الخطأ يوقف لأ بيعمل رسالة انه
في خطأ بيعمل expectation شو هو ده الخطأ لكن لازم
يكون عنده قدرة ان يكمل ويفحث بقية ال tokens اللي
جايات طبعا كيف يكمل؟ ايش السرتيجية للتكميل؟ هذه
قصة لحاله هناخد اكتر من السرتيجية كيف يقدر يكمل
مايقفش؟ ايش المبدأ؟ في اكتر من طريقة هذا بعدين لكن
احنا الآن بنقول الشيء الفكرة العامة tokensبتشجر
يعني ركبين هدول ال tokens جايين على ال syntax تبع
ال language ولا لأ إذا على ال syntax تبع ال
language بكون خلص و بكمل اللي وراه مش .. مش جايين
على ال syntax تبع ال language stop هنأ error stop
هنأ error stop هنأ error stop هنأ error عشان يصلح
نفسه مش هو بترجع انت لازم تصلح عشان يقدر ال code
يكمل لما تعمل computation هذه باختصار القصة فبنقش
نخربط الاشي في بعضه okay طيب لحد هنا في أي مشاكل
في ال syntaxواضحة الصورة العامة، فضّالي طبعا،
لأ، شوفي ال lexical لازم يطلع كل ال tokens
بالترتيبو يبقى .. لأ بس مستناش .. هذه هناخدها
بعدين ال pass يعني مش فاكريش أنه بروح بشتغل و بطلع
في الأول كل ال tokens و بعدين بعيد تفضل خد لأ
العملية كل واحد بيسلم التاني و كله بيشتغل فبنسميها
one pass بعدين هناخد ال passes يعني لما أخد كل
الخطوات هقولك برمجيا كيف بيخلصوا مع بعضلكن الأن
ايش بقولك؟ واحد بيسلم واحد يعني أول ما بيلاقي الـ
token الأول انتجر مش بيستنى بيقوله خد لجيتلك انتجر
اشتغل عليها عبال منايش ألاجيلك التاني بيروح بيجيب
في التاني بيكون هدا كده قاعد يدور في العدة تبعته
وين هي دي؟ أي شجرة؟ من وين أبدأ؟ أه هذا ال
statement طبعي الإف هي الرجل الأولى بيكون قاعد
بيشتغل بيشتغل في التاني بيقوله خد بياخدها بيستغل
عليها وكده حتى step 3 و 4 بيجافوشإيش بيطلع من
الشجرة؟ يعني هنلاقي إنه الأمور في one pass ممكن
أنا أعمل four four stages مع بعض أو phases مع بعض
هذا بعدين هتكلم عنه من ناحية البرمجية احنا لسه
بنتكلم بس steps إيش هذا بيعمل؟ إيش هذا بيسوي؟ وها
كده، تمام؟ طيب إذا وضح ال syntax analyzer إيش
بيعمل؟ طيب يعني أجوا ال tokensاتأكدنا إنهم
syntaxically مكتوبين بشكل سليم يتبع ال syntax تبع
ال language شو قصة ال semantic analyzer؟ إيش
تتوقعي؟ إيش ضال؟ يعني خلاص code و لاجئته مكتوب
بشكل سليم إيش المفروض أبدي أحول؟ طب إيش ال
semantic analyzer؟ إيش يعني؟ و ال semantic هذه
المفروض المصطلح هتكون عارفينه لأنه بمُرف أكتر من
مساق أه إيش semantic analyzer تتوقعي بيسوي؟
لأ .. ماكوا شطرين .. انتظرين .. اه .. ان
شاء الله عليكم ايش تتوقعوا بعد ال syntax؟ ايش ال
semantic ممكن يعمل؟ ال code برمجية انتظرت مش كامة
.. نظبط ال tree و نخليها ب anthem كيف يعني؟ مش
عارف واضحولي اكتر .. اه
مالكم؟ طب الطلاب كانوا أقل عدد منكوا وعدة وعتاد و
.. و جاوبوا الصبح ايش
semantic يعني؟ ال syntax ممكن فيها خطأ ال syntax
اتفاقنا انه خلاص مش هي .. مش هيروح ب step تلاتة
إلا إذا كان ال syntax صليب إذا كان مكتوب ضمن ال
syntax تبع ال language بروح يكمل ال stage التالتة
خلاص بياخدوا انه يشتغل عليها إيش ال semantic بدو
يعمل؟غالبا انه مثلا .. انه ايش؟ لأ مثلا انا مش
معرفة انتجار فوقه روح تستخدمته ممكن انه يقوللي انه
مثلا انت هذا ال .. الانتجار مفترض انك تكون معرفة
يعني جربتي بس بدنا الاشي أوضع كويس يعني جربتي طيب
في إجابة تانية؟ طيب بدي أسألك سؤال الآن لو أنا
كاتب X تساوي Y زائد Zفاصلة منقطة مثلا syntax
analyzer ايش هيسوي؟ عرفوا ان ال lexical analyzer
ايش هيسوي؟ هيقول لجيت identifier x لجيت assignment
اللي يساوي لجيت identifier لجيت زائد لجيت
identifier لجيت فاصلة منقطة و هيبعت هذا الكلام لل
syntax اعتبرها بتجابةالـ syntax بتاع ال Java هيقول
اه مسموح يكون في ID يساوي ID زائد ID فاصلة مقلوطة
مسموح ولا لا؟ مسموح في ال Java فال Java هيقول
بالنسبالي pass مافيش فيها مشاكل مسموح الصيغة هذه
ID يساوي ID زائد ID فاصلة مقلوطة و يبعت للي ورا
صح؟ الآن افترضي ان هاي float و افترضي ان هذه
انتجار هذه مشكلة كي بدك تجمعfloat مع انتجة طبعا
بعض ال languages ما بتسمح في هذه الشغلة بتقولك
ممكن تعملك إيها error و تقولك كده انك تجي معاهي
معاهي و لازم أنت تعملها بشكل explicitوبعض ال
languages بتسمح لكن بتعملك warning أنه احنا حولنا
لك ال z هذه حولنا لك إياها ل float لأن كبدك تجمع
فبعملك إياها بعد جد warning صح ولا لا؟ طيب فمين
اللي عرف أنه هذه float و لا هذه انتجار و انه مسموح
و لا مش مسموح؟ ال semantic ال semantic بشيك على ال
valuesبشيك على ال attributes بشوف صح هي
syntactically سليمة ك syntax مش فيها مشاكل لكن هل
ك values ك semantics مظبوطة و لا مش مظبوطة طب
أديكي غلط تاني افترضي ان ال Y كان اسم function كيف
تجمع function زاد انتجار؟ صح؟ هي ك syntax مظبوطة ك
syntax IDE يساوي IDE زاد IDE فصلا قطة لكن ك values
مش مظبوطة كيف تجمع اسم function مع عشرة والله اسم
array مع عشرة صح ولا لا طيب مثال تاني لنفس القصة
الآن افترض ان انا كاتب x بتساوي y number ك
syntax مسموح identifier يساوياسم array افتح ال
course بهذه الطريقة number تسكير ال course فاصلة
مرقوطة مش ك syntax مظبوطة يعني لو ال lexical بعت
لل syntax بعتله لجيت identifier لجيت يساو لجيت
identifier لجيت فتح ال course لجيت number لجيت
تسكير ال course لجيت فاصلة مرقوطة ك syntax سليمة
مافيش فيها مشاكل لكن تخيل ال number كان معرف ال
flow
وغلط مسموح بين ال array يكون ال index float number
ممنون صح ولا لأ لكن مين الكشفها ال semantic مش ال
syntax هو ك syntax بتصلح مصبوطة مسموح اكتب id
يساوي id افتح ghost number ساكر ال ghost فلسا
مبقوطة ال syntax تكلفش فيه هى غبارلكن semantically
طلع فيها مشكلة من ناحية values و attributes طلع
فيها مشكلة ممنوع هذه بين الجثين تكون number float
لازم انتجر كيف انت معرفة float مثلا هذه ممكن تكون
اسم function ممنوع ال y تكون اسم function لازم
يكون معرفة اسم arrayفهذه الأخطاء ماحدش بكشفها غير
السيماتيكي يعني في عندي نوعية من الأخطاء في عندي
أخطاء syntaxically على نطاق أو level السيمتاكس وفي
عندي أخطاء semantically على level أو نطاق ال
values و ال attributesفلازم يتأكد من التنتين ففي
stage خاصة بال syntax لأن ال syntax هو الأهم في
الأول لازم ال structure لازم التركيبة تكون سليمة
في الأول و بعدين لازم ال values كمان يكونوا ركبين
و سليمين و مافيش فيهم أي مشاكل عشان هيك بيجي ال
semantic وظيفته أنه يتأكد أنه بالفعل مافيش أي
مشاكل في ال values
طبعا هو شوف في النهاية كل اللي صار ان احنا قرأنا
ال units ال tokens اتأكدنا انهم راكبين من ناحية
syntax اتأكدنا انه مافيش مشاكل من ناحية values و
attributes يعني ال structure و semantics ال answer
كودي مكتوب سليم اذا تجاوز ال step تلاتة يا بنات
يعني ال code خلاص خلاص مظبوطبما انت كل الأخطاء
خلصتيها لأن كل أخطائك إيه تكون يا semantics يا
syntactic يا syntax فإذا أنت كاتبة syntactically
صح و semantically صح خلاص ال code أصبح جاهز الآن
لعملية الترجمة لكن غلط يترجم ال code غلط مش أنت
قبل تعمل run مش تعمل compile و طول ما في أغلاط
بخلصش ال compiled ليش؟ بقولك صلحي صلحي صلحي صلحي
لما يبطل فيه أخطاء بعملك compiled ترجمة كاملة
سليمة جاهز لل run فبقدرش أترجم أو أكتب code
بالصورة الجديدة غلط أنا بس بترجم الأكواد السليمة
والصحيحةعشان اذا كان في كوده ال source فيه غلط
بضلني وراه صلح .. صلح .. صلح .. صلح .. صلح .. صلح
.. صلح .. صلح .. صلح .. صلح .. صلح .. صلح .. صلح
.. صلح .. صلح ..مش .. مش يكون هو كاتب غلط و أنا
أجي على كيفي أروح أترجمه صح .. كيف؟ طيب ممكن هو
قاصد حاجة تانية .. ممكن مش قاصد .. مش قاصد .. فأنا
بدخلش في القصة، أنا ماليش دعوة، ال compiler بفكرش،
ماليش علاقة ال compiler هتلي code مكتوب صح، أنا
بروح بترجملك إياه ب language تانية صح، مو طول
السطر، أنت كاتبلي code غلط، أنا بدي ساعدك و أقولك
في عندك غلط هنا و هنا و هنا و هنا و هنا و أنت
زبطلي حالكبتدّيني في الآخر كودك صح بروح بتطب لكيه
أعيد كتابته صح بال language الجديدة إذا أنا بعد ما
بيخلص هو ال lexical و بيخلص ال syntax و بيخلص ال
semantic بيكون ال code الآن جاهز لشو؟ لعملية
التحوير تمام؟ طيب السؤال اللي بدأ أختم فيه راح
حوللـ intermediate code تحول لـ intermediate code
طب ليش؟ و بعدين optimizer و بعدين مش عارف code و
بعدين .. طب ليش؟ محول على طول لل target code يعني
إيش العبرة .. ماحظين إيش سوا؟ الآن كله صح أجت
مرحلة التحويل، مظبوط؟ طب ما تحول لل target code و
تريحنا و تفوقنا و تخلصنا إيش هو عمل؟لأ جال حول لسه
ل intermediate و بعدين ل optimization و بعدين مش
عارف .. و قاعد يمشي في step زي ما شايفينه طب ليش
محولش ل machine code و رايحنا؟ مش هو ال code صح؟و
semantically صح و syntactically صح و كله تمام؟ طب
خلاص حوله ل ال machine و ريحنا إيش العبرة تقعد
تتعبنا و تعملي انه لل intermediate؟ إيش رأيكوا؟
إيش رأيكوا في القصة؟ ملاحظين إيش سوا هو؟ حول ل
حاجة sem intermediate و بعدين بدأ يشتغل عليها و
بعدين حول ل ال machine طب أنت محول محول حول على
طول ل ال machine إيش رأيكوا؟ إيش العبرة؟ بدنا نجيب
هذا السؤال و نخلص كيف
يعني؟لأ أنا الحين مانديش interpreter ايش ماندي في
ال interpreter لأ عشان احنا أقولك نكتبه بأفضل
طريقة طيب ما نكتبه بأفضل طريقة على طول ليش يعني ..
يعني أنا سؤالي كمان مرة على طول حوّل لل ..
للمachine ليش تروح لل intermediate؟ بيت code، tree
address code، فيه كتير قصص أكتر من شكل أصعب؟ هيكون
أصعب؟
مرهقة أكتر طيب كويس برضه إجابة يعني مقبولة أه إيش
فيه كمان إجابات؟ إيش فيه إجابات؟ يعني
المهم أنكم بدأتوا تدوروا صح في الإجابة طيب
كويس بدأتوا إجابة يعني سليمة شوية بس أنا الحين بدي
أحاول أنه أعطي مثال في الدقائق هذه السريعة ونختم
في هذا الكلام ليش احنا عملنا intermediate تمام؟
افترضي أنا جبت هذا الكرسي هذا و حطيته هنا و هذا
خلّيني افترضه اللي هو الجابع حطيته أنا هنا و روحت
جبت الكرسي هداك و حطيته هنا اللي هو ال machine
languageو جيت قولت لو واحد شاطر يلا اتفضلي يا معلم
بدي تنطلي من الكرسي هذا .. بدون هذا التبريد مش
موجود المكتب تنطلي من الكرسي هذا لكرسي هذا تتوقع
الموضوع إيش هيكون؟ صعب جدا جدا جدا كيه بدي أنا
أنتقل من هنا لهناك؟ طبعا أنا ليش فرطت الفرضية هذه
المتباعدين؟لأن شكل ال machine language مختلف تماما
عن شكل ال high level language وابعد عن بعض كتير
هداك بتكلم في ال registerات و بتكلم في ال
processor و بتكلم في حاجات ضيقة وهذا بتكلم في
features و بتكلم في loops و بتكلم في while و زاد
فارق كبير بيناتهم فواضح ان الانتقال من هنا لهناك
بالتأكيد معقد و صعب و لم يكن مستحيل طيب افترضي انا
من باب حلإيجيت إيش قولت؟ قولت هذا المكتب يعني بدي
أجيبه أحطه أزيحه في النص و هذا هو ال intermediate
code خلاص حطيت المكتب في النص الآن اللي واقف هنا
صار سهل عليه أنه step صار في ال intermediate ومشي
و stepووصل من هناك لهناك من خلال فكرة المكتب اللي
انا حطيته طبعا ليش انا اعتبرت المكتب intermediate
لأن ال intermediate representation اللي لازم
نختاره لازم ياخد شوية characteristic شوية تشابهات
من ال low و لازم ياخد شوية تشابهات من ال high يعني
بتشابه مع عادة في شغلات و بتشابه مع عادة في شغلات
زي مثلا مين؟ طبعا في أمثلة كتير عن الـ
Intermediate Code Representation لكن زي مثلا الـ
Tree Address Code إذا مرت عليكم إيش ال Tree
Address Code؟ يعني مثلا بقول T1 تساوي T2 زي T3
ممنوع في ال command الواحدة أشوف أكتر من Tree
Operands ممنوع يعني طب افترض بدي أزيد T4إيش أعمل؟
مضطر أعمل command جديدة خلاص هيك هذه ال language
فلاحظي إنها تشابهت مع ال low level machine إن ال
operands محدودات عشان الرجسترات محدودات لكن تشابهت
أيضًا مع ال high level اللي كان بستخدم زائد و ضرب
و ناقص و قصبة صح ولا لا؟ و كذا هتلاقي برضه في ال
while اللي هي شكل قريب شوية على ال high و شكل قريب
شوية على ال lowفالآن هذه الـ Intermediate
Representation صارت شكل وسيط عشان كانت حددت في
النص طبعا ليش بس الـ Tree Address Code ال bio code
وسيط ال Tree وسيط لغة ال C كمان وسيط عفش لغة ال C
وسيط لأنه بقدر من خلالها أستخدم pointerات و بقدر
أدخل على ال registerات و فيها كمان تتعامل مع ال
processor من جوا عشانك برضه تعتبر لغة وسيطة طبعا
احنا خلال مساكمة انبسس هنركز في الوسيط على شغلتين
على ال Intermediate اللي هو ال Tree Address Code
وعلى الـ three فقط على هدول هنركز، بس المهم
الخلاصة تبعتنا أنه أنا استعانت بال intermediate
representation عشان أسهل عملية الانتقال من ال high
level ل ال low level الاقل بتصير عملية الانتقال من
ال Java ل ال intermediate مالها سهلة خالص و
efficient و performance أعلى و من ال intermediate
تنتقل لمين؟للمachine أسهل آخر فايدة عشان نخلص معلش
عشان نفس الموضوع مرتبط فيه افترضي انا عندي هنا
Java وعندي C++ وهي ال intermediate خلاص وعندي هنا
ال machine Intel وهنا عندي ماكنتوش ولا قبل ولا اي
حاجة خلاص واتعبت انا في الأول غيرت من ال Java لل
intermediateلل .. لل انتل اجيت اقول طب ايش رأيكوا
نطبق ال Java مثلا على ال Macintosh و لا ال Apple
هل قاعد شغل النص الأولاني و لا أكمل في النص التاني
بس؟ شفتي كده؟ ففيش داعي .. يعني بقدر الآن نفس ال
.. النص اللي كنت عامله أشبكه انصاص على Macintosh
على كده ماقعدش الشغل كلهشغلة تانية طب افترضى انا
بديش بدي ال C++ على ال machine الأولى بس بغير النص
الأولى يعنى انه كيف اوصل ال intermediate ومعناه
هذي هذي عملها قبل شوية فبصير انت بإمكانك الان
تنتقل من أي language بدك إياها لأي machine بديك
إياها ب effort أقل yes بغير النص هذا او بغير النص
هذاوحتى لو أنا عامل الانصاص كلها بصير استخدم
الموجود خلاص ال C ما أنا عامل هذه من هذه وعامل من
C لها دي كده بصير أجمعهم تجميع هاي مع هاك هاي مع
هديك هاي مع هاك فبصير علي أسهل في عملية ال
combination هاي باختصار كل القصةواضح الأمور؟ طيب
احنا بس كل اللي سوينها اليوم بس شرحنا ال steps
الأولى الأربعة phases الأولى و في العادة ال
compiler one اللي هناخده بس هنركز على هدول في
الشباتات النص التانى هناخده المرة الجاية نقول إيش
بيصير فيه لكن كما صح مش هنلحق نغطيهليش؟ لأن هذا
compiler tool المفروض، بتغطي الكتاب على جزء اتين،
احنا الجزء الاول بركز بس على ال front-end، النص
الأولاني، فهذا كلهم هيكونوا شبات المستقلة بذاتهم
وانا هناخدهم ان شاء الله بشكل مفصل، يعطيكم العافية