0% found this document useful (0 votes)
6 views7 pages

CS477 - Module11

تتناول الوثيقة تحسين الكود في تصميم المترجمات، حيث توضح كيف أن المترجمات الحديثة تستطيع تحسين الكود بشكل كبير من خلال فهم عميق لهاردوير الجهاز. تشمل الاستراتيجيات تحسينات محلية وعالمية، بالإضافة إلى تقنيات مثل تقليل القوة وفتح الحلقات، مما يؤدي إلى تحسين الأداء وتقليل استهلاك الموارد. كما تشير الوثيقة إلى أهمية قياس الأداء وتحليل التعقيد لتحسين الكود بشكل فعال.

Uploaded by

marj00j2021
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
6 views7 pages

CS477 - Module11

تتناول الوثيقة تحسين الكود في تصميم المترجمات، حيث توضح كيف أن المترجمات الحديثة تستطيع تحسين الكود بشكل كبير من خلال فهم عميق لهاردوير الجهاز. تشمل الاستراتيجيات تحسينات محلية وعالمية، بالإضافة إلى تقنيات مثل تقليل القوة وفتح الحلقات، مما يؤدي إلى تحسين الأداء وتقليل استهلاك الموارد. كما تشير الوثيقة إلى أهمية قياس الأداء وتحليل التعقيد لتحسين الكود بشكل فعال.

Uploaded by

marj00j2021
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 7

‫جميع الحقوق محفوظة لمنصة ‪KBS Education‬‬

‫واليُسمح بنشر أو تبادل هذه الملفات (شرعا ً وقانوناً) لغير المشتركين في الدورة‬

‫‪Compiler Design‬‬
‫‪Module 11 summary‬‬
‫‪Introduction to Code Optimization‬‬
‫البن آدمي‬
‫الل بيكتبه ي‬
‫الل بيعمله الـ ‪compiler‬كان أضعف من الكود ي‬ ‫زمان‪ ،‬الكود ي‬ ‫•‬
‫بيعتب‬ ‫ن‬ ‫ى‬
‫الل بيطلع من ‪ compilers‬ر‬
‫زمان‪ ،‬قبل ما يبق فيه ‪strategies‬متقدمة لتحسي الكود‪ ،‬كان الكود ي‬
‫أقل جودة من الكود المكتوب يدوي‪.‬‬
‫دلوقن بيعمل تحسينات قوية بسبب معرفته بالـ ‪architecture‬بتاع الجهاز‬
‫ي‬ ‫الـ ‪compiler‬‬ ‫•‬
‫مع الوقت‪ ،‬الـ ‪compilers‬الحديثة بقت بتعمل ‪optimizations‬ممتازة بتعتمد عل فهم عميق لهاردوير‬
‫الجهاز‪.‬‬
‫قواعد تحسي الكود‪:‬‬ ‫•‬

‫البنامج‪.‬‬
‫معن ر‬ ‫ّ‬
‫المحسن ما يغبش ن‬ ‫‪ o‬الكود‬
‫البنامج ويقلل الموارد المستخدمة‪.‬‬
‫يرسع تشغيل ر‬ ‫ّ‬
‫المحسن ّ‬ ‫‪ o‬الكود‬
‫ئ‬
‫تبط الـ‪compilation‬‬ ‫ن‬
‫التحسي نفسها تكون رسيعة وما‬ ‫عملية‬ ‫‪o‬‬

‫جهود تحسي الكود‬


‫التحسي ممكن يحصل يف مراحل مختلفة من عملية الـ‪compilation:‬‬ ‫•‬

‫ّ‬
‫المطور يقدر يغب ترتيب الكود أو يستخدم خوارزميات أحسن‪.‬‬ ‫‪ o‬من األول‪،‬‬
‫ّ‬
‫ويحسن الحلقات‪loops.‬‬ ‫‪ o‬بعد ما يطلع الكود الوسيط‪ ،‬الـ ‪compiler‬يعدل الـ ‪addresses‬‬
‫ن‬
‫تحسي استخدام الذاكرة أو المعالجات‪.‬‬ ‫‪ o‬ن يف المرحلة النهائية‪،‬‬
‫أمثلة‪:‬‬ ‫•‬

‫لو معانا ‪ assembly code‬جاهز‪ ،‬ممكن نشيل تعليمات ملهاش الزمة‪.‬‬ ‫‪o‬‬

‫ذك‪.‬‬ ‫ّ‬
‫لو بنشتغل بـ‪ ،linear IR‬نقدر نرسع الكود بتخصيص السجالت بشكل ي‬ ‫‪o‬‬

‫مع ‪ DAG‬أو‪ ، AST‬نقدر نشيل أجزاء كببة من الكود الغب مستخدم‪.‬‬ ‫‪o‬‬

‫أنواع التحسينات يف الكود‬


‫‪Local Optimizations .1‬‬
‫تغيبات بتحصل عل مستوى صغب‪ ،‬زي ‪basic block‬بدون تغيبات كببة‪.‬‬
‫‪Global Optimizations .2‬‬
‫أكب‪ ،‬زي دوال كاملة‪.‬‬
‫تحسينات بتطبق عل مستوى ر‬

‫‪https://kbseducation.com/‬‬
‫‪0550602949 / 0557715267‬‬
‫جميع الحقوق محفوظة لمنصة ‪KBS Education‬‬
‫واليُسمح بنشر أو تبادل هذه الملفات (شرعا ً وقانوناً) لغير المشتركين في الدورة‬

‫‪Inter-procedural Optimizations .3‬‬


‫أكب كمان‪ ،‬بتاخد ن يف االعتبار العالقات بي دوال مختلفة‪.‬‬
‫ن‬ ‫تحسينات ر‬
‫أكب‪.‬‬ ‫ّ‬
‫البنامج بشكل ر‬
‫كبت نطاق التحسينات‪ ،‬كل ما كانت أصعب بس بتحسن ر‬ ‫كل ما ر‬
‫‪Optimization in Perspective‬‬
‫‪ .1‬معظم الـ ‪ production compilers‬مش بيعملوا تحسينات كببة عل الكود لما بيتم تشغيلهم بالـ‬
‫‪default options‬‬
‫وتختب برسعة من غب وقت‬
‫ر‬ ‫السبب‪ :‬لما تكون شغال عل تطوير برنامج جديد‪ ،‬مهم إنك تعدل‬ ‫‪o‬‬
‫إضاف ن يف الـ‪compilation‬‬
‫ي‬
‫ن‬

‫فعل‪:‬‬ ‫ن‬ ‫ن‬


‫‪ .2‬مش كل تحسي بيؤدي لتحسي ي‬
‫التحسي يستخدم موارد ى‬
‫أكب زي الـ ‪ memory‬أو وقت أطول للتنفيذ‪.‬‬ ‫ن‬ ‫ممكن‬ ‫‪o‬‬

‫‪ .3‬التحسينات بتصعب الـ‪debugging:‬‬


‫بتخل من الصعب إنك تتبع الـ ‪ execution‬للـ‪source code.‬‬
‫ي‬ ‫ألنها‬ ‫‪o‬‬

‫لما برنامجك مش بيشتغل بالرسعة المتوقعة‪:‬‬


‫أحسن حاجة تعملها إنك ترجع تفكر من األول وتبدأ تحليل المشاكل‪.‬‬ ‫•‬

‫نصايح‪:‬‬
‫افحص تعقيد الخوارزمية‪:‬‬ ‫•‬

‫زي إنك تشوف لو الـ ‪ binary search‬أفضل من الـ ‪ linear search‬عل حسب الـ‪input size.‬‬ ‫‪o‬‬

‫قيس أداء برنامجك‪:‬‬ ‫•‬

‫وحسن األداء فيه‪.‬‬ ‫استخدم ‪ tools‬عشان تعرف إيه الجزء الل بياخد وقت ى‬
‫أكب ّ‬ ‫‪o‬‬
‫ي‬
‫‪Optimization:‬‬
‫معظم التحسينات بتستهدف ‪ patterns‬معينة ن يف الكود‪:‬‬ ‫•‬

‫ن‬
‫التحسي ممكن يقلل التكلفة‪.‬‬ ‫لو بتكرر حاجة كتب زي الـ‪، loops‬‬ ‫‪o‬‬

‫عشان تقيس تكلفة عملية معينة (زي نضب أرقام)‪ ،‬كرر العملية مليون مرة ن يف وقت محدد وشوف‬ ‫•‬
‫الل أخدته‪.‬‬
‫الزمن ي‬
‫التحسينات‪:‬‬
‫‪ .1‬استهدف مشاكل معينة ن يف الكود‪.‬‬
‫‪ .2‬قيس الزمن المستغرق واعمل تحسينات ً‬
‫بناء عل النتائج‪.‬‬

‫‪https://kbseducation.com/‬‬
‫‪0550602949 / 0557715267‬‬
‫جميع الحقوق محفوظة لمنصة ‪KBS Education‬‬
‫واليُسمح بنشر أو تبادل هذه الملفات (شرعا ً وقانوناً) لغير المشتركين في الدورة‬

‫‪High-Level Optimizations: Constant Folding‬‬


‫البمجية الجيدة بتشجع عل استخدام الثوابت المسماة‬
‫‪ .1‬استخدام الثوابت المسماة ‪:‬الممارسات ر‬
‫ن‬ ‫ن‬
‫)‪(named constants‬عشان توضح الغرض والمعن من القيم‪ .‬ي‬
‫يعن بدل ما تكتب رقم زي ‪86400‬‬
‫ر‬
‫مبارسة‪ ،‬ممكن تكتبه عن طريق متغبات توضح معناه زي‪:‬‬
‫‪seconds_per_minute=60‬‬ ‫‪o‬‬

‫‪minutes_per_hour=60‬‬ ‫‪o‬‬

‫‪hours_per_day=24‬‬ ‫‪o‬‬

‫وبعدين تستخدمهم لحساب ‪seconds_per_day‬‬ ‫‪o‬‬

‫ن‬
‫وهيبي‬ ‫هيبق أوضح وأسهل ن يف الفهم‪،‬‬
‫‪ .2‬وضوح الكود ‪:‬النتيجة النهائية ه نفسها ‪ ،86400‬لكن الكود ى‬
‫ي‬
‫ن‬
‫والمعن من الرقم‪.‬‬ ‫الغرض‬
‫المبجم ممكن يضيف عمليات إضافية زي جمع‬ ‫مبارس‪ ،‬ى‬
‫البنامج ‪:‬لما يتم ترجمة الكود بشكل ر‬ ‫‪ .3‬ترجمة ر‬
‫ن‬
‫محتاجي‪ .‬ده ممكن يزود الذاكرة المستهلكة واألداء‪.‬‬ ‫وضب مش‬‫ن‬

‫‪ .4‬العمليات داخل الحلقات ‪:‬لو الحساب ده حصل جوة حلقة )‪ (loop‬معقدة‪ ،‬ده هيأثر عل األداء‬
‫وهيستهلك موارد زيادة بشكل غب نضوري‪.‬‬
‫تخل الكود غب فعال‪ ،‬فاألفضل إن‬ ‫المبمج ممكن يكون متفصل أوي لدرجة‬ ‫ً‬
‫ي‬ ‫‪ .5‬التفصيل مش دايما كويس ‪ :‬ر‬
‫ى‬
‫المبجم يقدر يدمج الثوابت زي ما بيحصل مع ‪constant folding.‬‬
‫‪Constant Folding‬‬
‫ن‬
‫يعن بدل‬
‫‪ .1‬الفكرة ‪:‬التقنية دي بتحول أي تعبب فيه ثوابت إىل نتيجة واحدة قبل وقت التنفيذ ‪ (runtime).‬ي‬
‫البجمة وتتحول إىل ‪5.‬‬‫ما يحسب ‪2+3‬أثناء التشغيل‪ ،‬يحسبها أثناء ى‬

‫البنامج وقت أثناء التشغيل ألنها بتنقل بعض العمليات الحسابية من وقت‬
‫توفب الوقت ‪:‬بتوفر عل ر‬ ‫‪.2‬‬
‫التنفيذ لوقت ى‬
‫البجمة‪.‬‬
‫الل‬ ‫ى‬
‫التنفيذ ‪:‬المبجم بيعمل ‪post-order traversal‬لشجرة التعببات )‪ (AST‬وبيحسب القيم الثابتة ي‬ ‫‪.3‬‬
‫ممكن تدمجها‪.‬‬
‫معالجة األخطاء ‪:‬الزم نكون حذرين ن يف التعامل مع الحاالت الخاصة زي القسمة عل صفر أو ‪overflow‬‬ ‫‪.4‬‬
‫الل ممكن يسببوا مشاكل‪.‬‬
‫ي‬
‫البيانات الوهمية ‪ (Pseudo-code):‬تم ررسح الطريقة باستخدام كود بسيط يوضح إزاي يتم الدمج ن‬
‫بي‬ ‫‪.5‬‬
‫الثوابت داخل الشجرة التعببية‪.‬‬
‫األثر النهائ ‪:‬بيوفر أداء وكود ر‬
‫أكب كفاءة عن طريق تقليل العمليات المتكررة أثناء التشغيل‪.‬‬ ‫ي‬

‫‪https://kbseducation.com/‬‬
‫‪0550602949 / 0557715267‬‬
‫جميع الحقوق محفوظة لمنصة ‪KBS Education‬‬
‫واليُسمح بنشر أو تبادل هذه الملفات (شرعا ً وقانوناً) لغير المشتركين في الدورة‬

‫‪High-Level Optimizations: Strength Reduction‬‬


‫‪ .1‬الفكرة العامة‪:‬‬
‫‪Strength Reduction‬بتستخدم لتحويل العمليات المعقدة (المكلفة) إىل عمليات أبسط وأقل تكلفة‪.‬‬
‫المبجم بيحاول يخفف الحمل عل المعالج باستخدام بدائل بسيطة تؤدي نفس الغرض‪.‬‬ ‫يعن ى‬ ‫ن‬
‫ي‬
‫‪ .2‬مثال األسس‪(Exponentiation):‬‬
‫غالبا مكلف لو مكتوب عل شكل دالة مثل ‪pow(x, y).‬‬‫لو عندنا عملية زي ‪(xy‬رفع عدد لألس)‪ ،‬ده ً‬ ‫‪o‬‬

‫لو األس رقم ثابت زي ‪ ،x2‬ى‬


‫المبجم هيستبدلها بـ ‪ ،x∗x‬وده أرسع بكتب ألنه بيشيل حسابات إضافية أو‬ ‫‪o‬‬
‫استدعاءات دوال‪.‬‬
‫‪ .3‬الضب والقسمة عل أساس ‪:2‬‬
‫عمليات ن‬
‫الضب أو القسمة عل قوة ‪ )... 8 ,4 ,2( 2‬ممكن تستبدل بـ ‪bitwise operations‬‬ ‫‪o‬‬

‫مثال ‪: x∗8‬ممكن تتحول إىل ‪ x << 3‬عملية إزاحة لليسار‬ ‫‪o‬‬

‫‪ .4‬استخدام مكتبات معيارية ‪(Standard Library):‬‬


‫ن‬
‫لتحسي العمليات باستخدام مكتبات موجودة‪.‬‬ ‫المبجمات زي ‪GCC‬عندها قواعد‬‫‪ o‬بعض ى‬
‫‪ o‬مثال‪ :‬بدل ما تستخدم )‪printf(s‬لطباعة نص ثابت‪ ،‬ى‬
‫المبجم هيبدلها بـ )‪puts(s‬‬
‫السبب ‪:‬‬ ‫‪o‬‬

‫‪puts‬أسهل وأرسع ألنها مخصصة فقط للطباعة‪.‬‬ ‫▪‬

‫‪printf‬أبطأ ألنها تحتوي عل ن‬


‫مبات معقدة زي التنسيق)‪(formatting‬‬ ‫▪‬

‫وبالتاىل‬
‫ي‬ ‫البنامج عن طريق تقليل العمليات المكلفة وتبسيط الكود‪،‬‬
‫‪ Strength Reduction‬بيحسن أداء ر‬
‫استخدام أقل للموارد مع الحفاظ عل نفس النتائج‪.‬‬
‫‪Loop Unrolling:‬‬
‫تحسي ن يف الكود بحيث يتم تحويل الحلقة )‪ (loop‬إىل نسخة فيها عدد‬
‫ن‬ ‫تعريف ‪: Loop unrolling‬هو‬ ‫•‬
‫ن‬ ‫ى‬
‫أقل من التكرارات )‪ (iterations‬لكنها بتنجز شغل أكب يف كل مرة‪.‬‬
‫الل هيتم دمجها أو تقليلها ن يف كل مرة‪.‬‬
‫الـ ‪Unrolling Factor:‬ده عدد التكرارات ي‬ ‫•‬

‫عمل ‪:‬لو عندك ‪ loop‬شغال عل متغبات كتب وبيعمل عمليات زي‪:‬‬


‫ي‬ ‫مثال‬ ‫•‬

‫{ )‪for(i=0; i<400; i++‬‬


‫;‪a[i] = i * 2 + 10‬‬
‫}‬

‫بدل ما تتنفذ ‪ 400‬مرة‪ ،‬ممكن تضيف العمليات دي عل دفعات )‪ (batch‬كل ‪ 4‬عناض مع بعض‪.‬‬ ‫‪o‬‬

‫‪https://kbseducation.com/‬‬
‫‪0550602949 / 0557715267‬‬
‫جميع الحقوق محفوظة لمنصة ‪KBS Education‬‬
‫واليُسمح بنشر أو تبادل هذه الملفات (شرعا ً وقانوناً) لغير المشتركين في الدورة‬

‫األسباب‪:‬‬ ‫•‬

‫الل بتحصل )‪ (jump back‬عشان كل مرة ترجع بداية الحلقة‪.‬‬


‫تقليل عدد القفزات ي‬ ‫‪o‬‬

‫كل مرة ن يف الحلقة بتستهلك وقت ألنها بتشيك عل ررسط ‪i<400‬‬ ‫‪o‬‬

‫‪Strength Reduction:‬‬
‫الل ملهاش‬
‫تحويل حلقة الـ ‪for:‬بدل ما تعمل كل العمليات بشكل متكرر‪ ،‬بتقلل العمليات الحسابية ي‬ ‫•‬
‫الزمة‪.‬‬
‫الشكل الجديد‪:‬‬ ‫‪o‬‬

‫{ )‪for(i=0; i<400; i+=4‬‬


‫;‪a[i] = i * 2 + 10‬‬
‫;‪a[i+1] = (i+1) * 2 + 10‬‬
‫;‪a[i+2] = (i+2) * 2 + 10‬‬
‫;‪a[i+3] = (i+3) * 2 + 10‬‬
‫}‬
‫كده الكود ىبق بيعمل ‪ 4‬عمليات ن يف كل تكرار للحلقة بدل واحدة‪.‬‬ ‫‪o‬‬

‫الفايدة‪:‬‬ ‫•‬

‫بتقلل التشييكات المتكررة عل ررسط الحلقة زي ‪i<400.‬‬ ‫‪o‬‬

‫بتتجنب الـ "‪"stalls‬الل بتحصل نف الـ ‪CPU‬أثناء تنفيذ القفزات ن‬


‫بي التكرارات‪.‬‬ ‫‪o‬‬
‫ي‬ ‫ي‬
‫‪ Trade-offs‬التوازن‬
‫الممبات‪:‬‬ ‫•‬

‫وبالتاىل بتقلل التعليمات المتكررة‪.‬‬


‫ي‬ ‫بتقلل التكرار ن يف الحلقة‬ ‫‪o‬‬

‫بتقلل الضغط عل جزء القفزات داخل الكود‪.‬‬ ‫‪o‬‬

‫العيوب‪:‬‬ ‫•‬

‫مع زيادة حجم الكود (بسبب تكرار العمليات دفعة واحدة)‪ ،‬ممكن المعالج يستهلك ى‬
‫أكب لو تخط الكود‬ ‫‪o‬‬
‫مساحة الـ‪Instruction Cache.‬‬
‫النتيجة‪:‬‬ ‫•‬

‫لو الحلقة "‪ "unrolled‬أكب من المساحة المتاحة نف الكاش)‪ ، (cache‬األداء ممكن ى‬


‫يبق أسوأ من الكود‬ ‫ي‬ ‫ر‬ ‫‪o‬‬
‫األصل‪.‬‬
‫ي‬

‫‪https://kbseducation.com/‬‬
‫‪0550602949 / 0557715267‬‬
‫جميع الحقوق محفوظة لمنصة ‪KBS Education‬‬
‫واليُسمح بنشر أو تبادل هذه الملفات (شرعا ً وقانوناً) لغير المشتركين في الدورة‬

‫‪Code Hoisting:‬‬
‫فكرة عامة ‪:‬‬ ‫•‬

‫أوقات الكود جواه أجزاء بتتكرر كل مرة جوه الحلقة)‪ ، (loop‬بس القيم نفسها بتفضل ثابتة‪.‬‬ ‫‪o‬‬

‫ن يف الحالة دي مش الزم نحسب الحاجة دي كل مرة‪ ،‬وبدل كده ننقل الحسابات الثابتة دي برا الحلقة‪.‬‬ ‫‪o‬‬
‫التقنية دي اسمها‪"Code Hoisting".‬‬
‫مثال ‪:‬‬
‫{ )‪for(i=0; i<400; i++‬‬
‫;‪a[x * y] += i‬‬
‫}‬
‫هنا ‪ x * y‬بيتحسب كل مرة ن يف الحلقة‪ ،‬بس هو ثابت وممكن يتنقل برا الحلقة‪:‬‬ ‫‪o‬‬

‫;‪t = x * y‬‬
‫{ )‪for(i=0; i<400; i++‬‬
‫;‪a[t] += i‬‬
‫}‬
‫النتيجة‪ :‬الكود ىبق أرسع ألن الحسابات الثابتة اتحسبت مرة واحدة بس قبل الحلقة‪.‬‬ ‫‪o‬‬

‫‪ Cost‬التقنية ‪:‬‬ ‫•‬

‫لما تنقل الحسابات برا الحلقة‪ ،‬النتيجة الزم تتخزن ن يف مكان مؤقت‪:‬‬ ‫‪o‬‬

‫ى‬
‫الريجسبات‪.‬‬ ‫▪ يا إما ن يف متغب مؤقت)‪ ، (temporary variable‬وده ممكن يزود الضغط عل‬
‫▪ يا إما ن يف الذاكرة المحلية‪(local storage).‬‬
‫المبة إنها بتقلل الحسابات الغب نضورية بشكل كبب‪.‬‬ ‫ومع ذلك‪ ،‬ن‬ ‫‪o‬‬

‫مقارنة بـ ‪Loop Unrolling‬‬


‫‪Code Hoisting‬بسيط وأقل تكلفة مقارنة بـ‪Loop Unrolling.‬‬ ‫‪o‬‬

‫ن‬
‫تحسي األداء بدون ما يزيد حجم الكود كتب‪.‬‬ ‫بيساعد عل‬ ‫‪o‬‬

‫‪Function Inlining‬‬
‫الفعل للفنكشن نفسه‪ .‬الفكرة هنا إن بدل ما ر‬
‫البنامج يروح‬ ‫ي‬ ‫هو عملية استبدال استدعاء الفنكشن بالكود‬
‫ر‬ ‫ن‬
‫ويعمل "‪ "call‬عل الفنكشن ويرجع‪ ،‬ينحط كود الفنكشن يف مكانه مبارسة‪.‬‬

‫‪https://kbseducation.com/‬‬
‫‪0550602949 / 0557715267‬‬
‫جميع الحقوق محفوظة لمنصة ‪KBS Education‬‬
‫واليُسمح بنشر أو تبادل هذه الملفات (شرعا ً وقانوناً) لغير المشتركين في الدورة‬
‫ً‬
‫األمثلة يف البداية ‪:‬لو عندنا فانكشن بيتعمله استدعاء كتب جدا جوا لوب‪ ،‬ده ممكن يكون مكلف عشان‬ ‫•‬
‫ً‬
‫مبارسة‪ .‬لما نعمل‪ ، inlining‬ده ن‬
‫ببود‬ ‫بدال من تنفيذ الكود ر‬ ‫البنامج بيضيع وقت ن يف استدعاء الفانكشن‬‫ر‬
‫األداء‪.‬‬
‫أوتوماتيك‪ ،‬ألن‬ ‫الل المفروض نعملها ‪ inline‬بشكل‬ ‫نن‬
‫ي‬ ‫التلقائ ‪:‬من الصعب تحديد الفانكشب ي‬ ‫ي‬ ‫تحدي التنفيذ‬ ‫•‬
‫المزايا واضحة لكن التكلفة مش سهلة القياس‪ .‬مثال‪:‬‬
‫هيكب‪.‬‬
‫ر‬ ‫للبنامج‬ ‫زيادة حجم الكود ‪:‬لما نحط الكود ر‬
‫مبارسة بدل االستدعاء‪ ،‬الكود العام ر‬ ‫‪o‬‬

‫يبق فيه حسابات مكررة‪.‬‬ ‫تكرار الحسابات ‪:‬لو نفس الكود تم نسخه كتب‪ ،‬ممكن ى‬ ‫‪o‬‬

‫للمبمج إنه يتحكم‬


‫الكلمات المفتاحية ‪:‬بعض اللغات زي ‪ C‬و ‪ C++‬عندها كلمة زي ‪inline‬عشان تسمح ر‬ ‫•‬
‫ً‬
‫يدويا ن يف إذا كان الفنكشن هيتعمله ‪ inlining‬وال أل‪.‬‬
‫‪ High-Level Optimizations:‬كشف وحذف الكود الميت‬
‫ً‬
‫البنامج ممكن يحتوي عل كود مش هيتنفذ تحت أي ظرف‪ ،‬زي كود مكتوب بالغلط أو كود اتسبب‬
‫• أحيانا ر‬
‫ن‬
‫تحسي )‪ (Optimization‬معقدة‪ .‬ده بنسميه‪"Dead Code".‬‬ ‫فيه عملية‬
‫الل هو خريطة بتوضح‬
‫البنامج بيتمسك الكود الميت عن طريق تحليل )‪ Control Flow Graph (CFG‬ي‬ ‫ر‬ ‫•‬
‫ن‬
‫البنامج بي األجزاء المختلفة‪.‬‬
‫طريقة تنقل ر‬
‫مثال بسيط ‪:‬‬
‫الرسط ‪x < y‬اتحقق‪ ،‬بيعمل ‪return‬‬ ‫عندك كود لو ر‬ ‫•‬
‫الرسط متحققش بيعمل ‪ return 20.‬ن يف‬‫‪ ،10‬ولو ر‬
‫الل بيطبع "‪ "Goodbye‬و‪return 30‬‬ ‫ن‬
‫البنامج عمره ما هيوصل للسطر ي‬
‫الحالتي‪ ،‬ر‬
‫الل بعد الـ ‪if‬ملوش الزمة ألنه مستحيل يوصل له أثناء التشغيل‪.‬‬
‫هنا الكود ي‬ ‫•‬

‫إزاي بنكتشف الكود الميت؟‬


‫‪ .1‬نعمل ‪( traversal‬استكشاف) للـ‪CFG.‬‬
‫‪ .2‬كل ‪( Node‬عقدة) ن ن‬
‫ببورها‪ ،‬بنعلمها كأنها مستعملة‪.‬‬
‫‪ .3‬لو نف عقد مش متعلمة بعد االستكشاف‪ ،‬ى‬
‫يبق دي "غب قابلة للوصول‪".‬‬ ‫ي‬
‫ئ‬
‫النهائ‪.‬‬ ‫البنامج‬ ‫ن‬
‫ي‬ ‫‪ .4‬الكومبايلر يا إما هيطلع رسالة خطأ أو ببساطة مش هيحط الكود الميت ده يف ر‬
‫أهمية‪Dead Code Elimination‬‬
‫ئ‬
‫النهائ‪.‬‬ ‫• يقلل من حجم الكود‬
‫ي‬
‫ن‬
‫بيلغ حاجات مش بتستخدم‪.‬‬
‫• يحسن األداء ألنه ي‬
‫البنامج ويحسن فهم الكود‪.‬‬
‫يقلل من تعقيد ر‬ ‫•‬

‫‪https://kbseducation.com/‬‬
‫‪0550602949 / 0557715267‬‬

You might also like