برمجة قابلة للتوسيع
في علوم الحاسوب ، تُعدّ البرمجة القابلة للتوسيع أسلوبًا برمجيًا يركز على آليات توسيع لغة البرمجة والمترجم ونظام التشغيل (البيئة). كانت لغات البرمجة القابلة للتوسيع، التي تدعم هذا الأسلوب، مجالًا نشطًا في ستينيات القرن الماضي، إلا أن هذا التوجه تراجع في سبعينيات القرن نفسه. [ 1 ] وقد عادت البرمجة القابلة للتوسيع لتثير اهتمامًا متجددًا في القرن الحادي والعشرين. [ 2 ]
حركة تاريخية
تُعتبر ورقة إم. دوغلاس ماكلروي المنشورة عام 1960 حول وحدات الماكرو للغات البرمجة عالية المستوى أول ورقة بحثية تُنسب عادةً [ 1 ] [ 3 ] إلى حركة لغات البرمجة القابلة للتوسيع . [ 4 ] كما ورد وصف مبكر آخر لمبدأ قابلية التوسيع في ورقة بروكر وموريس المنشورة عام 1960 حول المترجم-المترجم . [ 5 ] وقد بلغت الحركة ذروتها في ندوتين أكاديميتين عُقدتا عامي 1969 و1971. [ 6 ] [ 7 ] وبحلول عام 1975، كانت مقالة توماس أ. ستانديش [ 1 ] الاستقصائية حول الحركة بمثابة تحليل لما بعد انتهائها. وكانت لغة فورث استثناءً، لكنها لم تحظَ بالاهتمام الكافي.
طبيعة الحركة التاريخية
كما هو متعارف عليه، تتألف اللغة القابلة للتوسيع من لغة أساسية توفر إمكانيات الحوسبة الأولية، ولغة وصفية قادرة على تعديل اللغة الأساسية. ويتكون البرنامج من تعديلات اللغة الوصفية وشفرة مكتوبة باللغة الأساسية المعدلة.
كانت أبرز تقنيات توسيع اللغة المستخدمة في هذه الحركة هي التعريف الكلي. كما ارتبط تعديل القواعد ارتباطًا وثيقًا بهذه الحركة، مما أدى في النهاية إلى تطوير صيغ قواعد نحوية تكيفية . وظل مجتمع لغة ليسب منفصلاً عن مجتمع اللغات القابلة للتوسيع، على ما يبدو، كما لاحظ أحد الباحثين،
يمكن اعتبار أي لغة برمجة تكون فيها البرامج والبيانات قابلة للتبادل بشكل أساسي لغة قابلة للتوسيع. ... ويتضح ذلك جليًا من حقيقة أن لغة ليسب تُستخدم كلغة قابلة للتوسيع منذ سنوات. [ 8 ]
في مؤتمر عام 1969، تم تقديم لغة سيمولا كلغة قابلة للتوسيع.
وصف ستانديش ثلاثة أنواع من امتداد اللغة، والتي أطلق عليها اسم إعادة الصياغة ، والصياغة الصحيحة ، والصياغة المغايرة (وإلا فإن إعادة الصياغة والصياغة المغايرة مصطلحات ترجمة ).
- يُعرّف بارافريز خاصيةً ما من خلال توضيح كيفية استبدالها بشيءٍ سبق تعريفه (أو سيتم تعريفه). ومن الأمثلة على ذلك، يذكر تعريفات الماكرو، وتعريفات الإجراءات العادية، والامتدادات النحوية، وتعريفات البيانات، وتعريفات المعاملات، وامتدادات بنية التحكم.
- تُضيف الامتدادات ميزات إلى لغة برمجة لم يكن من الممكن تحقيقها باستخدام اللغة الأساسية، مثل إضافة نظام إدخال/إخراج إلى لغة أساسية كانت تفتقر سابقًا إلى أدوات الإدخال/الإخراج. يجب فهم الامتدادات على أنها امتدادات للغة أساسية معينة، حيث يجب تعريف الميزة غير المُعرَّفة في اللغة الأساسية بلغة أخرى. وهذا يُطابق المفهوم الحديث للملحقات البرمجية .
- تقوم Metaphrase بتعديل قواعد التفسير المستخدمة للتعبيرات الموجودة مسبقًا. وهذا يتوافق مع المفهوم الحديث للبرمجة الانعكاسية (الانعكاس).
موت الحركة التاريخية
عزا ستانديش فشل حركة التوسعة إلى صعوبة برمجة التوسعات المتتالية. قد يبني المبرمج غلافًا أوليًا من وحدات الماكرو حول لغة أساسية. ثم، إذا بُني غلاف ثانٍ من وحدات الماكرو حول ذلك الغلاف، فيجب على أي مبرمج لاحق أن يكون على دراية تامة بكل من اللغة الأساسية والغلاف الأول. ويتطلب الغلاف الثالث الإلمام باللغة الأساسية وبالغلافين الأول والثاني، وهكذا. إن حماية المبرمج من تفاصيل المستوى الأدنى هي غاية حركة التجريد التي حلت محل حركة التوسعة.
على الرغم من تقديم لغة سيمولا سابقًا على أنها قابلة للتوسيع، إلا أن دراسة ستانديش عام 1975 لم تتضمن عمليًا التقنيات الأحدث القائمة على التجريد (مع أنه استخدم تعريفًا عامًا جدًا للتوسيع كان من الممكن تقنيًا أن يشملها). ولم يأتِ تاريخ تجريد البرمجة الصادر عام 1978، منذ اختراع الحاسوب وحتى ذلك الحين، على ذكر وحدات الماكرو، ولم يُشر إلى ظهور حركة اللغات القابلة للتوسيع. [ 9 ] وقد أُدرجت وحدات الماكرو مبدئيًا في حركة التجريد بحلول أواخر ثمانينيات القرن العشرين (ربما بسبب ظهور وحدات الماكرو المُحسّنة )، وذلك بمنحها اسمًا مستعارًا هو التجريدات التركيبية . [ 10 ]
الحركة الحديثة
بالمعنى الحديث، فإن النظام الذي يدعم البرمجة القابلة للتوسيع سيوفر جميع الميزات الموضحة أدناه .
بناء جملة قابل للتوسيع
هذا يعني ببساطة أن لغة (لغات) المصدر المراد ترجمتها يجب ألا تكون مغلقة أو ثابتة أو جامدة. يجب أن يكون من الممكن إضافة كلمات مفتاحية ومفاهيم وبنى جديدة إليها. تشمل اللغات التي تسمح بإضافة بنيات ذات صيغة يحددها المستخدم: Rocq ، و Racket ، و Camlp4 ، و OpenC++ ، وSeed7 ، و Red ، و Rebol ، و Felix . مع أنه من المقبول أن تكون بعض خصائص اللغة الأساسية والجوهرية غير قابلة للتغيير، إلا أنه يجب ألا يعتمد النظام كليًا على هذه الخصائص، بل يجب أن يكون من الممكن إضافة خصائص جديدة.
مترجم قابل للتوسيع
في البرمجة القابلة للتوسيع، لا يُعدّ المُصرّف برنامجًا متجانسًا يُحوّل مُدخلات الشفرة المصدرية إلى مُخرجات تنفيذية ثنائية. بل يجب أن يكون المُصرّف نفسه قابلاً للتوسيع لدرجة أن يكون في الواقع مجموعة من الإضافات التي تُساعد في ترجمة مُدخلات لغة المصدر إلى أي شيء . على سبيل المثال، يدعم المُصرّف القابل للتوسيع توليد الشفرة الكائنية، وتوثيق الشفرة، وإعادة تنسيق الشفرة المصدرية، أو أي مُخرجات أخرى مطلوبة. يجب أن تسمح بنية المُصرّف لمستخدميه بالوصول إلى تفاصيل عملية التجميع، وتوفير مهام معالجة بديلة في كل خطوة منطقية من خطواتها.
بالنسبة لمهمة ترجمة الشفرة المصدرية إلى شيء يمكن تنفيذه على جهاز كمبيوتر، يجب أن يقوم المترجم القابل للتوسيع بما يلي:
- استخدم بنية المكونات الإضافية أو المكونات لكل جانب تقريبًا من جوانب وظيفتها
- حدد اللغة أو أحد أشكالها التي يتم تجميعها، وحدد موقع المكون الإضافي المناسب للتعرف على تلك اللغة والتحقق من صحتها.
- استخدام مواصفات اللغة الرسمية للتحقق من صحة لغات المصدر المختلفة من الناحية النحوية والهيكلية
- المساعدة في التحقق الدلالي من لغات المصدر المختلفة عن طريق استدعاء مكون إضافي مناسب للتحقق.
- يسمح للمستخدمين بالاختيار من بين أنواع مختلفة من مولدات التعليمات البرمجية بحيث يمكن استهداف الملف التنفيذي الناتج لمعالجات مختلفة أو أنظمة تشغيل أو أجهزة افتراضية أو بيئة تنفيذ أخرى.
- توفير تسهيلات لتوليد الأخطاء وتوسيعها
- السماح بأنواع جديدة من العقد في شجرة بناء الجملة المجردة (AST)،
- السماح بقيم جديدة في عقد شجرة بناء الجملة المجردة (AST)،
- السماح بأنواع جديدة من الروابط بين العقد،
- دعم تحويل شجرة بناء الجملة المجردة المدخلة، أو أجزاء منها، من خلال "تمرير" خارجي.
- دعم ترجمة شجرة بناء الجملة المجردة المدخلة، أو أجزاء منها، إلى شكل آخر عن طريق "تمرير" خارجي.
- المساعدة في تدفق المعلومات بين العمليات الداخلية والخارجية حيث تقوم كلتاهما بتحويل وترجمة شجرة بناء الجملة المجردة (AST) إلى أشجار بناء جملة مجردة جديدة أو تمثيلات أخرى.
وقت تشغيل قابل للتوسيع
أثناء التشغيل، يجب أن تسمح أنظمة البرمجة القابلة للتوسيع للغات بتوسيع نطاق العمليات المسموح بها. على سبيل المثال، إذا كان النظام يستخدم مترجمًا لرمز البايت ، فيجب أن يسمح بتعريف قيم جديدة لرمز البايت. وكما هو الحال مع بناء الجملة القابل للتوسيع، من المقبول وجود مجموعة (صغيرة نسبيًا) من العمليات الأساسية أو الجوهرية غير القابلة للتغيير. ومع ذلك، يجب أن يكون من الممكن إعادة تعريف هذه العمليات الجوهرية أو توسيعها لدعم سلوكيات جديدة أو إضافية.
المحتوى منفصل عن النموذج
ينبغي لأنظمة البرمجة القابلة للتوسيع أن تعتبر البرامج بياناتٍ قابلةً للمعالجة. ويجب أن تخلو هذه البرامج تمامًا من أي معلومات تنسيق. وينبغي أن يكون عرض البرامج وتحريرها للمستخدمين وظيفة ترجمة، يدعمها المترجم القابل للتوسيع، حيث تُترجم بيانات البرنامج إلى صيغٍ أكثر ملاءمةً للعرض أو التحرير. وبطبيعة الحال، ينبغي أن تكون هذه الترجمة ثنائية الاتجاه. وهذا أمرٌ بالغ الأهمية لأنه يجب أن يكون من الممكن معالجة البرامج القابلة للتوسيع بسهولةٍ وبطرقٍ متنوعة . ومن غير المقبول أن تقتصر استخدامات مدخلات لغة المصدر على التحرير والعرض والترجمة إلى لغة الآلة. وتُسهّل المعالجة العشوائية للبرامج بفصل مدخلات المصدر عن مواصفات كيفية معالجتها (تنسيقها، وتخزينها، وعرضها، وتحريرها، وما إلى ذلك).
دعم تصحيح أخطاء لغة المصدر
يجب أن تدعم أنظمة البرمجة القابلة للتوسيع تصحيح أخطاء البرامج باستخدام بنيات لغة المصدر الأصلية، بغض النظر عن الإضافات أو التحويلات التي خضع لها البرنامج ليصبح قابلاً للتنفيذ. والأهم من ذلك، لا يمكن افتراض أن الطريقة الوحيدة لعرض بيانات وقت التشغيل هي في هياكل أو مصفوفات . يجب أن يسمح مصحح الأخطاء، أو بالأحرى "مدقق البرنامج"، بعرض بيانات وقت التشغيل بأشكال مناسبة للغة المصدر. على سبيل المثال، إذا كانت اللغة تدعم بنية بيانات لعملية تجارية أو سير عمل ، فيجب أن يكون بإمكان مصحح الأخطاء عرض بنية البيانات هذه كمخطط هيكل السمكة أو أي شكل آخر توفره إضافة برمجية.
أمثلة
انظر أيضاً
مراجع
- 1 2 3 ستانديش، توماس أ.، " قابلية التوسع في تصميم لغة البرمجة "، إشعارات SIGPLAN 10 رقم 7 (يوليو 1975)، ص 18-21.
- ↑ غريغوري ف. ويلسون، " البرمجة القابلة للتوسيع للقرن الحادي والعشرين "، ACM Queue 2 رقم 9 (ديسمبر/يناير 2004-2005).
- ↑ ساميت، جان إي، لغات البرمجة: التاريخ والأساسيات ، برنتيس هول، 1969، القسم III.7.2
- ↑ McIlroy, MD, " Macro Instruction Extensions of Compiler Languages ", Communications of the ACM 3 no. 4 (April 1960), pp. 214–220.
- ↑ بروكر، آر إيه وموريس، دي، " برنامج ترجمة عام للغات بنية العبارة "، مجلة ACM 9 العدد 1 (يناير 1962)، الصفحات 1-10. تم استلام الورقة في عام 1960.
- ↑ كريستنسن، سي. وشاو، سي جيه، محرران، وقائع ندوة اللغات القابلة للتوسيع، إشعارات SIGPLAN 4 رقم 8 (أغسطس 1969).
- ↑ شومان، إس إيه، محرر، وقائع الندوة الدولية حول اللغات القابلة للتوسيع، إشعارات SIGPLAN 6 رقم 12 (ديسمبر 1971).
- ↑ هاريسون، إم سي، في "حلقة نقاش حول مفهوم قابلية التمدد"، الصفحات 53-54 من ندوة عام 1969.
- ↑ Guarino, LR, " تطور التجريد في لغات البرمجة "، CMU-CS-78-120 ، قسم علوم الحاسوب، جامعة كارنيجي ميلون، بنسلفانيا، 22 مايو 1978.
- ↑ غابرييل، ريتشارد ب.، محرر، " تقرير مسودة حول متطلبات نظام النماذج الأولية المشترك "، إشعارات SIGPLAN 24 رقم 3 (مارس 1989)، ص 93 وما بعدها.
- ↑ "امتدادات بناء الجملة ونطاقات الترميز - وثائق Coq 8.17.0" . coq.inria.fr . تم الاطلاع عليه بتاريخ 25-05-2023 .
- ↑ زينجارو، دانيال، " اللغات الحديثة القابلة للتوسيع "، تقرير SQRL 47 جامعة ماكماستر (أكتوبر 2007)، الصفحة 16.
روابط خارجية
عام
- مقال غريغ ويلسون في مجلة ACM Queue
- نقاش على موقع سلاش دوت
- اللغات الحديثة القابلة للتوسيع، مؤرشفة بتاريخ ١٢ يونيو ٢٠١١ على موقع Wayback Machine - ورقة بحثية من تأليف دانيال زينجارو
أدوات
- ميتال – تطبيق محرك مترجم برمجي قابل للتوسيع
- XPS – نظام برمجة قابل للتوسيع (قيد التطوير)
- نظام البرمجة الوصفية MPS – JetBrains
لغات ذات بنية قابلة للتوسيع
- OpenZz
- إكس تي سي - سي القابل للتمدد
- نص إنجليزي
- نيميرل ماكروس
- وحدات الماكرو النحوية Boo
- مُجمِّع تنسيق ستانفورد الوسيط
- Seed7 – لغة البرمجة القابلة للتوسيع
- كاتاحدين - لغة ذات بنية نحوية ودلالات قابلة للتغيير أثناء التشغيل
- π – لغة ذات بنية نحوية قابلة للتوسيع، تم تنفيذها باستخدام محلل إيرلي
- لغات برمجة ذات بنية قابلة للتوسيع
- نماذج البرمجة
