مُحسِّن المُترجم
المُترجم المُحسِّن هو مُترجم مُصمَّم لتوليد كود مُحسَّن في جوانب مثل تقليل وقت تنفيذ البرنامج ، واستخدام الذاكرة ، وحجم التخزين ، واستهلاك الطاقة . [ 1 ] يتم تنفيذ التحسين عمومًا كسلسلة من التحويلات المُحسِّنة ، والمعروفة أيضًا بتحسينات المُترجم - وهي خوارزميات تُحوِّل الكود لإنتاج كود مُكافئ دلاليًا مُحسَّن لجانب مُعيَّن.
تُحدَّد عملية التحسين بعدة عوامل. تشير التحليلات النظرية إلى أن بعض مسائل التحسين هي مسائل NP-كاملة ، أو حتى غير قابلة للتقرير . [ 2 ] كما أن إنتاج كود مثالي تمامًا غير ممكن، لأن تحسين جانب واحد غالبًا ما يُضعف الأداء في جانب آخر (انظر: التحسين الفائق ). التحسين هو مجموعة من الأساليب الاستدلالية لتحسين استخدام الموارد في البرامج النموذجية. [ 3 ] : 585
التصنيف
النطاق المحلي مقابل النطاق العالمي
يحدد النطاق مقدار كود الإدخال الذي يتم أخذه في الاعتبار لتطبيق التحسينات.
تستخدم تحسينات النطاق المحلي معلومات خاصة بالكتلة الأساسية . [ 4 ] ولأن الكتل الأساسية لا تحتوي على عبارات تحكم في التدفق، فإن هذه التحسينات تتطلب تحليلًا بسيطًا، مما يقلل من الوقت ومتطلبات التخزين. مع ذلك، لا يتم الاحتفاظ بأي معلومات عبر عمليات القفز.
تُجرى تحسينات النطاق العام، والمعروفة أيضًا بتحسينات داخل الإجراء، على الدوال الفردية. [ 4 ] وهذا يمنحها معلومات أكثر للعمل بها، ولكنه غالبًا ما يستلزم عمليات حسابية مكلفة. يجب وضع افتراضات أسوأ الحالات عند استدعاء الدوال أو الوصول إلى المتغيرات العامة نظرًا لقلة المعلومات المتاحة عنها.
تحسين فتحة الباب
تُجرى تحسينات "ثقب الباب" عادةً في المراحل الأخيرة من عملية الترجمة البرمجية بعد توليد رمز الآلة . يفحص هذا التحسين بعض التعليمات المتجاورة (كما لو كان "ينظر من خلال ثقب الباب" إلى الكود) لمعرفة ما إذا كان بالإمكان استبدالها بتعليمات منفردة أو بتسلسل أقصر من التعليمات. [ 3 ] : 554 على سبيل المثال، قد يكون ضرب قيمة في اثنين أكثر كفاءةً عن طريق إزاحة القيمة إلى اليسار أو بجمعها مع نفسها (هذا المثال هو أيضًا حالة من حالات تقليل القوة ).
تحسين الإجراءات المتداخلة
تُحلل التحسينات بين الإجراءات جميع أجزاء الكود المصدري للبرنامج. وكلما توفرت معلومات أكثر، زادت فعالية هذه التحسينات. ويمكن استخدام هذه المعلومات في تحسينات متنوعة، منها تضمين الدوال ، حيث يُستبدل استدعاء الدالة بنسخة من جسمها.
تحسين وقت الربط
يُعدّ تحسين وقت الربط (LTO)، أو تحسين البرنامج بأكمله، فئةً أعمّ من تحسينات ما بين الإجراءات. خلال عملية LTO، يتمتع المُصرّف برؤية شاملة لوحدات الترجمة، مما يسمح له بإجراء تحسينات أكثر فعالية، مثل تضمين التعليمات البرمجية عبر الوحدات وإلغاء المحاكاة الافتراضية .
تحسين كود الآلة وكود الكائن
تتضمن عملية تحسين كود الآلة استخدام مُحسِّن كود الكائن لتحليل البرنامج بعد ربط جميع أكواد الآلة . وتصبح تقنيات مثل ضغط الماكرو، الذي يوفر المساحة عن طريق تكثيف تسلسلات التعليمات الشائعة، أكثر فعالية عندما تكون صورة المهمة القابلة للتنفيذ بالكامل متاحة للتحليل. [ 5 ]
مستقل عن اللغة مقابل معتمد على اللغة
تشترك معظم لغات البرمجة عالية المستوى في بنيات برمجية وتجريدات مشتركة، مثل بنيات التفرع (if، switch)، وبنيات التكرار (for، while)، وبنيات التغليف (الهياكل، الكائنات). وبالتالي، يمكن استخدام تقنيات تحسين متشابهة عبر اللغات. مع ذلك، تُصعّب بعض خصائص اللغة بعض عمليات التحسين. على سبيل المثال، تُصعّب المؤشرات في لغتي C و C++ تحسين المصفوفات؛ انظر تحليل الأسماء المستعارة . لكن لغات مثل PL/I ، التي تدعم المؤشرات أيضًا، تُطبّق تحسينات للمصفوفات. في المقابل، تُسهّل بعض خصائص اللغة بعض عمليات التحسين. على سبيل المثال، في بعض اللغات، لا يُسمح للدوال بإحداث آثار جانبية . لذلك، إذا استدعى برنامجٌ ما الدالة نفسها عدة مرات بنفس الوسائط، يمكن للمُصرّف أن يستنتج أن نتيجة الدالة تحتاج إلى حسابها مرة واحدة فقط. في اللغات التي يُسمح فيها للدوال بإحداث آثار جانبية، يمكن للمُصرّف حصر هذا التحسين على الدوال التي يمكنه تحديد أنها لا تُحدث آثارًا جانبية.
مستقل عن الآلة مقابل معتمد على الآلة
تعتمد العديد من التحسينات التي تُجرى على مفاهيم البرمجة المجردة (الحلقات، الكائنات، الهياكل) على الجهاز الذي يستهدفه المُصرّف، ولكنّ أكثر التحسينات فعالية هي تلك التي تستغلّ على النحو الأمثل الميزات الخاصة بالمنصة المستهدفة. ومن الأمثلة على ذلك التعليمات التي تُنفّذ عدة مهام في آنٍ واحد، مثل إنقاص قيمة المُسجّل والتفرع إذا لم تكن القيمة صفرًا.
فيما يلي مثال على تحسين يعتمد على الجهاز المحلي. لتعيين قيمة سجل إلى 0، فإن الطريقة الواضحة هي استخدام الثابت '0' في تعليمة تُعيّن قيمة السجل إلى قيمة ثابتة. أما الطريقة الأقل وضوحًا فهي إجراء عملية XOR بين السجل ونفسه أو طرحه من نفسه. ويعود للمُصرّف تحديد أي نوع من التعليمات يجب استخدامه. في العديد من أجهزة RISC ، تكون كلتا التعليمتين مناسبتين بنفس القدر، نظرًا لتساويهما في الطول والوقت. في العديد من المعالجات الدقيقة الأخرى، مثل عائلة Intel x86 ، يتضح أن تعليمة XOR أقصر وأسرع على الأرجح، إذ لا حاجة لفك تشفير المعامل الفوري، ولا استخدام "سجل المعامل الفوري" الداخلي؛ وينطبق الأمر نفسه على IBM System/360 والإصدارات اللاحقة بالنسبة لتعليمة الطرح. [ 6 ] تكمن إحدى المشكلات المحتملة في أن XOR أو الطرح قد يُدخلان تبعية بيانات على القيمة السابقة للسجل، مما يتسبب في توقف خط الأنابيب ، والذي يحدث عندما يضطر المعالج إلى تأخير تنفيذ تعليمة ما لأنها تعتمد على نتيجة تعليمة سابقة. ومع ذلك، غالباً ما تتعامل المعالجات مع عملية XOR بين سجل ونفسه أو طرح سجل من نفسه كحالة خاصة لا تسبب توقفات.
العوامل المؤثرة على التحسين
- آلة الهدف
- قد يعتمد تطبيق تحسينات معينة، أو حتى جدوى تطبيقها، على خصائص الجهاز المستهدف. تقوم بعض المترجمات، مثل GCC و Clang، بتحديد عوامل تعتمد على الجهاز بحيث يمكن استخدامها لتحسين الأداء على أجهزة مختلفة. [ 7 ]
- بنية وحدة المعالجة المركزية المستهدفة
- عدد المسجلات : يمكن استخدام المسجلات لتحسين الأداء. يمكن تخزين المتغيرات المحلية في المسجلات بدلاً من المكدس . كما يمكن الوصول إلى النتائج المؤقتة/الوسيطة في المسجلات بدلاً من الذاكرة الأبطأ.
- مقارنة بين معالجات RISC و CISC : تتميز مجموعات تعليمات CISC عادةً بأطوال تعليمات متغيرة، [ 8 ] كما أنها تحتوي على عدد أكبر من التعليمات الممكنة، وقد تستغرق كل تعليمة أوقاتًا متفاوتة. في المقابل، تسعى مجموعات تعليمات RISC إلى الحد من هذا التباين: فمجموعات التعليمات عادةً ما تكون ثابتة الطول، باستثناءات قليلة، كما أن عدد تركيبات السجلات وعمليات الذاكرة أقل، ومعدل إصدار التعليمات (عدد التعليمات المكتملة في كل فترة زمنية، وهو عادةً مضاعف صحيح لدورة الساعة) يكون ثابتًا في الحالات التي لا يؤثر فيها زمن استجابة الذاكرة. قد توجد عدة طرق لتنفيذ مهمة معينة، حيث توفر CISC عادةً بدائل أكثر من RISC. ويتعين على المترجمات معرفة التكاليف النسبية بين التعليمات المختلفة واختيار أفضل تسلسل للتعليمات (انظر اختيار التعليمات ).
- خطوط المعالجة : خط المعالجة هو وحدة معالجة مركزية مُقسّمة إلى سلسلة من العمليات . يسمح هذا النظام باستخدام أجزاء من وحدة المعالجة المركزية لتنفيذ تعليمات مختلفة، وذلك بتقسيم تنفيذ التعليمات إلى مراحل متعددة: فك تشفير التعليمات، فك تشفير العناوين، جلب البيانات من الذاكرة، جلب البيانات من المسجلات، الحساب، تخزين البيانات في المسجلات، إلخ. قد تكون إحدى التعليمات في مرحلة تخزين البيانات في المسجلات، بينما تكون أخرى في مرحلة جلب البيانات منها. تحدث تعارضات خطوط المعالجة عندما تعتمد تعليمة في مرحلة ما على نتيجة تعليمة أخرى تسبقها في خط المعالجة ولكنها لم تُستكمل بعد. يمكن أن تؤدي تعارضات خطوط المعالجة إلى توقفها ، حيث تُهدر وحدة المعالجة المركزية دورات المعالجة في انتظار حل التعارض. يمكن للمترجمات جدولة التعليمات، أو إعادة ترتيبها، لتقليل حدوث توقفات خطوط المعالجة.
- عدد الوحدات الوظيفية : تحتوي بعض وحدات المعالجة المركزية على عدة وحدات حسابية ومنطقية (ALU) ووحدات حسابية عائمة (FPU) تسمح لها بتنفيذ تعليمات متعددة في وقت واحد. قد توجد قيود على نوع التعليمات التي يمكن ربطها ببعضها (الربط هو التنفيذ المتزامن لتعليماتين أو أكثر)، وعلى الوحدة الوظيفية التي يمكنها تنفيذ أي تعليمة. كما أنها تواجه مشكلات مشابهة لتعارضات خط الأنابيب. يمكن جدولة التعليمات بحيث تكون الوحدات الوظيفية محملة بالكامل.
- هندسة الآلة
- حجم ونوع ذاكرة التخزين المؤقت لوحدة المعالجة المركزية (مُرتبطة مباشرةً، أو ترابطية ثنائية/رباعية/ثمانية/سداسية عشرة، أو ترابطية كاملة): قد تؤدي تقنيات مثل التوسيع المضمن وفك حلقات التكرار إلى زيادة حجم الكود المُولّد وتقليل موضع الكود. قد يتباطأ البرنامج بشكل كبير إذا لم يعد جزء من الكود كثير الاستخدام (مثل الحلقات الداخلية في الخوارزميات المختلفة) يتسع في ذاكرة التخزين المؤقت نتيجةً للتحسينات التي تزيد من حجم الكود. كذلك، فإن ذاكرات التخزين المؤقت غير الترابطية بالكامل لديها احتمالات أكبر لحدوث تصادمات حتى في ذاكرة تخزين مؤقت غير ممتلئة.
- معدلات نقل البيانات بين الذاكرة المؤقتة والذاكرة الرئيسية: تُعطي هذه المعدلات للمُصرّف مؤشرًا على تكلفة عدم العثور على البيانات في الذاكرة المؤقتة. ويُستخدم هذا بشكل أساسي في التطبيقات المتخصصة.
- الاستخدام المقصود
- تصحيح الأخطاء : أثناء التطوير، غالبًا ما يتم تعطيل التحسينات لتسريع عملية الترجمة أو لتسهيل تصحيح أخطاء الكود التنفيذي. قد يؤدي تحسين التحويلات، وخاصة تلك التي تعيد ترتيب الكود، إلى صعوبة ربط الكود التنفيذي بالكود المصدري.
- الاستخدام العام: غالبًا ما يُتوقع أن تعمل البرامج الجاهزة على مجموعة متنوعة من الأجهزة التي قد تشترك في نفس مجموعة التعليمات ولكنها تختلف في خصائص الأداء. قد لا يكون الكود مُحسَّنًا لأي جهاز معين، أو قد يكون مُعدًا ليعمل بأفضل شكل على الجهاز الأكثر شيوعًا بينما يعمل بشكل أقل كفاءة على الأجهزة الأخرى.
- الاستخدام الخاص: إذا تم تجميع البرنامج لأجهزة ذات خصائص موحدة، فيمكن للمترجم تحسين الكود الناتج بشكل كبير لتلك الأجهزة.
- وتشمل الحالات البارزة التعليمات البرمجية المصممة للمعالجات المتوازية والمتجهة ، والتي يتم استخدام مترجمات خاصة للتوازي من أجلها.
- يمكن تحسين البرامج الثابتة للأنظمة المدمجة لتتوافق مع وحدة المعالجة المركزية والذاكرة المستهدفة. قد تكون تكلفة النظام أو موثوقيته أهم من سرعة تنفيذ الكود. على سبيل المثال، توفر مُجمِّعات البرامج المدمجة عادةً خيارات لتقليل حجم الكود على حساب السرعة. قد يكون من الضروري أن يكون توقيت الكود قابلاً للتنبؤ، بدلاً من أن يكون بأقصى سرعة ممكنة، لذا قد يتم تعطيل التخزين المؤقت للكود، بالإضافة إلى تحسينات المُجمِّع التي تتطلبه.
المواضيع المشتركة
يشمل التحسين المواضيع التالية، والتي قد تكون متضاربة في بعض الأحيان.
- تحسين الحالة المشتركة
- قد يمتلك الوضع الشائع خصائص فريدة تسمح بمسار سريع على حساب مسار بطيء . إذا تم اختيار المسار السريع بشكل متكرر، فإن النتيجة هي أداء أفضل بشكل عام.
- تجنب التكرار
- أعد استخدام النتائج التي تم حسابها بالفعل وقم بتخزينها لاستخدامها لاحقًا، بدلاً من إعادة حسابها.
- كتابة أكواد أقل
- قم بإزالة العمليات الحسابية غير الضرورية والقيم الوسيطة. عادةً ما يؤدي تقليل الجهد المبذول من وحدة المعالجة المركزية والذاكرة المؤقتة والذاكرة الرئيسية إلى تسريع التنفيذ. في المقابل، في الأنظمة المدمجة ، يؤدي تقليل حجم الكود إلى خفض تكلفة المنتج.
- تقليل عدد القفزات باستخدام التعليمات البرمجية ذات الخط المستقيم ، والتي تسمى أيضًا التعليمات البرمجية الخالية من التفرعات
- شفرة أقل تعقيدًا. تتداخل القفزات ( التفرعات الشرطية أو غير الشرطية ) مع جلب التعليمات مسبقًا، مما يُبطئ الشفرة. يمكن تقليل التفرعات باستخدام التضمين أو فك الحلقات، ولكن على حساب زيادة حجم الملف الثنائي بمقدار طول الشفرة المُكررة. وهذا غالبًا ما يؤدي إلى دمج عدة كتل أساسية في كتلة واحدة.
- المنطقة
- ينبغي وضع التعليمات البرمجية والبيانات التي يتم الوصول إليها في وقت متقارب بالقرب من بعضها البعض في الذاكرة لزيادة الموضع المكاني للمرجعية .
- استغل التسلسل الهرمي للذاكرة
- تزداد تكلفة الوصول إلى الذاكرة مع كل مستوى من مستويات التسلسل الهرمي للذاكرة ، لذا ضع العناصر الأكثر استخدامًا في السجلات أولاً، ثم في ذاكرة التخزين المؤقت، ثم في الذاكرة الرئيسية، قبل الانتقال إلى القرص.
- التوازي
- إعادة ترتيب العمليات للسماح بإجراء عمليات حسابية متعددة بالتوازي، سواء على مستوى التعليمات أو الذاكرة أو الخيوط.
- المعلومات الأكثر دقة أفضل.
- كلما كانت المعلومات التي يمتلكها المترجم أكثر دقة، كلما كان بإمكانه استخدام أي من تقنيات التحسين هذه أو جميعها بشكل أفضل.
- يمكن أن تساعد مقاييس وقت التشغيل
- يمكن استخدام المعلومات التي يتم جمعها أثناء تشغيل الاختبار في التحسين الموجه بالملف التعريفي . ويمكن استخدام المعلومات التي يتم جمعها أثناء التشغيل، مع تقليل الحمل الزائد قدر الإمكان ، بواسطة مُترجم JIT لتحسين الأداء ديناميكيًا.
- تقليل القوة
- استبدل العمليات المعقدة أو الصعبة أو المكلفة بعمليات أبسط. على سبيل المثال، استبدل القسمة على ثابت بالضرب في مقلوبه، أو استخدم تحليل المتغيرات الاستقرائي لاستبدال الضرب في مؤشر حلقة بالجمع.
تقنيات محددة
تحسينات الحلقة
يُحسّن تحسين الحلقات التكرارية التعليمات البرمجية التي تُشكّل الحلقة، مثل حلقة for ، على سبيل المثال، نقل التعليمات البرمجية الثابتة داخل الحلقة . يُمكن أن يكون لتحسين الحلقات التكرارية تأثير كبير لأن العديد من البرامج تقضي نسبة كبيرة من وقتها داخل الحلقات. [ 3 ] : 596
تتضمن بعض تقنيات التحسين المصممة أساسًا للعمل على الحلقات ما يلي:
- تحليل المتغيرات الاستقرائية
- باختصار، إذا كان المتغير في حلقة تكرارية دالة خطية بسيطة لمتغير الفهرس، مثل ، فيمكن تحديثه بشكل مناسب في كل مرة يتغير فيها متغير الحلقة. يُعدّ هذا تبسيطًا للدالة ، وقد يسمح أيضًا بجعل تعريفات متغير الفهرس غير مستخدمة . [ 3 ] : 596-598. تُفيد هذه المعلومات أيضًا في إزالة التحقق من الحدود وتحليل التبعيات ، من بين أمور أخرى.
j := 4*i + 1
- انشطار الحلقة أو توزيع الحلقة
- تحاول تقنية تقسيم الحلقة تقسيم حلقة تكرارية إلى حلقات متعددة ضمن نفس نطاق الفهرس، بحيث تستخدم كل حلقة جديدة جزءًا فقط من جسم الحلقة الأصلية. وهذا من شأنه تحسين موضعية الوصول إلى كل من البيانات التي يتم الوصول إليها داخل الحلقة والتعليمات البرمجية الموجودة في جسم الحلقة.
- دمج الحلقات أو تجميع الحلقات أو تداخل الحلقات أو تشويش الحلقات
- هناك تقنية أخرى تهدف إلى تقليل الحمل الزائد للحلقات. فعندما تتكرر حلقتان متجاورتان نفس عدد المرات بغض النظر عما إذا كان هذا العدد معروفًا وقت الترجمة، يمكن دمج محتوياتهما طالما أنهما لا تشيران إلى بيانات بعضهما البعض.
- انعكاس الحلقة
- تُحوّل هذه التقنية حلقة while القياسية إلى حلقة do/while (المعروفة أيضًا باسم repeat/until ) مُغلّفة بشرط if ، مما يُقلّل عدد القفزات بمقدار قفزتين، في الحالات التي تُنفّذ فيها الحلقة. يُكرّر هذا التحقق من الشرط (مما يزيد من حجم الكود)، ولكنه أكثر كفاءة لأن القفزات عادةً ما تُسبّب توقفًا في خط الأنابيب . بالإضافة إلى ذلك، إذا كان الشرط الأولي معروفًا وقت الترجمة، وكان من المعروف أنه خالٍ من الآثار الجانبية ، فيمكن تخطّي شرط if .
- تقاطع لوب
- تُبدّل هذه التحسينات الحلقات الداخلية بالحلقات الخارجية. وعندما تُفهرس متغيرات الحلقة في مصفوفة، يُمكن لهذا التحويل تحسين موضعية المرجع، وذلك بحسب تخطيط المصفوفة.
- حركة الكود غير المتغيرة للحلقة
- إذا تم حساب قيمة ما داخل حلقة تكرارية في كل دورة، وكانت قيمتها ثابتة في كل دورة، فإن نقلها إلى خارج الحلقة وحساب قيمتها مرة واحدة فقط قبل بدء الحلقة يُحسّن الكفاءة بشكل كبير. [ 3 ] : 596 يُعدّ هذا الأمر بالغ الأهمية، خاصةً مع تعابير حساب العناوين الناتجة عن الحلقات التكرارية على المصفوفات. ولتنفيذ هذه التقنية بشكل صحيح، يجب استخدامها مع عكس الحلقة ، لأن بعض أجزاء الكود غير آمنة للنقل إلى خارج الحلقة.
- تحسين تداخل الحلقات
- تتميز بعض الخوارزميات الشائعة، مثل ضرب المصفوفات، بضعف أداء الذاكرة المؤقتة وكثرة عمليات الوصول إليها. تعمل تقنية تحسين تداخل الحلقات على زيادة عدد مرات الوصول إلى الذاكرة المؤقتة من خلال العمل على كتل صغيرة واستخدام تبديل الحلقات.
- انعكاس الحلقة
- يعكس عكس الحلقة ترتيب إسناد القيم إلى متغير الفهرس. يُعدّ هذا تحسينًا دقيقًا يُساعد على التخلص من التبعيات ، وبالتالي تمكين تحسينات أخرى. علاوة على ذلك، في بعض البنى، يُساهم عكس الحلقة في تقليل حجم الكود، إذ عند إنقاص فهرس الحلقة، يكون الشرط اللازم لخروج البرنامج قيد التشغيل من الحلقة هو المقارنة مع الصفر. غالبًا ما تكون هذه تعليمة خاصة لا تتطلب مُعاملات، على عكس المقارنة مع عدد، التي تتطلب العدد المراد المقارنة به. لذلك، يتم توفير مساحة البايتات اللازمة لتخزين المُعامل باستخدام عكس الحلقة. بالإضافة إلى ذلك، إذا تجاوز عدد المقارنة حجم كلمة النظام الأساسي، فسيتطلب الأمر تنفيذ تعليمات متعددة لتقييم المقارنة في ترتيب الحلقة القياسي، وهو ما لا يحدث مع عكس الحلقة.
- فك الحلقة
- يؤدي فك الحلقة إلى تكرار جسم الحلقة عدة مرات، لتقليل عدد مرات اختبار شرط الحلقة وعدد القفزات؛ إذ يمكن أن تؤثر الاختبارات والقفزات سلبًا على الأداء من خلال إعاقة مسار التعليمات. يُعد هذا تحسينًا لتقليل عدد القفزات. يؤدي فك الحلقة بالكامل إلى إزالة جميع النفقات العامة، ولكنه يتطلب معرفة عدد التكرارات وقت الترجمة.
- تقسيم الحلقة
- تهدف عملية تقسيم الحلقات إلى تبسيط الحلقة أو إزالة التبعيات بتقسيمها إلى حلقات متعددة لها نفس البنية ولكنها تتكرر على أجزاء متجاورة مختلفة من نطاق الفهرس. ومن الحالات الخاصة المفيدة عملية تقشير الحلقات ، التي تُبسط الحلقة ذات التكرار الأول الإشكالي بتنفيذ هذا التكرار بشكل منفصل قبل الدخول إلى الحلقة.
- إلغاء تبديل الحلقة
- يؤدي إلغاء التبديل إلى نقل الشرط من داخل حلقة إلى خارج الحلقة عن طريق تكرار جسم الحلقة داخل كل من عبارات if و else الخاصة بالشرط.
- تطوير البرمجيات باستخدام تقنية خطوط الأنابيب
- أُعيد هيكلة الحلقة بحيث يُقسّم العمل المنجز في كل تكرار إلى عدة أجزاء ويُنفّذ على عدة تكرارات. في حلقة مُحكمة، تُخفي هذه التقنية زمن الاستجابة بين تحميل القيم واستخدامها.
- التوازي التلقائي
- يتم تحويل الحلقة إلى كود متعدد الخيوط أو متجه (أو حتى كليهما) لاستخدام معالجات متعددة في وقت واحد في جهاز متعدد المعالجات ذي ذاكرة مشتركة (SMP)، بما في ذلك الأجهزة متعددة النوى.
تحسينات استباقية للمتاجر
تتيح تحسينات التخزين الاستباقية تنفيذ عمليات التخزين في وقت أبكر مما هو مسموح به عادةً في سياق الخيوط والأقفال. يحتاج البرنامج إلى طريقة ما لمعرفة القيمة التي سيتم تخزينها مسبقًا من خلال عملية الإسناد التي كان من المفترض أن تتبعها. يهدف هذا التيسير إلى تمكين مُحسِّن المُصرِّف من إجراء أنواع معينة من إعادة ترتيب التعليمات البرمجية التي تحافظ على دلالات البرامج المتزامنة بشكل صحيح. [ 9 ]
تحسينات تدفق البيانات
تعتمد تحسينات تدفق البيانات ، القائمة على تحليل تدفق البيانات ، بشكل أساسي على كيفية انتشار خصائص معينة للبيانات عبر حواف التحكم في مخطط تدفق التحكم . ومن بين هذه الخصائص:
- استبعاد التعبيرات الفرعية الشائعة
- في هذا التعبير
(a + b) - (a + b)/4، يشير مصطلح "التعبير الفرعي المشترك" إلى التعبير المكرر(a + b). تدرك المترجمات التي تطبق هذه التقنية أن هذا التعبير(a + b)لن يتغير، وبالتالي تحسب قيمته مرة واحدة فقط. [ 3 ] : 592-594
- الطي والانتشار المستمر
- استبدال التعبيرات المكونة من ثوابت (مثلاً،
3 + 5) بقيمتها النهائية (8) في وقت الترجمة، بدلاً من إجراء الحساب في وقت التشغيل. [ 10 ] يُستخدم في معظم اللغات الحديثة.
- التعرف على المتغيرات الاستقرائية وإزالتها
- انظر المناقشة أعلاه حول تحليل متغيرات الاستقراء .
- تصنيف الأسماء المستعارة وتحليل المؤشرات
- في وجود المؤشرات ، يصعب إجراء أي تحسينات، إذ قد تتغير أي قيمة لمتغير ما عند تخصيص موقع ذاكرة له. بتحديد المؤشرات التي يمكنها أن تُشير إلى متغيرات معينة، يمكن تجاهل المؤشرات غير ذات الصلة.
- التخلص من المتاجر الميتة
- إزالة عمليات الإسناد إلى المتغيرات التي لا تتم قراءتها لاحقًا، إما بسبب انتهاء عمر المتغير أو بسبب عملية إسناد لاحقة ستستبدل القيمة الأولى.
التحسينات القائمة على SSA
تهدف هذه التحسينات إلى إجرائها بعد تحويل البرنامج إلى صيغة خاصة تُسمى صيغة التعيين الأحادي الثابت ، حيث يُعيّن لكل متغير مكان واحد فقط. ورغم أن بعض الوظائف تعمل بدون هذه الصيغة، إلا أنها تكون أكثر فعالية معها. كما أن العديد من التحسينات المذكورة في أقسام أخرى تستفيد منها دون أي تغييرات خاصة، مثل تخصيص السجلات.
- ترقيم القيم العالمية
- تُزيل GVN التكرار من خلال إنشاء مخطط قيم للبرنامج، ثم تحديد القيم التي تُحسب بواسطة تعابير مكافئة. تستطيع GVN تحديد بعض حالات التكرار التي لا تستطيع تقنية حذف التعبيرات الفرعية المشتركة تحديدها ، والعكس صحيح.
- انتشار الثوابت الشرطية المتفرقة
- يجمع هذا الأسلوب بين نشر الثوابت، وطَيّ الثوابت ، وإزالة التعليمات البرمجية غير المستخدمة ، ويُحسّن ما يُمكن تحقيقه بتشغيلها بشكل منفصل. [ 11 ] [ 12 ] يُنفّذ هذا التحسين البرنامج بشكل رمزي، حيث ينشر القيم الثابتة في آنٍ واحد، ويزيل أجزاءً من مخطط تدفق التحكم التي تجعلها غير قابلة للوصول.
تحسينات مولد الشفرة
- تخصيص السجل
- يُفضّل تخزين المتغيرات الأكثر استخدامًا في سجلات المعالج لضمان أسرع وصول إليها. ولتحديد المتغيرات التي يجب تخزينها في السجلات، يُنشأ رسم بياني للتداخل. يُمثّل كل متغير رأسًا، وعندما يُستخدم متغيران في الوقت نفسه (أي يتقاطع نطاقهما)، يُنشأ بينهما ضلع. يُلوّن هذا الرسم البياني باستخدام خوارزمية تشايتين، على سبيل المثال ، بنفس عدد الألوان الموجودة في السجلات. في حال فشل التلوين، يُخزّن أحد المتغيرات في الذاكرة، ثم تُعاد محاولة التلوين.
- اختيار التعليمات
- تُتيح معظم البنى، ولا سيما بنى CISC وتلك التي تدعم أنماط عنونة متعددة ، عدة طرق مختلفة لتنفيذ عملية معينة، باستخدام تسلسلات تعليمات مختلفة تمامًا. وتتمثل مهمة مُحدِّد التعليمات في اختيار التعليمات المناسبة لتنفيذ كل عامل في التمثيل الوسيط منخفض المستوى . على سبيل المثال، في العديد من المعالجات من عائلة 68000 وبنية x86، يمكن استخدام أنماط عنونة معقدة في عبارات مثل ` - ...
lea 25(a1,d5*4), a0 - جدولة التدريس
- يُعد جدولة التعليمات تحسينًا مهمًا للمعالجات الحديثة ذات البنية الأنبوبية، حيث يتجنب التوقفات أو الفقاعات في خط الأنابيب عن طريق تجميع التعليمات التي لا توجد تبعيات معًا، مع الحرص على الحفاظ على الدلالات الأصلية.
- إعادة التجسيد
- تُعيد عملية إعادة التجسيد حساب القيمة بدلاً من تحميلها من الذاكرة، مما يُلغي الحاجة إلى الوصول إليها. ويتم ذلك بالتزامن مع تخصيص السجلات لتجنب تجاوز سعة الذاكرة.
- تحليل الشفرة
- إذا كانت عدة سلاسل من التعليمات البرمجية متطابقة، أو يمكن تحديد معاييرها أو إعادة ترتيبها لتكون متطابقة، فيمكن استبدالها باستدعاءات لروتين فرعي مشترك. وهذا غالبًا ما يسمح بمشاركة التعليمات البرمجية لإعداد الروتين الفرعي، وأحيانًا للاستدعاء الذاتي النهائي. [ 13 ]
- الترامبولين
- تحتوي العديد من وحدات المعالجة المركزية على تعليمات استدعاء روتينية فرعية أصغر للوصول إلى الذاكرة المنخفضة. يمكن للمترجم توفير مساحة باستخدام هذه الاستدعاءات الصغيرة في الجزء الرئيسي من الكود. تتيح تعليمات القفز في الذاكرة المنخفضة الوصول إلى الروتينات في أي عنوان. هذا يضاعف توفير المساحة الناتج عن تحليل الكود. [ 13 ]
- إعادة ترتيب العمليات الحسابية
- استنادًا إلى البرمجة الخطية الصحيحة ، تعمل مُجمِّعات إعادة الهيكلة على تحسين موضع البيانات وزيادة التوازي من خلال إعادة ترتيب العمليات الحسابية. وقد تُعيد مُجمِّعات تحسين المساحة ترتيب التعليمات البرمجية لإطالة التسلسلات التي يمكن تقسيمها إلى إجراءات فرعية.
تحسينات اللغة الوظيفية
على الرغم من أن العديد من هذه الأمور تنطبق أيضًا على اللغات غير الوظيفية، إلا أنها إما تنشأ في اللغات الوظيفية مثل Lisp و ML أو أنها ذات أهمية خاصة فيها .
- تحسين استدعاء الذيل
- تستهلك استدعاءات الدوال مساحة من الذاكرة المخصصة لها، وتتضمن بعض النفقات الإضافية المتعلقة بتمرير المعاملات وتفريغ ذاكرة التخزين المؤقت للتعليمات. يمكن تحويل الخوارزميات ذات الاستدعاء الذيل إلى خوارزميات تكرارية من خلال عملية تُسمى إزالة الاستدعاء الذيل أو تحسين استدعاءات الدوال.
- إزالة الغابات ( دمج هياكل البيانات )
- في اللغات التي يشيع فيها تطبيق سلسلة من التحويلات على قائمة، تحاول عملية إزالة الغابات إزالة بناء هياكل البيانات الوسيطة.
- التقييم الجزئي
- يمكن تقييم العمليات الحسابية التي تنتج نفس المخرجات بغض النظر عن المدخلات الديناميكية في وقت التشغيل في وقت الترجمة.
تحسينات أخرى
- استبعاد التحقق من الحدود
- تفرض العديد من لغات البرمجة، مثل جافا ، التحقق من حدود جميع عمليات الوصول إلى المصفوفات. ويُعدّ هذا عائقًا كبيرًا أمام الأداء في بعض التطبيقات، مثل البرامج العلمية. يسمح إلغاء التحقق من الحدود للمُصرّف بإزالته بأمان في العديد من الحالات التي يُمكنه فيها تحديد أن الفهرس يجب أن يقع ضمن حدود صالحة؛ على سبيل المثال، إذا كان متغيرًا بسيطًا في حلقة تكرارية.
- تحسين إزاحة الفروع (يعتمد على الجهاز)
- اختر أقصر مسافة بين الفروع تصل إلى الهدف.
- إعادة ترتيب كتل التعليمات البرمجية
- يؤدي إعادة ترتيب كتل التعليمات البرمجية إلى تغيير ترتيب الكتل الأساسية في البرنامج لتقليل الفروع الشرطية وتحسين موضعية المرجع.
- إزالة التعليمات البرمجية غير المستخدمة
- يزيل هذا الأسلوب التعليمات التي لن تؤثر على سلوك البرنامج، مثل التعريفات التي لا فائدة منها، والتي تُسمى التعليمات البرمجية الميتة . وهذا يقلل من حجم التعليمات البرمجية ويزيل العمليات الحسابية غير الضرورية.
- تحليل الثوابت ( ثوابت الحلقة )
- إذا تم تنفيذ تعبير ما عند تحقق شرط ما أو عدم تحققه، فيمكن كتابته مرة واحدة فقط خارج العبارة الشرطية. وبالمثل، إذا ظهرت أنواع معينة من التعبيرات (مثل إسناد قيمة ثابتة إلى متغير) داخل حلقة تكرارية، فيمكن نقلها خارجها لأن تأثيرها سيكون واحدًا سواء تم تنفيذها عدة مرات أو مرة واحدة فقط. يُعرف هذا أيضًا باسم الإزالة الكاملة للتكرار. وهناك تحسين مشابه ولكنه أكثر فعالية يُعرف باسم الإزالة الجزئية للتكرار .
- التوسيع المضمن أو التوسيع الكلي
- عندما يستدعي جزء من الكود إجراءً ما ، يُمكن إدراج جسم الإجراء مباشرةً داخل الكود المُستدعي بدلاً من نقل التحكم إليه. يُوفر هذا الجهد الإضافي المُتعلق باستدعاءات الإجراءات، كما يُتيح فرصةً للعديد من التحسينات الخاصة بالمعاملات، ولكنه يأتي على حساب المساحة؛ إذ يُكرر جسم الإجراء في كل مرة يُستدعى فيها مُضمناً. عموماً، يُعد التضمين مُفيداً في الأكواد الحساسة للأداء التي تُجري عدداً كبيراً من الاستدعاءات لإجراءات صغيرة. هذا تحسينٌ يُقلل من عدد القفزات. تُعد عبارات لغات البرمجة الإجرائية مثالاً آخر على هذا النوع من التحسين. على الرغم من إمكانية تنفيذ العبارات باستخدام استدعاءات الدوال، إلا أنها تُنفذ دائماً تقريباً باستخدام التضمين.
- خيط القفز
- في هذا التحسين، يتم دمج القفزات الشرطية المتتالية المبنية كليًا أو جزئيًا على نفس الشرط.
- على سبيل المثال:
إذا ( كان الشرط موجودًا ) { foo (); } إذا ( كان الشرط موجودًا ) { bar (); }// يصبح: إذا ( الشرط ) { foo (); bar (); }- و:
إذا كان الشرط موجودًا ، فسيتم استدعاء الدالة foo (). إذا لم يكن الشرط موجودًا ، فسيتم استدعاء الدالة bar () .// يصبح: إذا ( cond ) { foo (); } else { bar (); }- ضغط الماكرو
- تُعدّ هذه التقنية طريقةً لتحسين استخدام المساحة، حيث تتعرف على تسلسلات التعليمات البرمجية المشتركة، وتُنشئ برامج فرعية ("وحدات ماكرو برمجية") تحتوي على هذه التعليمات، ثم تستبدل تكرارات هذه التسلسلات باستدعاءات للبرامج الفرعية المناسبة. [ 5 ] وتُطبّق هذه التقنية بكفاءة عالية عند استخدامها في تحسين لغة الآلة ، حيث تكون جميع التعليمات البرمجية موجودة. وقد استُخدمت هذه التقنية لأول مرة لتوفير المساحة في تدفق بايتات تفسيري مُستخدم في تطبيق لغة Macro Spitbol على الحواسيب الصغيرة . [ 14 ] ومن المعروف أن مشكلة تحديد مجموعة مثلى من وحدات الماكرو التي تُقلل المساحة المطلوبة لجزء معين من التعليمات البرمجية تُصنّف ضمن مسائل NP-complete ، [ 5 ] إلا أن الطرق الاستدلالية الفعّالة تُحقق نتائج شبه مثالية. [ 15 ]
- تقليل تضارب الذاكرة المؤقتة
- (على سبيل المثال، عن طريق تعطيل المحاذاة داخل الصفحة)
- تقليل ارتفاع الرصة
- أعد ترتيب شجرة التعبير لتقليل الموارد اللازمة لتقييم التعبير.
- إعادة ترتيب الاختبار
- إذا كان لدينا اختباران يشترطان حدوث شيء ما، فيمكننا أولاً التعامل مع الاختبارات الأبسط (مثل مقارنة متغير بشيء ما)، ثم الانتقال إلى الاختبارات المعقدة (مثل تلك التي تتطلب استدعاء دالة). تُكمّل هذه التقنية التقييم الكسول ، ولكن لا يمكن استخدامها إلا عندما لا تعتمد الاختبارات على بعضها البعض. قد تُصعّب دلالات الاختصار هذه العملية.
تحسينات بين الإجراءات
يعمل التحسين بين الإجراءات على البرنامج بأكمله، متجاوزًا حدود الإجراءات والملفات. ويتكامل هذا التحسين بشكل وثيق مع نظائره داخل الإجراءات، حيث يتم تنفيذه بالتعاون بين جزء محلي وجزء عالمي. تشمل التحسينات النموذجية بين الإجراءات تضمين الإجراءات ، وإزالة التعليمات البرمجية غير المستخدمة بين الإجراءات، ونشر الثوابت بين الإجراءات، وإعادة ترتيب الإجراءات. وكما هو معتاد، يحتاج المترجم إلى إجراء تحليل بين الإجراءات قبل تنفيذ التحسينات الفعلية. يتضمن هذا التحليل تحليل الأسماء المستعارة، وتحليل الوصول إلى المصفوفات ، وإنشاء مخطط استدعاءات الدوال .
يُعدّ تحسين العمليات بين الإجراءات شائعًا في المترجمات التجارية الحديثة من شركات SGI و Intel و Microsoft و Sun Microsystems . لفترة طويلة، وُجّهت انتقادات لمترجم GCC مفتوح المصدر لافتقاره إلى تحليل وتحسينات قوية بين الإجراءات، إلا أن هذا الجانب يشهد تحسنًا الآن. [ 16 ] يُعدّ Open64 مترجمًا آخر مفتوح المصدر يتمتع ببنية تحتية كاملة للتحليل والتحسين .
نظراً للوقت والمساحة الإضافيين المطلوبين لتحليل ما بين الإجراءات، فإن معظم المترجمات لا تُجريه افتراضياً. يجب على المستخدمين استخدام خيارات المترجم بشكل صريح لإخبار المترجم بتمكين تحليل ما بين الإجراءات والتحسينات الأخرى المكلفة.
الاعتبارات العملية
يمكن للمترجم أن يُجري نطاقًا واسعًا من التحسينات، بدءًا من التحسينات البسيطة والمباشرة التي تستغرق وقتًا قصيرًا في الترجمة، وصولًا إلى التحسينات المعقدة والمتشعبة التي تستغرق وقتًا طويلًا. [ 3 ] : 15 وبناءً على ذلك، غالبًا ما توفر المترجمات خيارات لأوامر التحكم أو الإجراءات الخاصة بها، مما يسمح لمستخدم المترجم باختيار مستوى التحسين المطلوب؛ فعلى سبيل المثال، كان مترجم IBM FORTRAN H يسمح للمستخدم بتحديد عدم وجود تحسين، أو التحسين على مستوى السجلات فقط، أو التحسين الكامل. [ 3 ] : 737 وبحلول العقد الأول من الألفية الثانية، أصبح من الشائع أن تحتوي المترجمات، مثل Clang ، على العديد من خيارات أوامر الترجمة التي يمكن أن تؤثر على مجموعة متنوعة من خيارات التحسين، بدءًا من -O2المفتاح المألوف. [ 17 ]
يُعدّ استخدام ما يُسمى بمُحسِّنات ما بعد المعالجة (والتي يعود تاريخ بعض إصداراتها التجارية إلى برامج الحواسيب المركزية في أواخر سبعينيات القرن الماضي) أحد أساليب عزل عملية التحسين. [ 18 ] تقوم هذه الأدوات بأخذ مُخرَجات المُحسِّن التنفيذية وتحسينها بشكلٍ أكبر. تعمل مُحسِّنات ما بعد المعالجة عادةً على مستوى لغة التجميع أو لغة الآلة (على عكس المُترجمات التي تُحسِّن التمثيلات الوسيطة للبرامج). ومن الأمثلة على ذلك مُترجم لغة سي المحمول (PCC) في ثمانينيات القرن الماضي، والذي كان يحتوي على مرحلة اختيارية تُجري تحسينات لاحقة على كود التجميع المُولَّد. [ 3 ] : 736
من الاعتبارات الأخرى أن خوارزميات التحسين معقدة، وخاصة عند استخدامها لتجميع لغات برمجة كبيرة ومعقدة، إذ قد تحتوي على أخطاء تُدخل عيوبًا في الكود المُولّد أو تُسبب أخطاءً داخلية أثناء التجميع. قد تُسبب أخطاء المُجمِّع، أيًا كان نوعها، إزعاجًا للمستخدم، لا سيما في هذه الحالة، لأنه قد لا يكون من الواضح أن منطق التحسين هو المُسبب للمشكلة. [ 19 ] في حالة الأخطاء الداخلية، يُمكن التخفيف من حدة المشكلة جزئيًا باستخدام تقنية برمجة "آمنة من الأعطال"، حيث يُبرمج منطق التحسين في المُجمِّع بحيث يتم اكتشاف أي عطل، وإصدار رسالة تحذير، ثم يكتمل باقي التجميع بنجاح. [ 20 ]
تاريخ
كانت المترجمات المبكرة في ستينيات القرن العشرين تُعنى في المقام الأول بتجميع الشفرة بشكل صحيح وفعال، ما جعل وقت التجميع شاغلاً رئيسياً. ومن أبرز المترجمات المُحسِّنة المبكرة مترجم IBM FORTRAN H في أواخر الستينيات. [ 3 ] : 737 ومن أوائل المترجمات المُحسِّنة وأهمها، والتي رائدة في العديد من التقنيات المتقدمة، مترجم BLISS (1970)، الذي وُصف في كتاب "تصميم مترجم مُحسِّن" (1975). [ 3 ] : 740، 779 وبحلول أواخر الثمانينيات، أصبحت المترجمات المُحسِّنة فعالة لدرجة أدت إلى تراجع البرمجة بلغة التجميع. وتزامن هذا التطور مع تطوير رقائق RISC وميزات المعالجات المتقدمة مثل المعالجات فائقة القياس ، والتنفيذ خارج الترتيب ، والتنفيذ التخميني ، والتي صُممت لتكون هدفاً للمترجمات المُحسِّنة بدلاً من شفرة التجميع المكتوبة يدويًا.
قائمة تحليلات الكود الثابت
انظر أيضاً
مراجع
- ↑ جودبولت، مات (12 نوفمبر 2019). "التحسينات في مترجمات لغة C++" . مجلة ACM Queue . المجلد 17، العدد 5.
- ↑ "المحاضرة 15: اكتمال NP، والتحسين، والفصل" (ملف PDF) . IE 511: البرمجة العددية الصحيحة، ربيع 2021 .
- 1 2 3 4 5 6 7 8 9 10 11 أهو، ألفريد ف.؛ سيثي، رافي؛ أولمان، جيفري د. (1986). المترجمات: المبادئ والتقنيات والأدوات . ريدينغ، ماساتشوستس: أديسون-ويسلي. ISBN 0-201-10088-6.
- 1 2 كوبر، كيث د .؛ توركزون، ليندا (2003) [2002-01-01]. هندسة المترجم . مورغان كوفمان . ص 404، 407. ISBN 978-1-55860-698-2.
- 1 2 3 غوس، كلينتون ف. (أغسطس 2013) [نُشر لأول مرة في يونيو 1986]. تحسين كود الآلة - تحسين كود الكائن القابل للتنفيذ (PDF) (أطروحة دكتوراه). المجلد. التقرير الفني رقم 246 لقسم علوم الحاسوب. معهد كورانت، جامعة نيويورك. arXiv : 1308.4815 . Bibcode : 2013arXiv1308.4815G . مؤرشف (PDF) من الأصل في 9 أكتوبر 2022. تم الاطلاع عليه في 22 أغسطس 2013 .
- كلينتون ف. غوس (2013) [1986]. تحسين كود الآلة - تحسين كود الكائن القابل للتنفيذ (أطروحة دكتوراه). معهد كورانت، جامعة نيويورك.
- ↑ مقدمة للمبرمجين إلى لغة التجميع لنظام IBM System/360 (ملف PDF) . IBM . ص 42. GC20-1645-5.
- ↑ "خيارات GCC المعتمدة على الجهاز" . مشروع جنو .
- ↑ "RISC vs. CISC" . cs.stanford.edu . تم الاطلاع عليه بتاريخ 15-10-2024 .
- ↑ جيمس جوسلينج ؛ بيل جوي ؛ جاي ستيل . "17 الخيوط والأقفال" . مواصفات لغة جافا ( الطبعة 1.0). 17.8 إجراءات التخزين الاستباقية.
- ↑ موشنيك، ستيفن؛ موشنيك وشركاؤه (15 أغسطس 1997). تصميم وتنفيذ المترجمات المتقدمة . مورغان كوفمان. ص 329 وما يليها. ISBN 978-1-55860-320-2
طي مستمر
. - ↑ ويغمان، مارك ن.؛ زاديك، ف. كينيث (أبريل 1991). "نشر الثوابت مع الفروع الشرطية" (ملف PDF) . معاملات ACM في لغات البرمجة والأنظمة . 13 (2): 181-210 . doi : 10.1145/103135.103136 .
- ↑ كليك، كليفورد؛ كوبر، كيث. (مارس 1995). "دمج التحليلات، دمج التحسينات" (ملف PDF) . معاملات ACM في لغات البرمجة والأنظمة . 17 (2): 181-196 . doi : 10.1145/201059.201061 .
- 1 2 دليل مُجمِّع Cx51، الإصدار 09.2001، صفحة 155، شركة كيل للبرمجيات.
- ↑ ديوار، روبرت ب.ك .؛ غولومبيك، مارتن تشارلز ؛ غوس، كلينتون ف. (أغسطس 2013) [أكتوبر 1979]. MICRO SPITBOL . تقرير فني لقسم علوم الحاسوب. المجلد 11. معهد كورانت للعلوم الرياضية. arXiv : 1308.6096 . Bibcode : 2013arXiv1308.6096D .
- ↑ غولومبيك، مارتن تشارلز ؛ ديوار، روبرت ب.ك ؛ غوس، كلينتون ف. (1980). "الاستبدالات الكلية في لغة MICRO SPITBOL - تحليل توافقي". وقائع المؤتمر الحادي عشر لجنوب شرق الولايات المتحدة حول التوافقية ونظرية الرسوم البيانية والحوسبة، كونغرسوس نوميرانتيوم، يوتيليتاس ماث، وينيبيغ، كندا . المؤتمر الحادي عشر لجنوب شرق الولايات المتحدة حول التوافقية ونظرية الرسوم البيانية والحوسبة. المجلد 29. الصفحات 485-495 .
- ↑ جلازونوف، ن.م. (25 نوفمبر 2012). "أسس البحث العلمي". arXiv : 1212.1651 [ cs.OH ].
- ↑ غيلتون، سيرج (5 أغسطس 2019). "تخصيص عملية التجميع باستخدام Clang: خيارات التحسين" . ريد هات.
- ↑ إيفانز، مايكل (ديسمبر 1982). "هندسة البرمجيات لبيئة كوبول" . مجلة اتصالات رابطة مكائن الحوسبة . 25 (12): 874-882 . doi : 10.1145/358728.358732 . تاريخ الاسترجاع: 10 أغسطس 2013 .
- ↑ صن، تشنغنيان؛ وآخرون . (18-20 يوليو 2016). "نحو فهم أخطاء المترجم في GCC وLLVM" . وقائع الندوة الدولية الخامسة والعشرين لاختبار البرمجيات وتحليلها . Issta 2016. ص 294-305 . doi : 10.1145/2931037.2931074 . ISBN 9781450343909. S2CID 8339241 .
- ↑ شيلينغ، جوناثان ل. (أغسطس 1993). "البرمجة الآمنة في تحسين المترجم". إشعارات ACM SIGPLAN . 28 (8): 39-42 . doi : 10.1145/163114.163118 . S2CID 2224606 .
روابط خارجية
- كتيبات تحسين الأداء من تأليف أغنر فوغ – وثائق حول بنية معالج x86 وتحسين التعليمات البرمجية على مستوى منخفض
- بناء المترجم
- تحسينات المُترجم
- تنفيذ لغة البرمجة
- نظرية المترجمات
