الخميس، 11 أغسطس 2022

أصل مصطلح البرمجة كائنية التوجه OOP

د. آلان كاي
د. آلان كاي (مصدر الصورة هنا)


سبب كتابة التعليق التالي هو محاولة تصحيح خطأ شاهدته في أحد فيديوهات تعلم لغة البرمجة سي ++، والخطأ يتعلق بادعاء أن لغة السي ++ قدمت لأول مرة أسلوب البرمجة كائنية التوجه (Object Oriented Programming) والتي تختصر لـ OOP، وهذا الكلام غير دقيق لأنه هذا الأسلوب في كتابة البرامج معروف قبل اختراع لغة البرمجة سي ++ بعشرات السنين.

مصطلح البرمجة كائنية التوجه OOP بدأ مع د. آلان كاي حوالي العام 1966 وهو يحكي هنا في نص رسالة ردا على تساؤل عن بداية استخدام مصطلح "object-oriented": (ملاحظة الترجمة هنا بتصرف وليست حرفية، حاولت توضيح بعض المصطلحات بين قوسين يبدأ بعلامة =)

في وقت ما بعد نوفمبر من عام 1966 في كلية الهندسة بجامعة يوتا، عندما تأثرت ببرنامج Sketchpad (لإيفان سذرلاند)، ولغة البرمجة سيمولا  (Simula)، وتصميم شبكة أربانت (ARPAnet) وتصميم حاسوب Burroughs B5000 وخلفيتي الأكاديمية في علم الأحياء والرياضيات، فكرت في تصميم هيكلية للبرمجة. ربما في عام 1967 عندما سألني أحدهم عما أفعله، فقلت: "برمجة كائنية التوجه" (OOP).

كان المفهوم الأصلي يتكون من الأجزاء التالية:

 - فكرت في الكائن (Object) على أنه كالخلايا البيولوجية و/أو كأجهزة الحاسوب المنفردة المتصلة بالشبكة ، قادرة فقط على الاتصال فيما بينها بواسطة الرسائل (وهنا يتضح أن مفهوم الاتصال بين الكائنات عن طريق الرسائل ظهر مبكرًا في البداية، رغم أنه استغرق وقتا لوصوله لشكل مفيد في لغة البرمجة).
 
 - أردت التخلص من البيانات. حاسوب B5000 فعل هذا بتصميم للعتاد تقريبًا لا يُصدق. أدركت أن تشبيه الكائن (Object) بـ (الخلية/الكمبيوتر المنفرد) سيؤدي للتخلص من البيانات، وأن استخدام الترميز التالي "->" سيكون مجرد علامة على رسالة أخرى (استغرق هذا بعض الوقت لفهم كل هذا لأنني فكرت حقًا في كل هذه الرموز كأسماء للدوال والإجراءات).
 
 - خلفيتي الرياضياتية جعلتني أدرك أنه يمكن أن يكون لكل كائن (Object) العديد من أنواع الجبر المرتبطة به، ويمكن أن يكون هناك عائلات جبرية منها، وأنها ستكون مفيدة جدًا جدًا. فُرِضَ مصطلح "تعدد الأشكال" (Polymorphism) لاحقًا (أظن عن طريق بيتر وجنر Peter Wegner) ولم يكن صحيحًا، لأنه جاء من اللغة المستخدمة لوصف الدوال الرياضية، وأردت أكثر قليلاً من الدوال. لذا ابتكرت مصطلح "العمومية" (genericity) للتعامل مع السلوكيات العامة في شكل شبه جبري.
 
 - لم تعجبني طريقة عمل التوريث (Inheritance) في سميولا (Simula I) أو سميولا 67 (برغم أن نيجارد Nygaard وداهل Dahl  (=مصمما اللغة) كانا مفكرين ومصممين رائعين). لذا قررت التخلي عن التوريث (Inheritance) كميزة مُضمنة حتى أفهمها بشكل أفضل.
 
أجريت تجاربي الأصلية على هذا التصميم باستخدام نموذج اقتبسته من عمل فينجاردن (Wijngaarden) في لغة ألجول (ALGOL) والورقة البحثية "تعميم للغة البرمجة ألجول" (A GENERALIZATION OF ALGOL) لنيكلاوس ويرث (Niklaus Wirth) وكذا لغة البرمجة أويلر (EULER) التي صممها ويرث. كلاهما كان يشبه لغة ليسب (LISP) ولكن تركيب الجملة كان أسهل في القراءة. لم أفهم وقتها فكرة ليسب (LISP) الضخمة وقتها عن اللغة المُعَرِّفة (metalanguage) (= أي استخدام لغة البرمجة ليسب لكتابة لغات برمجة أخرى)، ولكني اقتربت منها بأفكار عن اللغة التي يمكن توسعيها مستعيرًا من مصادر عدة، من ضمنها لغة IMP لـ إدجار آيرونز (Edgar T. Irons).

المرحلة التالية لهذا كانت فهمي أخيرًا لليسب (LISP) ثم استخدام هذا الفهم لجعل بنية التصميم التحتية أجمل وأصغر وأقوى وداعمة للاقتران المتأخر (late bound) (= يقصد أن اللغة أثناء التنفيذ تقوم بالتعرف على نوع البيانات الملائم للدالة المراد استدعائها، بدلا من تحديد ذلك أثناء ترجمة مصدر البرنامج لإخراج ملف تنفيذي) . أفادتني كثيرًا الأفكار المعروضة في أطروحة ديف فيشر (David A. Fisher) والمكتوبة بأسلوب "مكارثي" (=نسبة لجون مكارثي مصمم لغة ليسب والأسلوب الذي كتب به أطروحته الشهيرة عن لغة ليسب) حول هياكل التحكم الموسعة (extensible control structures) (= يقصد هنا أساليب التحكم في تنفيذ البرنامج كـ Goto والاستدعاء الذاتي والتنفيذ المتوازي ... الخ). تأثير كبير آخر وقتها كان مصدره لغة البرمجة بلانر (PLANNER ) لـ كارل هيويت (Carl Hewitt) (التي لم تحصل على التقدير الذي تستحقه، نظرًا لأنها بَشرَت بشكل جيد ومبكرا جدًا لما ستقوم به فيما بعد لغة البرمجة برولوج (Prolog)).

ظهرت لغة سمول توك (Smalltalk) الأصلية في معامل زيروكس بارك (Xerox PARC) نتاج لما ذكرته بالأعلى. أُشُتكِيَ من نسخ سمول توك (Smalltalk) اللاحقة في هذا الفصل من التاريخ: تراجعت أكثر لتصبح أقرب للغة سميولا (Simula) ولم يغيروا آليات توسيع (extension mechanisms) اللغة بآليات أكثر أمانًا ولم تكن مفيدة بأي شكل.

المصدر: Dr. Alan Kay  on the Meaning of “Object-Oriented Programming” (رابط)

ليست هناك تعليقات:

إرسال تعليق