I here conduct an exploration of programming language extensibility, making an argument for an often overlooked component of conventional language design. Now, this is not a technical detailing of these components, rather, I attempt to provide an overview as I myself have lacked during my time investigating programming languages. Thus, read this as an introduction to the magical world of extensibility. Through a literature review, I identify key extensibility themes - Macros, Modules, Types, and Reflection - highlighting diverse strategies for fostering extensibility. The analysis extends to cross-theme properties such as Parametricism and First-class citizen behaviour, introducing layers of complexity by highlighting the importance of customizability and flexibility in programming language constructs. By outlining these facets of existing programming languages and research, I aim to inspire future language designers to assess and consider the extensibility of their creations critically.
- معرّف الورقة: 2510.13236
- العنوان: Extensibility in Programming Languages: An overview
- المؤلف: Sebastian Mateos Nicolajsen (جامعة كوبنهاغن للتكنولوجيا)
- التصنيف: cs.PL (لغات البرمجة)
- تاريخ النشر: 15 أكتوبر 2025 (نسخة arXiv المسبقة)
- رابط الورقة: https://arxiv.org/abs/2510.13236
تستكشف هذه الورقة قابلية التوسع في لغات البرمجة بعمق، وتقدم حجة لمكونات غالباً ما يتم تجاهلها في تصميم اللغات التقليدية. يحدد المؤلف من خلال مراجعة الأدبيات أربعة مواضيع رئيسية لقابلية التوسع: الماكروهات (Macros)، والوحدات (Modules)، والأنواع (Types)، والانعكاس (Reflection)، مما يبرز استراتيجيات متنوعة لتعزيز قابلية التوسع. يمتد التحليل أيضاً إلى الخصائص عبر المواضيع، مثل البارامترية (Parametricism) والسلوك من الدرجة الأولى (First-class citizen behaviour)، من خلال تسليط الضوء على أهمية التخصيص والمرونة في بنى لغات البرمجة.
- المشكلة الأساسية: قابلية التوسع في لغات البرمجة غالباً ما يتم تجاهلها في تصميم اللغات، وتفتقر إلى دراسة وتلخيص منهجي
- غموض التعريف: يفتقر مفهوم قابلية التوسع إلى تعريفات واضحة في الأدبيات، وتفتقر إلى إطار تصنيف وفهم واضح
- الاحتياجات العملية: غالباً ما تكون لغات البرمجة الموجودة محدودة عند مواجهة احتياجات جديدة بسبب طبيعتها غير القابلة للتغيير
- قيود اللغة: يعتقد الرأي التقليدي أن لغات البرمجة هي قطع أثرية غير قابلة للتغيير، لكن هذا يحد من قدرة اللغة على التكيف مع الاحتياجات الجديدة
- كفاءة التطوير: قابلية التوسع هي الطريقة الوحيدة لتحسين إنتاجية المطورين وحل قيود اللغة
- التطور المستقبلي: يعتقد علماء مثل Guy Steele أن التصميم لنمو اللغة (أي قابلية التوسع) يجب أن يكون عنصراً أساسياً في لغات المستقبل
- تشتت البحث: على الرغم من أن مفاهيم مثل الماكروهات والانعكاس والدوال والوحدات تتم دراستها على نطاق واسع، إلا أن التركيز الأساسي ينصب على إعادة الاستخدام والمعيارية والتجريد، وليس على قابلية التوسع نفسها
- نقص المنظور الشامل: يركز العمل الموجود بشكل أساسي على تحسين قابلية التوسع أو تفاصيل التنفيذ، مع نقص الدراسة المنهجية لقابلية التوسع نفسها
- نقص النظرية: تفتقر قابلية التوسع إلى تعريفات واضحة وأساس نظري مقارنة بمفاهيم مثل التجريد
- التصنيف المنهجي: تحديد أربعة مواضيع أساسية لقابلية التوسع من خلال مراجعة الأدبيات (الماكروهات، الوحدات، الأنواع، الانعكاس)
- الخصائص عبر المواضيع: اكتشاف وتحليل خاصيتين مهمتين عبر المواضيع (البارامترية والسلوك من الدرجة الأولى)
- إطار نظري: توفير إطار منظم لفهم قابلية التوسع في لغات البرمجة
- التوجيه العملي: توفير إرشادات لمصممي اللغات المستقبليين لتقييم والنظر في قابلية التوسع في اللغة
- تحديد الفجوات البحثية: الإشارة إلى مفاهيم أقل استكشافاً مثل التمهيد (Bootstrapping)، وخطافات المترجم (Compiler hooks)، والآلات الافتراضية
تستخدم الورقة منهج مراجعة الأدبيات المنهجية، متبعة العملية المحددة من قبل Kitchenham وآخرين، مع دمج طرق ترميز البيانات من النظرية المجذرة (Grounded Theory).
- مصادر البيانات: 10 مؤتمرات ودوريات متعلقة بهندسة اللغات
- المؤتمرات تشمل: HOPL, POPL, PLDI, CGO, DLS, GPCE, Onward, SLE, TOPLAS, PACMPL
- الحجم الأولي: 7090 ورقة
- استراتيجية الاستبعاد: استبعاد المؤتمرات التي تركز على نماذج لغات محددة
- فحص الكلمات الرئيسية: استخراج 65 كلمة رئيسية من 19 ورقة ذات صلة، مما أنتج 19 كلمة رئيسية إضافية
- فحص العنوان: مقارنة الكلمات الرئيسية مع عناوين الأوراق، فحص إلى 648 ورقة
- فحص الملخص: مقارنة الكلمات الرئيسية مع الملخصات والخلاصات، فحص إضافي إلى 223 ورقة
- تقييم الجودة: تقسيم بناءً على ما إذا كانت تصف أو تناقش قابلية التوسع، إلى ذات صلة كبيرة (69 ورقة) وذات صلة جزئية (64 ورقة)
- طريقة الاستخراج: استخراج جميع الأوصاف النوعية ومناقشات قابلية التوسع
- طريقة التوليف: استعارة طرق ترميز البيانات من النظرية المجذرة، باستخدام منهج استقرائي لتطوير نظام التصنيف
- التحسين التكراري: تحسين وإعادة تقييم التصنيف بشكل مستمر عند اكتشاف معلومات جديدة
- الحجم الإجمالي: 7090 ورقة أولية
- الفترة الزمنية: البيانات المجمعة في خريف 2022
- التحليل النهائي: 133 ورقة ذات صلة (69 ورقة عالية الصلة + 64 ورقة جزئية الصلة)
الأسئلة الرئيسية:
- هل تناقش المقالة قابلية التوسع؟ (بشكل مباشر أو غير مباشر)
- هل تناقش المقالة مفاهيم قابلية التوسع؟
الأسئلة الثانوية:
- هل تناقش المقالة مفهوم قابلية التوسع المحدد؟
- هل تناقش المقالة لغة محددة وقابلية التوسع؟
استخدام منهج استقرائي لتحديد المواضيع، من خلال المقارنة المستمرة والتصنيف المكرر، مما أسفر عن إطار يتضمن أربعة مواضيع رئيسية وخاصيتين عبر المواضيع.
الدافع: تمكن الماكروهات مستخدمي اللغة من إنشاء آليات تحكم جديدة بأشكال نحوية تقريباً عشوائية، مما يزيد من قابلية التوسع.
تصنيف الأنواع:
- الماكروهات اللفظية: تحويلات قائمة على السلاسل النصية، غير مرتبطة بالنحو لكن لا تضمن السلامة النحوية
- الماكروهات النحوية: تعمل على شجرة بناء الجملة المجردة (AST)، تضمن السلامة النحوية
- الماكروهات الدلالية: توفر تحليل دلالي، مثل فحص النوع
التطبيقات التمثيلية:
- Racket: نظام نحو معياري
- CPP: محرك الماكروهات اللفظي للغة C
- LISP: نظام الماكروهات النحوية
- C++: القوالب والمفاهيم (وظائف شبيهة بالماكروهات)
الدافع: تُستخدم الوحدات لهيكلة الكود، مما يسمح للمستخدمين بتجميع الكود لتوفير لغات خاصة بالمجال أو أطر عمل كحزم.
نظام الأنواع:
- الأنواع الموجودة: تسمح بوحدات من الدرجة الأولى لكن تخفي تفاصيل التنفيذ
- الأنواع المعتمدة: شفافة تماماً
- الأنواع الصريحة: توفر حلاً وسطاً بين الاثنين
الاعتبارات التصميمية:
- الهيكل الهرمي والتبعيات
- معالجة الوحدات المتداخلة
- حل التبعيات الدائرية
الدافع: يسمح نظام النوع للمستخدمين بتقديم ضمانات في اللغة، وعند دمجه مع خصائص مثل تعدد الأشكال والبرمجة العامة، يوفر قابلية التنبؤ والأمان للمطورين.
تصنيف تعدد الأشكال:
- تعدد الأشكال المخصص (Ad hoc): النوع يعتمد على المعاملات
- تعدد الأشكال العام (Universal):
- تعدد الأشكال البارامتري: يسمح بأي نوع كمعامل
- تعدد الأشكال الفرعي: يسمح باستبدال النوع
البرمجة العامة:
- طرق التنفيذ المختلفة: دعم الآلة الافتراضية (C#) مقابل محو النوع (Java)
- المطابقة الهيكلية: ML, C++, OCaml وغيرها
الدافع: يمكّن الانعكاس المستخدمين من تعديل بنى البرمجة الأخرى برمجياً، مما يزيد من قابلية التعديل والمرونة للمفاهيم التي كانت غير قابلة للتعديل في الأصل.
نطاق القدرات:
- فحص البرنامج وتعديله
- استنساخ وتوسيع الفئات
- توفير واجهة واضحة للآلة الافتراضية
التحديات:
- تكاليف الأداء
- كسر التغليف
- مشاكل الاستقرار الفوقي
الدافع: تزيد البارامترية من قدرة التخصيص للبنى، مما يحقق المزيد من إعادة الاستخدام والتجريد.
مجالات التطبيق:
- البارامترية الوحدوية: مثل بناء functor في Standard ML و OCaml
- البارامترية النوعية: يتم تنفيذها من خلال تعدد الأشكال، مثل concepts في C++ و type classes في Haskell
الدافع: تمكّن خاصية المواطن من الدرجة الأولى المستخدمين من استخدام البنى مثل استخدام القيم الأخرى، مما يسمح بتعديل ديناميكي لبنى البرمجة.
طرق التنفيذ:
- الوحدات من الدرجة الأولى: يمكن التعامل معها مثل هياكل البيانات
- الأنواع من الدرجة الأولى: آليات مثل مولدات النوع
- التمهيد (Bootstrapping): تمهيد اللغة، القضاء على فكرة عدم قابلية اللغة للتعديل
- خطافات المترجم (Compiler hooks): السماح للمستخدمين بحقن خطافات في المترجم
- الآلات الافتراضية (Virtual machines): توفير ميزات غنية والقابلية للنقل لتجارب اللغة
- Daniel Zingaro: تطبيق مفاهيم paraphrase و orthophrase و metaphrase من Standish على مجموعات اللغات
- Sebastian Erdweg و Felix Rieger: اقتراح إطار Sugar* للاستدلال على قابلية التوسع في اللغة
- Philip Wadler: طرح مشكلة التعبيرية في قائمة بريد Java، المستخدمة لقياس قابلية التوسع في لغات البرمجة
- Robert Tennent: "مبادئ لغات البرمجة"، يصف مكونات اللغة المختلفة
- Peter Sestoft: "مفاهيم لغات البرمجة"، يغطي مواضيع مماثلة وقرارات التصميم
- أهمية قابلية التوسع: قابلية التوسع هي عامل حاسم للتغلب على قيود اللغة وتعزيز التطوير الموجه نحو المجتمع
- إطار منهجي: توفر أربعة مواضيع (الماكروهات، الوحدات، الأنواع، الانعكاس) وخاصيتان عبر المواضيع إطاراً منظماً لفهم قابلية التوسع
- الاعتبار المتوازن: تتطلب قابلية التوسع التوازن مع خصائص الجودة الأخرى مثل الأداء والأمان والقابلية للتنبؤ
- تأثير الأداء: تجعل الملخصات والقابلية للتوسع في Java و C# أداؤها أقل من لغة C
- مخاطر الأمان: قد تقدم الامتدادات التي يطورها المستخدمون ثغرات أمنية
- زيادة التعقيد: قد تؤدي إلى تضخم اللغة والحلول الخاصة بالسياق
- تسرب التجريد: معظم التجريدات في اللغات تسرب تفاصيل التنفيذ
- يجب أن تكون قابلية التوسع جزءاً متكاملاً من تصميم اللغة الشامل
- يجب أن يأخذ مهندسو اللغات في الاعتبار التحديات المؤكدة
- يجب إيجاد توازن بين قابلية التوسع والخصائص الأخرى للجودة
- الاستكشاف المتعمق: تتطلب مفاهيم مثل التمهيد وخطافات المترجم والآلات الافتراضية مزيداً من البحث
- تطوير النظرية: الحاجة إلى تعريفات أوضح وأساس نظري لقابلية التوسع
- التطبيق العملي: توفير إرشادات تصميم قابلية التوسع الأكثر تحديداً لمصممي اللغات
- قوة منهجية عالية: أول مراجعة أدبيات منهجية وتصنيف لقابلية التوسع في لغات البرمجة
- وضوح الإطار: توفير إطار تحليل واضح يتكون من أربعة مواضيع وخاصيتين عبر المواضيع
- قيمة عملية عالية: توفير مرجع وإرشادات قيمة لمصممي اللغات
- صرامة المنهج: استخدام طريقة مراجعة أدبيات منهجية معيارية، مع عملية شفافة وقابلة للتتبع
- نطاق تغطية واسع: يغطي لغات وتقنيات متعددة من التاريخ إلى العصر الحديث
- غموض التعريف: على الرغم من الإشارة إلى غموض تعريف قابلية التوسع، فإن الورقة أيضاً لم توفر تعريفاً أكثر دقة
- نقص التجريبية: افتقار إلى البحث التجريبي الكمي، يعتمد بشكل أساسي على التحليل النوعي
- معايير التقييم: نقص المعايير الموضوعية لتقييم فعالية آليات قابلية التوسع المختلفة
- قيود النطاق: قد يؤدي استبعاد بعض المؤتمرات المهمة إلى تفويت أبحاث ذات صلة
- انحياز الباحث: قد يؤدي التحليل من قبل باحث واحد إلى إدخال انحياز ذاتي
- المساهمة الأكاديمية: توفير منظور بحثي جديد وإطار لمجال أبحاث لغات البرمجة
- القيمة العملية: ذات أهمية مرجعية كبيرة لمصممي اللغات ومطوري الأدوات
- القيمة الإلهامية: قد تحفز المزيد من الأبحاث المتعمقة حول قابلية التوسع في اللغات
- القيمة التعليمية: يمكن استخدامها كمرجع مهم لدورات لغات البرمجة
- تصميم اللغات: تصميم لغات برمجة جديدة وتحسين اللغات الموجودة
- تطوير الأدوات: تصميم آليات التوسع لبيئات التطوير المتكاملة والمترجمات وغيرها من أدوات التطوير
- البحث الأكاديمي: مزيد من البحث في نظرية وممارسة لغات البرمجة
- التدريب والتعليم: تطوير مواد دورات وتدريب لغات البرمجة
تتضمن الورقة 135 مرجعاً، يغطي تاريخ لغات البرمجة ومبادئ التصميم والتطبيقات المحددة وجوانب أخرى متعددة، مما يوفر أساساً أدبياً شاملاً لأبحاث قابلية التوسع. تشمل المراجع الرئيسية:
- Standish (1975): عمل مبكر في تصميم لغات البرمجة القابلة للتوسع
- Steele (1998): وجهات نظر مهمة حول نمو اللغة
- أوراق HOPL المختلفة: توفير مواد قيمة حول تاريخ اللغة وأفكار التصميم
التقييم الشامل: هذه ورقة مراجعة عالية الجودة توفر إطاراً نظرياً مهماً وإرشادات عملية لأبحاث قابلية التوسع في لغات البرمجة. على الرغم من وجود بعض القيود، فإن منهجها المنهجي وإطار التحليل الواضح يجعلها مساهمة مهمة في هذا المجال. لها قيمة مرجعية مهمة لمصممي اللغات والباحثين والطلاب.