بسم الله الرحمن الرحيم اليوم إن شاء الله بدنا
نستكمل ما تبقى في 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 تمام؟
طبعا معلش وكلامنا اليوم للأسف كله هيكون دهش زي
هيك كله ثقافة عامة ومجرّد معلومات يعني هذا زي ما
أنا قلت قبل شوية هيك طبيعة الـ section اللي بس بدها
منك مجرد قراءة وتستفيدي من باب الثقافة المعلومات
اللي فيه لكن إن شاء الله إحنا نبتدأ من شفطة
الاثنين هنبدأ نكتب بدينا ونجرّب ونشوف techniques
وطرق وتصير الأمور أفضل لكن الشفطة الأول هيك
طبيعته بده شوية رغي وتركيز طبعا؟ طيب الآن
applications of 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 بيكونش لسه قاعد بيفكر كيف أنا
أستخدم الـ registerات بشكل فعل، قاعد بفكر كيف أعمل الـ
task بتاعة الـ computation، عشان هيك هذه تعتبر سلبية
كانت موجودة في الـ C، فلما اتطور الـ compiler أجت
الجابة إيش قالت؟ الجابة مثلا قالت إحنا بدنا نمنع
الناس يلعبوا في الشغلات اللي تحتها، بدأ أمنعه، يعمل
pointerات مثلا، الجابة هذا التطور كان موجود، بدأ
أمنعه يلعب في الـ registerات، بدأ أمنعه، الاخر طب يا عم
أنت منعته بالأمور هذه، طب كيف الـ 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 الـ cache في عندك أكثر من level في الـ
memory في السرعة في كل شيء طبعا ليش اللي برا بطيئة
جدا لأنها بتحتفظ بالقيم بتاعتها إذا انقطعت الكهربا
غير متطايرة و بالتالي التكنولوجيا اللي عملت عليها
بتنعكس إنها تكون بطيئة، بينما الـ cash اللي جوا أو
اللي في الـ processor هي متطايرة و بالتالي في عامل
من المواد تكون في قمة السرعة، طيب واحدة ممكن تقول
طب ليش أنا ما أكبرها كتير الـ cash اللي جوا الـ
processor، المشكلة لو كبرناها كتير حق الجهاز .. لأ
لأ مش .. حق الجهاز ممكن يفوق من ألف لعشر تلاف
ما حدش هيشتريه، فعشان هي كمان زي ما قولنا أيام
العمارة، بيوازنوا إنه بيحاول يحط الاشي المعقول
المقبول و السعر كمان يكون هالقدر، لأنه كل ما كبرت
أكثر كل ما كلفت أكثر، هناك في الـ processor و بعدين
حتى أنت خد ملاحظة أنت معك خبر أن لو جيت تشوفي
جهاز دي بتشتريه و كان معروف جهازها مسميت جيجا و
بعدين قالك الجهاز الثاني بس سارتيرة و هتلاقي فرق
السعر ما نطش كتير لأنه عملوا الضعف، لكن تعالى جوا في
المواصفات لو لجيت الـ processor فيه cache مثلا 215
الـ cache هذه صارت 512 بتلاقي فط فط في السعر صار
ميجا صار .. بتلاقي فط فط في السعر ليش؟ لأن كل ما
تزيد المساحة هناك كل ما كان أسرع كل ما كان أغلى
فبتلاقي فط في السعر، كذلك أيضا الـ processor نفسه
سرعته إذا كان سرعته جيجا هرتز صارت 2 جيجا هرتز
بتلاقيه أكثر في السعر من الـ memory، شوفت كيف فيه
أكثر من level، المهم نرجع لموضوع الـ memory الـ
memory باقتصاد زي ما قلنا أكثر من level الآن أنت
لما بتفتح الـ code بتفتح البرنامج إيش بيصير في
البرنامج بيروح بتحمل الرامو من الـ RAM اللي بيصير
تشتغل فيه بيصير يحمل على الـ cache و الـ 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 وتعمل أكثر من عملية
تقول بدي أعمل عملية الجمع، بدي أروح أجيب الـ
operand أبصر من وين، بدي أعمل عملية حساب للـ
address اللي بديها من خلال address modes وبعد ما
يجيب الحسبة تبعته ممكن ينجح يعمل access ثاني للـ
memory والأخيرة فكانت الـ instruction الواحدة
بنسميها الـ complex لأنها كانت تقوم بأكثر من عملية
تمام؟ الآن هذه فيها إشكاليتين الـ complex الإشكالية
الأولى أنه أنا ممكن تكون خياراتي في إزالة التكرارات
في التعامل مع الـ memory مثلاً محدود أو ماقدرش، ليش؟
لأنه أنا مثلاً دائماً أنا مين اتقعد، غصب عني بتجيب
عملية الـ .. الـ .. الـ .. الـ instruction بتاعة
القادة اللي غصب عني هتلعب في الـ memory لأنها كتلة
واحدة مثلاً، بعد شوية بدي صب لأي شيء معين أو ضرب أو
قور أو الآخر، غصب عني بتروح كمان مرة تروح على الـ
memory تجيب مثلاً ممكن نفس الـ operand كمان مرة،
شوفتي كيف؟ ليش؟ لأن هي الـ instruction ما لها block
كامل بيعمل أكثر من عملية وبالتالي بيخلي
إمكانية أن أنا أعمل تعديلات وأشيل الـ redundancy
وأشيل التكرارات وأن أعمل شيء more efficient صعب
محدود وبالتالي ممكن الـ compiler اللي أنا عامله غصب
عنه ما يقدرش يشيل هذه التكرارات وغصب عنه يصير مش
قادر يتعامل بطريقة more efficient ليه؟ لأن هيك
طبيعة الـ complex أو هيك طبيعة الـ 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 مش مجبر إذا صار الآن فيه
إمكانية أن أستخدم هدول الـ reduced 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 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
زي هي يعني يقرأ من لغة أصفر وحيد ويترجمها لأصفر
وحيد لـ machine تاني ممكن أسوي حاجة زي هي طب هذي
اللي بتوفر عليها مثلا لو كنت أنا عامل compiler
لـ machine الانتل بدل ما أعمل compiler تاني لـ
language X مثلا لـ machine الماكنتوش أنا خلاص محول
من الـ 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 طيب آخر حاجة بتحكيها اللي
هي الـ aliasing إيش من الـ aliasing؟ إيش الـ aliasing؟
أكثر من اسم لنفس الـ parameter أو لنفس الـ value
تجيئين المرة الجاية دارسة الـ blocks اللي أخدناها
تاعة الـ compiler design والمثال اللي أخدناه، بدي
أظل أتذكر أهم دول لإننا الآن هنسير إحنا إيش نفصل
فيهم طبعا بالمناسبة chapter 2 أيضا يعتبر مقدم للـ
compiler بس بيختص بالـ stages الأربع الأولانيات
عشان أتعلمنا من الـ source وطالع intermediate فـ
chapter 2 هيركز بس على الأربعة stages هدول و
هيعطيني مثال عملي خلال هذا ال chapter بعد chapter
2 بتكون المقدمة هيك خلصت نهائي للـ stages الأربعة و
جرب عليهم مثال كامل و بدأ بعد كل chapter يمسك
stage إن شاء الله رب العالمين يعطيكم العافية و
مرتبطة إن شاء الله