بسم الله الرحمن الرحيم اليوم إن شاء الله بدنا
نستكمل ما تبقى في chapter الأول اللي هو المقدمة
طبعا احنا يمكن المرة اللي فاتت وصلنا ل section
واحد تلاتة ويمكن محاضرتنا اليوم هيكون في معظمها
كلام ودردشة ويمكن هي تندرج تحت باب الثقافة العامة
في بعض المعلومات اللي هنتكلم فيها اليوم إن شاء
الله رب العالمينوطبعا ممكن المعلومات اللي بنحكيها
اليوم انت تاخديها up to date من خلال الجوجل يعني
مثلا اليوم نتكلم في section 1-3 عن تطور البرامج
لغات البرمجةلغات البرمجة ممكن تقسم إلى أجيال ممكن
تقسم في أكثر من تصنيف زي ما هنشوفه الآن في هذا ال
section لكن اللي بدأ أوصله أنه ممكن أنت كمان تدخل
على الجوجل من باب الثقافة العامة وتكتب نفس العنوان
the evolution of programming languages يجيبلك up
to date لأنه زي ما أنت عارفه باستمرار فيه تطور في
لغات البرمجة وفي تصنيفاتها فممكن على طول تكتب
وتشوفيup to date لكن احنا ان شاء الله هنتقيد
بالمعلومات الموجودة معنا بالكتاب يمكن الكلام اللي
هان مجرد معلومات انا بدي اذكرها يعني مافيها اشي
نقول والله بدي نشرح معناه مافيها اشي مش واضح ومجرد
سكاشن محتاجة انت تقرأيها عشان تعرف المعلومات اللي
فيها لكن بالتأكيد احنا اليوم ان شاء الله هنتكلم عن
هذه المعلومات اليوم يعني مثلا بيجي بقولككيف تطورت
لغات البرمجة أو كيف تقسم لغات البرمجة؟ طبعا
تقسيمات لغات البرمجة ممكن تلاقي أكتر من تقسيم هنا
في الكتاب فعليا ذاكر نوعين من التقسيمات تتكلم في
الأول على أساس تقسيمها كأجيالإيش كان الجيل الأول،
إيش الجيل التاني، إيش الجيل التالت و هكذا و صار
يسرد في كل جيل و يتكلم و يعطي فيه أمثلة على سبيل
المثال الجيل الأول أتوقع كلنا عارفينه إيش الجيل
الأول تاع لغة البرمجة تتوقعيه ال machine language
أنه أنا أول برنامجكنت أنا أقدر أكتبه لازم أكتبه
بلغة الأصفار والوحيد لأن ال machine ماكنتش تفهم
مني إيه الأصفار والوحيد فهذا يعتبر الجيل الأول
اللي هو لكل machine فيه لها لغة خاصة فيها ممثلة
بالأصفار والوحيد طيب إيش تتوقع الجيل اللي وراه؟الـ
assembly أو الـ low-level machine languages يعني
بدل ما أنا أكتب أصفار ووحيد بدي أكتب على شكل add،
sub، مش عارف إيش، لغة ال assembly أخدتها فهذا
يعتبر طبعا جيل تاني يعني بعد الجيل الأول أجى جيل
ال low-level machine languages زي ال assembly طيب
إيش تتوقع بعد هيك ممكن نقول في جيل كمان ال high
levelيعني ممكن بعديك نقول أجهزي التالت من الـ high
level languages ولاحظ إن هذا لحاله ال band ممكن
يقسم لأجيال لحاله وممكن يقسم لفئات لحاله هو طبعا
في الكتاب ذكرهم خلاص كانوا واحد high level
language لكن المقصد إن هذا حتى هو أنواع يعني على
سبيل المثال ماكانش في object oriented ماكانش في
features كتيرة في اللغات الأولى اللي كانت موجودةزي
الـ C مثلا، شوية قال لا يا عم احنا بنحاول نطور
أكتر، نحاول نضيف ال object oriented بكل الخصائص
المفيدة فيه، زي ايش مثلا خصائص انتوا أخدتوها في ال
object oriented؟ال inheritance ال polymorphism ال
abstraction إلى آخره في خصائص كتيرة تمام في لغة
البرمجة زي مين زي ال C++ زي الجابا إلى آخره فهذا
جيل كامل وفيه تفصيلات و أنا حتى لما بذكر في الكتاب
بذكرك الأنواع بقولك زي ال C كانت كذا زي ال Pascal
كانت كذا زي ال C++ صارت كذا إلى آخرهطيب في جيل
كمان؟ أه ممكن في جيل و جيل و جيل حسب التقسيمات إيش
في جيل بعدين أجهزة؟ جال باختصار أنه لكل
application مرات بيكون فيه برنامج أو برمجة خاصة
فيه يعني عملوا لغات برمجة مخصصة لشئ معين أو ل
application معين زي مين مثلا؟ زي ال SQL ال SQL
ببساطةمخصص لمين لل database و الاخره و زي لغات ال
ايش ال script languages و ال bhp و ال python مش
عارف مين و مين و مين و مين الاخره يعني بتلاقي طبعا
جيل ورا scripting languagesتطور في لغات البرمجة
بشكل مستمر تمام؟ طبعا مش بس الأجيال هذه اللي
ذكرتها انت زي ما قلت لو انت تروح تفتح في ال google
و تكتب بس بحث في ملف تشوف يمكن تلاقي ضايف السادس
السابع الاخر ايه حسب وين احنا up to date المهم انا
من باب المعلومات العامة طيب ايضا لو جيت تقرأ هنا
بتلاحظ انه ممكن كان يقسم لغات البرمجة إلى فئتين
رئيسيات هذا تقسيم اخر حاجة بيسموها imperativeوحاجة
بيسموها declarative ايش الفرق بين ال imperative و
ال declarative اه ايش هذه و ايش هذه توضيح كويس
بدنا توضيح طبعا بالنسبة لل imperative باختصارhow
we can do the computation يعني كيف احنا بنقدر
نحوسب كيف بنقدر احنا نبرمج زي ما بتعمل انت باختصار
بال C++ و باليابا مش انت اللي بتقعد تكتب ال code و
بتفكر ايش اللي بيجتعمله عشان تعمل ال task المحددة
فانت قاعد عامل بتكتبي كيف بدنا نحوسب او كيف بدنا
نعمل ال task الفلانية فهذه اللغات بنسميها
imperativeبينما في في الشقة التانية declarative
وهي إيش بتقول what computation we need to do يعني
إيش ال computation اللي بدنا نعمله يعني function
جاهزة method جاهزة command جاهزة كل إشي جاهز مابدى
أفكر كيف أقعد أبرمج الشغل بس مجرد استخدام لل
facilities الموجودة لل functions الموجودة لل
methods الموجودة حتى أنا أقدر أبرمج ففي اختلاف في
الفلسفة بين هذه و بين هذه بس الشهد اللي بدأ أقوله
هان إنه هذا تصديف تانيو ممكن تلاقي تصنيف تالت و
تصنيف رابع و الاخرى بس احنا هنكتفي بهذا القدر من
التصنيفات في هذا ال sub-section تمام؟ طيب الآن في
section 1.3.2 بتكلم برضه في موضوع في غاية الأهمية
impacts on compiler و هنا فيه تلت نقاط رئيسية بنحب
نوضحهاالنقطة الأولى واتكلمنا فيها قبل هيك أنه في
challenge موجودة على ال compiler أنه بده يبرمج أو
يترجم unlimited codes صح؟ هل أنا بلغة ال Java مثلا
أو بلغة ال C++ بعمل عدد محدود من البرامج؟والله
infinity عندي infinity من الأكواد اللي ممكن تنعمل
صح ولا لأ المفروض ال compiler يكون عنده القدرة على
ترجمة كل هذه الأكواد ال infinity أي code ينكتب
بهذه ال language المفروض ال compiler يكونيش عنده
القدرة ان يترجمها وهذه ال challenge رئيسيةطيب ايش
الشغل التاني ال challenge في نفس الموضوع انه لما
بيروح يعيد كتابة ال code لازم برضه يكون efficient
ال performance تبقى عالي يعني بمعنى و هذا مثال
ضربناه قبل هيك لما نيجي نقول حوالي من هذا ال high
لـ LOW وخلّينا الأربع اللي قاعدين في الأول كل
واحدة تعيد كتابة ال code بالـ LOW أكيد الأربع
هيختلفوا مع بعض أكوادهم وأكيد يمكن code ها أو code
ها يكون more efficient من ال code التاني صح ولا
لأ؟ الآن المشكلة ان ال compiler مش بس بدي يروح
يترجم وخلاص ويحاول يكتب أحسن code ممكن من ناحية ال
performance و ال efficiency فهذه ال challenge
تانية مهمة في موضوع ال compiler يعني مش بس ترجم
ويعطيك العافية لأ ترجم و بأفضل طريقةالـ Challenge
تالتة موجودة أنه لازم يكون عنده المقدرة على
استكشاف الأخطاء وإبلاغ رسالة فيها أو إعطاء رسالة
بالأخطاءو مش إنه أول خطأ يوقف و يطلع من البرنامج
لأ المفروض إنه يحاول لما يلاقي الخطأ يكون دقيق في
تعريف هذا الخطأ ما هذا الخطأ يقوله بشكل واضح
برسالة تمام و يقدر يكمل يفحص أيش بقية ال code فهذه
كلها challenges موجودة في ال compiler طيب إيش فيه
تأثيرات تانية على ال compiler تؤثر عليه و ال
compiler يؤثر عليها شغلتين كمان نذكرهم و هنفصل
فيهم كمان شويةموضوع ال software الان كيف موضوع ال
software؟ انا الان لما بكون عندي مثلا لغة برمجة
اكيد هيكون في المقابل لها compiler صح؟ علشان يترجم
الأكواد المكتوبة فيها للغة ال machine طيب الان
لغات البرمجة هاي مش بيصير فيها تطور مش بيصير فيها
إضافة لل features يعني زمان كان في Cماكنش هتش
object-oriented أجه بعد هي كالـ C++ صار فيها
object-oriented صار فيها خصائص صار فيها features
زيادة صح ولا لأ؟ طب اتخيلي جدلا أن ال compiler غير
قادر على التعامل مع ال features زيادة مستحيل
يترجمهم مثلا يبقى أنا ماقدرت أضيف .. ماقدرش أضيفهم
في الحالة هذه لل high level language لأنه أصلا
عملية ترجمتهم مستحيلة لكن مش هذا ال case طبعا لأ
ما بتترجموا بس الفكرة يعني وين أن أي شيء بنعمل
إضافات و تطور في ال language لازم نكون ماخدين
بالنا أن ال compiler بيقدر يترجم و يتعامل مع هذه
الشغلات برضه بشكل فاعلشوفت انت كيف؟ عشان هيك بيصير
باستمرار بفضل وجود ال compiler design و بفضل وجود
التقنيات اللي فيه بتصير ال languages عامال
باستمرار تتطور و في أجيال بتصير ليش؟ لأن احنا
عارفين ان هذه ال techniques اللي موجودة في ال
compiler بتساعدني ان اترجم هذه الشغلات اذا النقطة
هنا اللي بدنا نوضحها ان يبقى في تأثير من ال
software او من ال level high level language على ال
compilerلأن كل feature زيادة بتنضاف لازم ال
compiler ماله يكون عنده المقدر يتعامل معها
ويترجمها صح ولا لأ؟ إذا في واضح ارتباط بناتهم و
لازم كل compiler على الطلاع بهذه ال features زيادة
هكذا يتعامل معها واضحة الفكرة هنا أنه في واضح تأثر
بين ال compiler و بين مين؟ بين التطور اللي بيكون
في ال languages بين ال features اللي بتنزد في ال
languages كمان مرة زي ايش ال features؟الـ
Polymorphism الـ Abstraction الـ Inheritance الـ
Object-oriented نفسه أي تطور، أي استحداث في هذه
اللغة لازم الـ compiler يكون عنده المقدرة ان
يتعامل معاه و يترجم و مافيش مشاكل و ب performance
عالي كمان واضحة الفكرة كيف؟ طيب في نقطة تالتة مهمة
وهذه هنفسر فيها كمان شوية في المحاضرة لقدام ويمكن
تستغربي منهاإن كذلك ال hardware يؤثر ويتأثر بال
compiler ال بعض ممكن يقول طب إيش دخل ال hardware؟
يعني ماشي ال compiler software برنامج بترجم من
high level language ل low level language طب إيش
كيف ال hardware هذا اللي بنتكلم فيه؟بدو ياخد باله
من ال compiler وكيف ال compiler بدو ياخد باله من
ال hardware غريبة شوية لكن هذه الإجابة مش هاجاوب
عليها الآن عشان ما نكررش الكلام مرتين هاجاوب عليها
في نص المحاضرة لأنه هيجينا subsection بس مخصص كيف
ال compiler تأثر وأثرفي ال hardware فهذه هنجيها
احنا كمان شوية اما هنا بس ك sub-section بذكر بس
تلت نقاط الرئيسية ال challenges بتاعة ال compiler
اللي اتكلمنا عنها كيف يؤثر ويتأثر بال high level
language و بال features سبعتها و انه ايضا يتأثر و
يؤثر في موضوع ال hardware زي ما هنشوف في التفاصيل
ان شاء الله كمان شوية طبعا طيب الان في section 1.4
بدوا
يأكدلي على نقطةاتكلمنا فيها كتير قبل هيك قالة وهي
أن ال techniques المستخدمة أو اللي بيستخدمها ال
compilerأنا بأقدر أستخدمها في حاجات تانية هذا احنا
متفقين عليها تمام؟ و بعدين بيؤكد على نقطة تانية في
غاية الأهمية أن أساسا ال compiler أو العلم تبعه
استخدم علوم موجودة من أول و جابها و جيرها لل
process بتاعة ال compiler زي ما هنشوف أمثلة عليها
يعني مش أن ال compiler عمل حاجات جديدة بس لأ في
علوم كانت أصلا موجودة جابها و استخدمهاو هنا بدك
تركزي على الفكرة عشان تستفيدي من مادة ال compiler
انه كيف جاب ال items هذه من برا وجيرها في عمل شيء
معين في المستقبل عندك software application بدك
تعمليه ممكن تجيبي هذه الشغلات اللي من برا وتستفيدي
انت منها فيها في كودك زي ما ال compiler رخدها
واستفاد منها ممكن تعمل نفس الحركة بس مش لشغل
compiler ل software ال compiler ل software خاص
فيكي عشان هيك بنقول دايما ركزيفي ال methods اللي
جابها في ال techniques اللي اتعامل معها كيف عملها
كيف سوى ال task وهذا هشوف في التفاصيل لكن هنا هو
يكتفي بذكر أنثى لك وانا هتكلم عنها الآن طبعا
تتذكروا ان احنا اول phase كانت في ال compiler ايش
هي lexical analyzer صح ايش كان بيسوي ال lexical
كان بيقطع الملفالى tokens باختصار هى كان شغله طبعا
معاك خبر انه هذا ال lexical analyzer استخدم أشياء
موجودة في مساقات أخرى وفي مواد تانية و جابها عشان
يعمل هذه ال task زى ايش حاجة اسمها finite state
machine أخدتيها ولا لا أخدتيها في مادة تانية اللى
هى ال transition diagram والدوائر والدراهاي
للدراهاي للدراهاي للدراهايفما تتفاجئيش لما نوصل
chapter ال lexical أنه جبنا حاجة معروفة من زمان
عشان أسهل عملية التقطيع لكن لسه كيف أخدتها، كيف
استخدمها أنا مش عارففانا هتعلم هذا الكلام كيف أخد
ال state diagram وعمل ال task عشان انت في المستقبل
تعمل إزاي و تجيب ال state diagram و تعمل ال task
اللي بيكيها فهذا هتكون إيجابية و أنا أتأكد أنه أخد
أشي كان موجود مش بس هي كمان هذا ال lexical
analyzer أخد علم كان موجود استخدمه اللي هو موجود
في الجابر الخطي اللي هو regular expressions لسه
انت مش عارف امكن ان انا مش متذكر ايش regular
expressions انا في وقته هي عبارة عن معادلات رياضية
بشكل رياضي معادلات نستخدمها لوصف ال token احنا كيف
بنوصف مثلا ال token اللي هو ID مثلا؟ عبارة عن
letter followed by letter or digit صح؟ بس أنا
وصفته بإيش؟ بكلامفي المستقبل هشوف إن هذا ال token
أنا بقدر أوصفه بمعادلة رياضية regular execution
تفاصيلها هشوفها بعدين طب إيش العبرة؟ جالبا أنا لما
أوصف الاشي بشكل systematic كمعادلة و هذا يتحول
بشكل systematic ل finite state machine و ال finite
state machine بشكل automatic بتطلع code ما خلصت
الجثة بدون تعب أنا صرت أعمل شغل lexical
straightforward على طول واحد زي دلوقتي سوى اتنين
لأن انت في اللواحل الأولى تتخيل الكود هيكون صعب
وكيف أقطع ومش عارف ايش لكن بعد ما تاخد ال
techniques الموجودة اللي كانت وكيف جيّرها مع بعض
وكيف استخدامها لعمل ال task المطلوبة هنا هتستفيد
كتير هصير يقول طب ما أنا أعمل زي هيك في المستقبل
ما أنا أجيب الفينات و أجيب ال regular و أعمل كذا
أو أسوي بهذا الكلام ان شاء الله هيفيد لكن في حينه
المهم انه واضح ان ال compiler اتعاملمع أشياء كانت
موجودة علم موجود و أجى وجيره حسب ال step المطلوب
منه مش بس هذا المثال ال phase اللي وراها شو كانت؟
syntax analyzer صح؟ ما تستغربيش إذا قلتلك و قلنا
هذا الكلام إن احنا هنجيب علم literaryو نستخدمه في
عملية ال parsing هذه طب ال tree أخدتوها قبل هيك
موجودة طب هده إيش هيوفر عليها؟ هيوفر عليك كلام
كتير لأن ال tree لما أخدناها أخدنا فيه إيه لها
ملحقات ال depth of traversal ال bottom up ال notes
كيف نزورهم مش عارف إيش أخدنا كلام كتير طب أنا جبت
هده كله جاهزلعملية ما في ال compiler فبريحني ان
هذا الاشي موجود استخدمته وزي ما ال compiler أجى
واستخدمه بشيء معين انت بكرا ممكن تستخدميه يعني أنا
متأكد انتوا خلصوا data structure مش جاي على بالك
كيف ممكن أستخدم ال letter E ايش بدها تلزم ال
letter E بكرا في المستقبل في ال application تبعي
صح ولا لأ لكن لما تشوف ال compiler كيف استفاد من
هذا العلم وجابه وعمل taskاللي هي المقارنات اللي
اتكلمنا عنها هتصير تعمل ازاي في المستقبل تقول اه
طب أنا مقدر استخدم ال tree هان او هان او هان شوفتي
كيف هذا الكلام مفيد ومهم طيب مش بس استخدم ال tree
كمان syntax analyzer استخدم حاجة اسمها context
free grammar للاختصار بنقول grammar تمام؟هذا برضه
كان موجود، ممكن ما أخدتهوش انت قبل هيك، لكن هذا
برضه عنه موجود، إيش ال context free grammar وكيف
بنكتب؟ هذا هنتعرف عليه احنا ان شاء الله خلال ال
comparison، لكن هذا إشي موجود طبعا هذا استخدم و
ليش هو عندنا؟ استخدم عشان يعمل modeling لل syntax
تبع ال language، عشان قولنا فيه ال language إلها
syntaxلازم يتعرف ال syntax analyzer على ال syntax
كيف يتعرف على ال syntax من خلال حاجة اسمها grammar
حتى جريبة على الإنقليزي مش ال grammar بعرفك كيف
تكتب و كيف تعمل في ال language نفس الفكرة أنا عند
ال language high level لغة برمجة فكيف أوصفها بال
grammar هذا العلم لحاله انت ممكن برضه تستخدمه
مستقبلا توصفي شغلها بال grammar هذاشوفتي كيف؟ فهذا
ان شاء الله كله في حينه هنشوفه إيش ال grammar كيف
بيوصف، كيف بيعمل model، طب إيش ال tree؟ طب كيف ال
tree مع ال grammar اشتغلوا؟ كيف عملية ال parsing
بتتم؟ هذي ان شاء الله كله هنجاوب عليه في وقته في
حينه، لكن احنا بس كل اللي بدنا ياها شغلة واحدة أنه
تشوف بالفعل أن ال compiler استفاد من ال science
الموجودة في عملية البناء تبعتهتمام؟ طيب، الآن في
شغلة تانية برضه في هذا subsection مهمة واتكلمنا
عنها كتير و تعتبر كمراجعة برضه أيضا موضوع ال
optimization احنا قلنا قبل هيك انه بعد ما بنكتب ال
intermediate code representation أو حتى بعد ما
بنكتب ال assembly language الأصل يكون فيه
optimizationتمام؟ طبعا ال optimization في اندي
أربع objectives رئيسيات أربع أهداف رئيسيات أربع
goals رئيسيات وهي هم عاملين ك summary هان هدول
بنركز عليهم ونفهمهم شو هم تمام؟ هذا قلاصة الصفحة
اللي بتتكلم عن ال optimization لكن احنا فاهمينا
حتى قبل ما اتطلع فاهمينا بده يخل باختصار ال code
ماله و هيك بالبلد يخل ال code more efficient صح؟ و
أسرع و أحسن مش هيك ولا لا؟ لكن تعالى نشوف
بالتفاصيل ال objectives إيش بقول فيها أول حاجة
the optimization must be correct وهذا طبيعي
منطقيا، منطقيا جدا انت عندك code مكتوب، صح؟ بدك
تعيدي كتابته بطريقة أفضل، صح؟ لازم يكون correct في
الأول، قبل كل حاجة لازم يكون صح لازم يكون نفس
المعنى تبع من؟ تبع اللي انا اشتغلت عليه فهذه أول
حاجة، ايش الفايد اروح اكتب code تاني high
performance لكنه يختلف عن الأولانيأو له معنى مختلف
وهذا غلط اذا اول نقطة مهمة انه لازم احافظ على نفس
المعنى ونفس المفهوم تبع هذا ال code يعني ال code
اللي بيطلع معاه هو equivalent في المعنى نفس المعنى
فعشان الكلاب يقولي بشكل واضح وصريح لازم يكون
correct هذه اول نقطة اهتم فيها في ال optimization
تكون صح بكملت نفس المعنى بتاع ال code الأساسي اللي
اشتغل عليه طيب ايش فيه كمان؟الشغلة التانية المهمة
يجب أن تحسن عملية البرنامج أو العديد من البرنامج
لازم في النهاية هذا الكود اللي طلع معايا ماله يحسن
عملية البرنامج أنا ليش .. ليش بعمل optimization؟
مش عشان يصير more efficient عشان يصير البرنامج
أفضل وأحسن يبقى بالعربي لازم ال performance تتحسن
فهذه نقطة مهمة بقول صح أنا بدي correct ونفس المعنى
لكن بالتأكيد بيهمني كمان يكون ال performance تبعه
كويس فهذه نقطة اتنين هذه objective مهمة في موضوع
ال optimization عشان هيك الشبات المتأخرة في الكتاب
ال optimization و ال methods و ال techniques و ال
algorithms كلها ليش هذه كلها علشان كيف نقدر نعمله
و نعيد كتاب بشكل سليم و performance يكون ماله كويس
طيب تعالى نقطة تالتة مهمةthe compilation time must
be reasonable ايش بقصد فيها هنا انه لازم الوقت
الكلي في النهاية تبع ال compilation يكون معقول
ومقبول كيف يعني اديكي مثال افترض ال code قبل ما
اعمله optimization مثلا بقعد خمس ثواني مثلا روحت
انا اعملت code تانيالـ code التاني صار بتنفذ في
أربع ثواني مثلا لكن ال process نفسها أني عشان أعيد
كتابته أظبطه أخدت ثانيتين مثلا من عند هيك الفرضية
صار كله بعد ال optimization مع ال optimization كام
ثانية؟ ستة لأ لسه لو خليته أحسن ليه لأنه كان خمسة
بدون ما أتعاب و optimization و واجت و التسريع اللي
صرعته إياه ماستفدتش منه كتيرعشانك بقولي خد بالك من
النقطة هاي في الآخر بدي أكون الوقت الكلي لل
compilation بعد عملية optimization معقول و يكون
فيه تحسن فدي نقطة مهمة إيش الفايدة؟ أروح أسرعه
أخليه بدل يقعد دقيقة يقعد ثانية و عملية ال process
اللي هي تقعد لساعة وش استفدت من كل هالقصة؟ شفتي
إيش الفكرة؟ فكله مع بعض و بدي يشتغل بعدين دي ليه
بالك؟ في بتحس أحيان التضاد trade of تعاكسأنا بدي
كودي يكون أفضل ما يمكن ما أنا بتوقع ال process
تطول أكتر عشان أقدر أكتبه أحسن ففي هنا تعاكس بتحسي
كل ما بدي أظبطه أكتر كل ما أ spend time أكتر عليه
عشان يتظبط أكتر شوفت انت كيف في تعاكس لازم اوازن
الموضوع بحيث انه خلاص ال total تاع ال compilation
يكون ماله أفضل واضحة كيف النقطة؟ طيبأخر نقطة ..
طبعا بنات كل نقطة في هدول انفصلة في الشرح بس انا
بديك ال summary و بعدين تجري قراءة عامة مبدوش اشي
.. ايش رأيك في النقطة الأخيرة؟ و هاد بدي تحاول انت
تشرحليها the engineering .. خلني بس أكبر عشان برضه
يبين في التصوير و كل هذا طيب the engineering
effort required must be manageable ايش يعني؟ ايش
بقصوده؟إيش رأيكم؟ ما معنى النقطة الأخيرة؟ يعني
النقاط التلاتة اللي فوق واضحين علينا، طب إيش
النقطة الأخيرة بقصود فيها؟
بدي
أوضح من هيك، إيش رأيكم؟ بدنا أوضح من هيك الكلام
إجابة sorry بس فرضه بتدعي .. كمان كويس يعني انتوا
بتجاوبوا صح طيب في حد بيجاوب كمان يعني بشكل مصطلح
الفكرة انه مش بس يعدي يعدي بشكل يعني مجروح يعني في
عنده إدارة في ترتيب ال code على كل حوال انتوا يعني
بتجاوبوا مقاطع لكن خلّيني نقول إيش النقطة هي
بتتكلم فيها بالتفصيل طبعا هذه النقطة مش بس لل
optimization هذه لأي software application بتعمليه
إيش بقولك بقولك في النهاية هذا ال compilerهو ال
software تمام؟ ومطلوب منه كتير شغلات و تعقيدات
مظبوط او لا ده؟ عشان تقول المفروض ان نحاول نعمل
هذا ال software بأبسط طريقة ممكنة ليش؟ علشان حتى
لو كان في maintenance بدي أعمل صيانة صار في مشاكل
في ال code تكون مايكلفنيش cost كبير هذه شغلة
الشغلة التانية أحيانا بدي أضيف تحديث أحيانا بدي
أعمل updatingفالمفروض يكون فيه إمكانية أني أطور
عليه و أعدله مش أكون عامله تخيلي معمول بشكل معقد و
ماحدش قادر يفوت فيه و هيك تكتلات في بعضها مثلا و
انعمل بوحدة واحدة و جينا بعد أسبوع من عمله و الله
شهر قولنا فيه features بدنا نظيفها أو بدنا تحسين
نعملهمش هعرف أعمل فيه حاجة لأنه دا في بعض ومش مبين
ولا حاجة فيه وبالتالي هدا هيكلفني cost أكتر
ويكلفني maintenance ويكلفني قصص كتير لكن اتخيل
الأمور واضحة ال system simple كل إشي واضح فيه
فبالتالي بيسهل عليه عملية ال updating بيسهل عملية
ال maintenance بيكون ال cost مالهأقل و هذه النقطة
دي لبالك مش خاصة بس بال compiler باختصار هذه أي
software أو أي application بتعمليه لازم تهتم في
هذا النقطة و هذه أحد مراحل ال software engineering
بتلاقيها موجودة انه لازم يكون فيه قدرة على ال
maintenance و ال updating و المحافظة على ال code و
التطوير و الاخرين فهذه النقطة الأخيرة بتتكلم في
هذا الموضوع انه صح هو معقد شغله لكن لازم يكون ال
compiler هذا ال softwareمبسط قدر الإمكان في مقدرة
أنه نقدر نفتحه و نعمله updating في مقدرة أنه نكون
نعمله صيانة و نعمله بأقل التكلفة هاي كل الفكرة
تبعتنا عشان هيك أجال in general أجال ال F4 بتاع ال
engineering يكون قليل و manageable يعني بقدر أطوره
و أحكي و أشغل عليه هاي باختصار النقاط الرئيسية
الموجودة في ال optimization تمام؟ طيب الآن خلونا
نتابع في section 15 تمام؟
طبعا معلش و كلامنا اليوم للأسف كله هيكون دهش زي
هيك كله ثقافة عامة و مجرد معلومات يعني هذا زي ما
انا قلت قبل شوية هيك طبيعة السكاشي اللي بس بدها
منك مجرد قراءة و تستفيدي من باب الثقافة المعلومات
اللي فيه لكن ان شاء الله احنا نبتدأ من شفطة
الأتنين هنبدأ نكتب بدينا و نجرب و نشوف techniques
و طرق و تصير الأمور أفضل لكن الشفطة الأول هيك
طبيعته بده شوية رغي و تركيز طبعا؟ طيب الآن
applicationsof compiler technology وهنا برضه احنا
بنأكد على الكلام اللي قلناه قبل هيك انه ال
compiler design استفاد زي ما قلناه قبل شوية من
علوم موجودة وبالتالي ممكن استخدامه هو نفسه في
أماكن تانية مختلفة مش بس من high to low فممكن
نستخدمه في أي مكان تانيال techniques اللي أجد تبعت
ال compiler ممكن استفادة منها وين زي ما قلنا في
أماكن أخرى فهذه المعلومات مابدك تنسيها تمام و برضه
ماننساش أن ال compiler design يتأثر و يؤثر زي ما
قلنا قبل شوية بال software و بال hardware و هنا
بيصير يدخل شوية في التفاصيل خصوصا في ال hardware
اللي احنا أجلناه قبل شوية تمام طيب أول ما بدأ جال
من تطبيقاته أنه أنا بقدرأعمل implementation أو
تطوير لل high level language وهذه حقيقة، ليش؟ لأنه
تخيلي أنه أنا ماكنتش قادر أعمل compiler جدلا، إيش
كانت النتيجة؟ النتيجة ماكانش هيكون عندك high level
language، اختصار مش كان اتفقنا قبل هيك أنه لما
الناس فكرت تتطوروتنتقل من الجيل بتاع ال assembly
وتروح للجيل بتاع ال high level مش قلنا لازم يكون
فيه شرط اتفقنا عليه في البداية شو الشرط ان يكون في
حد موجود يعيد كتابته بال low level صح ولا لأ ولو
هذا الحد مش موجود مستحيل اذا هنا بدأ ناخد الصورة
يعني ان وجود ال compiler design وجود ال techniques
بتاع ال compiler قدت الوجود من ال high level
languages باختصارهذه شيء مهم مش بس هيك وجود ال
compiler design أدى إلى تطور في لغات البرمجة و في
إضافة ال features اللي اتكلمنا عنها قبل هيك
فبتكتبلى القصة هيك طب أنا بتعطي مثال من واقعي
الموجود هنا .. في المذكور جال لغة زي ال C لغة زي
ال C كانت تتعامل معال level ال watt اللي في ال
machine اللي هو من التعامل مع ال registerات
التعامل مع ال memory من خلال ال pointers فكان في
عندها features الجابة اللي عفوا ال C انها التعامل
مع الحاجات اللي الداخلية بتاعة الجهاز تمام؟ وهذا
طبعا فيه إيه إيجابياته و فيه إيه سلبياته من أهم
سلبياته أنه أنا كمبرمج مش فاهم إيش اللخة إيش القصة
ممكن أجع في infinite loop ولا أجع في حاجة يروح
يشطبل من ال memory كتير معلومات إلييعني مثلا انا
كنت عامل ملف word حاطط فيه شوية معلومات ومسكره
وصارت من خلال برنامج لغة ال C صار فيه إمكانية أدخل
على ال memory في ال pointerات صرت أغير في القيم
اللي موجودة في ال memory عملت infinite loop انا مش
ماخد بالي الاخير هوب اللي انا لاجي معلومات اللي
كانت في الملفات التانية راحت طب ليش راحت؟ لأن كانت
اللغة بتاعة ال C تسمح باللعبفي الرجسترات تسمح
بالله في ال memory تسمح في ال pointer تسمح أنه
أتشتغل في الحاجات هذه طيب الآن لما ال .. طبعا
المبرمج لما ببرمج في ال .. في ال C أو في ال high
level language بيكونش لسه قاعد بيفكر كيف أنا
أستخدم الرجسترات بشكل فعل قاعد بفكر كيف أعمل ال
task بتاعة ال computation عشان هيك هذه تعتبر سلبية
كانت موجودة في ال Cفلما اتطور ال compiler أجت
الجابة إيش قالت؟ الجابة مثلا قالت إحنا بدنا نمنع
الناس يلعبوا في الشغلات اللي تحتهاي بدأ أمنعه يعمل
pointerات مثلا الجابة هذا التطور كان موجود بدأ
أمنعه يلعب في الرجسترات بدأ أمنعه الاخر طب يا عم
أنت منعته بالأمور هذه طب كيف ال code اللي عمل
إفشان قال هذه مسيوبة لل compiler تبعيها شوفتي كيف
جالمش ال compiler بتطور وفي techniques وفي تحديثات
أنا خلاص المبرمج ماعليه إلا يكتب code ويكتب
الشغلات اللي بدهياها وهذه أنا شغلتي جوا أنا مع ال
operating system مع ال compiler اللي نفكر كيف
نستغل ال resources اللي جوا بأفضل طريقة ممكنة عندي
عشر رجسترات عندهم meet variable كيف أستخدمهم
بطريقة ال efficient wayفصارت هذه ال details اللي
أنا مخبّى على مين على المبرمج صار همه يكتب ال code
بطريقة سليمة تمام و يهتم بالحاجات العادية ماعملش
loops على الفاضي ماعملش ال variables على الفاضي
الاخره و بعدين في عملية التحويل صار ال compiler هو
اللي ايش بيفكر يسوي عاد انه يعمل التحسينات هذه لأن
ال compiler ايش بيشوف دي rebelcon ال compiler
بيحاول من ال highبحوّل لل law للغة ال machine
فبيكون فاهم إيش ال instructions تبعات لغة ال
machine وكيف يتعامل معاه وإيش موجود جواتها
وبالتالي صار هذا على عاطق ال compiler طيب اتخيلي
ال compiler مش قادر يعمل هذه القصة كان ماجاتش
تجابة تقول ممنوع يلعب في ال memory ممنوع يلعب في
كذا ممنوع .. شفتي ليش؟ بس إيش اللي سمح؟إنه ال
languages فيش تتطور و تقول لأ لأ خلاص خلّي هذا
التفاصيل الصعبة اللي جد ميت مش هتقنها كويس خلّيه
يركز في برمجته و أنا بدي أعمله وياه من خلال ال
compiler طب إيش اللي سمح هذا الكلام؟ وجود ال
compiler و التقنيات على ال compiler و تطور ال
compiler المستمر صح ولا لأ؟ يعني واضح المنطق كيف
بيشتغل؟ افترض ال compiler مش قادر يتعامل مع الفئة
اللي تحتها دي مثلا بديه سيبقى كل language ترجع
تقول للمبرج انت حر و شوف اعمل .. مش هيقوله لأبس
طالما قدرنا نتعامل معاها ده القصة ريحنا المبرمج
خلاص صار المبرمج بس كل فكرته هات function هات مش
عارف ايش اعمل ال loop صح ولا لا لكن الأمور الفنية
تحت اللي تخلي efficient صارت متروكة عالميا مش بس
compiler في operating system طبعا في القصة و أخدت
operating system لكن أنا بركز على جزءية ال
compiler لأنه في عنده code مكتوب في عنده شغلات
بيتعامل معاها كيف بيتعامل معاها بشكل efficient لما
يعيد كتاب ال code بس هي كل الفكرةفبس هاي اللي بدي
أقوله في الكلام هذا أن وجود ال compiler أدى
باختصار هاي ال summary أدى إلى وجود ال high level
languages و أدى إلى وجود التطور فيها راح للمبرمج
أنه خلاص يركز يبرمج و خلاص بدوش تفاصيل تحت، هاي
باختصار، تمام؟ طيب، الآن مثال تاني اللي
هو اللي بنفصل فيه
مش فاهم السؤال مافيش شي اللي جابل طبعا عندك قولنا
بيأثروا على بعض احنا طبعا قولنا بتأثروا على بعض
كيه بيأثروا على بعض الان ال compiler ما بنعملمش
فيه جيه وقلنا إله techniques معينة إله طرق معينة
عساسي أننا نعرف أنه كيب بنعمل بتساوي الآن الإثنين
مرتبطين في بعض زي ما قلنا قبل شهر بيأثروا على بعض
الآن عملت ال high level language ليش؟ لأنه لقوا
إنه في techniques معينة في ال compiler بقدر
استخدمها يعمل automatic ويرجع الكود المكتوب،
مظبوط؟ الآن الإثنين بتطلعوا مع بعض، على بعض، الآن
ال language ده تطور featuresبتعمل تحديثات تعمل
تحديثات ال compiler هل في techniques و هل في
تكنولوجي و هل في تطور ان نقدر نتعامل مع ال
features زيادة عشان نقدر نكمل ولا لأ طبعا لازم
دايما يكون في techniques لهان و لهان فالاتنين
بتطوروا هذا ضاف الamorphism abstract مش عارف ايش
بدل ال compiler يضاف عليه شغلات اللي تسمعبتطور هذا
الكلام فطول ما فيه تطور في ال .. ال compiler يؤدي
لتطور في مين؟ في ال language الآن مثلا أجى فكرة في
ال high level language مثلا زي ما قولنا في ال C
ليش أخلي الناس تخرر تحت في الجهاز و تلعب في
الرجسترات و ندوشها في القصص هذه طب هل بنقدر ال
compiler نخليه هو اللي يهتم بالقصص هذه و نريح
المبرمج ولا لا؟ إذا لجى حاله مقدرشهيظل زي ما هو
يسمحله لاجى حاله بيقدر يقول طب خلاص احنا بنريح
الناس لأن احنا قلنا دايما التطور المستمر في ال
language ليش؟ في ال high level عشان يريح المبرمج
قدر الإمكان فكل مرة بيشوف كيف انا ممكن اريحه، ايش
في مشاكل كانت عنده، ايش ممكن انا استبعدها، احملها
على compiler، احملها على operating system، ليش؟
لأنه كمان مرة انا كمبرمج بيهمنيش ال machine من تحت
ايش بتسويبيهمنيش كيف بتشتغل ال hardware تحت أنا
كمبرمج أنا بس بدي برمج في ال task كده تطلع معايا
صح ولا ده؟ مين اللي إله علاقة بال machine سواء ال
operating system أو ال compiler هدول اللي بيشوفوا
إيش فيه و إيش متحول و إيش ال assembly و مش عارف
إيش فعشان الجهة اللي طبعا خليها تتحمل على ال NASA
دول إذا بنفع أه بنفع ريحت راسي فصارت language زي
مثلا زي كده بيجيب و بيقول مديش أسمحله زي ما كان في
ال CML كده كده كده طب مين بيعمل الجثة هاي؟ ال
compiler بيعمل الجثة هاي مثلا و هكدالان تعالى نركز
شوية على موضوع كيف يؤثر ويتأثر ال compiler بال
hardware مش مناقش أمنا نفصل فيه، الأمنا نفصل فيه و
أديكي أول مثال اللي هو ذاكره ال parallelism طبعا
التوازي هذه ممكن تكون على two levelsال level الأول
اللي هو أن نفذ أكثر من instruction في نفس الوقت
بالتوازي لو تسمع توازي بيجي على بالك شغلتين يا
بقصد أنه مثلا ان ال instructions يتنفذوا في نفس
اللحظة أو بقصد مثلا أن في عندي أكتر من processor
موجود multi processorزي ال core, quad و dual مش
عارف ايش حفت كيف طالما بحكي توازي معناه في شغلتهم
يشتغلوا مع بعض يا اما بنتكلم كبروسيسورات في عندى
اكتر من بروسيسور شغال في نفس الوقت يا اما بنتكلم
ببرضه بشكل مقابل ان اكتر من instruction بتتنفذ في
نفس الوقت طيب افترضى الان ال compiler ماعوش خبر في
هذه التكنولوجيا ولا بيعرف ان في بروسيسورينإنه ممكن
يشتغلوا مع بعض ولا بعرف إنه في اتنين instructions
إنه ممكن بيشتغلوا مع بعض وغمض عينه عن هذا الكلام
إيش النتيجة؟ النتيجة إنه ممكن ماستفيدش من القصة
هذه كيف؟ ممكن ال compiler يروح يكتب ل instruction
ألف و instruction با و با تتمد على نتيجة ألف كيف
أروح أنفذ التنتين في نفس اللحظة؟ طب ما لسه با بدها
ألف تخلص عشان ياخد القيمة تبعتها و يستفيد منها كيف
بده أنفذ التنتين في نفس اللحظة؟مش هيظبط إلا إذا في
مشاكل وفي waiting ومش عارف إيش شوفتي كيف .. في
الناس ممكن يقولوا إيش طب أنا أعطي ال processor
الأول ال instruction الأولى و ال processor التاني
مايعطيهوش التاني أعطيله حاجة مثلا تانية مابتتمدش
على الاتنين هدول شوفتي كيف صارنا نفكر إذا صار ال
compiler الآن عشان يستفيد من اتنين processor مع
بعض بدي يحاول يكتب كوده بطريقة اللي يغذ الأول ويغذ
التاني بدون ما يكون فيه تضارب بنات اتنينشوفتي كيف؟
طب ليش ال compiler أخد باله من القصة هاي؟ لأنه
لازم ياخد باله إلا مش هستفيد من قصة ال
multiprocessor شوفتي انت كيف؟ نفس الفكرة لما أقول
أنا ممكن اتنين instructions يتنفذوا في نفس اللحظة
نفس المعنى طب مين الاتنين instructions اللي ممكن
يتنفذوا على بعض اللي ممكن يتنفذوا في نفس اللحظة
عشان لما ييجي يعمل ال execution يدي هذا ويدي هذه
ومايأثروش على بعض شوفتي كيف؟ فالآن لو ال compiler
مش ما أخد باله أن هذه ال technology أنها موجودة
وكتب code عادي وماعملش حسابه في قصة هيك مش هنستفيد
من فرر ال processor أو الفرر التنفيذ ال
instruction لأنه هيصير النتاشر تطلع غلطيعني قاعد
بياخد ال instruction الأولى و بيقوله اتفضل و ال
processor بتاعنا بياخد ال instruction التانية و
تتمد على الأولى و هذا بيطلع النتيجة و هذا بيطلع
النتيجة وشوفنا مشاكل من هذا النوع و ال hazards في
ال pipelines في العمارة ده بتتذكر كمان شوية حكاية
عنها بس النقطة اللي بدي أوصلها انه صح صار فيه
تكنولوجيا موجودة لكن لازم ال compiler ياخد باله
منها عشان يستفيد منها عشان لما انا اكتب كودي اكتب
بطريقةأقدر أوزع أثنين ال processor instructions
مكتوبش بطريقة أنه كان واحد لأن أكيد كتابة ال code
ل processor واحد تختلف عن كتابة ال code لو اتنين
بيشتغلوا مع بعض بختلفوا يعني أنا بصير زي ما قلت
لما بترجم ال code هذا ال block مثلا بعتمدش على هذا
ال block مثلا طب أنا أخلي هذا ال block يروح لل
processor هذا و ال block هذا يروح لل processor هذا
و أنا أجمع النتائج بعدين شفتي كيف؟ لأن عرفت أنه
الآنطالما فيه إثنين processors أو أكتر معناه بدي
أحاول كودي أعمله أنه يروح له هدول بدون مشاكل طب
أنا مش عارف هذا الكلام بفكر processor واحد ممكن
أكتب كودي كله step by step واحد ورا التاني وبتطلعش
عساسا بفكر أنه واحد ورا التاني هيتنفذ وبالتالي
بستفيدش من التكنولوجيا الموجودة شوفتي كيف أثرت
بشكل كبير ال parallelism؟ طيب تعالوا نتكلم في مثال
تانيبرضه في ال hardware احنا كل كلامنا الآن هنحاول
نوضّح علاقة ال hardware بإيش بال computer من خلال
أنثنا متنوعة طيب غير ال parallelism تعالوا نشوف ال
memory ال memory عشان نكون في الصورة هي عبارة عن
أكتر من level hierarchical memory كيف يعني؟ يعني
خلينا نبدأ من ال memory البطيئة اللي هي ال hard
diskوبعدها ال level الأسرع منه شوية الرامات
الوسيطة وبعدها الأسرع خالص اللي هم عندك ال
processor ال cash في عندك أكتر من level في ال
memory في السرعة في كل شيء طبعا ليش اللي برا بطيئة
جدا لأنها بتحتفظ بالقيم تبعتها إذا انقطعت الكهربا
غير متطيرة وبالتالي التكنولوجيا اللي عملت عليها
بتنعكس إنها تكون بطيئة بينماال cash اللي جوا او
اللي في ال processor هي متطايرة وبالتالي في العامل
من المواد تكون في قمة السرعة طيب واحدة ممكن تقول
طب ليش انا ما نكبرها كتير ال cash اللي جوا ال
processor المشكلة لو كبرناها كتير حق الجهاز .. لأ
لأ مش .. حق الجهاز ممكن يفوق من الف لعشر تلاف
ماحدش هيشتريهفعشان هي كمان زي ما قولنا أيام
العمارة بيوازنوا انه بيحاول يحط الاشي المعقول
المقبول و السعر كمان يكون هالقدر لأنه كل ما كبرت
أكتر كل ما كلفت أكتر هناك في ال processor و بعدين
حتى انت خد ملاحظة انت معاك خبر ان لو جيت تشوفي
جهاز دي بتشتريه و كان معروف جهازها مسميت جيجا و
بعدين قالك الجهاز التاني بس سارتيرة و هتلاقي فرق
السعر ما نطش كتير لأنه عملوا الضعفلكن تعالى جوا فى
المواصفات لو لجيت ال processor فىه cash مثلا 215
ال cash هذه صارت 512 بتلاقي فط وفطة فى السعر صار
ميجا صار .. بتلاقي فط فط فى السعر ليش لأن كل ما
تزيد المساحة هناك كل ما كان أسرع كل ما كان أغلى
فبتلاقي فط فى السعر كذلك أيضا ال processor نفسه
سرعتهإذا كان سرعته جيجاهرتز صارت 2 جيجاهرتز
بتلاقيه أكتر في السعر من ال memory شوفت كيف فيه
أكتر من level المهم نرجع لموضوع ال memory ال
memory باقتصاد زي ما قلناه أكتر من level الآن إنت
لما بتفتح ال code بتفتح البرنامج إيش بيصيح في
البرنامج بيروح بتحمل الرامو من ال RAM اللي بيصير
تشتغل فيه بيصير يحمل على ال cash و ال cash ممكن
يكون برضه فيه أكتر من level دي لبالك الآن تخيل
يروح تعملتي التجربة هذه على جهاز قديم شوية فتحتي
عشرين برنامج تمام؟ فتحتي عشرين برنامج هتحسي كل ما
هتصير يتحمل وين؟ على ال RAM فجأة هتصير لما تفتح
البرنامج بعدين تحسيه بيمشي جاءت ببطء لما بيفتحليش؟
لأنه صيرت انت لأن مافيش واسعة في الرهن فكل ما
تكتفتها application بيصير بيرجع اللي كان على ال
memory البطيقة ويحمل في ال memory هذا فبتلاحظ انت
القصة هاي حتى أقولك لو انت كتبت في ملف word و جيت
عملتي save بتحس ال save بيبين معاك بال index على
ال save بيبين ليش ال save بيبين؟ لأنه خلاص مضطر
طالما عملتي save يروح يخزن وين المعلومات في ال
memory أشد بطءطبعا سرعة ال memory اللي برا .. هاد
اللي بتاعة ال hard disk مقارنة بالجوا في غاية غاية
البطء أبطأ من السهباب الكثير زي كده لازم نقارن
فعشان هيك نيجي الآن موضوع ال compiler الآن ال
compiler عشان اوضح الفكرة اعتبري انه انا جدلا هيك
عشان اوضح المعنى انه داخل ال browser مافيش غير عشر
رجسترات بس عشرةواعتبري أنا كودي المكتوب فيه عشرين
variable صح؟ كيف بدي أحمل العشرين variable على
عشرة؟ أنا مش هقدر فهسيل أحمل مجموعة صح؟ و لما بدي
أجيب واحد تاني بروح برجّه واحد في ال level التاني
مش هيك اللي عاملة بدي تتم؟ طب السؤال مين اللي
أشيله؟مين اللي أخلّيه؟ مين اللي أوديه؟ مين اللي
أجيبه؟ أكيد المنطق إيش بيقول لو في variable
هستخدمه عشرين مرة مثلا و الباقين هستخدمه خمس مرات
الأولى تشيلي أبو الخمس مرات و ترجعيه و تخلي أبو
العشرين مرة عشان تحضر على السرعة يعني سيرتي أنت
قاعد تفكري كيف أستغل هذا ال hardware الموجود هذه
الطبقات الموجودة هذه اللبن الموجودة عشان كنت يصير
ماله ايه فيش يعني؟ عاد مين اللي بيكون بهذا الدور؟
الكمبايلر زى ما قلنا قبل شوية انا بريح دماغى انا
بعمل البرنامج ماليش علاقة بحط ان شاء الله مليون
variable, mid variable, loops, arrays كل القصة
بيجي عاد الكمبايلر و هو في مرحلة الترجمةبتطلع عاد
اه ايش اللي عندي؟ طب ايش ال level بتاعة ال
memories؟ طب هذه وين أحطها أحسن؟ طب مين اللي أكله؟
مين اللي أشيله؟ شوفتي كيف؟ فصار الأن بدو يستفيد من
تكنولوجيا ال levels هذه طب تخيلي أن ال compiler ما
هوش خبر بالتطور اللي صار في ال memory و بفكرهم
كلهم memory واحدةو ال 20 .. ال X بتستخدمها عشرين
مرة صار ورا على باله كل شوية ما أخدها و موديها
وين؟ على ال memory البطيئة كل ما بيبقى .. لأنه مش
عارف أنه في levels و في أسرع و في أبطأ و في habit
ديابط صار لأ إذن واضح أنه لازم طالما صار تطوير في
ال memory و ال levels ابعتها و ال hierarchical
ابعتها لازم ال compiler ماله يكون فاهم التكنولوجيا
اللي صارت في هذا ال hardware علشان لما بكتب كوده
يستفيد ويكتب بطريقة فعالة شوفت كيف؟ بما أن هذا
hardware لكن هيه انعكس واتأثر كمين في الكبارة
شوفتوا كيف؟ هي مثالين لحد تلان طيب تعالوا نشوف
المثال التالت و بعدين ناخدوا ال break و لا تاخدوا
ال break بعد المثال التالت تاخدوا break جيجا؟ طب
خدوا break جيجا و بنكمل ان شاء الله طيب خلينا
نستكمل الآنdesign a new أو of a new computer
architectures بتتذكروا قبل هيك لما أخدنا العمارة
كنا بنقول زمان كانوا بيستخدموا في ال assembly تبع
ال machine نظام ال cisc اللي هو ال complex
instruction بتتذكريوقلنا كانت أما هو يذكركم فيه
وكنا بنقول إن ال instruction الواحدة في هذا النظام
ممكن تتعامل مع ال memory وتعمل أكتر من ال process
تقول بدي أعمل عملية الجمع، بدي أروح أجيب ال
operand أبصر من وين، بدي أعمل عملية حساب لل
address اللي بديها من خلال address modesو بعد ما
يجيب الحسبة تبعته ممكن ينجح يعمل access تاني لل
memory و الاخره فكانت ال instruction الواحدة
بنسميها ال complex لأنها كانت تقوم بأكثر من عملية
تمام؟ الآن هذه فيها إشكاليتين ال complex الإشكالية
الأولى أنه أنا ممكن تكون خياراتيفي إزالة التكرارات
في التعامل مع الممري مثلا محدود أو ماقدرش، ليش؟
لأنه أنا مثلا دايما انا مين اتقعد، غصب عني بتجيب
عملية ال .. ال .. ال .. ال instruction بتاعة
القادة اللي غصب عني هتلعب في ال memory لأنها كتلة
واحدة مثلا، بعد شوية بدي صب لأي شي معين أو ضرب أو
قور أو الأخر، غصب عني بتروح كمان مرة تروح على ال
memory تجيب مثلا ممكن نفس الoperand كمان مرة،
شوفتي كيف؟ ليش؟ لأن هي ال instruction ما لهاblock
كامل بيعمل أكتر من ال process وبالتالي بيخلي
إمكانية ان انا اعمل تعديلات واشيل ال redundancy
واشيل التكرارات وان اعمل اشي more efficient صعب
محدود وبالتالي ممكن ال compiler اللي انا عامله غصب
عنه مايقدرش يشيل هذه التكرارات وغصب عنه يصير مش
قادر يتعامل بطريقة more efficient ليه؟ لأن هيك
طبيعةالكمبليكس أو هيك طبيعة ال assembly بتاعة ال
machine اللي هو مقيد فيهاالمشكلة التانية مش بس هذه
المشكلة المشكلة التانية أنه ممكن يكون إضافة ال
pipeline زي ما شفنا في العمارة صعب جدا في هذا
النظام لأن ال pipeline شفناه بموضوع ال cisc كان مش
كتير simple و معقد عشان هيك غيروا النظام شوية و
قالوا طب و إحنا ليش ما نتعامل بطريقة تانية شو هي
الطريقة التانية؟ قال أنا ليش أخلي كل من هب و ده
بيلعب في ال memory مثلا ما خلاص نعمل instruction
خاصةإني أجيب من ال memory Instruction خاصة لحالها
إني أكتب في ال memory Instruction خاصة إني أعمل
جمع Instruction خاصة إني أعمل all وخلاص فهيك بيصير
عندك انت ال instruction مالها simple reduced
Instruction set Architecture فقال بالطريقة هاي أنا
مش مجبر ألعب في ال memory مثلا ألف مرةبصير اذا انا
يستدعي الأمر ان اتعامل مع access لل memory مرتين
او تلاتة ليش اعمل خمس عشر مرات عشان كنت مجبر في ال
risk الان في ال risk مش مجبر اذا صار الان فيه
امكانية ان استخدم هدول ال reduce instruction و
اعمل اشي efficient اكترفصار ال compiler اللي الآن
ماله ماخد راحته في التعامل مش قاعد أجبره إنه كل
هدول بيكونوا مع بعض خلاص إنه مال إيش بدك بدك add
بدك sub بدك memory بدك كده بيصير هو كيفه يتحكم
وهذا أعطاله حرية الآن إنه يكتب ال code بشكل
efficient أكتر وإنه يشيل أي تكرارات كان مجبر عليها
زمان ومالهاش داعي خصوصا فيما يتعلق بال access تبع
ال memory فهنا كان في فايدة كبيرةفي إعادة كتابة ال
code بعدين أحيانا انا ممكن أكتب بال simple
instructions هدول يكون ال code الكلي efficient
أكتر من ال complex كمان هذه الشيء التاني في السرعة
يعني بدل ان انا أعمل واحدة طويلة و بتاخد قصص ممكن
أعمل تنتين صغار و يطلعوا أسرع من الواحدة الكبيرة
هذا الكلام شفناه احناواقع في العمارة، لما خدنا
العمارة وشوفنا الفرق بيناته فالفكرة الأولى أنه لما
نغير عن نظام ال risk أنه صار بإمكانه إيش؟ أنه ال
compiler يكتب إشي أحسن من اللي كان مقيد فيه بال
-cisc الشغلة التانية المهمة و اللي شوفناها في
العمارة أنه صار إمكانية إضافة تكنيك ال pipeline
أسهلأحنا قلنا ال pipeline للناس اللي نسيين انه عمل
سرعة خيالية بالنسبة للي كان موجود قبل ال pipeline
ضاعف السرعة مرات و مرات عشان هي كده صار موضوع ال
pipeline في غاية الأهمية ماعنده مشكلة كانوا يغيروا
كل ال assembly علشان خاطر يقدر يحطوا ال pipeline
لأنه عمل تكنولوجيا في السرعةوبالتالي لما غيروا ال
risk ضربوا عصافير بحجر يعني لو أنا بضيف أول ال
pipelines اللي هو أصلا هيسرع قدرة ال hardware على
العمل وفي نفس الوقت أنا بسمح لل compiler أنه
يستفيد مني ويحاول يعمل code بشكل فاعل أكثر
performance أكثر مافيش داعي يكرر مافيش داعي يصير
التكرارات يشيلها فهنا ضربوا عصافر بحجر الآن طيبايش
فيه فروقات بين ال CISC و ال risk؟ برضه بذكركم انه
كمبرمج assembly كمبرمج assembly ال CISC أسهل ليه؟
لإن أنا بكتب instruction واحدة و يعطيني العافية
بدي قاعد و خلصنا بروح بجيب ال operant بجمع بخلص هو
باللي حاطف ريحني مش بدي أقعد اكتر اكتر اكتب تلاتة
اربعة instructions عشان اعمل ال ال operation اللي
بديها فكال CISC للمبرمج أسهلهلكن لل system مش أحسن
شوفت انت كيف؟ لل hardware و ال pipeline مش أحسن
عشان هيك صار نقلة بعد هيك صار الكل يعمل ايش؟ risk
.. risk .. risk و ريح دماغه من كل شيء طب ال Intel
مثلا تعالي اتطلعي بتلاقي جال بتدسي بال CISCلكن هو
فعليا هو صح سبه من برا ك assembly لكن internally
جوا ل processor حط شغلة اه عمل risk و حط شغلة تحول
ال cisc ل risk جوا انت مشوفاش المبرمج تعالى ال
cisc هو ببرمج بال cisc لكن كنظام جوابيكون جسمها ل
micro instructions اللي هم أصلاً risk وعمل ال
hardware يشتغل مع ال risk و حتى ال pipelines يشتغل
مع ال risk فزي ضرب عصير بحجر خلص Cisco المبرمج
بالنسبة له أسهل لكن من جوا ال system أخد بنظام و
قاعد ال risk لأنه لو ماعملش هيك فهيلاقى كل
المؤسسات التانية و الشركات التانية عملت أسرع بكتير
من اللي هو عامله وبالتالي بيخسر خصوصا في مبدأ ال
pipelines فهو لأ عملهابطريقة التفافية إنه جال بخل
ال SISC من برا لكن internally لازم يتحول ل risk من
خلال ال micro instructions و بعدين عمل ال hardware
تبعه و عمل ال pipelines تبعته و بدأ يشتغل فيش
مشاكل أما تكون في النهاية في مرحلة الصفر اللي عند
ال processor متفق على موضوع ال risk إنه تكون ال
instruction محددة تقوم بال task محددة عشان يقدروا
يستفيدوا منهاالان نقطة تالتة برضه هنا فالفكرة يعني
انه لما عمل ال risk استفاد منه مين ال compiler صح
هي اللي هي النقطة اللي بيوصلك إياها مع ان ال risk
hardware مش ان ال compiler ضال مسكرا عينه مافرجتش
معاه risk عن Cisco انه جال خلاص هذه hardware
issues وماليش علاقة لأ لأ فرجت لما اتغير نظام كامل
في ال architecture من Cisco لrisk جدر ال compiler
يبدأ يعمل اشي performance اكتر واشي تكرارات و
redundancies و قصص كتير فهي تأثر بمين؟على طول بال
.. بالتكنولوجيا بتاعة ال hardware طيب الشغلة
التالتة لما أخدنا ال pipelines في العمارة بتتذكري
كان أحيان بيجيني حاجة اسمها hazards فكنت أضطر ..
ليش كانت ال instruction التانية بتاعة الأولى فكنت
أضطر أأخرها اتنين stalls أحط فراغات أحط bubbles
أوقف ال system أجد اتنين installs عشان أشتغل مين
التالتة، بعدين قولنا بينفعش، بيضايق وقت ال stalls
حاولنا نعمل forward ومش forward و path ووصل لكن
برضه لجيت إجباريا أحيانا بيصير فيه stall واحدة في
بعض ال cases، صح؟ طب افترض ال compiler ما خد باله
من جزء ال hazard اللي بتصير، طب مش ال compiler كان
قادر إذا هذه ال stall إجبارية يجيب instruction مش
تتمشي الأولى و التانية اللي فيهم المشكلة، يجيب
instruction تتمشي الأولى و التانية ويحطها في النص
مثلا ويستفيد من قصة ال pipeline ويستفيد من عدم
التأخير يا ستي بلاش قصة ال forward مش كنت أنا بعمل
بين الأولى والتانى لما كان في مشاكل أعمل فراغين طب
هالمشكلة لو حطيت instruction هنا مالهمش علاقة مش
أنا برضه بستفيد و بضيعش الوقت مع أن هذه المشكلة
كانت hardware لكن انحلت من أين؟من عند ال compiler
عشانك برضه ال compiler بيستوعب القصة هاي ايش ال
pipeline ايش ال hardware ايش ال features الزيادة
ايش اللي انا ممكن اسويه على اساس نسرع مع بعض
ناكلنا ال system لأنه كمان مرة ان ال performance
العالي لأي نظام مش مشكلة hardware لحدزي ما أخدنا
زمان ال hardware بيلعب دور و ال software بيلعب دور
و ال operating system بيلعب دور و ال application
بيلعب دور كله دور فكلهم مشتركين في نفس الهدف ان
يكون ال code الأخير ماله efficient performance
عالي يستفيد من كل التكنولوجيا الموجودة لكن أنا بس
موضوعي هنا كان بين من ومن ان هذا ال pipeline لازم
ال compiler يكون فاهم قصة ال hazards كيف بتصير
عشان هو يساهم بحلها من عندهوسهل جدا لما بكتب code
انا في ال compiler ان خلاص جملة مالهاش داعي
ومابعتمدش عليها حد ماحطها بين الأولى والتانى اللى
بينهم dependency مثلا فعشان هيك ضرورى ان ال
compiler يستوعب ايش صار في ال hardware ويحاول
يستفيد ويفيد شوفتي هى التأثير فما تستغربيش فماكننا
نقوله اه والله في علاقة بتأثر ال compiler بال
hardware هيك شوفتي تأثر بال parallelismالـ
Multiprocessor أو الـ Instructions اللي بتتنفذوا
مع بعض اتأثر بالتكنولوجيا بتاعة ال memory اتأثر
بالتكنولوجيا بتاعة ال RISC و ال CISC اتأثر
بالتكنولوجيا بتاعة ال pipeline شفت كده ففي علاقة
بينات و مطيدة بيأثروا على بعض حتى لو كان هذا
software و هذا hardware في النهاية أي hardware
موجود لازم software يتعامل معاهصح ولا لأ ان هي ال
hardware لمن محطوط مش ل ال instructions اللي اتنفت
مش ل ال software اللي ينفذها فلازم ال software
يستفيد من هذه التكنولوجيا اللي عملت و يشغلها بأفضل
طريقة ممكنة مهما كانت هذه التكنولوجيا عشانك ما
تستغربيش لما كنا نقول فيه تأثر بين ال hardware و
بين ال compiler طبعا بعد هيك انا مش هاهتم كتير او
خلينا نكمل مش المشكلة ال section هذاعملية ال
program translations طبعا قلنا قبل هيك مش بالضرورة
ان ال compiler بيحول من high ل low هذه أنفلة تانية
على ال compiler اول شي بقولك مثلا ممكن اعمل binary
translation ايش بقصد فيها؟ يعني احول من binary
machineلـ Binary Machine تاني ممكن أعمل compiler
زي هي يعني يقرأ من لغة أصفر وحيد ويترجمها لأصفر
وحيد لمachine تاني ممكن أسوي حاجة زي هي طب هذي
اللي بتوفر عليها مثلا لو كنت أنا عامل compiler
لمachine الانتل بدل ما أعمل compiler تاني لل
language X مثلا لمachine الماكنتوش أنا خلاص محول
من ال binary هاي لل binary هاي مثلا هذا solution
هذا حل استخدامات كثيرة المهم الفكرة أنه ممكن أحول
من binary إلى binary طبعابرضه ممكن في ال hardware
زي ال VHDL مش ال VHDL لغة hardware برضه ال
compiler بدي يفهم ال computer اللي كتبها و كيف بدي
تترجم على شكل ال hardware على شكل البنات على شكل
ال signalsمثلا طيب database ال query أنت تكتب صورة
معينة في ال database بطلع بصورة تانية table مرتب
مش عارف صح ولا طب مين اللي جري و فهم هاي و حولها
لصورة تانية هذا برضه compiler techniques في الآخر
فهذه مجردأمثلة مختلفة انه وين انا ممكن استفيد من
شغل ال compiler او ايش applications ممكن اسوي طبعا
غير ال simulators برضه حكينا كتير قبل هيك في ال
tools انه دايما بيجي من ورا ال compiler tools كتير
جاهزة سواء التشريك على ال types التعامل مع ال
memory التعامل مع مش عارف مع مين ففي كتير كلام انا
زي ما قلت هذا الكلام مابدوش يصحيح شرح جد ما بده
قراءة عامة انتوا اجروا قراءة عامة و ركزوا على
أشياءاللي أنا حكيتها بالتفصيل أشياء أنا ماحكيتهاش
خلاص خدوها هيك وامشوا عنها خلوني أمشي الآن لل
section الأخير عشان أخلص ال section الأخير مابدوش
إشي هو عبارة عن مراجعة للغة البرمجة أو ال basics
اللي لازم انت تكوني عارفاها عشان تقدر تكمل المساق
البرمجة ال basics تبعتك بقولك واحد ستة كله اجلب
عنه و ادخل ع شبط اتنين مابلزمك هذا مجرد بس تذكير
يعني ايش بيذكرك بيجي بيذكرك مثلا بتعامل معاك ان
انت لسه مش عارفه تذكير بيذكرك ايش ال static ايش ال
dynamicإيش ال variable أو ال identifier؟ إيش ال
function أو ال method أو ال procedure؟ إيش ال
scope؟ إيش ال block؟ إيش ال parameters؟ إيش ال
pass by value؟ إيش ال pass by reference؟ فقاعد إيش
بيتقلبلك صفحات و بيذكرك في المواضيع العامة مش داخل
في برمجات نين ولا داخل في object oriented ولا ما
يحزنون بس قاعد بيذكرك في إيش؟ في الحاجات البسيطة
عشان تكون ميتذكرها فاللي مش ذاكره يتقلب إيش؟
الصفحات أثرية اللي ذاكرة خلاص مافيش داعي لكن
خلّيني أتأكد إن أنتوا شطرين في البرمجة يعني مثلا
إيش ال static وإيش ال dynamic؟ ما شاء الله عليكم
ببرمجات المستقبل ال static هو ال constant اللي
ماقدرش أغيره
ممتاز زي ما انتوا قولتواال dynamic هو مخصص في
scope معين خلاص و تطلع من هذا ال scope بيبطل يبين
معايا ال static هذا live خلال كل البرنامج واجد
مابدك من أي مكان تتكلمي عنه و تتكلمي عنه و بتغيري
في قيمته و مافيش مشاكل إلا أن انت معرفها طبعا
constant ف static يعني live طول فترة البرنامج
بينما ال dynamic هو live فقط في ال .. أيوة في ال
block أو المكان أو ال scope اللي محدد فيه طيب إيش
يعني environment و states؟
environmentally situated طيب بشكل مختصر انت لما
تقول انت X تساوي عشرة الان انت عندك اسم X هذا ال X
ماله في شغلتين إله فيه القيمة العشرة وإله ال
address مش مشكلة بحكيش أنه كانوا .. بقول ك memory
إله locationاللي هو يمثل X بس هو أرقام Zero X مش
عارف إيش بالهجسام وإله value الآن مين بيربطني بال
address تبعه تقنيك أو حاجة اسمها environment اللي
هو موجود بتكلم X بيكون مسجل وين عنوانه فهذا نسميه
environment ال state القيمة ال value تبعته بس عشان
تكونوا يفهموا فأحد أطلق عليه environment اللي
بوصلني لل location تبعه والثاني أطلق عليه اللي هو
ال value تبعته اللي هو ال state طيب مثلاعارفين إيش
ال variable؟ هو ال identifier؟ هو ال names؟ تمام؟
طيب ال scope؟ طب عارفين إيش ال procedure؟ ال
function؟ ال methods؟ ال function؟طبعا ال blocks
انا بقدر كل مرة افتح block جديد بيصير scope جديد
يعني بقدر اعرف ال X فيه كمان مرة فبصير ال X هذه
غير ال X في ال scope اللي برا ماعرفتش ال X وقولت X
تساوي S بيصير بدور اخر تعريف لها ال block اللي
اكبر و ال block اللي اكبر فموجود ان ممكن اعمل اكتر
من block و اكتر من scope طيب ..هذا مش مشكلة دايما
كل ودا كده مافيش فيه إشي طيب parameter passing إيش
يعني call أو by value أو pass by value إيش يعني by
value إيش الفرق يعني by value أو by reference
تمام لما أنا أقول pass by value لل function بكون
أعملت نسخة منها فال function لو روحت غيرتي في
النسخة الأصل بتغيرش لكن لما أقول pass أو call by
reference بقول لأ بعدت ال reference عليها نفسها
وبالتالي لو في ال function غيرتي بتتغير الأصل فانت
حرة هذه بترجعلك أنت ناوي تتغيري على الأصل من خلال
ال function ولا لاوالله انت ناوي بس تعملي صورة
منها عشان ترجعي قيمة فهذه بترجعلك ففيه متاع ال by
reference و ال by value طيب أخر حاجة بتحكيها اللي
هي الاليازينج إيش من الاليازينج؟ إيش الاليازينج؟
أكتر من اسم لنفس ال parameter أو لنفس ال value
تجيين المرة الجاية دارسة البلوكات اللي أخدناها
تاعة ال compiler design والمثال اللي أخدناه، بدي
أظل أتذكر أهم دول لإننا الآن هنسير إحنا إيش نفصل
فيهم طبعا بالمناسبة chapter 2 أيضا يعتبر مقدم لل
compiler بس بيختص بال stages الأربع الأولانيات
عشان أتعلمنا من ال source و طالع intermediateف
chapter 2 هيركز بس على الأربعة stages هدول و
هيعطيني مثال عملي خلال هذا ال chapter بعد chapter
2 بتكون المقدمة هيك خلصت نهائي لل stages الأربعة و
جرب عليهم مثال كامل و بدأ بعد كل chapter يمسك
stage ان شاء الله رب العالمين يعطيكم العافية و
مرتبطة ان شاء الله