المكرر
في البرمجة الوظيفية ، يُعدّ المُكرِّر تجريدًا تركيبيًا لمعالجة أجزاء بيانات الإدخال المُقدَّمة بالتسلسل بشكل تدريجي وبطريقة وظيفية بحتة . باستخدام المُكرِّرات، يُمكن تحويل كيفية إخراج البيانات من مورد ما بشكل كسول، على سبيل المثال، عن طريق تحويل كل جزء من الإدخال إلى أحرف كبيرة عند استرجاعه، أو عن طريق حصر البيانات في الأجزاء الخمسة الأولى فقط دون تحميل بيانات الإدخال كاملةً في الذاكرة. كما أن المُكرِّرات مسؤولة أيضًا عن فتح الموارد وإغلاقها، مما يوفر إدارة موارد قابلة للتنبؤ.
في كل خطوة، يُعرض على المُكرَّر أحد ثلاثة أنواع من القيم: الجزء التالي من البيانات، أو قيمة تُشير إلى عدم توفر بيانات، أو قيمة تُشير إلى انتهاء عملية التكرار. وقد يُعيد المُكرَّر أحد ثلاثة أنواع من القيم، لتوضيح الخطوة التالية للمُستدعي: قيمة تعني "توقف" (وتحتوي على قيمة الإرجاع النهائية)، وقيمة تعني "متابعة" (وتُحدد كيفية المتابعة)، وقيمة تعني "الإشارة إلى وجود خطأ". تُمثل هذه الأنواع الأخيرة من القيم "حالات" المُكرَّر المُحتملة. يبدأ المُكرَّر عادةً في حالة "متابعة".
تُستخدم التكرارات في لغتي هاسكل وسكالا (في إطار عمل بلاي [ 1 ] وفي سكالاز )، وهي متاحة أيضًا للغة إف شارب [ 2 ] . توجد تطبيقات مختلفة قليلاً للتكرارات. على سبيل المثال، في إطار عمل بلاي، تتضمن هذه التكرارات كائنات مستقبلية (Futures) لتمكين المعالجة غير المتزامنة.
نظرًا لأن الدوال المتكررة تُستدعى بواسطة شيفرة أخرى تُزودها بالبيانات، فإنها تُعد مثالًا على عكس التحكم . مع ذلك، وعلى عكس العديد من الأمثلة الأخرى لعكس التحكم، مثل تحليل SAX XML، تحتفظ الدالة المتكررة بقدر محدود من التحكم في العملية. لا يمكنها الرجوع إلى البيانات السابقة (إلا إذا خزنت تلك البيانات داخليًا)، ولكن يمكنها إيقاف العملية بسلاسة دون إطلاق استثناء (يُعتبر استخدام الاستثناءات كوسيلة للتحكم في تدفق البرنامج ، بدلًا من الإشارة إلى حدث استثنائي، أمرًا غير مستحب لدى المبرمجين [ 3 ] ).
المفاهيم المجردة الشائعة المرتبطة
إن التجريدات التالية ليست ضرورية بالمعنى الدقيق للكلمة للعمل مع العناصر المتكررة، لكنها تجعل الأمر أكثر ملاءمة.
المحصون
يُعدّ المُعدّد تجريدًا مناسبًا لتغذية المُكرِّر بالبيانات من أي مصدر بيانات. عادةً ما يتولى المُعدّد أي عملية تنظيف ضرورية للموارد المرتبطة بمصدر البيانات. ولأنه يعرف بدقة متى ينتهي المُكرِّر من قراءة البيانات، فإنه يُجري عملية تنظيف الموارد (مثل إغلاق ملف) في الوقت المناسب تمامًا - لا مُبكرًا جدًا ولا مُتأخرًا جدًا. ومع ذلك، يُمكنه القيام بذلك دون الحاجة إلى معرفة تفاصيل تنفيذ المُكرِّر أو التواجد معه في نفس الموقع - لذا يُشكّل المُعدّدون والمُكرِّرون مثالًا على فصل الاهتمامات .
الأشخاص الذين تم إحصاؤهم
يُعدّ المُعَدَّد تجريدًا مناسبًا لتحويل مُخرَجات كلٍّ من المُعَدَّد والمُكرِّر، وتغذية المُكرِّر بتلك المُخرَجات. على سبيل المثال، يقوم مُعَدَّد "الخريطة" بتطبيق دالة على كل جزء من أجزاء المُدخلات. [ 4 ]
الدوافع
تم ابتكار التكرارات نتيجةً لمشاكل في الحلول الوظيفية البحتة الحالية لمشكلة جعل الإدخال/الإخراج قابلاً للتركيب وصحيحًا في الوقت نفسه. سمح الإدخال/الإخراج الكسول في لغة هاسكل للدوال البحتة بالعمل على البيانات الموجودة على القرص كما لو كانت في الذاكرة، دون إجراء أي عمليات إدخال/إخراج صريحة بعد فتح الملف - وهي ميزة تُشبه ميزة الملفات المُرتبطة بالذاكرة - ولكن نظرًا لاستحالة معرفة وقت التشغيل، بشكل عام (بسبب مشكلة التوقف )، ما إذا كان الملف أو أي مورد آخر لا يزال مطلوبًا، فقد يتم ترك عدد كبير جدًا من الملفات مفتوحة دون داعٍ، مما يؤدي إلى استنفاد مُعرّفات الملفات على مستوى نظام التشغيل . من ناحية أخرى، كان الإدخال/الإخراج التقليدي على نمط لغة C منخفض المستوى للغاية، ويتطلب من المطور الاهتمام بتفاصيل دقيقة مثل الموضع الحالي في الملف، مما أعاق قابلية التركيب. تجمع التكرارات والمُعدِّدات بين مزايا البرمجة الوظيفية عالية المستوى للإدخال/الإخراج الكسول، مع القدرة على التحكم في الموارد والتفاصيل الدقيقة عند الضرورة التي يوفرها الإدخال/الإخراج على نمط لغة C. [ 5 ]
أمثلة
الاستخدامات
تُستخدم التكرارات في إطار عمل Play لدفع البيانات إلى اتصالات Comet و WebSocket طويلة الأمد مع متصفحات الويب .
يمكن أيضًا استخدام التكرارات لإجراء تحليل تدريجي (أي تحليل لا يقرأ جميع البيانات في الذاكرة دفعة واحدة)، على سبيل المثال JSON . [ 6 ]
تُعدّ المُكرِّرات مفهومًا تجريديًا عامًا جدًا، ويمكن استخدامها لأنواعٍ مُختلفة من معالجة المعلومات التسلسلية (أو المعالجة المُختلطة التسلسلية/العشوائية) - ولا تتطلب بالضرورة أي عمليات إدخال/إخراج على الإطلاق. وهذا يُسهّل إعادة توظيف المُكرِّر للعمل على مجموعة بيانات موجودة في الذاكرة بدلًا من البيانات المُتدفقة من الشبكة.
تاريخ
بمعنى ما، يُعد مفهوم خط الأنابيب في أنظمة التشغيل سلفًا بعيدًا لفكرة قيام مُعدِّد البيانات بدفعها إلى سلسلة من مُكرِّر واحد أو أكثر. مع ذلك، وخلافًا لخط الأنابيب التقليدي، فإن المُكرِّرات ليست عمليات منفصلة (وبالتالي لا تتحمل عبء الاتصال بين العمليات ) - أو حتى خيوطًا منفصلة، على الرغم من قدرتها على أداء العمل بطريقة مشابهة لسلسلة من خيوط العمل التي تُرسل الرسائل إلى بعضها البعض. هذا يعني أن المُكرِّرات أخف وزنًا من العمليات أو الخيوط - فعلى عكس الحالات التي تكون فيها العمليات أو الخيوط منفصلة، لا حاجة إلى مكدسات إضافية.
ابتكر أوليغ كيسليوف التكرارات والمعدِّدات لاستخدامها في لغة هاسكل. [ 5 ] وفي وقت لاحق، تم إدخالها في سكالاز (في الإصدار 5.0؛ كانت المعدِّدات غائبة وتم إدخالها في سكالاز 7) وفي إطار عمل بلاي 2.0.
الدلالات الرسمية
تم تصميم التكرارات رسميًا على أنها مونادات حرة ، مما يسمح بالتحقق من صحة القوانين المعادلاتية، واستخدامها لتحسين البرامج باستخدام التكرارات. [ 5 ]
البدائل
- يمكن استخدام المكررات بدلاً من المكررات في لغة سكالا، لكنها إلزامية ، لذا فهي ليست حلاً وظيفياً بحتاً .
- في لغة هاسكل، تم تطوير نموذجين بديلين للتجريد يُعرفان باسم Conduits وPipes. (لا تُعدّ هذه الأنابيب أنابيب على مستوى نظام التشغيل، لذا فهي، مثل iteratees، لا تتطلب استخدام استدعاءات النظام ). ترتبط Conduits تحديدًا بمكتبات أغنى بكثير من العناصر الأساسية والمُركِّبات مقارنةً بـ iteratees؛ إذ توجد مُهايئات Conduits لوظائف إضافية مثل تحليل HTML وXML والتحليل العام، وإجراء طلبات HTTP ومعالجة الاستجابات، مما يجعل Conduits أكثر ملاءمة من iteratees لتطوير البرمجيات الصناعية في هاسكل، بشكل فوري.
- يوجد أيضًا تجريد عالي المستوى يُسمى machines . في لغة Scala، توجد حزمة تُسمى FS2: Functional Streams for Scala ، والتي يمكن تتبع أصولها إلى machines عبر عدة عمليات نقل وإعادة تسمية وإعادة هيكلة.
- في لغة هاسكل، توجد حزمة safe-lazy-io . وهي توفر حلاً أبسط لبعض المشاكل نفسها، والذي يتضمن أساساً أن تكون "صارمة بما يكفي" لسحب جميع البيانات المطلوبة، أو التي قد تكون مطلوبة، من خلال مسار يتولى تنظيف الموارد عند الانتهاء.
مراجع
- ↑ "التعامل مع تدفقات البيانات بشكل تفاعلي" . وثائق إطار عمل بلاي . تم الاطلاع عليه بتاريخ 29 يونيو 2013 .
- ↑ "نتائج بحث GitHub: Iteratee في FSharpx" . GitHub .
- ↑ "نظرية جافا وتطبيقها: نقاش الاستثناءات" . IBM developerWorks . تم الاطلاع عليه بتاريخ 17 مايو 2014 .
- ↑ "المحصون" . وثائق إطار عمل بلاي . تم الاطلاع عليه بتاريخ 29 يونيو 2013 .
- 1 2 3 كيسليوف، أ. (2012). "المتكررون". البرمجة الوظيفية والمنطقية . سلسلة محاضرات في علوم الحاسوب. المجلد 7294. الصفحات 166-181 . doi : 10.1007/978-3-642-29822-6_15 . ISBN 978-3-642-29821-9.
- ↑ جيمس روبر (10 ديسمبر 2012). "Json.scala" . play-iteratees-extras . تم الاطلاع عليه بتاريخ 29 يونيو 2013 .
للمزيد من القراءة
- جون دبليو. لاتو (12 مايو 2010). "المُتَجَرِّب: تعليم القديم حيلًا جديدة" . العدد 16 من مجلة قارئ الموناد . تم الاطلاع عليه بتاريخ 29 يونيو 2013 .هذا يتعلق بلغة هاسكل.
روابط خارجية
- دروس تعليمية في لغة سكالا
- دروس تعليمية في لغة هاسكل
- للمزيد من المعلومات
- البرمجة الوظيفية
- التكرار في البرمجة
