البرمجة الفوقية

البرمجة الفوقية هي تقنية برمجة حاسوبية تتمتع فيها برامج الحاسوب بالقدرة على التعامل مع برامج أخرى باعتبارها بيانات خاصة بها . وهذا يعني أنه يمكن تصميم برنامج لقراءة أو إنشاء أو تحليل أو تحويل برامج أخرى، وحتى تعديل نفسه، أثناء التشغيل. [1] [2] في بعض الحالات، يسمح هذا للمبرمجين بتقليل عدد أسطر التعليمات البرمجية للتعبير عن حل، مما يقلل بدوره من وقت التطوير. [3] كما يسمح للبرامج بمزيد من المرونة للتعامل بكفاءة مع المواقف الجديدة دون إعادة التجميع.

يمكن استخدام البرمجة الفوقية لنقل العمليات الحسابية من وقت التشغيل إلى وقت التجميع ، لتوليد التعليمات البرمجية باستخدام العمليات الحسابية في وقت التجميع ، وتمكين التعليمات البرمجية ذاتية التعديل . تسمح قدرة لغة البرمجة على أن تكون لغة ميتا خاصة بها بالبرمجة الانعكاسية ، ويطلق عليها الانعكاس . [4] الانعكاس هو ميزة لغوية قيمة لتسهيل البرمجة الفوقية.

كانت البرمجة الوصفية شائعة في سبعينيات وثمانينيات القرن العشرين باستخدام لغات معالجة القوائم مثل Lisp . وقد اكتسبت أجهزة آلة Lisp بعض الاهتمام في ثمانينيات القرن العشرين، ومكّنت التطبيقات من معالجة التعليمات البرمجية. وكثيراً ما كانت تستخدم في تطبيقات الذكاء الاصطناعي .

النهج

تمكن البرمجة الوصفية المطورين من كتابة البرامج وتطوير التعليمات البرمجية التي تندرج تحت نموذج البرمجة العامة . كما أن وجود لغة البرمجة نفسها كنوع بيانات من الدرجة الأولى (كما في Lisp أو Prolog أو SNOBOL أو Rebol ) مفيد جدًا أيضًا؛ وهذا ما يُعرف باسم التماثل الرمزي . تستدعي البرمجة العامة مرفق البرمجة الوصفية داخل لغة ما من خلال السماح للمرء بكتابة التعليمات البرمجية دون القلق بشأن تحديد أنواع البيانات حيث يمكن توفيرها كمعلمات عند استخدامها.

تعمل البرمجة الفوقية عادةً بإحدى ثلاث طرق. [5]

  1. النهج الأول هو عرض الأجزاء الداخلية لنظام التشغيل (المحرك) على كود البرمجة من خلال واجهات برمجة التطبيقات (APIs) مثل تلك الخاصة بمصدر لغة الوسيطة المشتركة (CIL) في .NET .
  2. النهج الثاني هو التنفيذ الديناميكي للتعابير التي تحتوي على أوامر برمجة، والتي غالبًا ما تكون مكونة من سلاسل، ولكن يمكن أن تكون أيضًا من طرق أخرى تستخدم الوسائط أو السياق، مثل JavaScript . [6] وبالتالي، "يمكن للبرامج كتابة برامج". على الرغم من أنه يمكن استخدام كلا النهجين في نفس اللغة، إلا أن معظم اللغات تميل إلى الميل نحو أحدهما أو الآخر.
  3. النهج الثالث هو الخروج عن نطاق اللغة بالكامل. أنظمة تحويل البرامج للأغراض العامة مثل المترجمات ، التي تقبل أوصاف اللغة وتنفذ تحويلات عشوائية على تلك اللغات، هي تنفيذات مباشرة للبرمجة الوصفية العامة. وهذا يسمح بتطبيق البرمجة الوصفية على أي لغة مستهدفة تقريبًا بغض النظر عما إذا كانت تلك اللغة المستهدفة لديها أي قدرات برمجة وصفية خاصة بها. يمكن للمرء أن يرى هذا في العمل مع Scheme وكيف يسمح بمعالجة بعض القيود التي تواجهها C باستخدام التراكيب التي تعد جزءًا من لغة Scheme لتوسيع C. [7]

ربما تكون لغة Lisp هي اللغة الأساسية التي تتمتع بمرافق البرمجة الفوقية، وذلك بسبب أسبقيتها التاريخية وبسبب بساطة وقوة برمجتها الفوقية. في البرمجة الفوقية بلغة Lisp، يقدم عامل الاقتباس (عادةً الفاصلة) كودًا يتم تقييمه في وقت تعريف البرنامج وليس وقت التشغيل. وبالتالي فإن لغة البرمجة الفوقية متطابقة مع لغة البرمجة المضيفة، ويمكن إعادة استخدام روتينات Lisp الموجودة مباشرةً للبرمجة الفوقية إذا رغبت في ذلك. تم تنفيذ هذا النهج في لغات أخرى من خلال دمج مفسّر في البرنامج، والذي يعمل مباشرةً مع بيانات البرنامج. هناك تنفيذات من هذا النوع لبعض اللغات الشائعة عالية المستوى، مثل Pascal Script for Object Pascal في RemObjects .

الاستخدامات

توليد الكود

مثال بسيط على البرنامج النصي الوصفي هو برنامج POSIX Shell النصي هذا ، وهو مثال على البرمجة التوليدية :

#!/bin/sh 
# metaprogram 
echo '#!/bin/sh' > program
 for i in $( seq 992 ) do echo "echo $i " >> program
 done 
chmod +x program
       

         

يقوم هذا البرنامج النصي (أو البرنامج) بإنشاء برنامج جديد مكون من 993 سطرًا يطبع الأرقام من 1 إلى 992. هذا مجرد توضيح لكيفية استخدام التعليمات البرمجية لكتابة المزيد من التعليمات البرمجية؛ إنها ليست الطريقة الأكثر كفاءة لطباعة قائمة من الأرقام. ومع ذلك، يمكن للمبرمج كتابة وتنفيذ هذا البرنامج النصي في أقل من دقيقة، وسيقوم بإنشاء أكثر من 1000 سطر من التعليمات البرمجية في هذا القدر من الوقت.

الكوين هو نوع خاص من البرامج الوصفية التي تنتج كود المصدر الخاص بها كمخرج لها. الكوينات عادة ما تكون ذات أهمية ترفيهية أو نظرية فقط .

لا تتضمن كل عمليات البرمجة الوصفية البرمجة التوليدية. إذا كانت البرامج قابلة للتعديل في وقت التشغيل، أو إذا كان التجميع التدريجي متاحًا (كما هو الحال في C# و Forth و Frink و Groovy و JavaScript و Lisp و Elixir و Lua و Nim و Perl و PHP و Python و Rebol و Ruby و Rust و R و SAS و Smalltalk و Tcl ) ، فيمكن استخدام التقنيات لإجراء البرمجة الوصفية دون إنشاء كود المصدر.

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

أدوات الترميز

أحد استخدامات البرمجة الوصفية هو تجهيز البرامج من أجل إجراء تحليل ديناميكي للبرنامج .

التحديات

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

الاستخدامات في لغات البرمجة

الأنظمة الكلية

مجمعات الماكرو

كان لدى IBM /360 ومشتقاته مرافق تجميع ماكرو قوية كانت تُستخدم غالبًا لإنشاء برامج كاملة بلغة التجميع [ بحاجة لمصدر ] أو أقسام من البرامج (لأنظمة تشغيل مختلفة على سبيل المثال). كانت وحدات الماكرو المزودة بنظام معالجة المعاملات CICS تحتوي على وحدات ماكرو تجميعية تولد عبارات COBOL كخطوة معالجة مسبقة.

تدعم المجمعات الأخرى، مثل MASM ، وحدات الماكرو أيضًا.

الفئات الفرعية

يتم توفير الفئات الوصفية بواسطة لغات البرمجة التالية:

برمجة القالب

البرمجة المرحلية

  • ميتامال
  • ميتاوكامل
  • سكالا بشكل أصلي أو باستخدام إطار عمل التدريج المعياري خفيف الوزن [13] [14]
  • تيرا

أنواع تابعة

يسمح استخدام الأنواع التابعة بإثبات أن الكود الناتج غير صالح أبدًا. [15] ومع ذلك، فإن هذا النهج رائد ونادرًا ما يوجد خارج لغات البرمجة البحثية.

التنفيذات

تتم صيانة قائمة أنظمة البرمجة الفوقية البارزة في قائمة أنظمة تحويل البرامج .

انظر أيضا

مراجع

  1. ^ Sondergaard, Harald (2013). "Course on Program Analysis and Transformation" . تم الاسترجاع في 18 سبتمبر 2014 .
  2. ^ تشارنيكي، كرزيستوف ؛ أيزنيكر، أولريش دبليو (2000). البرمجة التوليدية . رقم ISBN 0-201-30977-7.
  3. ^ Walker, Max. "فن البرمجة الفوقية في جافا". New Circle . تم الاسترجاع في 28 يناير 2014 .
  4. ^ كراوس، آرون. "مفاهيم البرمجة: التأمل والتأمل في النوع". The Societa . تم الاسترجاع في 14 سبتمبر 2014 .
  5. ^ جوشي، براتيك (5 أبريل 2014). "ما هي البرمجة الفوقية؟ – الجزء 2/2". لغز دائم . تم استرجاعه في 14 أغسطس 2014 .
  6. ^ على سبيل المثال، تأخذ instance_eval في Ruby سلسلة أو دالة مجهولة. "Rdoc for Class: BasicObject (Ruby 1.9.3) - instance_eval" . تم الاسترجاع في 30 ديسمبر 2011 .
  7. ^ "فن البرمجة الفوقية". IBM .
  8. ^ ab Bicking, Ian. "The challenge of metaprogramming". IanBicking.org . تم الاسترجاع في 21 سبتمبر 2016 .
  9. ^ تيري، مات (21 أغسطس 2013). "احذر من البرمجة الفوقية". Medium.com . Medium Corporation . تم الاسترجاع في 21 أغسطس 2014 .
  10. ^ من خلال "بروتوكول الكائن الفوقي" الخاص بنظام كائنات Common Lisp
  11. ^ "برمجة قالب C++". aszt.inf.elte.hu . تم الاسترجاع في 2022-07-23 .
  12. ^ ليسب (لغة برمجة) "أشكال التقييم الذاتي والاقتباس"، عامل شبه اقتباس.
  13. ^ "LMS: Program Generation and Embedded Compilers in Scala". scala-lms.github.io . تم الاسترجاع في 2017-12-06 .
  14. ^ Rompf, Tiark; Odersky, Martin (June 2012). "Lightweight Modular Staging: A Pragmatic Approach to Runtime Code Generation and Compiled DSLs". Communications of the ACM . 55 (6): 121–130. doi :10.1145/2184319.2184345. ISSN  0001-0782. S2CID  52898203.
  15. ^ Chlipala, Adam (يونيو 2010). "Ur: statically-typed metaprogramming with type-level record computation" (PDF) . إشعارات ACM SIGPLAN . PLDI '10. 45 (6): 122–133. doi :10.1145/1809028.1806612 . تم الاسترجاع في 29 أغسطس 2012 .
  • c2.com Wiki: مقالة البرمجة الفوقية
  • البرمجة الوصفية على ويكي تحويل البرنامج
  • توليد التعليمات البرمجية مقابل البرمجة الفوقية
  • "Solenoid": أول إطار عمل للبرمجة الوصفية لـ eXist-db
تم الاسترجاع من "https://en.wikipedia.org/w/index.php?title=البرمجة الفوقية&oldid=1248198388"
Original text
Rate this translation
Your feedback will be used to help improve Google Translate