سؤال

رأيت هذا الاقتباس في السؤال: ما هي اللغة الوظيفية الجيدة لبناء خدمة الويب؟

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

هل هذا صحيح؟إذا كان الأمر كذلك، فما هو الشيء المتعلق بـ JVM الذي يخلق هذا القيد الأساسي؟

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

المحلول

هذا المشنور: العودية أو التكرار؟ قد تساعد.

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

هناك أيضًا المزيد من المناقشة في حشرة الشمس رقم 4726340, حيث ينتهي التقييم (من 2002):

وأعتقد أنه من الممكن القيام بذلك رغم ذلك، ولكنها ليست مهمة صغيرة.

حاليا، هناك بعض الأعمال الجارية في آلة دافنشي مشروع.تم إدراج حالة المشروع الفرعي للاستدعاء الخلفي كـ "proto 80%"؛من غير المرجح أن يصل إلى Java 7، لكنني أعتقد أن لديه فرصة جيدة جدًا في Java 8.

نصائح أخرى

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

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

ومن ثم هناك حجة قوية جدًا مفادها أن Scala ليست لغة برمجة وظيفية حقيقية:اعتبرت هذه اللغات النداءات الخلفية ميزة أساسية منذ تقديم النظام لأول مرة منذ أكثر من 30 عامًا.

يدعم Scala 2.7.x تحسين الاستدعاء الخلفي للتكرار الذاتي (وظيفة تستدعي نفسها) للطرق النهائية والوظائف المحلية.

قد يأتي Scala 2.8 مزودًا بدعم المكتبة للترامبولين أيضًا، وهي تقنية لتحسين الوظائف العودية المتبادلة.

يمكن العثور على قدر كبير من المعلومات حول حالة تكرار Scala في مدونة ريتش دوجيرتي.

بالإضافة إلى الورقة المرتبطة بـ Lambda The Ultimate (من الرابط mmyers المنشور أعلاه)، لدى John Rose من Sun المزيد ليقوله حول تحسين الاتصال الخلفي.

http://blogs.Oracle.com/jrose/entry/tail_calls_in_the_vm

لقد سمعت أنه قد يتم تنفيذه على JVM يومًا ما.يتم النظر في دعم المكالمات الخلفية من بين أمور أخرى على آلة دافنشي.

http://openjdk.java.net/projects/mlvm/

تشير جميع المصادر إلى عدم قدرة JVM على التحسين في حالة التكرار الخلفي، ولكن عند القراءة ضبط أداء جافا (2003، O'reilly) لقد وجدت المؤلف يدعي أنه يستطيع تحقيق أداء عودي أكبر من خلال تنفيذ التكرار الذيلي.

يمكنك العثور على مطالبته في الصفحة 212 (ابحث عن "العودة الخلفية" حيث ينبغي أن تكون النتيجة الثانية).ما يعطي؟

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