سؤال

في تصميم المترجم، لماذا بدلاً من وجود ترتيب لحفظ سجل المتصل أو المستدعى، لم يتمكن المتصل من تمرير قائمة السجلات المستخدمة (والتي قد يدفعها في حالة ترتيب حفظ المتصل) إلى المستدعى حتى يتمكن المستدعى من مقارنة بياناته قائمة السجلات المستخدمة إلى السجلات المستخدمة من قبل المتصل.عندها فقط سيتم دفع السجلات التي تحتاج إلى الدفع حقًا.هل فاتني شيء؟

هل كانت مفيدة؟

المحلول

إنها فكرة مثيرة للاهتمام.أعتقد أن هناك شيئان يجعلانها أقل جاذبية:

  • يجب على المستدعي حجز مساحة المكدس لأسوأ الحالات، بغض النظر.
  • ولجعلها فعالة، ستحتاج إلى تعليمات خاصة لتخزين وتحميل مجموعات من السجلات دفعة واحدة.كانت مثل هذه التعليمات موجودة على جهاز Motorola 68000 (وربما PowerPC أيضًا)، لكنها لم تكن شائعة.

فيما يلي توضيح بسيط لكيفية العمل:قد ترغب في أن يقوم المتصل بتعبئة القائمة في كلمة آلية كمتجه بت.ستحتاج بعد ذلك إلى أن يقوم المستدعى بالبت - وبقائمة خاصة به، لديه تعليمات تحفظ جميع السجلات المسماة بواسطة متجه البت الناتج.

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

وصحيح أيضًا أنه إذا كان ما تريده حقًا هو تقليل عدد التحميلات والمخازن في وقت التشغيل، فما عليك سوى استخدام جميع سجلات حفظ المتصلين.هذه الإستراتيجية أيضًا تجعل من رفع الاستثناء والتبديل الوقائي للسلاسل، والكثير من المترجمين (مثل أوكامل) استخدامه لهذا السبب.تعد سجلات حفظ Callee نوعًا من الاختراق لمحاولة تقليل حجم الكود الخاص بتعليمات الانسكاب وإعادة التحميل.وهي تعمل في العديد من المواقف، وتوفر المساحة نظرًا لأن عدد مواقع الاتصال يفوق عدد تعريفات الإجراءات بكثير (في المتوسط، يحتوي الإجراء على مكالمات متعددة).

لمزيد من المعلومات حول المفاضلات بين سجلات حفظ المتصل وحفظ المتصل، هناك ورقة جميلة كتبها جاك ديفيدسون وديفيد والي.

نصائح أخرى

وهذا غير فعالة للغاية ... سوف تحتاج إلى تحليل القائمة (على كل وظيفة!) التي لا لزوم لها تماما.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top