سؤال

ما هي بعض الانتقادات التي وجهت ضد تعريض متابعات كما الدرجة الأولى الأجسام ؟

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

على الرغم من كل هذه ، هل هناك حجج قوية ضد من الدرجة الأولى متابعات?

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

المحلول

أولا، هناك أكثر من ذلك فقط اتصل / CC عندما يتعلق الأمر بالاستمرار. أقترح بدءا من ورقة مارك فئر: واجهة برمجة تطبيقات أفضل للمستمرات من الدرجة الأولى

بعد ذلك، أقترح القراءة حول تحول مشغلي التحكم وإعادة تعيين، وهي طريقة مختلفة لتمثيل العاطور.

نصائح أخرى

الواقع هو أن العديد من مفيدة الحالات حيث يمكن استخدام متابعات مشمولة بالفعل المتخصصة بنيات اللغة:رمي/الصيد, عودة, C#/بيثون العائد.وهكذا اللغة منفذي حقا لم يكن لديك الكثير من الحوافز تقدم لهم في شكل عام قابلة للاستخدام لفة الخاص الحلول.

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

هذه اللغات يمكن تنفيذ معينة استمرار ميزات مثل تلك التي لا تكسر كومة الأساسي القائم على نموذج أكثر كفاءة من الحالة العامة ، ولكن تنفيذ المعمم متابعات جدا أصعب قليلا و لا يستحق كل هذا العناء.

اللغات الوظيفية أكثر احتمالا لتنفيذ استمرارا لعدة أسباب:

  1. وكثيرا ما تنفذ في استمرار مرور النمط الذي يعني "الاستدعاءات" هو على الارجح قائمة مرتبطة تخصيص كومة الذاكرة المؤقتة.وهذا يجعل تافهة إلى تمرير مؤشر إلى كومة استمرار, منذ كنت لا تحتاج إلى الكتابة فوق كومة السياق عندما كنت البوب الإطار الحالي و دفعة واحدة جديدة.(لم تنفذ CPS ولكن هذا ما فهمته من ذلك.)
  2. انهم يفضلون البيانات ثابتة الارتباطات التي تجعل القديم استمرار الكثير أكثر فائدة لأنه سوف لا يكون لديك تغيير محتويات المتغيرات التي المكدس وأشار إلى عندما قمت بإنشائه.

لهذه الأسباب متابعات المرجح أن تظل في الغالب فقط في مجال اللغات الوظيفية.

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

  1. معظم المبرمجين لا يفهمونهم. إذا كان لديك رمز يستخدمها، فمن الصعب العثور على مبرمجات بديلة سيتمكنون من العمل معها.
  2. من الصعب تنفيذ المستمرات على بعض المنصات. على سبيل المثال، لا يدعم Jruby استمرار.

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

راجع شكوى كينت بيتمان حول استمرار, ، حول الطريقة الصعبة التي تفاعلها الحماية الاسترخاء مع Call / CC

Call / CC هو "GOTO" للبرمجة الوظيفية المتقدمة (A LA هنا).

في روبي 1.8 كان التنفيذ بطيئا للغاية. أفضل في 1.9، وبالطبع أن معظم المخططات قد بنيتها وأداءها جيدا منذ البداية.

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