نظرة عامة على الـ Coroutines

Mohammad Laifمنذ 4 سنوات

بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته

 

في هذا الدرس ستتعرف على الروتين الاعتيادي Routine وانواعه ومن بينها الـ Coroutine.

 

ماذا ستقرئ في هذا الدرس

  • ماهو الروتين Routine.
  • ماهو الروتين التعاوني Coroutine.
  • كيفية عمل الروتين Coroutine وما هي آلية التعاون.
  • فهم معنى المصطلح العربي للكروتين Coroutine.

 

ما هو الروتين Routine

الروتين في حياتنا الطبيعية يقصد به الـ دأب (إي تكرار نفس العمل مراراً ومراراً كل يوم). وفي البرمجة أي عملية نقوم بتكرارها نستطيع إطلاق عليها اسم روتين routine. مثل تلك الأعمال التي تقوم بها نواة النظام Kernel بشكل متكرر وقد تأتي بأسماء مختلفة مثل Services او Extensions وكلها تعتبر روتينات routines. ولإستشفاف عن بعض من تلك الأعمال انظر في القسم الأول Linux Kernel في الهيكلة الهندسية لبيئة نظام الاندرويد. ايضاً كل نظام تشغيل لديه روتيناته الخاصة. وكذلك تطبيقاتك فلو صادف أن لديك تطبيق مفكرة, يقوم بتخزين النص عندما يكتب المستخدم فيه بشكل آلي كل دقيقة فهنا نستطيع تسمية هذا العمل بروتين.

 

نستطيع تسمية الدوال التي تقوم بعمل مكرر بالروتينات Routines.

 

ما هو الروتين التعاوني Coroutine

الآن بتنا نعرف ان اي عملية متكررة تسمى روتين routine ونستطيع تغليفها بداخل دالة ما, وتلك الدالة نستطيع حزمها مع أخريات بداخل فئات classes او اذا صح التعبير بداخل وحدات modules.

والآن إلى فهم الكروتين Coroutine نحتاج لرؤية تاريخية بسيطة عنه. فمبدأ الكروتينات Coroutines ليس جديد, بل قديم جداً. يعود تقريباً الى سنة ١٩٥٨ ميلادي حين تمت مناقشته في لغة التجميع Assembly Program من قبل Donald Knuth و Melvin Conway. وأول تفسير وشرح له كان في سنة ١٩٦٣ ميلادي في ورقة علمية بعنوان Design of a Separable Transition-Diagram Compiler والتي نصت على اقتراح لحل مشكلة ما بإستخدام هذا المنهج الجديد (الـ Coroutine) وكان الهدف منه في ذلك الوقت هو التعاون وليس تحقيق التزامن, كالتالي:

 

The coroutine approach to the same problem accomplishes the switching job implicitly by use of the subroutine calling sequence. When Coroutines A and B are connected so that A sends items to B, B runs for a while until it encounters a read command, which means it needs something from A. Then control is transferred to A until it wants to "write,” whereupon control is returned to B at the point where it left off.

 

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

 

 استخدام كروتينان اثنان A و B. ومن خلال التبديل بين المهام بشكل ضمني implicitly (أي ليس من قبل المبرمج) بإستخدام مشتق روتين subroutine ذي النهج التسلسلي (إي بما يعرف لنا الآن بالدالة function). فعند توصيل كروتين A مع كروتين B. ويبدأ الكروتين A بإرسال المهام إلى الكروتين B. فإن الكروتين B يقوم بالعمل حتى يصادف آمر قرائة, وهذا الآمر يعني انه يحتاج الى شئ من الكروتين A. وعندها يتوقف عن العمل, ويبدأ الكروتين A في الكتابة له في المكان الذي توقف فيه بالضبط. 

 

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

وقد اشتق منه شئ سمي بالسبروتين Subroutine وهو المعروف لدينا كوحدة تحمل في طياتها شفرات برمجية ولكنها لا تستطيع إيقاف تنفيذ نفسها عند اي سطر, فهي لابد أن تبدأ التنفيذ من السطر الاول وتنهي التنفيذ في السطر الاخير مع إرجاع نتيجة ما (نعم أنها الدوال). فهو عبارة عن مجموعة من التعليمات المتسلسلة والمتعاقبة جمعت او غلفت في وحدة واحدة, والتي يتم تنفيذها لأجل إتمام مهمة ما بشكل تسلسلي و تعاقبي. ويتم اطلاق عليها اسماء مختلفه تناسب أدوارها في بعض الأحيان مثل Procedure و Function و Routine و Method و Subprogram أو Callable Unit.

وكذلك اشتق منه شئ آخر مشابه له سمي بالسميكروتين semicoroutines او بما يعرف بـ المولدات Generators.

 

كيفية عمل الروتين Coroutine وما هي آلية التعاون

آلية الدوال

نحن نعرف طريقة عمل الدوال Functions, أن التنفيذ فيها يبدأ من السطر الاول وينتهي في السطر الاخير, مع وجوب إرجاع قيمة (نعم يجب على الدالة إرجاع قيمة, لذلك كنا نرى نوع Void سابقاً في الجافا والآن في الكوتلن نرى نوع Unit اللذان يعبران عن قيمة تعبر عن الفراغ ان صح التعبير). فلو فرضنا أن لدينا دالتان يريدان التعاون مع بعضهم البعض في أداء مهمة ما فلن يستطيعا. واقصد هنا بالتعاون هو أن الدالتين يقومان بإداء المهمة في الوقت نفسه. والسبب على أنهم لا يستطيعون التعاون لأن الدالة الاولى يجب عليها ان تنتهي ليتم تنفيذ الدالة الثانية. أي أن الدوال يجب عليها أن تطأ موطئ العبارة return في نهايتها. وهذا ماهو معروف في السبروتين Subroutine كالدوال والمثودز وما إلى ذلك.

آلية الكروتين

في الجهة المقابلة, في الروتينات التعاونية Coroutines. لو فرضنا أن لدينا روتينان (تستطيع تخيلهما كدالتان) يستطيع الروتين الأول التعاون مع الروتين الثاني في أداء المهمة. وذلك لأن الروتين يستطيع أيقاف تنفيذ نفسه في أي سطر برمجي, ولديه القدرة على حفظ رقم ذلك السطر والحالة التي وصل لها في أداء المهمة. ثم يعطي المهمة الى الروتين الآخر ليبدء عمله, وهكذا دواليك. أي أن الروتينات لا يجب عليها أن تطأ موطئ العبارة return في نهايتها.

 

فهم معنى المصطلح العربي للكروتين Coroutine

الـ Coroutines تتم ترجمته في العربية بعض الاحيان الى الروتينات المساعدة. لا ادري ما القصد من كلمة “المساعدة”. مفهوم المساعدة يختلف عن التعاون. المساعدة تأتي مرة واحدة وذلك عند الحاجة لها في أداء مهمة ما. أما التعاون فهو شئ دائم عند أداء المهمة. بحثت كثيراً عن اصل التسمية, انتهيت الى أن كلمة aid routine ذكرت في كتاب معجم حاسب عربي من سنة ١٩٩٥م وكانت ترجمة صحيحة تتعلق بالروتينات في قلب النواة Kernel واخرى روتينات مساعدة لعمليات التصحيح. والظاهر حالياً أنه تم استخدام وإطلاق نفس الترجمة على Coroutine بدون فهم ماهيتها ولا طريقة عملها. ايضاً لاحظت ان اغلب ترجمة المصطلحات العربية تأتي بكلمة "مساعد" اعتباطاً (إي دون سبب أو علة).

فالافضل تسمية الـ Coroutine بالروتينات التعاونية أو المتعاونة, لإنها تتعاون مع بعضها البعض. فالأصل في تركيبها هو كلمة routine ومعناها “روتين” ويقصد بها الدوال “functions” في الحاسب الآلي, وأدخلت عليها كلمة cooperative التي تترجم الى “التعاون” واختصاراً كتبت co وهكذا أصبحت Coroutine. وستجد انها في قمة التعاون عندما نقوم بإيصالها مع بعضها البعض بإستخدام القنوات في درس متقدم.

 

في الدرس القادم سنكمل التعرف على الكروتين Coroutine ولكن بشكل خاص مرتبط بلغة الكوتلن Kotlin. سنرى أين يتواجد الكروتين, وكيف استطاعة لغة الكوتلن تحقيق هذا المبدأ. وسنرى الفرق بينه وبين الدوال على الخيط الحاسوبي Thread وكيف يعمل وما الى ذلك من امور عامة.

 

المصادر

  • كتاب Learning Concurrency in Kotlin.
  • ويكيبيديا Coroutine.
  • ويكيبيديا Subroutine.
  • الورقة العلمية Design of a Separable Transition-Diagram Compiler.

المحاضر

Mohammad Laif

محتوى الدورة

الكلمات الدليلية

عن الدرس

2 إعجاب
3 متابع
0 مشاركة
3015 مشاهدات
منذ 4 سنوات

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !