نظام كائنات لغة ليسب الشائعة

نظام كائنات Common Lisp (CLOS) هو أداة برمجة كائنية التوجه في لغة ANSI Common Lisp . يُعد CLOS نظام كائنات ديناميكيًا يختلف جذريًا عن أدوات البرمجة كائنية التوجه الموجودة في لغات أكثر ثباتًا مثل C++ أو Java . استُلهم CLOS من أنظمة كائنات Lisp سابقة مثل MIT Flavors و CommonLoops ، مع أنه أكثر عمومية منهما. في البداية، اقتُرح CLOS كإضافة، ثم اعتُمد كجزء من معيار ANSI للغة Common Lisp، وتم تكييفه مع لهجات Lisp أخرى مثل EuLisp و Emacs Lisp . [ 1 ]
سمات
تتكون بنية CLOS الأساسية من الطرق ، والفئات ، ومثيلات تلك الفئات، والدوال العامة . توفر CLOS وحدات ماكرو لتعريف هذه العناصر: defclassو defmethodو defgeneric. يتم إنشاء المثيلات باستخدام الطريقة make-instance.
يمكن أن تحتوي الفئات على عدة فئات أساسية ، وقائمة من الخانات (متغيرات الأعضاء في لغة C++/Java)، وفئة وصفية خاصة . يمكن تخصيص الخانات إما على مستوى الفئة (حيث تشترك جميع نسخ الفئة في الخانة) أو على مستوى النسخة. لكل خانة اسم، ويمكن الوصول إلى قيمتها باستخدام هذا الاسم عبر الدالة slot-value. بالإضافة إلى ذلك، يمكن تعريف دوال عامة خاصة لكتابة أو قراءة قيم الخانات. يجب أن يكون لكل خانة في فئة CLOS اسم فريد.
نظام CLOS هو نظام إرسال متعدد . هذا يعني أنه يمكن تخصيص الدوال بناءً على أيٍّ من وسائطها المطلوبة أو جميعها. معظم لغات البرمجة الكائنية التوجه أحادية الإرسال، أي أن الدوال مخصصة فقط للوسيط الأول. ومن السمات غير المألوفة الأخرى أن الدوال لا "تنتمي" إلى الأصناف؛ فالأصناف لا توفر مساحة اسم للدوال أو الدوال العامة. تُعرَّف الدوال بشكل منفصل عن الأصناف، وليس لها وصول خاص (مثل "this" أو "self" أو "protected") إلى خانات الأصناف.
تُجمّع الدوال في لغة CLOS ضمن دوال عامة . الدالة العامة هي كائن يُمكن استدعاؤه كدالة عادية، ويربط مجموعة من الدوال باسم وبنية وسائط مشتركة، كل منها مُخصص لوسائط مُختلفة. بما أن لغة Common Lisp تُوفر فئات غير تابعة لـ CLOS للهياكل وأنواع البيانات المُدمجة (الأرقام، السلاسل النصية، الأحرف، الرموز، ...)، فإن آلية الإرسال في CLOS تعمل أيضًا مع هذه الفئات غير التابعة لـ CLOS. كما تدعم CLOS الإرسال عبر الكائنات الفردية (مُخصصات eql). لا تدعم CLOS افتراضيًا الإرسال عبر جميع أنواع بيانات Common Lisp (على سبيل المثال، لا يعمل الإرسال مع أنواع المصفوفات المُخصصة بالكامل أو مع الأنواع المُقدمة بواسطة deftype). مع ذلك، تُوفر مُعظم تطبيقات Common Lisp بروتوكولًا للكائنات الوصفية يسمح للدوال العامة بتوفير تخصيص وقواعد إرسال خاصة بالتطبيق.
يختلف نظام الإرسال في CLOS أيضًا عن معظم لغات البرمجة الكائنية:
- يتم تحديد قائمة بالأساليب القابلة للتطبيق عند إعطاء قائمة بالوسائط.
- تم ترتيب هذه القائمة وفقًا لمدى خصوصية مُخصصات المعلمات الخاصة بها.
- ثم يتم دمج الطرق المختارة من هذه القائمة في طريقة فعالة باستخدام مجموعة الطرق المستخدمة بواسطة الوظيفة العامة.
- ثم يتم استدعاء الطريقة الفعالة باستخدام الوسائط الأصلية.
تعمل آلية الإرسال هذه أثناء التشغيل. لذا، قد تؤدي إضافة أو إزالة الدوال إلى تغيير الدوال الفعلية (حتى عند استدعاء الدالة العامة بنفس الوسائط) أثناء التشغيل. كما أن تغيير تركيبة الدوال قد يؤدي إلى دوال فعلية مختلفة.
على سبيل المثال،
; قم بتعريف النموذج الأولي لبنية الوسيط المشترك. ( defgeneric f ( x y ))عرّف دالة تنفيذ للدالة (f integer y)، حيث y من جميع الأنواع. ( defmethod f (( x integer ) y ) 1 )( f 1 2.0 ) => 1عرّف دالة تنفيذ للدالة (f عدد صحيح حقيقي). ( defmethod f (( x عدد صحيح ) ( y عدد حقيقي )) 2 )( f 1 2.0 ) => 2 ; تم تغيير الإرسال في وقت التشغيل.على غرار أنظمة البرمجة الكائنية في معظم اللغات الديناميكية ، لا يفرض CLOS التغليف . يمكن الوصول إلى أي خانة باستخدام الدالة أو عبر دوال الوصولslot-value (التي يتم إنشاؤها تلقائيًا اختياريًا) . للوصول إليها، يجب معرفة اسم الخانة. يستخدم مبرمجو CL ميزة الحزم في اللغة لتحديد الدوال أو هياكل البيانات المراد تصديرها.slot-value
إلى جانب الطرق العادية ("الأساسية")، توجد أيضًا طرق :before" مساعدة" :afterو :around"إضافية". تُستدعى الطريقتان الأوليان قبل أو بعد الطريقة الأساسية، بترتيب محدد بناءً على التسلسل الهرمي للفئة. :aroundيمكن للطريقة المساعدة التحكم في تنفيذ الطريقة الأساسية من عدمه. بالإضافة إلى ذلك، يمكن للمبرمج تحديد ما إذا كان ينبغي استدعاء جميع الطرق الأساسية الممكنة على طول التسلسل الهرمي للفئة، أو استدعاء الطريقة التي تُقدم أقرب تطابق فقط.
تُوفّر تركيبة الأساليب القياسية الأساليب الأساسية، والأساليب السابقة، واللاحقة، والمحيطة، الموضّحة أعلاه. توجد تركيبات أساليب أخرى بأنواع أساليب مختلفة. ويمكن تعريف تركيبات أساليب وأنواع أساليب جديدة (بسيطة ومعقدة).
يسمح نظام CLOS بالوراثة المتعددة . عندما لا يكون الترتيب الافتراضي لتنفيذ الطرق في الوراثة المتعددة صحيحًا، يمكن للمبرمج حل مشاكل الوراثة الماسية عن طريق تحديد ترتيب مجموعات الطرق.
لغة CLOS ديناميكية، ما يعني إمكانية تعديل ليس فقط محتوياتها، بل أيضًا بنية كائناتها أثناء التشغيل. تدعم CLOS تغيير تعريفات الفئات ديناميكيًا (حتى في حال وجود نسخ من الفئة المعنية مسبقًا)، بالإضافة إلى تغيير انتماء نسخة معينة إلى فئة أخرى باستخدام عامل change-classالتشغيل. كما تتيح CLOS إضافة الدوال وإعادة تعريفها وحذفها أثناء التشغيل. تُحل مشكلة الدائرة والقطع الناقص بسهولة في CLOS، وتختفي معظم أنماط تصميم البرمجة الكائنية أو تصبح أبسط نوعيًا. [ 2 ]
CLOS ليست لغة نموذجية : يجب تعريف الفئات قبل أن يتم إنشاء الكائنات كأعضاء في تلك الفئة.
بروتوكول الكائن الفوقي
إلى جانب معيار ANSI Common Lisp، يوجد امتداد شائع الاستخدام للغة CLOS يُسمى بروتوكول الكائنات الوصفية (MOP). يُعرّف بروتوكول الكائنات الوصفية واجهة قياسية لأساسيات تطبيق CLOS، حيث يُعامل الفئات، ووصف الخانات، والدوال العامة، والأساليب نفسها كأمثلة على فئات وصفية ، ويسمح بتعريف فئات وصفية جديدة وتعديل جميع سلوكيات CLOS. تُمهّد مرونة بروتوكول الكائنات الوصفية لـ CLOS الطريق للبرمجة الموجهة نحو الجوانب ، والتي طوّرها لاحقًا بعض المهندسين أنفسهم، مثل غريغور كيتزاليس . يُعرّف بروتوكول الكائنات الوصفية سلوك نظام الكائنات بأكمله من خلال مجموعة من البروتوكولات، المُعرّفة بلغة CLOS. وبالتالي، يُمكن إنشاء أنظمة كائنات جديدة عن طريق توسيع أو تغيير وظائف CLOS المُتاحة. يصف كتاب " فن بروتوكول الكائنات الوصفية" استخدام وتطبيق بروتوكول الكائنات الوصفية لـ CLOS.
تختلف تطبيقات لغة Common Lisp المختلفة قليلاً في دعمها لبروتوكول الكائنات الوصفية. ويهدف مشروع Closer [ 3 ] إلى توفير الميزات المفقودة.
تأثيرات من أنظمة الكائنات القديمة القائمة على لغة ليسب
كان نظام Flavors (وخليفته New Flavors) هو نظام الكائنات في جهاز MIT Lisp Machine . تستخدم أجزاء كبيرة من أنظمة تشغيل Lisp Machine والعديد من تطبيقاتها نظام Flavors أو New Flavors. قدّم نظام Flavors ميزاتٍ عديدة، من بينها التوريث المتعدد والمزج . يُعتبر نظام Flavors قديمًا إلى حد كبير، على الرغم من وجود تطبيقات له في لغة Common Lisp. كان نظام Flavors يعتمد على نموذج تمرير الرسائل. أما نظام New Flavors فقد قدّم الدوال العامة.
كانت CommonLoops خليفةً لـ LOOPS (من Xerox Interlisp -D). طُوّرت CommonLoops للغة Common Lisp. وكان تطبيقها المحمول، المسمى Portable CommonLoops (PCL)، أول تطبيق لـ CLOS. وقد تم نقل PCL على نطاق واسع، ولا تزال تُشكّل الأساس لتطبيق CLOS في العديد من تطبيقات Common Lisp . يُنفّذ PCL في الغالب بلغة Common Lisp المحمولة، مع وجود أجزاء قليلة فقط تعتمد على النظام.
CLOS في لغات برمجة أخرى
بسبب قوة لغة CLOS وقدرتها التعبيرية، بالإضافة إلى التوافر التاريخي لـ Tiny CLOS (وهو تطبيق مبسط وقابل للنقل للغة CLOS كتبه غريغور كيتزاليس للاستخدام مع لغة Scheme)، أصبحت أنظمة الكائنات القائمة على MOP الشبيهة بلغة CLOS هي المعيار الفعلي في معظم تطبيقات لهجات لغة Lisp، بالإضافة إلى أنها وجدت طريقها إلى مرافق البرمجة الكائنية في بعض اللغات الأخرى :
- COS، نظام كائنات C [ 4 ]
- ديلان
- Dynace، وهو تطبيق (إلى حد كبير) CLOS في لغة C [ 5 ]
- EIEIO لـ Emacs Lisp
- غوش، مخطط مع CLOS
- GOOPS في GNU Guile
- ILOS في ISLISP
- ميرون، نظام كائنات في لغة سكيم
- راكو
- القوس، مخطط مع CLOS
- ScmObj، للمخطط
- SOS for MIT Scheme
- STklos، مخطط مع CLOS
- الاحتيال في شبكة
- حظائر الدجاج في مشروع تربية الدجاج
- VCLOS للمهارة [ 6 ]
- Tiny CLOS [ 7 ]
- فئات S4 في لغتي البرمجة S و R
للمزيد من القراءة
- بوبرو، دانيال ج .؛ كان، كينيث؛ كيتزاليس، غريغور ؛ ماسينتر، لاري ؛ ستيفيك، مارك؛ زديبل، فرانك (يونيو 1986). "الحلقات المشتركة: دمج لغة ليسب والبرمجة كائنية التوجه" (ملف PDF) . وقائع مؤتمر أنظمة ولغات وتطبيقات البرمجة كائنية التوجه . OOPSLA '86. الصفحات 17-29 . doi : 10.1145/28697.28700 . ISBN 978-0-89791-204-4S2CID 62631315. مؤرشف من الأصل (PDF) بتاريخ 17 أغسطس 2022. تم الاطلاع عليه بتاريخ 17 مارس 2022 .
- فيتش، جيم (1998). "تاريخ ووصف لغة CLOS". في سالوس، بيتر هـ. (محرر). دليل لغات البرمجة، المجلد الرابع: لغات البرمجة الوظيفية والمنطقية ( الطبعة الأولى). ماكميلان للنشر التقني. الصفحات 107-158 . ISBN 1-57870-011-6.
مراجع
- ↑ «CLOS معيار. توفره عدة شركات. يُستخدم CLOS (أو أجزاء منه) لإضافة البرمجة الكائنية إلى لهجات أخرى من لغة Lisp مثل EuLisp أو Emacs Lisp.» ص 110 من كتاب فيتش 1998
- ↑ في شرائح أنماط التصميم في اللغات الديناميكية ، يقدم بيتر نورفيج النتائج التي توصل إليها والتي مفادها أن 16 من أصل 23 نمط تصميم مأخوذة من كتب مدرسية مختلفة إما "غير مرئية أو أبسط" في Dylan أو Common Lisp مقارنة بـ C++.
- ↑ مشروع أقرب: أقرب إلى MOP
- ↑ دينيو، لوران (12 مارس 2010). نظام كائنات لغة C: استخدام لغة C كلغة برمجة كائنية عالية المستوى (ملف PDF) . arXiv : 1003.2547 . CiteSeerX 10.1.1.763.7946 . تاريخ الاسترجاع: 17 مارس 2022 .
- ↑ امتداد Dynace الموجه للكائنات إلى لغة C
- ↑ نيوتن، جيم؛ رودس، كريستوف (28 نوفمبر 2008). "المُخصِّصات المُخصصة في لغة ليسب الكائنية التوجه" . مجلة علوم الحاسوب العالمية . 14 (20): 3370-3388 . CiteSeerX 10.1.1.523.2413 . doi : 10.3217/jucs-014-20-3370 . S2CID 12032836. تاريخ الاسترجاع: 17 مارس 2022 .
- ↑ Tiny CLOS، من تطوير غريغور كيتزاليس
الأدب
- سونيا كين ، البرمجة الكائنية في لغة Common Lisp: دليل المبرمج إلى CLOS ، 1988، أديسون-ويسلي. ISBN 0-201-17589-4
- غريغور كيتزاليس ، وجيم دي ريفيير ، ودانيال جي. بوبرو ، فن بروتوكول الكائن الميتا ، 1991، مطبعة معهد ماساتشوستس للتكنولوجيا. رقم ISBN 0-262-61074-4
- جو أ. لوليس ومولي م. ميلر ، فهم نظام كائنات Common Lisp: CLOS ، 1991، دار النشر الرقمية، رقم ISBN 1-55558-064-5
- أندرياس بابكه ، البرمجة الكائنية التوجه: منظور CLOS ، 1993، مطبعة معهد ماساتشوستس للتكنولوجيا. ISBN 0-262-16136-2
- يقدم كتاب "نظام كائنات Common Lisp: نظرة عامة" لريتشارد ب. غابرييل وليندا ديميشيل مقدمة جيدة للدافع وراء تعريف الفئات عن طريق الوظائف العامة.
- يقدم كتاب "أساسيات CLOS" للمؤلف نيك ليفين شرحًا تفصيليًا خطوة بخطوة لتطبيق مفاهيم البرمجة الكائنية في CLOS، وكيفية استخدامها. وهو موجه لكل من لديه معرفة أساسية بلغة Lisp أو Scheme.
- Common Lisp HyperSpec ، الفصل 7: الكائنات
- لغة الشفرة الشائعة
- البرمجة الكائنية التوجه
- لغة البرمجة ليسب
