ما الذي يجب على jvm التضحية به من أجل تنفيذ تحسين المكالمة الخلفية؟

StackOverflow https://stackoverflow.com/questions/1006596

سؤال

يقول الناس أن تنفيذ clojure ممتاز بصرف النظر عن القيود المفروضة على عدم وجود تحسين للمكالمات الخلفية - وهو قيود على jvm وليس تنفيذ clojure.

http://lambda-the-ultimate.org/node/2547

لقد قيل أن تطبيق التكلفة الإجمالية للملكية في بايثون سوف يضحي

  • مقالب تتبع المكدس، و
  • انتظام التصحيح.

اشرح لي ما هي المشكلة الكبيرة في تحسين المكالمات الخلفية ولماذا تحتاجها بايثون

هل يجب تقديم نفس التضحيات من أجل تنفيذ JVM للتكلفة الإجمالية للملكية؟هل يجب التضحية بأي شيء آخر؟

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

المحلول

على الرغم من الاختلاف (حيث أن التعليمات موجودة بالفعل) فمن الجدير بالذكر الجهد الإضافي الذي بذله .Net فريق جيت 64 بت كان لا بد من المرور لاحترام جميع المكالمات الخلفية.

وأود أن أذكر على وجه الخصوص التعليق:

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

أعتقد أنه من غير المرجح أن يتمكن JVM من تجنب ذلك أيضًا.

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

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

نصائح أخرى

العمل هو جارية الآن لإضافة مكالمات ذيل إلى JVM.هناك صفحة ويكي الحديث عن بعض التفاصيل.

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

من الجدير بالذكر أيضًا أن Clojure لديه ميزة "التكرار" التي لا تستهلك المكدس للتغلب على هذا القيد في إصدارات JVM الحالية.

مثال:

(defn triangle [n accumulator] 
  (if 
    (<= n 0)  
      accumulator
      (recur (dec n) (+ n accumulator))))

(triangle 1000000 0)

=> 500000500000     (note stack does not explode here!)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top