اقتراح قانوني

في علوم الحاسوب ، يُعدّ مصطلح "نقل الكود" ، الذي يشمل رفع الكود، وخفض الكود، ونقل الكود غير المتأثر بالحلقات، وتفكيك الكود، مصطلحًا شاملًا لأي عملية تنقل الكود داخل البرنامج. ويتم ذلك عادةً لتحسين الأداء وتقليل حجم البرنامج، وهو إجراء تحسين شائع في معظم المترجمات البرمجية المُحسِّنة .

الاستخدامات

تتمتع تقنية نقل التعليمات البرمجية بمجموعة متنوعة من الاستخدامات والفوائد، ويتداخل الكثير منها مع بعضها البعض في تطبيقها.

إزالة العمليات غير المستخدمة/غير المفيدة

رسم تخطيطي يوضح مُجمِّعًا مُحسِّنًا يُزيل استدعاءً غير مُجدٍ لتعليمات التجميع "b" عن طريق نقله إلى نقطة استخدامه.

إن مصطلح "إغراق الكود" ، المعروف أيضًا باسم "نقل الكود الكسول "، هو مصطلح يشير إلى تقنية تقلل من التعليمات المهدرة عن طريق نقل التعليمات إلى الفروع التي يتم استخدامها فيها: [ 1 ] إذا تم تنفيذ عملية ما قبل فرع، وكان مسار واحد فقط من مسارات الفرع يستخدم نتيجة تلك العملية، فإن إغراق الكود يستلزم نقل تلك العملية إلى الفرع الذي سيتم استخدامها فيه.

تُعد هذه التقنية شكلاً من أشكال إزالة التعليمات البرمجية الميتة بمعنى أنها تزيل التعليمات البرمجية عندما يتم تجاهل نتائجها أو عدم استخدامها، ولكن على عكس إزالة التعليمات البرمجية الميتة، يمكنها إزالة التعليمات غير الضرورية حتى لو كان هناك استخدام محتمل لنتائج تلك التعليمات في مسار تنفيذ التعليمات البرمجية.

تقليص حجم البرنامج

رسم بياني يوضح تحسين الحجم باستخدام تحليل الكود، بافتراض أن جميع العمليات لا تعتمد على عمليات أخرى تُنفذ قبلها.

تحليل الكود هو مصطلح يُطلق على تقنية لتحسين حجم الكود، حيث يتم دمج التبعيات المشتركة في الفروع ضمن الفرع الأعلى منها. [ 2 ] وكما يُحلل تحليل الأعداد الصحيحة العدد إلى أصغر أشكاله الممكنة (كعوامل)، فإن تحليل الكود يُحوّل الكود إلى أصغر شكل ممكن، وذلك بدمج "العوامل" المشتركة حتى لا يتبقى أي تكرار.

يؤدي تقليل حالات التوقف الناتجة عن الاعتماد إلى

مثال على كيفية منع المُصرّف لتوقفات التبعية في الكود المُجمّع من خلال نقل الكود، وذلك بمراقبة مخطط التبعية . ونظرًا لتطورات التنفيذ خارج الترتيب ، قد لا يكون للتحسين أي فائدة على وحدات المعالجة المركزية الحديثة.

تُشير مصطلحات مثل نقل التعليمات البرمجية على مستوى النظام ، ونقل التعليمات البرمجية على المستوى المحلي ، وجدولة التعليمات البرمجية ، وجدولة التعليمات ، ورفع/خفض التعليمات البرمجية، إلى تقنية يتم فيها إعادة ترتيب (أو "جدولة") التعليمات لتحسين كفاءة التنفيذ داخل وحدة المعالجة المركزية. [ 3 ] [ 4 ] تستطيع وحدات المعالجة المركزية الحديثة جدولة خمس تعليمات أو أكثر في كل دورة ساعة. مع ذلك، لا تستطيع وحدة المعالجة المركزية جدولة تعليمة تعتمد على بيانات من تعليمة قيد التنفيذ (أو لم تُنفذ بعد). تقوم المترجمات بدمج التبعيات بطريقة تزيد من عدد التعليمات التي يمكن لوحدة المعالجة المركزية معالجتها في أي وقت. [ 5 ]

في معمارية إنتل إيتانيوم المتوقفة عن العمل ، يقوم المترجم برفع تعليمة التنبؤ بالتفرع (BRP) يدويًا فوق التفرعات لتمكين وحدة المعالجة المركزية من تنفيذ التفرع فورًا. تعتمد إيتانيوم على جدولة إضافية للتعليمات البرمجية من وحدة المعالجة المركزية لزيادة كفاءة المعالج إلى أقصى حد. [ 6 ]

حركة الكود غير المتغيرة للحلقة

رسم بياني يوضح حركة الكود الثابتة بين حلقات التكرار على مخطط التنفيذ. يفترض هذا أن D ثابتة بين عمليات تنفيذ حلقات التكرار.

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

أمثلة على المترجم

LLVM

يحتوي LLVM على آلية تمرير مُغلقة في صيغة التعيين الثابت الفردي. لن يقوم LLVM 15.0 بإغلاق عملية إذا كان أي من مسارات التعليمات البرمجية الخاصة به يتضمن تعليمة تخزين، أو إذا كان من المحتمل أن يُصدر خطأً. [ 7 ] بالإضافة إلى ذلك، لن يقوم LLVM بإغلاق تعليمة داخل حلقة تكرارية.

مجلس التعاون الخليجي

تُطبّق مجموعة مُترجمات جنو (GCU) خاصية نقل الشيفرة البرمجية تحت مُسمّى "تحليل الشيفرة"، بهدف تقليل حجم البرنامج المُترجم. [ 8 ] يقوم مُترجم جنو بنقل أي شيفرة تصاعديًا أو تنازليًا إذا لم تُبطل أي تبعيات موجودة أو تُضيف تبعيات جديدة. [ 9 ]

LuaJIT

يستخدم LuaJIT تقنية "تخزين الذاكرة المؤقتة" (Allocation sinking) لتقليل الوقت الذي يقضيه الكود المُترجم في تخصيص وجمع الكائنات المؤقتة داخل حلقة تكرارية. [ 10 ] تنقل هذه التقنية عمليات التخصيص إلى مسارات تنفيذية حيث يمكن للكائن المُخصص أن يخرج من الكود قيد التنفيذ، مما يستدعي تخصيصه في الذاكرة الديناميكية. تُملأ جميع عمليات التخصيص المُزالة ببيانات مُعاد توجيهها من التحميل إلى التخزين. [ 11 ]

انظر أيضاً

مراجع

  1. كرافت، مايكل؛ أوفوت، جيفرسون (1994). "استخدام تقنيات تحسين المترجم لاكتشاف الطفرات المتكافئة" . اختبار البرمجيات، والتحقق، والموثوقية . 4 (3): 131-154 . doi : 10.1002/stvr.4370040303 . S2CID 35717348. تاريخ الاسترجاع: 25 فبراير 2022 . 
  2. لوكي، غابور، وآخرون. "تحليل الكود في GCC". وقائع قمة مطوري GCC لعام 2004. 2004.
  3. فاس، جوستوس، وآخرون. تحويلات الشفرة لزيادة فرص جدولة المرور المسبق في CompCert. أطروحة ماجستير في العلوم. جامعة غرونوبل ألب. https://www-verimag.imag.fr/~boulme/CPP_2022/FASSE-Justus-MSc-Thesis_2021.pdf ، 2021.
  4. غوبتا، راجيف (1998). "إطار عمل لحركة التعليمات البرمجية لجدولة التعليمات العالمية". بناء المترجمات . سلسلة محاضرات في علوم الحاسوب. المجلد 1383. الصفحات 219-233 . doi : 10.1007/BFb0026434 . ISBN   978-3-540-64304-3.
  5. تشانغ، بوهوا ب.، وآخرون. "أهمية جدولة التعليمات البرمجية المسبقة للمعالجات فائقة القياس والمعالجات فائقة التوازي." معاملات IEEE على أجهزة الكمبيوتر 44.3 (1995): 353-370.
  6. شارانغباني، هـ.؛ أرورا، هـ. (سبتمبر 2000). "البنية الدقيقة لمعالج إيتانيوم". مجلة IEEE Micro . 20 (5): 24-43 . doi : 10.1109/40.877948 . ISSN 1937-4143 . 
  7. "LLVM: lib/Transforms/Scalar/Sink.cpp ملف المصدر" . llvm.org . تم الاطلاع عليه بتاريخ 25 فبراير 2022 .
  8. "تحسينات تحليل الكود - مشروع جنو" . gcc.gnu.org . تم الاطلاع عليه بتاريخ 25 فبراير 2022 .
  9. "قمة مطوري GCC لعام 2004 - تحليل الكود.pdf" (ملف PDF) . gnu.org . تم الاطلاع عليه بتاريخ 25 فبراير 2022 .
  10. "تخصيص الذاكرة في git HEAD - luajit - FreeLists" . www.freelists.org . تم الاطلاع عليه بتاريخ 25 فبراير 2022 .
  11. "تحسين تخصيص الموارد" . wiki.luajit.org .