خلونا اليوم إن شاء الله نبدأ الـ 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 لإيش للـ machine أو للـ low 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 لإنه ممكن يكون أكثر دقة في كشف الأخطاء
صح بيكون عندي أخطاء؟ الـ compiler بيكشف أخطاء و الـ
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 بحولها لمين؟ لل machine و
بعدين بعمل على طول ايش؟ عملية ال 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 codes into 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 بتحولها لل machine و
بعدين يتحول لل machine خلاص زي وزي 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؟ إيش اللي بـ preprocessor؟ اه ما شاء الله
عليكم شطارتكم لسه
هو ما حكاش على ال 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 تبعك فيه صح ولا لا؟
أي ملف لل java عبارة عن إيش في النهاية لما تفتحيه؟
هو characters في الآخر كله لو داّجة تطلع من الألف
إلى الياء تجميع ال characters صح ممكن في بعضها لا
معنى لما نكتب IF هذه 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 اسمها IF طب المشكلة ما فيش keyword واحد في
عندك ولا 70 ولا 80 keyword IF وY وD ومش عارف مين
ومين ومين صح ولا لأ و ال identifiers كثيرة و ال
numbers كثيرة فلما تيجي تفكري طب كيف بدي أعملها
هتلاقيها مش سهلة لكن أنا ما بقولش لك مش هتقدري ممكن
بطريقة معينة تعملِ إن شاء الله meet if else كل ما
تلاقي if كل ما تلاقي keyword if else if لقيت do لقيت
do if else if if ما لقيتش هدول number ما لقيتش هدول
يعني بتقدري أنك في الآخر تعملي code لكن تخيلي نيجي
نتعلم في ال compiler methods 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 أو أي حاجة، المهم الفكرة، لما ييجي
على بالي، بدي أعمل model لشيء معين، و بدي أتأكد إن
الـ outputs أو الـ units اللي جاية تطابق هذا الشيء ولا
لا، كيف بدك تعمليه؟ هذا بيعلمك methods، بيعلمك
ideas، بيعلمك أفكار لكن تطبيقها الآن ممكن يكون في
أي language، في Python، في C++، ما أعرفش اللي
بيكون، يعني ما تفكري كمان أنه أنا مش هستفيد من
التكنولوجيا إلا في الـ Java، لأ لأ لأ، ما فيش لأ،
أنت بتتعلمي هنا ideas، أفكار، methods و قد
تستخدميها في أشياء أخرى، فهي اللي بديك تفهميه في
النهاية، ما بديش تطلع من المقررات مجرد مجايرة الاشي
أجدكم بالخير و السلام عليكم، و إلا إيش استفدتي من
المقررات؟ لأ، كل تكنولوجيا بتاخديها .. كل مثل بتاخديها
خديها .. فهميها إليكِ للمستقبل عشان تقدر تستفيدي
منها و تشتغلي عليها، والحلو ما تنسيش أن حتى كل واحدة
فيهم إلها tool، إيش يعني tool؟ يعني إيش جاهز ليش
تتعبى حالك؟ تقولي خلاص هات الـ tool و اشتغلي، okay
طيب، إذا .. الـ syntax اللي عايزاها باختصار خريطة
معروفة in advance داخل الـ syntax اللي عايزاها
عرفها، اللي هي الـ syntax بتاع الـ language يعني لازم
هذا أنا أفهم شو الـ syntax بتاع الـ language، أقول له
هاي شكل الـ F، هاي شكل الـ Y، هاي شكل الـ D، هاي شكل الـ
C، هاي هاي هاي هاي، يعرفوا in advance، وبعدين اللي
كتبوا المبرمج اللي أجاله من الـ Lexical Analyzer
يشوفوا ينطبق ولا لا ينطبق، إذا ينطبق، أنت صح، كمل،
إذا لا ينطبق، في خطأ طبعاً، يمكن مفاجأة أو شيء كويس
أنه هتلاحظي إن الـ 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، الآن المبرمج إيش كتب
بعد هيك؟ قص، هل ممكن يجي قص؟ .. اه، بيجي .. هي راح
إيش؟ نزل الرجل هاي، طب افترضي كان في غلط هنا، كان
كاتب مثلاً تعجب، مثلاً مثلاً، أي حاجة كاتب غلط، الآن
الرجل هذه ما لها مش هتقدر تنزل، ليش؟ لأنه هي عشان
تنزل لازم يكون إيش؟ تسكيرة، هي كانت صح، لكن هو إيش
كاتب؟ تعجب، فبطلت الشجرة قادرة تكمل، ليش؟ لأنه مش
قادرة تنزل بناء على اللي هو متعارف عليه، إذا الشجرة
مش هتكمل، طالما ما طلعتش لـ tree .. هدول هتعلموهم بعدين
بالتفصيل كيف نعمل بشكل برمجي، لكن الفكرة إذا ما
طلعتش لـ tree، ليش ما طلعتش؟ معناه كاتب غلط، مش كاتب
مطابق للاشي اللي هو متعرف عليه، عشان إيه كأبعرف أنه
فيه غلط، بيكملش لـ tree، لكن افترض، طب كاتب صح، هنزل رجل
عادي، وأجد هدي هتنزل هدي عادي، وأجد هدي هتنزل هدي
عادي، وأجد هدي هتنزل هدي عادي، صح؟ خلصت لـ tree؟ معناه
هو كاتب إيش؟ صح ومطابق، فهو باختصار عشانك أنتِ ترى
إيش قال لك؟ قال لك الـ output إيش؟ syntactical tree، صح، دخل
tokens، هو هيحاول يعمل شجرة من الـ tokens، إذا كملت
معاه الشجرة، معناها كل المكتوب صحيح، عشانك طلعت معاه
الشجرة بالكامل، إذا ما فيش عندي مشاكل، إذا سليمة
الشجرة هذه ما طلعتش، ليش ما طلعتش؟ لأنه مش قادر
يشجر، مش قادر يعمل الـ parsing هذا، ليش؟ لأنه كاتب
غلط، كاتب حاجة مختلفة عن الطريقة اللي أنا متعلم
أشجر فيها، فهي باختصار، طبعاً كمان مرة كيف التفاصيل
بعدين في chapter، بس أنا الآن بحاول أديكي الفكرة
العامة، كل اللي بدي أتعرف إيه أنه الـ syntax analyzer
بياخد الـ tokens بيحاول يقارنهم مع اللي هو متعرف
عليه، الـ syntax تبع الـ language، قليل المقارنة كيف
بالتحديد من خلال عملية parsing أو عملية تشجير، إن قدر
المكتوب اللي أجاني من الملف الـ tokens ينعمل لهم شجرة
معناه مكتوبين صح، مطابق للـ syntax اللي أنا عارفه، ما
طلعت الشجرة لأي سبب من الأسباب، معناها مش مكتوب
بشكل مطابق للـ syntax اللي أنا متعرف عليه، معناه هو
كاتب خارج الـ syntax تبعي، معناه فيه problem، معناه
ما طلعت الشجرة، عشان هيك مستحيل نقول أن الـ syntax
طلع صح إلا إذا نتيجة الشجرة طلعت معاه صح، هذه
باختصار الآن، لكن كيف التفاصيل بعدين؟ كيف بعمل
الخريطة؟ كيف بوصف الخريطة؟ كيف بعمل الـ model؟ كيف
طب الـ tokens بيجوني بالظبط؟ كيف؟ طب أنا بعمل مقارنة
إن الـ tokens اللي أجوني بنعملهم parsing من الشجرة
ولا لا؟ هذه التفاصيل الفنية بعدين هنشوفها لما في
وقت لها، احنا الآن بنتكلم بس إيش بنعمل في step number
two؟ لكن زي ما قلت فيه chapter كامل متكامل بكل
التفاصيل بعدين، ما تستعجلوش، خدوا الآن الفكرة العامة
لكل الـ 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
هنأ stop هنأ stop هنأ عشان يصلح
نفسه مش هو بترجع أنت لازم تصلح عشان يقدر ال code
يكمل لما تعمل computation هذه باختصار القصة فبنقش
نخربط الاشي في بعضه okay طيب لحد هنا في أي مشاكل
في ال syntax واضحة الصورة العامة، فضّالي طبعا،
لأ، شوفي ال lexical لازم يطلع كل ال tokens
بالترتيبو يبقى .. لأ بس مستناش .. هذه هناخدها
بعدين ال pass يعني مش فاكريش أنه بيروح بيشتغل و بيطلع
في الأول كل ال tokens وبعدين بعيد تفضل خد لأ
العملية كل واحد بيسلم التاني وكلّه بيشتغل فبنسميها
one pass بعدين هناخد ال passes يعني لما أخد كل
الخطوات هقولك برمجيا كيف بيخلصوا مع بعض لكن الآن
ايش بقولك؟ واحد بيسلم واحد يعني أول ما بيلاقي الـ
token الأول integer مش بيستنى بيقوله خد لجيتلك integer
اشتغل عليها عبال ما يجيلي التاني بيروح بيجيب
في التاني بيكون هذا كده قاعد يدور في العدة تبعته
وين هي دي؟ أي شجرة؟ من وين أبدأ؟ أه هذا ال
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 بدو
يعمل؟ غالبا أنه مثلا .. أنه إيش؟ لأ مثلا أنا مش
عارفة integer فوقه روح تستخدمته ممكن أنه يقول لي أنه
مثلا أنت هذا ال .. ال integer مفترض أنك تكوني عارفته
يعني جربتي بس بدنا الاشي أوضح كويس يعني جربتي طيب
في إجابة ثانية؟ طيب بدي أسألك سؤال الآن لو أنا
كاتب 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 وافترضي أن هذه
integer هذه مشكلة كيف بدك تجمع float مع integer طبعا
بعض ال languages ما بتسمح في هذه الشغلة بتقولك
ممكن تعملك إياها error وتقولك كده أنك تجي معاها
معاها ولازم أنت تعملها بشكل explicit وبعض ال
languages بتسمح لكن بتعملك warning أنه احنا حولنا
لك ال z هذه حولنا لك إياها ل float لأن كبدك تجمع
فبعملك إياها بعد جد warning صح ولا لا؟ طيب فمين
اللي عرف أنه هذه float ولا هذه integer وأنّه مسموح
ولا مش مسموح؟ ال semantic ال semantic بيشيك على ال
values بيشيك على ال attributes بيشوف صح هي
syntactically سليمة ك syntax مش فيها مشاكل لكن هل
ك values ك semantics مظبوطة ولا مش مظبوطة طب
أديكي غلط ثاني افترضي أن ال Y كان اسم function كيف
تجمع function زائد integer؟ صح؟ هي ك syntax مظبوطة ك
syntax ID يساوي ID زائد ID فاصلة منقطة لكن ك 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 افتح course number ساكر ال course فاصلة
منقطة ال syntax ما تكلفش فيه هي غبار لكن semantically
طلع فيها مشكلة من ناحية values و attributes طلع
فيها مشكلة ممنوع هذه بين الجثين تكون number float
لازم integer كيف أنت عارفة float مثلا هذه ممكن تكون
اسم function ممنوع ال y تكون اسم function لازم
يكون معرفة اسم array فهذه الأخطاء ماحدش بيكشفها غير
السيماتيكي يعني في عندي نوعية من الأخطاء في عندي
أخطاء syntactically على نطاق أو 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 مكتوب صح، أنا
بروح بترجملك إياه بلanguage ثانية صح، مو طول
السطر، أنت كاتب لي code غلط، أنا بدي أساعدك وأقولك
في عندك غلط هنا وهنا وهنا وهنا وهنا وأنت
زبط لي حالك بتدّيني في الآخر كودك صح بروح بتطب لكيه
أعيد كتابته صح بلanguage الجديدة إذا أنا بعد ما
بيخلص هو ال 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 لأ عشان احنا أقولك نكتبه بأفضل
طريقة طيب ما نكتبه بأفضل طريقة على طول ليش يعني ..
يعني أنا سؤالي كمان مرة على طول حول للـ ..
للmachine ليش تروح لل 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
تنتقل لمين؟ للmachine أسهل آخر فايدة عشان نخلص معلش
عشان نفس الموضوع مرتبط فيه افترضي أنا عندي هنا
Java وعندي C++ وهي ال intermediate خلاص وعندي هنا
ال machine Intel وهنا عندي ماكنتوش ولا قبل ولا أي
حاجة خلاص واتعبت أنا في الأول غيرت من ال Java لل
intermediate للـ .. لل Intel اجيت اقول طب إيش رأيكوا
نطبق ال Java مثلا على ال Macintosh ولا ال Apple
هل قاعد شغل النص الأولاني ولا أكمل في النص التاني
بس؟ شفتي كده؟ ففيش داعي .. يعني بقدر الآن نفس ال
.. النص اللي كنت عامله أشبكه انصاص على Macintosh
على كده ما قعدش الشغل كله شغلة تانية طب افترضي أنا
بديش بدي ال C++ على ال machine الأولى بس بغير النص
الأولى يعني إنه كيف أوصل ال intermediate ومعناه
هذي هذي عملها قبل شوية فبصير أنت بإمكانك الآن
تنتقل من أي language بدك إياها لأي machine بديك
إياها بـ effort أقل yes بغير النص هذا أو بغير النص
هذا وحتى لو أنا عامل الأنصاص كلها بصير أستخدم
الموجود خلاص ال C ما أنا عامل هذه من هذه وعامل من
C لها دي كده بصير أجمعهم تجميع هاي مع هاك هاي مع
هديك هاي مع هاك فبصير علي أسهل في عملية ال
combination هاي باختصار كل القصة واضح الأمور؟ طيب
احنا بس كل اللي سوينها اليوم بس شرحنا ال steps
الأولى الأربعة phases الأولى وفي العادة ال
compiler one اللي هناخده بس هنركز على هدول في
الشباتات النص التاني هناخده المرة الجاية نقول إيش
بيصير فيه لكن كما صح مش هنلحق نغطيه ليش؟ لأن هذا
compiler tool المفروض، بتغطي الكتاب على جزء اتين،
احنا الجزء الأول بركز بس على ال front-end، النص
الأولاني، فهذا كلهم هيكونوا شبات المستقلة بذاتهم
وأنا هناخدهم إن شاء الله بشكل مفصل، يعطيكم العافية