بيئة كائنات بيرل
بيئة كائنات بيرل ( POE ) هي مكتبة من وحدات بيرل مكتوبة بلغة برمجة بيرل بواسطة روكو كابوتو وآخرون.
من CPAN:
- "تم تطوير POE في الأصل كنواة لخادم كائنات مستمر وبيئة تشغيل. وقد تطور إلى إطار عمل متعدد المهام والشبكات للأغراض العامة، يشمل ويوفر واجهة متسقة لحلقات الأحداث الأخرى مثل Event ومجموعات أدوات Tk و Gtk ."
الهندسة المعمارية وطبقات التجريد
يمكن اعتبار بيئة كائنات بيرل (POE) نظام تشغيل معياريًا صغيرًا . يمكن تشغيل برنامج واحد أو أكثر من برامج أو نسخ POE في وقت واحد، وهي مناسبة عمومًا لتعدد المهام التعاوني . تتكون حزمة POE من مساحات أسماء وتجريدات توجه التطوير المستقبلي لـ POE وفقًا لاتفاقية مفتوحة على غرار CPAN .
طبقة الأحداث
يتألف الهيكل غير الرسمي من مجموعة من الطبقات مع نواة في الأسفل. تمثل هذه النواة الصغيرة طبقة الأحداث التي تعمل كحلقة رئيسية لكل مثيل POE قيد التشغيل. أول استدعاء يكون إلى "موزع الأحداث" - POE::Kernel .
يحتوي نطاق اسم POE::Kernel على مجموعة من الدوال المدمجة في نواة النظام. صُممت هذه التجريدات الحلقية وفقًا لواجهة جسر حلقة الأحداث القياسية في POE، وهي POE::Loop . يمكن دمج هذه الدوال وتخصيصها حسب الحاجة لتوفير خدمات وقت التشغيل وآلية فعّالة للتواصل بين العمليات . الدوال الأساسية هي POE::Loop::Event و POE::Loop::Poll و POE::Loop::Select . كما تتوفر أيضًا POE::Loop::Tk و POE::Loop::Gtk اللتان توفران إمكانية الربط بجسور حلقات أخرى في البيئة الخارجية. إضافةً إلى ذلك، يوفر تجريد نواة POE::Loop وظائف استدعاء إشارات قابلة لإعادة الاستخدام، ووظائف استدعاء للوقت أو الإنذارات، ووظائف استدعاء لأنشطة مقابض الملفات، بالإضافة إلى وظائف إدارية مثل تهيئة حلقات الأحداث وتنفيذها وإنهائها.
يوجد أيضًا إطار عمل تغليف عالي المستوى يُسمى POE::Macro، وأداة تصحيح أخطاء لاختباره تُسمى POE::Preprocessor. وقد أدى هذا الإطار إلى تطوير POE::Macro::UseBytes .
- ملاحظة: كما يقتضي تقليد بيرل، فإن POE هو أيضًا هدف متحرك.
احرص دائمًا على مراجعة CPAN للاطلاع على الإضافات الجديدة التي أضافها المجتمع إلى الأرشيف. (...وتذكر شعار بيرل: "هناك أكثر من طريقة لفعل ذلك" كما قال لاري ).
يعمل النواة الجارية من خلال آلات الحالة المحدودة البدائية، المُنشأة من مجموعة أخرى من التجريدات التي تحكمها بنية POE::Session . تُعرَّف POE::Session ببساطة على أنها خريطة للأحداث إلى الدوال، أو أساليب الفئات ، أو أساليب الكائنات التي تعالجها. تحتوي كائنات POE::Session أيضًا على مساحة تخزين مشتركة بين جميع معالجات الأحداث الخاصة بها، تُسمى كومة . وبغض النظر عن كيفية تقسيمها، فإن الحالات محددة بدقة وواضحة المعالم.
يُعدّ معالج الأحداث الأكثر تطورًا فئةً فرعيةً من POE::Session تُسمى POE::NFA ، وهي عبارة عن آلة حالة محدودة غير حتمية تعمل بالأحداث ( آلة حالة محدودة أكثر ذكاءً ). ينتقل معالج الأحداث هذا من حالة محددة بدقة إلى أخرى حسب متطلبات الأحداث، أو الاستطلاعات، أو اختيارات المستخدم، أو غيرها من الأحداث الخارجية. تعمل آلة الحالة هذه على تغليف نطاق واسع من سلاسل العمليات العامة التي تعمل بالأحداث، مما يسمح بتتبع أدق بكثير على طول مسار التنفيذ مقارنةً بـ POE::Session غير الرسمي نسبيًا.
طبقة الإدخال/الإخراج
المتطلب التالي لنواة النظام هو وجود معالجات إدخال/إخراج ضمن طبقة إدخال/إخراج واحدة تُسمى " العجلات ". تبدأ العجلات الإجراءات، وتتعامل مع الأحداث الناتجة عنها على المستوى الأدنى، وتُنتج أحداثًا على المستوى الأعلى للجلسات التي تستخدمها. تُبنى العجلات، مثل الجلسات والحلقات، من مجموعة موحدة من التجريدات - POE::Wheel - التي تعمل فوق نواة النظام. يوجد سبع عجلات متخصصة ومحددة بدقة في التوزيعة الأساسية لنظام POE:
- POE::Wheel::Run - يقوم بإنشاء العمليات الفرعية والتفاعل معها باستخدام pipe() و fork() وأحيانًا exec(). يتم التفاعل من خلال المدخلات والمخرجات القياسية للعملية الفرعية.
- POE::Wheel::SocketFactory - طريقة لإنشاء مقابس العميل والخادم دون انتظار إنشائها.
- POE::Wheel::Curses - معالج للإدخال غير المتزامن من مكتبة واجهة النصوص Curses . تعتمد عليه مكونات CPAN مثل Curses::UI::POE وTerm::Visual.
- POE::Wheel::FollowTail - يتتبع ملفًا متزايدًا باستمرار، مثل سجل أو مستند تعاوني، من خلال الاحتفاظ بمؤشر على ذيله.
- POE::Wheel::ListenAccept - مجموعة فرعية من POE::Wheel::SocketFactory تستخدم للاستماع على مقابس الخادم الموجودة وقبول الاتصالات من العملاء البعيدين.
- POE::Wheel::ReadLine - نظير غير مانع، يعتمد على الأحداث، لـ Term::ReadLine.
- POE::Wheel::ReadWrite - معالج ملفات NBIO عالي الأداء لـ POE يستخدم برامج التشغيل والمرشحات الخاصة بـ POE لإجراء عمليات القراءة والكتابة المخزنة مؤقتًا على مقابض الملفات والتي تعتمد على الطبقة التالية - نظام الملفات الصغير الخاص بـ POE.
طبقات الملفات
تتولى برامج التشغيل عملية قراءة وكتابة مؤشرات الملفات. وهي مصممة وفقًا للتعريفات الأقل تجريدًا الموجودة في وحدة POE::Driver . برنامج التشغيل الرئيسي المُطبق وقت كتابة هذا النص هو POE::Driver::SysRW ، وهو قارئ/كاتب مؤشرات ملفات شامل مصمم خصيصًا لـ POE::Wheel::ReadWrite.
الطبقة التالية، المبنية من POE::Filter وربما محور اهتمام معظم خبراء التشفير في لغة بيرل (انظر POE #POE Humor أدناه)، هي مجموعة POE::Filter :
"تقوم المرشحات بالترجمة بين التدفقات الخام وقطع مطبوخة من دادا لذيذة." بحسب سونغو
- تقوم الدالة POE::Filter::Block بتحليل المدخلات على شكل كتل ذات طول ثابت. أما في جانب الإخراج، فهي ببساطة تمرر البيانات دون أي تغيير.
- تقوم وحدة POE::Filter::HTTPD بتحليل المدخلات كطلبات HTTP وتحويلها إلى كائنات HTTP::Request . أما في جانب الإخراج، فتأخذ كائنات HTTP::Response وتحولها إلى صيغة مناسبة للإرسال إلى متصفح الويب/وكيل المستخدم.
- تقوم وحدة POE::Filter::Line بتحليل التدفقات الواردة إلى أسطر وتحويل الأسطر الصادرة إلى تدفقات. كانت في السابق بسيطة للغاية، ولكن التحسينات الأخيرة أضافت ميزات مثيرة للاهتمام مثل الكشف التلقائي عن الأسطر الجديدة.
- يُستخدم POE::Filter::Reference لإرسال هياكل بيانات Perl بين برامج POE أو بين POE وبرامج Perl أخرى. في جانب الإدخال، تُحوّل البيانات المُجمّدة (عبر Storable أو FreezeThaw أو YAML أو أي آلية تسلسل أخرى) إلى هياكل بيانات Perl. أما في جانب الإخراج، فتُجمّد المراجع المُعطاة للمرشح. كما يُمكن ضغط البيانات عند الطلب في حال تثبيت Compress::Zlib.
- لا يقوم POE::Filter::Stream بأي شيء. فهو ببساطة يمرر البيانات دون أي تغيير.
راجع قسم POE على CPAN للاطلاع على القائمة الكاملة
عناصر
وفقًا لتوثيق POE::Component ، كُتبت العديد من الحزم البرمجية الكبيرة باستخدام POE . هذه الحزم عبارة عن وحدات نمطية تعتمد على الأحداث، ويعمل الكثير منها كبرامج خلفية صغيرة تُقدّم خدمات للحزم الأكبر التي تنتمي إليها. يُسهّل بعضها التواصل عالي المستوى بين الوحدات النمطية، لا سيما التطبيقات المستقلة التي يجب أن تبقى مستقلة عن التوزيعة الرئيسية للغة بيرل.
بشكل عام، تُعدّ مكونات POE إجراءات جاهزة عالية المستوى تُنفّذ مهامًا كبيرة ومحددة. إليك بعض الأمثلة:
- Component::Server::TCP - خادم TCP مخصص
- Component::Client::TCP - عميل TCP يدعم تقنية PoE
- POE::Component::IRC - عميل IRC شبه كامل الميزات.
- POE::Component::Server::IRC - خادم IRC متوافق مع RFC 2810 إلى RFC 2813 (قيد التطوير)
- POE::Component::UserBase - خادم مصادقة المستخدم وحفظ البيانات.
"تميل مكونات POE إلى أن تكون مكتبات قابلة لإعادة الاستخدام بدرجة كبيرة وتتعامل مع المهام الشاقة، مما يتيح للمبرمجين التركيز على أمور أكثر إثارة للاهتمام. لكن ينبغي أن ينطبق هذا على أي مكتبة.
مزاح
- وحدة Acme::POE::Knee على CPAN .
- عدد من التوسعات السخيفة للاختصارات في نهاية ما هو POE.
انظر أيضاً
- البرمجة القائمة على الأحداث
- Twisted ، إطار عمل مماثل للغة البرمجة بايثون
روابط خارجية
- الصفحة الرئيسية لـ POE (موقع ويكي)
- وحدات بيرل
- برنامج مبرمج بلغة بيرل
