استمرار
في علم الحاسوب ، يُعدّ الاستمرار تمثيلاً مجرداً لحالة التحكم في برنامج حاسوبي . يُجسّد الاستمرار حالة التحكم في البرنامج، أي أنه بنية بيانات تُمثّل العملية الحسابية عند نقطة معينة في تنفيذها. يمكن للغة البرمجة الوصول إلى بنية البيانات هذه، بدلاً من أن تكون مخفية في بيئة التشغيل . تُفيد الاستمرارات في ترميز آليات تحكم أخرى في لغات البرمجة، مثل الاستثناءات ، والمولدات ، والروتينات الفرعية ، وما إلى ذلك.
يُقصد بـ" الاستمرار الحالي " أو "استمرار خطوة الحساب" الاستمرار الذي، من منظور تنفيذ الكود، يُشتق من النقطة الحالية في تنفيذ البرنامج. ويمكن استخدام مصطلح "الاستمرار" أيضًا للإشارة إلى الاستمرار من الدرجة الأولى ، وهي بنيات تُمكّن لغة البرمجة من حفظ حالة التنفيذ عند أي نقطة والعودة إليها لاحقًا في البرنامج، وربما عدة مرات.
تاريخ
أول وصفٍ للاستمرارية كان من نصيب أدريان فان وينغاردن في سبتمبر 1964. وقد ألقى وينغاردن كلمته في مؤتمر IFIP العملي حول لغات وصف اللغات الرسمية، الذي عُقد في بادن باي فيينا، النمسا. وكجزء من صياغة معالج مسبق للغة Algol 60 ، دعا إلى تحويل الإجراءات المناسبة إلى أسلوب تمرير الاستمرارية ، [ 1 ] على الرغم من أنه لم يستخدم هذا المصطلح، وكان هدفه تبسيط البرنامج وبالتالي جعل نتيجته أكثر وضوحًا.
ساهم كل من كريستوفر ستراشي ، وكريستوفر ب. وادزورث، وجون سي. رينولدز في إبراز مصطلح الاستمرارية في أعمالهم في مجال الدلالات التفسيرية التي تستخدم الاستمراريات على نطاق واسع للسماح بتحليل البرامج المتسلسلة من حيث دلالات البرمجة الوظيفية . [ 1 ]
ابتكر ستيف راسل [ 2 ] خاصية الاستمرار في تطبيقه الثاني للغة ليسب لجهاز IBM 704 ، على الرغم من أنه لم يطلق عليها اسمًا. [ 3 ]
يقدم رينولدز (1993) تاريخًا كاملاً لاكتشاف الاستمراريات.
استمرارات من الدرجة الأولى
تُتيح الاستمراريات من الدرجة الأولى للغة التحكم الكامل في ترتيب تنفيذ التعليمات. يُمكن استخدامها للانتقال إلى دالةٍ استدعت الدالة الحالية، أو إلى دالةٍ انتهت سابقًا. يُمكن اعتبار الاستمرارية من الدرجة الأولى بمثابة حفظ حالة تنفيذ البرنامج. لا تحفظ الاستمراريات الحقيقية من الدرجة الأولى بيانات البرنامج - على عكس صورة العملية - بل تحفظ سياق التنفيذ فقط. ويتضح ذلك من خلال وصف "شطيرة الاستمرارية".
لنفترض أنك في المطبخ أمام الثلاجة، تفكر في شطيرة. تأخذ نسخة من القصة وتضعها في جيبك. ثم تُخرج بعض شرائح الديك الرومي والخبز من الثلاجة وتُعدّ لنفسك شطيرة، وهي الآن موضوعة على المنضدة. تستحضر النسخة التي في جيبك، فتجد نفسك واقفًا أمام الثلاجة مرة أخرى، تفكر في شطيرة. ولكن لحسن الحظ، هناك شطيرة على المنضدة، وجميع المكونات المستخدمة في تحضيرها قد اختفت. فتأكلها. :-) [ 4 ]
في هذا الوصف، يعتبر الساندويتش جزءًا من بيانات البرنامج (على سبيل المثال، كائن في الذاكرة)، وبدلاً من استدعاء روتين "صنع الساندويتش" ثم العودة، قام الشخص باستدعاء روتين "صنع الساندويتش مع الاستمرار الحالي"، والذي يقوم بإنشاء الساندويتش ثم يتابع من حيث توقف التنفيذ.
كان نظام Scheme أول نظام إنتاج كامل يوفر أولاً "التقاط" [ 1 ] ثم الاتصال/النسخ . وقد أدخل بروس دوبا الاتصال/النسخ في لغة SML .
تُستخدم الاستمراريات أيضًا في نماذج الحوسبة، بما في ذلك الدلالات التفسيرية ، ونموذج الفاعل ، وحسابات العمليات ، وحسابات لامدا . تعتمد هذه النماذج على المبرمجين أو مهندسي الدلالات لكتابة الدوال الرياضية بأسلوب تمرير الاستمراريات . وهذا يعني أن كل دالة تستهلك دالة أخرى تمثل باقي الحساب المتعلق باستدعاء هذه الدالة. ولإرجاع قيمة، تستدعي الدالة "دالة الاستمرارية" هذه مع قيمة إرجاع؛ ولإيقاف الحساب، تُرجع قيمة.
يكتسب المبرمجون الوظيفيون الذين يكتبون برامجهم بأسلوب تمرير الاستمرارية القدرة التعبيرية على التحكم في تدفق التعليمات البرمجية بطرقٍ مختلفة. لكن ثمن ذلك هو ضرورة الحفاظ على ثوابت التحكم والاستمرارية يدويًا، وهو ما قد يكون مهمة بالغة التعقيد (انظر "أسلوب تمرير الاستمرارية" أدناه).
الاستخدامات
تُبسّط الاستمراريات وتُوضّح تنفيذ العديد من أنماط التصميم الشائعة ، بما في ذلك الروتينات الفرعية / الخيوط الخضراء ومعالجة الاستثناءات ، من خلال توفيرها للبنية الأساسية منخفضة المستوى التي تُوحّد هذه الأنماط التي تبدو غير مترابطة. تُقدّم الاستمراريات حلولًا أنيقة لبعض المشكلات المعقدة عالية المستوى، مثل برمجة خادم ويب يدعم صفحات متعددة، يُمكن الوصول إليها باستخدام زري الرجوع والتقدم، ومن خلال الروابط. يستخدم إطار عمل الويب Smalltalk Seaside الاستمراريات بفعالية كبيرة، مما يسمح ببرمجة خادم الويب بأسلوب إجرائي، عن طريق تبديل الاستمراريات عند الانتقال بين الصفحات.
توجد أيضًا بنيات أكثر تعقيدًا تُقدّم لها "الاستمراريات وصفًا أنيقًا" [ 1 ] . على سبيل المثال، في لغة C ، يُمكن استخدام longjmp للقفز من منتصف دالة إلى أخرى، بشرط أن تكون الدالة الثانية أعمق في مكدس الاستدعاءات (إذا كانت تنتظر انتهاء الدالة الأولى، وربما غيرها). تشمل الأمثلة الأخرى الأكثر تعقيدًا: الروتينات الفرعية في Simula 67 و Lua و Perl ؛ والمهام الصغيرة في Stackless Python ؛ والمولدات في Icon و Python ؛ والاستمراريات في Scala (بدءًا من الإصدار 2.8)؛ والألياف في Ruby (بدءًا من الإصدار 1.9.1)؛ وآلية التراجع في Prolog ؛ والمونادات في البرمجة الوظيفية ؛ والخيوط .
أمثلة
تتضمن لغة برمجة Scheme عامل التحكم call-with-current-continuation (المختصر بـ: call/cc) والذي يمكن لبرنامج Scheme من خلاله التلاعب بتدفق التحكم:
( عرّف الاستمرارية #f )( define ( test ) ( let (( i0 ) ) ; call/cc تستدعي وسيط الدالة الأول، وتمرر إليه متغير استمرار يمثل هذه النقطة في البرنامج كوسيط لتلك الدالة. ; ; في هذه الحالة، يُسند وسيط الدالة هذا الاستمرار إلى المتغير the-continuation. ; ( call/cc ( lambda ( k ) ( set! the - continuationk ))) ; ; في المرة التالية التي يُستدعى فيها the-continuation، نبدأ من هنا. ( set! i ( + i1 ) ) i ))باستخدام ما سبق، تحدد كتلة التعليمات البرمجية التالية دالة testتقوم the-continuationبتعيين حالة التنفيذ المستقبلية لنفسها:
> ( اختبار ) 1 > ( الاستمرار ) 2 > ( الاستمرار ) 3 > ; يخزن الاستمرار الحالي (الذي سيطبع 4 لاحقًا) > ( تعريف استمرار آخر الاستمرار ) > ( اختبار ) ; يعيد ضبط الاستمرار 1 > ( الاستمرار ) 2 > ( استمرار آخر ) ; يستخدم الاستمرار المخزن مسبقًا 4للحصول على مقدمة أبسط لهذه الآلية، انظر call-with-current-continuation .
الروتينات الفرعية
يوضح هذا المثال استخدامًا محتملاً للاستمراريات لتنفيذ الروتينات الفرعية كخيوط منفصلة. [ 5 ]
;;; قائمة انتظار بسيطة لجدولة العمليات. ;;; تحتوي على قائمة بالاستمراريات "التي تنتظر التشغيل".( تعريف *queue* ' ())( define ( empty-queue? ) ( null? *queue* ))( تعريف ( إضافة x إلى قائمة الانتظار ) ( تعيين! *قائمة الانتظار* ( إلحاق *قائمة الانتظار* ( قائمة x ))))( define ( dequeue ) ( let (( x ( car *queue* ))) ( set! *queue* ( cdr *queue* )) x ));;; هذا يبدأ تشغيل سلسلة عمليات جديدة (proc).( define ( fork proc ) ( call/cc ( lambda ( k ) ( enqueue k ) ( proc ))));;; هذا يُحيل المعالج إلى خيط آخر، إن وُجد.( تعريف ( إرجاع ) ( استدعاء/نسخة ( لامدا ( ك ) ( إضافة ك ) (( إزالة من )))));;; هذا ينهي الخيط الحالي، أو البرنامج بأكمله ;;; إذا لم تكن هناك خيوط أخرى متبقية.( تعريف ( خروج الخيط ) ( إذا ( قائمة الانتظار فارغة؟ ) ( خروج ) (( إزالة من قائمة الانتظار ))))تسمح الوظائف المحددة أعلاه بتعريف وتنفيذ سلاسل العمليات من خلال تعدد المهام التعاوني ، أي سلاسل العمليات التي تتنازل عن التحكم للسلسلة التالية في قائمة الانتظار:
;;; نص أحد خيوط Scheme النموذجية التي تقوم ببعض المهام:( define ( do-stuff-n-print str ) ( lambda () ( let loop (( n0 ) ) ( format #t "~A ~A \n " str n ) ( yield ) ( loop ( + n1 ) ))))أنشئ خيطين، وابدأ تشغيلهما. ( fork ( do-stuff-n-print "This is AAA" )) ( fork ( do-stuff-n-print "Hello from BBB" )) ( thread-exit )سينتج الكود السابق هذا الناتج:
هذا هو AAA 0 تحية من BBB 0 هذا هو AAA 1 تحية من BBB 1 هذا هو AAA 2 تحية من BBB 2 ...
تطبيق
يجب على البرنامج تخصيص مساحة في الذاكرة للمتغيرات التي تستخدمها دواله. تستخدم معظم لغات البرمجة مكدس الاستدعاءات لتخزين المتغيرات المطلوبة، لأنه يسمح بتخصيص الذاكرة وتحريرها تلقائيًا بسرعة وسهولة. بينما تستخدم لغات برمجة أخرى الكومة لهذا الغرض، مما يوفر مرونة أكبر بتكلفة أعلى لتخصيص الذاكرة وتحريرها. ولكلتا الطريقتين مزايا وعيوب في سياق الاستمرارية. [ 6 ]
دعم لغات البرمجة
تُظهر العديد من لغات البرمجة استمرارية من الدرجة الأولى تحت مسميات مختلفة؛ وتحديداً:
- Common Lisp : cl-cont . يمكن أيضًا استخدام وحدات ماكرو مخصصة.
- لغة C++ : تم تنفيذها بشكل تقريبي باستخدام
co_await،co_return،co_yield - C# / VB.NET :
asyncوawait: "سجّل باقي الدالة كاستمرار، ثم ارجع إلى الدالة المستدعِية فورًا؛ ستستدعي المهمة الاستمرار عند اكتمالها". البرمجة غير المتزامنة للغة C# - العامل :
callcc0وcallcc1 - هاسكل : موناد الاستمرارية في
Control.Monad.Cont - هاكس : تكملة هاكس
- Icon ، Unicon :
create, suspend, @عامل: تعبيرات مشتركة - جافا : Lightwolf javaflow (يتطلب معالجة رمز البايت في وقت التشغيل أو وقت الترجمة)
- كوتلين :
kotlin.coroutines.Continuation - جافا سكريبت راينو :
Continuation - ببغاء :
ContinuationPMC؛ يستخدم أسلوب تمرير الاستمرارية لجميع تدفقات التحكم - بيرل : كورو والاستمرارية
- بيكو :
call(exp())وcontinue(aContinuation, anyValue) - بايثون : مكتبة PyPy
_continuation.continulets - مضرب :
call-with-current-continuation(يُختصر عادةً إلىcall/cc) - روبي :
callcc - سكالا :
scala.util.continuationsتوفرshift/reset - مخطط :
call-with-current-continuation(يُختصر عادةً إلىcall/cc) - Smalltalk :
Continuation currentDo:في معظم بيئات Smalltalk الحديثة، يمكن تنفيذ الاستمراريات دون دعم إضافي من الآلة الافتراضية. - معيار ML لولاية نيو جيرسي :
SMLofNJ.Cont.callcc - Unlambda :
cعملية التحكم في التدفق للمكالمة مع الاستمرار الحالي
في أي لغة تدعم الإغلاقات واستدعاءات الذيل الصحيحة ، يُمكن كتابة البرامج بأسلوب تمرير الاستمرارية وتنفيذ استدعاءات الدوال يدويًا. (في أسلوب تمرير الاستمرارية، تُصبح استدعاءات الدوال دالةً بسيطةً يُمكن كتابتها باستخدام تعبير لامدا ). تُعد هذه استراتيجية شائعة في لغة هاسكل ، حيث يسهل إنشاء " موناد تمرير الاستمرارية " (على سبيل المثال، Contالموناد ContTومُحوِّل الموناد في mtlالمكتبة). يُعد دعم استدعاءات الذيل الصحيحة ضروريًا لأنه في أسلوب تمرير الاستمرارية، لا تُعيد أي دالة قيمةً أبدًا؛ فجميع الاستدعاءات هي استدعاءات ذيلية.
في مجال تطوير الويب
يُعدّ برمجة الويب أحد المجالات التي شهدت استخدامًا عمليًا للاستمرارية . [ 7 ] [ 8 ] يحمي استخدام الاستمرارية المبرمج من الطبيعة عديمة الحالة لبروتوكول HTTP . في النموذج التقليدي لبرمجة الويب، ينعكس غياب الحالة في بنية البرنامج، مما يؤدي إلى شيفرة مبنية على نموذج لا يُناسب التعبير عن المشكلات الحسابية. بالتالي، تُمكّن الاستمرارية من كتابة شيفرة تتمتع بالخصائص المفيدة المرتبطة بانعكاس التحكم ، مع تجنب مشكلاته. تُقدّم ورقة بحثية بعنوان "عكس انعكاس التحكم، أو الاستمرارية مقابل البرمجة المرتكزة على الصفحة" [ 9 ] مدخلًا جيدًا للاستمرارية المُطبقة على برمجة الويب.
أنواع
يتباين دعم الاستمراريات بشكل كبير. تدعم لغات البرمجة الاستمراريات القابلة لإعادة الاستدعاء إذا كان من الممكن استدعاء الاستمرارية بشكل متكرر (حتى بعد انتهائها). وقد قدّم بيتر ج. لاندين الاستمراريات القابلة لإعادة الاستدعاء باستخدام عامل J (اختصارًا لـ Jump) الذي يُعيد توجيه مسار التحكم إلى منتصف استدعاء الإجراء. يُطلق على الاستمراريات القابلة لإعادة الاستدعاء أيضًا اسم "الاستمراريات المُعاد دخولها" في لغة Racket . مع ذلك، قد يُساء فهم هذا الاستخدام لمصطلح "الاستمراريات المُعاد دخولها" بسهولة عند مقارنته باستخدامه في مناقشات تعدد الخيوط .
يُعدّ استمرار الهروب نوعًا محدودًا يُستخدم للهروب من السياق الحالي إلى سياق آخر. تدعم العديد من اللغات التي لا تدعم الاستمراريات صراحةً معالجة الاستثناءات ، وهي مكافئة لاستمراريات الهروب ويمكن استخدامها للأغراض نفسها. setjmp/longjmpتُعدّ استمراريات الهروب في لغة C مكافئة أيضًا، إذ لا يمكن استخدامها إلا لفكّ مكدس الاستدعاءات . كما يمكن استخدامها لتنفيذ حذف الاستدعاءات التيلية .
أحد أنواع الاستمرارية هو الاستمرارية المحددةcall/cc . تستحوذ عوامل الاستمرارية، مثل `continue`، على كامل العمليات الحسابية المتبقية عند نقطة معينة في البرنامج، ولا توفر أي طريقة لتحديد نطاق هذا الاستحواذ. تعالج عوامل الاستمرارية المحددة هذه المشكلة من خلال توفير آليتي تحكم منفصلتين: مُوجِّه يُحدد عملية الاستمرارية، وعامل تجسيد مثل ` continue` أو shift` continue` control. وبالتالي، فإن الاستمراريات التي يتم الاستحواذ عليها باستخدام عوامل محددة لا تُمثل سوى جزء من سياق البرنامج.
العيوب
تُعدّ الاستمراريات التعبير الوظيفي لعبارة GOTO ، وتنطبق عليها نفس المحاذير. [ 10 ] ورغم أنها خيار منطقي في بعض الحالات الخاصة، مثل برمجة الويب، إلا أن استخدامها قد ينتج عنه شيفرة يصعب فهمها. في الواقع، تتضمن لغة البرمجة Unlambda، وهي لغة برمجة متخصصة، خاصية استدعاء الدوال مع الاستمرارية الحالية كإحدى ميزاتها، وذلك لأن التعبيرات التي تتضمنها "يصعب تتبعها للغاية". [ 11 ] توضح الروابط الخارجية أدناه هذا المفهوم بمزيد من التفصيل.
اللغويات
في مقال "الاستمرارية وطبيعة التحديد الكمي"، قدم كريس باركر "فرضية الاستمرارية"، التي
بعض التعبيرات اللغوية (وخاصة عبارات الاسم الكمية) لها دلالات تتلاعب باستمراراتها الخاصة. [ 12 ]
جادل باركر بأن هذه الفرضية يمكن استخدامها لتفسير ظواهر مثل ازدواجية معنى الاسم (على سبيل المثال، حقيقة أن الاسم الكمي "الجميع" يتصرف بشكل مختلف تمامًا عن العبارة الاسمية غير الكمية "بوب" في المساهمة في معنى جملة مثل "أليس ترى [بوب/الجميع]")، وانزياح النطاق (على سبيل المثال، أن عبارة "سقطت قطرة مطر على كل سيارة" تُفسر عادةً على أنهابدلاً من أن تكونوالغموض في النطاق (أي أن جملة مثل "رأى أحدهم الجميع" قد تكون غامضة بينو). كما لاحظ أن هذه الفكرة هي بطريقة ما مجرد امتداد طبيعي لنهج ريتشارد مونتاج في "المعالجة الصحيحة للكمية في اللغة الإنجليزية العادية" (PTQ)، حيث كتب أنه "مع الاستفادة من النظرة إلى الماضي، يمكن تمييز شكل محدود من الاستمرارية بوضوح في جوهر معالجة مونتاج (1973) PTQ للأسماء الاسمية كأدوات كمية معممة".
يُعد مدى إمكانية استخدام الاستمراريات لشرح الظواهر العامة الأخرى في اللغة الطبيعية موضوعًا للبحث الحالي. [ 13 ]
انظر أيضاً
- استمرار المكالمة الحالية
- إنهاء
- قادم من
- أسلوب الاستمرارية والتمرير
- تدفق التحكم
- روتين فرعي
- تكملة محدودة
- الدلالات الدلالية
- انتقل إلى
- معكرونة سباغيتي
- Quajects ، وهو نوع من الكائنات يسمح بتعيين استمراريات قابلة للتحديد (تسمى "callouts") للطرق على أساس كل كائن، من خلال حقن التبعية .
مراجع
- 1 2 3 4 رينولدز 1993
- لاحظ إس آر راسل أن دالة eval يمكن أن تعمل كمترجم للغة LISP، فقام على الفور ببرمجتها يدويًا، وهكذا أصبح لدينا لغة برمجة مزودة بمترجم. —جون مكارثي، تاريخ LISP
- ↑ "ستيف "سلاغ" راسل" . تاريخ الحاسوب .
- ↑ بالمر، لوك (29 يونيو 2004). "undo()? ("مثال على استمرارية الساندويتش")" . perl.perl6.language (مجموعة الأخبار) . تم الاسترجاع في 4 أكتوبر 2009 .
- ↑ هاينز، سي تي، فريدمان، دي بي، وواند، إم. 1984. الاستمراريات والروتينات الفرعية. في وقائع ندوة ACM لعام 1984 حول لغة LISP والبرمجة الوظيفية (أوستن، تكساس، الولايات المتحدة، 6-8 أغسطس 1984). LFP '84. ACM، نيويورك، نيويورك، 293-298.
- ↑ "استدعاء مع استمرارية التيار لمبرمجي لغة C" . ويكي مخطط المجتمع . 12 أكتوبر 2008.
- ↑ "قائمة قراءة حول لغة XML وبرمجة الويب" . مؤرشفة من الأصل بتاريخ 14-06-2010 . تم الاطلاع عليها بتاريخ 03-08-2006 .
- ↑ "برمجة الويب باستخدام الاستمراريات" (ملف PDF) . مؤرشف من الأصل (ملف PDF) بتاريخ 2012-09-05 . تم الاطلاع عليه بتاريخ 2012-09-05 .
- ↑ كريستيان كوينيك (2003) عكس عكس التحكم أو، الاستمراريات مقابل البرمجة المتمحورة حول الصفحة
- ↑ كويجلي، جون (سبتمبر 2007). "الاستمرارية الحسابية" (ملف PDF) . ص 38.
- ↑ مادور، ديفيد. "لغة برمجة Unlambda" . www.madore.org . تم الاطلاع عليه بتاريخ 19 يونيو 2021 .
- ↑ كريس باركر، الاستمراريات وطبيعة التحديد الكمي ، 2002 دلالات اللغة الطبيعية 10:211-242.
- ↑ انظر على سبيل المثال كريس باركر، الاستمراريات في اللغة الطبيعية مؤرشفة في 2007-08-24 في Wayback Machine (ورشة عمل الاستمراريات 2004)، أو تشونغ تشيه شان، الآثار الجانبية اللغوية (في "التركيب المباشر"، تحرير كريس باركر وبولين جاكوبسون، ص 132-163، مطبعة جامعة أكسفورد، 2007).
للمزيد من القراءة
- بيتر لاندين . تقرير تعميم القفزات والتسميات . بحث برمجة أنظمة UNIVAC. أغسطس 1965. أعيد طبعه في الحوسبة الرمزية والرتبة العليا، 11(2):125-143، 1998، مع مقدمة بقلم هايو ثيليكي.
- درو ماكديرموت وجيري سوسمان . دليل كونيفير المرجعي، مذكرة معهد ماساتشوستس للتكنولوجيا للذكاء الاصطناعي رقم 259، مايو 1972.
- دانيال بوبرو : نموذج لهياكل التحكم للغات برمجة الذكاء الاصطناعي IJCAI 1973.
- كارل هيويت ، بيتر بيشوب وريتشارد ستيجر . شكلية الممثل المعياري العالمي للذكاء الاصطناعي IJCAI 1973.
- كريستوفر ستراشي وكريستوفر ب. وادزورث . الاستمراريات: دلالات رياضية للتعامل مع القفزات الكاملة. دراسة فنية PRG-11. مختبر الحوسبة بجامعة أكسفورد. يناير 1974. أعيد طبعه في الحوسبة الرمزية والرتبة العليا، 13(1/2):135-152، 2000، مع مقدمة بقلم كريستوفر ب. وادزورث.
- جون سي. رينولدز . المفسرات التعريفية للغات البرمجة عالية المستوى. وقائع المؤتمر الوطني الخامس والعشرين لجمعية آلات الحوسبة، الصفحات 717-740، 1972. أعيد طبعه في الحوسبة عالية المستوى والرمزية 11(4):363-397، 1998، مع مقدمة.
- جون سي. رينولدز. حول العلاقة بين الدلالات المباشرة ودلالات الاستمرارية. وقائع الندوة الثانية حول الأوتوماتا واللغات والبرمجة. سلسلة محاضرات في علوم الحاسوب، المجلد 14، الصفحات 141-156، 1974.
- رينولدز، جون سي. (1993). "اكتشافات الاستمراريات" (ملف PDF) . لغة ليسب والحوسبة الرمزية . 6 (3/4): 233-248 .
- جيرالد سوسمان وجاي ستيل . SCHEME: مترجم لحساب التفاضل والتكامل الموسع لامدا. مذكرة الذكاء الاصطناعي رقم 349، مختبر الذكاء الاصطناعي بمعهد ماساتشوستس للتكنولوجيا، كامبريدج، ماساتشوستس، ديسمبر 1975. أعيد طبعه في الحوسبة الرمزية والرتبة العليا 11(4):405-439، 1998، مع مقدمة.
- روبرت هيب ، آر. كينت ديبفيج ، كارل بروجيمان . تمثيل التحكم في وجود استمراريات من الدرجة الأولى. وقائع مؤتمر ACM SIGPLAN '90 حول تصميم وتنفيذ لغات البرمجة، الصفحات 66-77.
- ويل كلينجر ، آن هارتهايمر ، إريك أوست . استراتيجيات التنفيذ للاستمراريات. وقائع مؤتمر ACM لعام 1988 حول لغة LISP والبرمجة الوظيفية، الصفحات 124-131، 1988. نسخة المجلة: الحوسبة الرمزية والحسابات من الرتبة العليا، 12(1):7-45، 1999.
- كريستيان كوينيك . عكس عكس التحكم أو، الاستمراريات مقابل البرمجة المتمحورة حول الصفحة SIGPLAN Notices 38(2)، ص 57-64، 2003.
روابط خارجية
- ورشة عمل ACM SIGPLAN حول الاستمرارية 2011 في المؤتمر الدولي لعلم النفس الوظيفي (ICFP) .
- تتمة لرواية "المتشائمون" بقلم سام روبي
- يحتوي كتاب "Teach Yourself Scheme in Fixnum Days" للمؤلف دوراي سيتارام على فصل رائع حول التكملات.
- الاستمراريات و Stackless Python بقلم كريستيان تيسمر
- وقائع ورشة عمل ACM SIGPLAN الرابعة حول الاستمرارية، متاحة على الإنترنت، مؤرشفة بتاريخ 2 ديسمبر 2010 في موقع Wayback Machine.
- وقائع ورشة عمل ACM SIGPLAN الثانية حول الاستمرارية المنشورة على الإنترنت
- متابعة، وظائف، وقفزات. مؤرشف بتاريخ 2 ديسمبر 2010 في أرشيف الإنترنت (Wayback Machine).
- http://okmij.org/ftp/continuations/ بقلم أوليغ كيسليوف
- https://wiki.haskell.org/Continuations
- وحيد القرن مع التكملات
- استكمالات بلغة جافا خالصة من إطار عمل تطبيقات الويب RIFE
- تصحيح أخطاء الاستمراريات في جافا خالصة. مؤرشف بتاريخ 16 مايو 2021 على موقع Wayback Machine من إطار عمل تطبيقات الويب RIFE.
- مقارنة بين المولدات، والروتينات الفرعية، والاستمراريات، مصدر المثال أعلاه
- متابعة
- تدفق التحكم
