لغة البرمجة الذاتية

لغة سيلف هي لغة برمجة عامة الأغراض وعالية المستوى وموجهة للكائنات ، تعتمد على مفهوم النماذج الأولية . بدأت سيلف كلغة فرعية من لغة سمول توك ، وكانت ذات كتابة ديناميكية وتستخدم الترجمة الفورية (JIT) مع منهج النماذج الأولية للكائنات. استُخدمت لأول مرة كنظام اختبار تجريبي لتصميم اللغات في ثمانينيات وتسعينيات القرن الماضي. في عام 2006، كانت سيلف لا تزال قيد التطوير كجزء من مشروع كلاين، وهو عبارة عن آلة افتراضية بلغة سيلف مكتوبة بالكامل بها. صدرت أحدث نسخة منها، 2024.1، في أغسطس 2024. [ 2 ]

تم تطوير وتحسين العديد من تقنيات الترجمة الفورية في أبحاث Self حيث كانت مطلوبة للسماح للغة كائنية التوجه عالية المستوى بالعمل بسرعة تصل إلى نصف سرعة لغة C المحسّنة . وقد تم تطوير جزء كبير من Self في شركة Sun Microsystems ، وتم نشر التقنيات التي طوروها لاحقًا في آلة HotSpot الافتراضية الخاصة بلغة Java .

في مرحلة ما، تم تطبيق نسخة من لغة سمول توك في برنامج سيلف. وبفضل قدرتها على استخدام تقنية الترجمة الفورية (JIT)، حققت هذه النسخة أداءً ممتازًا للغاية. [ 3 ]

تاريخ

صُممت لغة البرمجة "سيلف" في الغالب على يد ديفيد أونجار وراندال سميث عام 1986 أثناء عملهما في مركز أبحاث زيروكس بارك . كان هدفهما تطوير أحدث ما توصل إليه البحث في لغات البرمجة كائنية التوجه، بعد إصدار لغة "سمول توك -80" من قبل المختبرات وبدء الصناعة في أخذها على محمل الجد. انتقلا إلى جامعة ستانفورد وواصلا العمل على اللغة، وقاما ببناء أول مُترجم عملي للغة "سيلف" عام 1987. ثم تحول التركيز إلى العمل على بناء نظام كامل للغة "سيلف"، بدلاً من الاقتصار على اللغة فقط.

صدر الإصدار الأول للجمهور عام ١٩٩٠، وفي العام التالي انتقل الفريق إلى شركة صن مايكروسيستمز حيث واصلوا العمل على اللغة. وتوالت الإصدارات الجديدة حتى توقف العمل عليها بشكل كبير عام ١٩٩٥ مع الإصدار ٤.٠. وفي عام ٢٠٠٦، صدر الإصدار ٤.٣ لأنظمة ماك أو إس إكس وسولاريس . وفي عام ٢٠١٠، طوّر فريقٌ ضمّ بعض أعضاء الفريق الأصلي ومبرمجين مستقلين إصدارًا جديدًا، هو الإصدار ٤.٤، لأنظمة ماك أو إس إكس ولينكس ، كما هو الحال مع جميع الإصدارات اللاحقة. وفي يناير ٢٠١٤، صدر إصدارٌ لاحق، هو الإصدار ٤.٥ ، وبعد ثلاث سنوات، في مايو ٢٠١٧، صدر الإصدار ٢٠١٧.١.

طُوِّرت بيئة بناء واجهة المستخدم Morphic في الأصل بواسطة راندي سميث وجون مالوني للغة البرمجة Self. [ 6 ] وقد نُقلت Morphic إلى لغات برمجة أخرى بارزة، بما في ذلك Squeak و JavaScript و Python و Objective -C .

ألهمت لغة "سيلف" أيضاً عدداً من اللغات البرمجية المبنية على مفاهيمها. ولعل أبرزها لغة "نيوتن سكريبت" لجهاز "أبل نيوتن" ولغة "جافا سكريبت" المستخدمة في جميع المتصفحات الحديثة. ومن الأمثلة الأخرى "آيو" و"ليساك" و "أغورا" . أما نظام الكائنات الموزعة في إطار عمل "آي بي إم تيفولي"، الذي طُوّر عام 1990، فكان في أبسط مستوياته نظام كائنات قائم على النماذج الأولية، مستوحى من "سيلف".

لغات البرمجة القائمة على النماذج الأولية

تعتمد لغات البرمجة الكائنية التقليدية القائمة على الأصناف على ثنائية متأصلة:

  1. تحدد الفئات الصفات والسلوكيات الأساسية للكائنات.
  2. تُعدّ مثيلات الكائنات مظاهر خاصة لفئة معينة.

على سبيل المثال، لنفترض أن كائنات الفئة Vehicleلها اسم وقدرة على أداء مهام مختلفة، مثل القيادة إلى العمل وتوصيل مواد البناء . Bob's carهو كائن محدد (نسخة) من الفئة Vehicle، واسمه "سيارة بوب". نظريًا، يمكن إرسال رسالة إلى Bob's car، لإخباره بتوصيل مواد البناء .

يُظهر هذا المثال إحدى مشكلات هذا النهج: سيارة بوب، وهي سيارة رياضية، غير قادرة على نقل مواد البناء وتوصيلها (بمعنى حقيقي)، مع أن هذه القدرة Vehicleمُصممة لتتمتع بها بعض المركبات. يُمكن الحصول على نموذج أكثر فائدة من خلال استخدام التوريث لإنشاء تخصصات من فئة معينة Vehicle؛ على سبيل المثال، فئة Sports Carمعينة وفئة أخرى Flatbed Truck. تحتاج كائنات الفئة فقط Flatbed Truckإلى توفير آلية لتوصيل مواد البناء ؛ أما السيارات الرياضية، غير المُناسبة لهذا النوع من العمل، فلا تحتاج إلا إلى القيادة بسرعة . مع ذلك، يتطلب هذا النموذج المُعمق فهمًا أعمق أثناء التصميم، وهو فهم قد لا يتضح إلا عند ظهور المشكلات.

تُعدّ هذه المسألة أحد الدوافع الرئيسية وراء النماذج الأولية . فما لم يكن بالإمكان التنبؤ بدقة بخصائص مجموعة من الكائنات والفئات في المستقبل البعيد، لا يمكن تصميم تسلسل هرمي للفئات بشكل سليم. وكثيرًا ما يحتاج البرنامج في نهاية المطاف إلى سلوكيات إضافية، ما يستدعي إعادة تصميم (أو إعادة هيكلة ) أجزاء من النظام لتقسيم الكائنات بطريقة مختلفة. وقد أظهرت التجارب مع لغات البرمجة الكائنية المبكرة، مثل Smalltalk، أن هذا النوع من المشكلات يتكرر باستمرار. إذ تميل الأنظمة إلى التوسع حتى تصل إلى حد معين، ثم تصبح جامدة للغاية، حيث تصبح الفئات الأساسية الموجودة أسفل كود المبرمج غير مناسبة . وبدون طريقة سهلة لتغيير الفئة الأصلية، قد تنشأ مشكلات خطيرة.

سمحت اللغات الديناميكية مثل Smalltalk بهذا النوع من التغيير عبر طرق معروفة في الفئات؛ فبتغيير الفئة، تتغير سلوكيات الكائنات المبنية عليها. مع ذلك، كان لا بد من إجراء هذه التغييرات بحذر شديد، إذ قد تتوقع كائنات أخرى مبنية على نفس الفئة هذا السلوك الخاطئ : وغالبًا ما يعتمد الخطأ على السياق. (هذا أحد أشكال مشكلة الفئة الأساسية الهشة ). علاوة على ذلك، في لغات مثل C++ ، حيث يمكن تجميع الفئات الفرعية بشكل منفصل عن الفئات الأصلية، قد يؤدي تغيير الفئة الأصلية إلى تعطيل طرق الفئة الفرعية المُجمَّعة مسبقًا. (هذا شكل آخر من أشكال مشكلة الفئة الأساسية الهشة، وأيضًا أحد أشكال مشكلة واجهة البرمجة الثنائية الهشة ).

في لغة Self، وغيرها من اللغات القائمة على النماذج الأولية، يتم التخلص من الازدواجية بين الفئات ومثيلات الكائنات.

بدلاً من إنشاء نسخة من كائن مُستند إلى فئة معينة ، في تقنية "الذات"، يتم إنشاء نسخة من كائن موجود وتعديله. على سبيل المثال، Bob's carيتم إنشاء كائن من خلال نسخ كائن موجود من فئة "المركبة" ، ثم إضافة دالة "قيادة سريعة" ، مع مراعاة كونه سيارة بورش 911. تُعرف الكائنات الأساسية التي تُستخدم بشكل رئيسي لإنشاء نسخ باسم "النماذج الأولية" . يُزعم أن هذه التقنية تُبسط الديناميكية بشكل كبير. إذا ثبت أن كائنًا موجودًا (أو مجموعة كائنات) غير مناسب كنموذج، يمكن للمبرمج ببساطة إنشاء كائن مُعدل بالسلوك الصحيح واستخدامه بدلاً من الكائن الموجود. لا يتم تغيير الكود الذي يستخدم الكائنات الموجودة.

وصف

الكائنات الذاتية هي مجموعة من الخانات . الخانات هي دوال وصول تُرجع قيمًا، ووضع نقطتين رأسيتين بعد اسم الخانة يُحدد قيمتها. على سبيل المثال، بالنسبة لخانة تُسمى "name"،

اسمي الشخصي

يُعيد القيمة بالاسم، و

اسم الشخص : 'foo'

يضبطه.

تستخدم لغة Self، مثل لغة Smalltalk، الكتل البرمجية للتحكم في تدفق التعليمات البرمجية ومهام أخرى. الأساليب عبارة عن كائنات تحتوي على التعليمات البرمجية بالإضافة إلى خانات (تُستخدم للوسائط والقيم المؤقتة)، ويمكن وضعها في خانة Self تمامًا مثل أي كائن آخر: رقم على سبيل المثال. يبقى بناء الجملة كما هو في كلتا الحالتين.

لاحظ أنه لا يوجد تمييز في لغة Self بين الحقول والأساليب: فكل شيء عبارة عن خانة. وبما أن الوصول إلى الخانات عبر الرسائل يشكل الجزء الأكبر من بنية لغة Self، فإن العديد من الرسائل تُرسل إلى self ، ويمكن حذف كلمة self (ومن هنا جاء الاسم).

بناء الجملة الأساسي

تتشابه صيغة الوصول إلى الخانات مع صيغة لغة سمول توك. وتتوفر ثلاثة أنواع من الرسائل:

أحادي
receiver slot_name
ثنائي
receiver + argument
الكلمة المفتاحية
receiver keyword: arg1 With: arg2

تُعيد جميع الرسائل نتائج، لذا يمكن أن يكون المُستقبِل (إن وُجد) والوسائط نتاجًا لرسائل أخرى. وضع نقطة بعد الرسالة يعني أن الدالة `Self` ستتجاهل القيمة المُعادة. على سبيل المثال:

طباعة "مرحباً بالعالم! "

هذه نسخة "Self" من برنامج "Hello, World!" . 'يشير التركيب إلى كائن نصي حرفي. تشمل الكائنات الحرفية الأخرى الأرقام والكتل والكائنات العامة.

يمكن فرض التجميع باستخدام الأقواس. في حال عدم وجود تجميع صريح، تُعتبر الرسائل الأحادية ذات أولوية قصوى، تليها الرسائل الثنائية (التجميع من اليسار إلى اليمين)، ثم الكلمات المفتاحية ذات أولوية دنيا. استخدام الكلمات المفتاحية للتخصيص سيؤدي إلى أقواس إضافية في حال احتواء التعبيرات على رسائل كلمات مفتاحية، لذا لتجنب ذلك، يشترط برنامج Self أن يبدأ الجزء الأول من مُحدد رسالة الكلمة المفتاحية بحرف صغير، بينما تبدأ الأجزاء اللاحقة بحرف كبير.

صالح: قاعدة سفلية بين: قاعدة الربط السفلية + الارتفاع و: قاعدة علوية / عامل المقياس .

يمكن تحليلها بشكل لا لبس فيه، وتعني نفس المعنى التالي:

صالح: (( القاعدة السفلية ) بين : (( الوصلة السفلية ) + الارتفاع ) و: (( القاعدة العلوية ) / ( عامل المقياس ))) .

في لغة Smalltalk-80، ستُكتب نفس العبارة على النحو التالي:

صالح := قاعدة ذاتية سفلية بين : قاعدة ذاتية سفلية + ارتفاع ذاتي و: قاعدة ذاتية علوية / عامل مقياس ذاتي .

بافتراض أن ، و baseلم ligatureتكن متغيرات مثيل لـ ولكنها كانت في الواقع طرقًا.heightscaleself

إنشاء كائنات جديدة

لنأخذ مثالاً أكثر تعقيداً قليلاً:

labelWidget copy label: 'Hello, World!' .

يقوم بإنشاء نسخة من كائن "labelWidget" مع رسالة النسخ (بدون اختصار هذه المرة)، ثم يرسل إليه رسالة لوضع عبارة "Hello, World" في الخانة المسماة "label". الآن، لنفعل شيئًا ما بهذه النسخة:

( سطح المكتب النافذة النشطة ) ارسم: ( عنصر واجهة المستخدم التسمية نسخ التسمية : 'مرحباً بالعالم!' ) .

في هذه الحالة (desktop activeWindow)، يتم تنفيذ العملية أولاً، حيث تُعاد النافذة النشطة من قائمة النوافذ التي يعرفها كائن سطح المكتب. بعد ذلك (من الداخل إلى الخارج، ومن اليسار إلى اليمين)، يُعيد الكود الذي فحصناه سابقًا عنصر واجهة المستخدم (labelWidget). وأخيرًا، يُرسل عنصر واجهة المستخدم إلى خانة الرسم الخاصة بالنافذة النشطة.

وفد

نظريًا، كل كائن من نوع "سيلف" كيان مستقل. لا يحتوي "سيلف" على فئات أو فئات وصفية. لا تؤثر التغييرات التي تُجرى على كائن معين على أي كائن آخر، ولكن في بعض الحالات يكون من المستحسن حدوث ذلك. عادةً، لا يفهم الكائن إلا الرسائل التي تتوافق مع خاناته المحلية، ولكن من خلال وجود خانة واحدة أو أكثر تشير إلى الكائنات الأصلية ، يمكن للكائن تفويض أي رسالة لا يفهمها بنفسه إلى الكائن الأصلي. يمكن جعل أي خانة مؤشرًا للكائن الأصلي بإضافة علامة النجمة كلاحقة. بهذه الطريقة، يتولى "سيلف" مهامًا تستخدم الوراثة في اللغات القائمة على الفئات. يمكن أيضًا استخدام التفويض لتنفيذ ميزات مثل مساحات الأسماء والنطاق المعجمي .

على سبيل المثال، لنفترض تعريف كائن باسم "حساب بنكي"، يُستخدم في تطبيق محاسبي بسيط. عادةً، يُنشأ هذا الكائن مع تضمين الدوال، مثل "إيداع" و"سحب"، بالإضافة إلى أي خانات بيانات لازمة لها. هذا نموذج أولي، يتميز فقط بطريقة استخدامه، حيث إنه في الوقت نفسه حساب بنكي كامل الوظائف.

سمات

إنشاء نسخة طبق الأصل من هذا الكائن لحساب "بوب" سيُنشئ كائنًا جديدًا يبدأ تمامًا مثل النموذج الأولي. في هذه الحالة، قمنا بنسخ الخانات، بما في ذلك الطرق وأي بيانات. مع ذلك، يتمثل الحل الأكثر شيوعًا في إنشاء كائن أبسط يُسمى كائن السمات ، والذي يحتوي على العناصر التي تُربط عادةً بفئة.

في هذا المثال، لن يحتوي كائن "الحساب المصرفي" على دالتي الإيداع والسحب، ولكنه سيرتبط بكائن رئيسي يحتوي عليهما. بهذه الطريقة، يمكن إنشاء نسخ متعددة من كائن الحساب المصرفي، مع إمكانية تغيير سلوكها جميعًا بتغيير خانات البيانات في الكائن الرئيسي.

ما الفرق بين هذا وبين الفصل الدراسي التقليدي؟ حسناً، لننظر في معنى ما يلي:

myObject parent: someOtherObject .

يُغيّر هذا المقتطف فئة الكائن myObject أثناء التشغيل بتغيير القيمة المرتبطة بالخانة 'parent*' (العلامة النجمية جزء من اسم الخانة، ولكنها ليست جزءًا من الرسائل المقابلة). على عكس الوراثة أو النطاق المعجمي، يمكن تعديل الكائن المُفوَّض أثناء التشغيل.

إضافة خانات

يمكن تعديل الكائنات في Self لإضافة خانات إضافية. يُمكن القيام بذلك باستخدام بيئة البرمجة الرسومية، أو باستخدام الدالة الأساسية '_AddSlots:'. للدالة الأساسية نفس صيغة رسالة الكلمات المفتاحية العادية، ولكن اسمها يبدأ بشرطة سفلية. يُنصح بتجنب استخدام الدالة الأساسية _AddSlots لأنها من بقايا التطبيقات القديمة. مع ذلك، سنستخدمها في المثال أدناه لأنها تُختصر الكود.

كان أحد الأمثلة السابقة يتعلق بإعادة هيكلة فئة بسيطة تُسمى "Vehicle" بهدف التمييز بين سلوك السيارات والشاحنات. في "Self"، يمكن تحقيق ذلك باستخدام ما يشبه التالي:

_ AddSlots: ( | vehicle <- ( | parent * = traits clonable| ) | ) .

بما أن مُستقبِل الأمر '_AddSlots:' غير مُحدَّد، فهو الكائن نفسه . في حالة التعبيرات المكتوبة في سطر الأوامر، يكون هذا الكائن هو "lobby". وسيط الأمر '_AddSlots:' هو الكائن الذي سيتم نسخ خاناته إلى المُستقبِل. في هذه الحالة، هو كائن حرفي يحتوي على خانة واحدة فقط. اسم الخانة هو 'vehicle' وقيمتها هي كائن حرفي آخر. <-يشير هذا الترميز إلى وجود خانة ثانية تُسمى 'vehicle:' والتي يمكن استخدامها لتغيير قيمة الخانة الأولى.

يشير الرمز =`'` إلى خانة ثابتة، لذا لا يوجد عنصر أب مطابق لها. يحتوي الكائن الحرفي الذي يمثل القيمة الأولية لـ `vehicle` على خانة واحدة فقط، مما يسمح له بفهم الرسائل المتعلقة بالاستنساخ. أما الكائن الفارغ تمامًا، المشار إليه بـ (| |) أو ببساطة بـ ()، فلا يمكنه استقبال أي رسائل على الإطلاق.

vehicle_AddSlots : ( | name <- ' automobile' | ) .

هنا يكون المتلقي هو الكائن السابق، والذي سيتضمن الآن خانات 'name' و 'name:' بالإضافة إلى 'parent*'.

_ AddSlots: ( | sportsCar <- vehicle copy | ) . sportsCar _ AddSlots: ( | driveToWork = ( '' بعض التعليمات البرمجية ، هذه دالة '' ) | ) .

على الرغم من أن مصطلحي "vehicle" و"sportsCar" كانا متطابقين تمامًا في السابق، إلا أن الأخير يتضمن الآن خانة جديدة تحتوي على دالة غير موجودة في المصطلح الأصلي. ولا يمكن تضمين الدوال إلا في خانات الثوابت.

_ فتحات الإضافة: ( | porsche911 <- نسخة سيارة رياضية | ) . اسم بورشه 911 : "بوبس بورش" .

بدأ الكائن الجديد 'porsche911' تمامًا مثل 'sportsCar'، لكن الرسالة الأخيرة غيّرت قيمة خانة 'name' الخاصة به. لاحظ أن كلا الكائنين لا يزالان يمتلكان نفس الخانات تمامًا على الرغم من اختلاف قيمة إحداهما.

بيئة

إحدى سمات لغة Self أنها تعتمد على نفس نوع نظام الآلة الافتراضية الذي استخدمته أنظمة Smalltalk السابقة. أي أن البرامج ليست كيانات مستقلة كما هو الحال في لغات مثل C ، بل تحتاج إلى بيئة الذاكرة الكاملة لتشغيلها. وهذا يتطلب توزيع التطبيقات في أجزاء من الذاكرة المحفوظة تُعرف باسم اللقطات أو الصور . من عيوب هذا النهج أن الصور قد تكون كبيرة الحجم وغير عملية؛ ومع ذلك، فإن تصحيح أخطاء الصورة غالبًا ما يكون أسهل من تصحيح أخطاء البرامج التقليدية لأن حالة وقت التشغيل أسهل في الفحص والتعديل. (يشبه الفرق بين التطوير القائم على المصدر والتطوير القائم على الصور الفرق بين البرمجة الكائنية الموجهة القائمة على الأصناف والبرمجة الكائنية الموجهة النموذجية).

بالإضافة إلى ذلك، صُممت البيئة لتواكب التغيير السريع والمستمر للكائنات في النظام. إعادة هيكلة تصميم فئة ما أمرٌ في غاية البساطة، إذ يكفي سحب الدوال من الكائنات الأصلية الموجودة إلى كائنات جديدة. يمكن إنجاز مهام بسيطة، مثل اختبار الدوال، عن طريق إنشاء نسخة، ثم سحب الدالة إليها، ثم تعديلها. على عكس الأنظمة التقليدية، يحتوي الكائن المُعدَّل فقط على الكود الجديد، ولا حاجة لإعادة بناء أي شيء لاختباره. إذا نجحت الدالة، يمكن ببساطة سحبها مرة أخرى إلى الكائن الأصلي.

أداء

حققت الآلات الافتراضية الذاتية أداءً يقارب نصف سرعة لغة C المحسّنة في بعض الاختبارات المعيارية. [ 7 ]

وقد تحقق ذلك من خلال تقنيات التجميع في الوقت المناسب التي تم تطويرها وتحسينها في أبحاث سيلف لجعل لغة عالية المستوى تؤدي هذا الأداء الجيد.

جمع القمامة

يستخدم جامع البيانات المهملة في نظام "سيلف" تقنية جمع البيانات المهملة الجيلية التي تفصل الكائنات حسب عمرها. وباستخدام نظام إدارة الذاكرة لتسجيل عمليات الكتابة على الصفحات، يمكن الحفاظ على حاجز للكتابة. توفر هذه التقنية أداءً ممتازًا، مع ذلك، بعد تشغيل النظام لفترة من الزمن، قد تحدث عملية جمع بيانات مهملة كاملة، مما يستغرق وقتًا طويلاً.

التحسينات

يقوم نظام التشغيل بتبسيط هياكل الاستدعاءات بشكل انتقائي. وهذا يُحسّن السرعة بشكل طفيف، ولكنه يسمح بتخزين معلومات الأنواع بشكل مكثف وإنشاء نسخ متعددة من التعليمات البرمجية لأنواع الاستدعاءات المختلفة. وهذا يُغني عن الحاجة إلى إجراء العديد من عمليات البحث عن الدوال، ويسمح بإدراج عبارات التفرع الشرطية والاستدعاءات المُبرمجة مسبقًا، مما يُعطي غالبًا أداءً مشابهًا للغة C دون فقدان العمومية على مستوى اللغة، ولكن على نظام مُدار بالكامل بواسطة جامع البيانات المهملة. [ 8 ]

انظر أيضاً

مراجع

  1. أونغار، ديفيد؛ سميث، راندال ب. (2007). "الذات". وقائع المؤتمر الثالث لجمعية آلات الحوسبة SIGPLAN حول تاريخ لغات البرمجة . doi : 10.1145/1238844.1238853 . ISBN 9781595937667. S2CID 220937663 . 
  2. "Self "Mandarin" 2017.1" . GitHub . 24 مايو 2017. تم الاطلاع عليه في 1 نوفمبر 2024 .
  3. وولكزكو، ماريو (1996). يتضمن ذاتيًا: سمول توك . ورشة عمل حول اللغات القائمة على النماذج الأولية، ECOOP '96. لينز، النمسا.
  4. "تم إصدار النسخة 4.4 من برنامج Self" . 16 يوليو 2010. مؤرشف من الأصل في 5 ديسمبر 2017. تم الاطلاع عليه في 24 مايو 2017 .
  5. "تم إصدار Self Mallard (4.5.0)" . 12 يناير 2014. مؤرشف من الأصل في 6 ديسمبر 2017. تم الاطلاع عليه في 24 مايو 2017 .
  6. مالوني، جون هـ.؛ سميث، راندال ب. (1995). "المباشرة والحيوية في بيئة بناء واجهة المستخدم المورفية" . وقائع الندوة السنوية الثامنة لجمعية ACM حول واجهة المستخدم وتكنولوجيا البرمجيات . الصفحات 21-28 . doi : 10.1145/215585.215636 . ISBN  089791709X. S2CID 14479674 . تم الاسترجاع في 24 مارس 2020 . 
  7. أغيسن، أولي (مارس 1997). "تصميم وتنفيذ بيب، مترجم جافا فوري" . نظرية وممارسة أنظمة الكائنات . 3 (2): 127-155 . doi : 10.1002/(SICI)1096-9942(1997)3:2 < 127::AID-TAPO4 > 3.0.CO ; 2-S . مؤرشف من الأصل في 24 نوفمبر 2006.
  8. تشامبرز، كريج (13 مارس 1992). تصميم وتنفيذ مُترجم SELF، وهو مُترجم مُحسِّن للغات البرمجة الكائنية التوجه (ملف PDF) (أطروحة دكتوراه). جامعة ستانفورد .

للمزيد من القراءة