سؤال

من المحتمل أن تكون لغة C++ هي اللغة الأكثر شيوعًا البرمجة الفوقية الساكنة و جافا لا تدعم ذلك.

هل هناك أي لغات أخرى إلى جانب C++ تدعم البرمجة التوليدية (البرامج التي تنشئ البرامج)؟

هل كانت مفيدة؟

المحلول

البديل للبرمجة الوصفية لنمط القالب هو نمط الماكرو الذي تراه في تطبيقات Lisp المختلفة.أود أن أقترح التنزيل بول جراهام على ليسب وإلقاء نظرة أيضا على كلوجر إذا كنت مهتمًا بـ Lisp مع وحدات الماكرو التي تعمل على JVM.

تعد وحدات الماكرو في Lisp أقوى بكثير من أسلوب C/C++ وتشكل لغة بحد ذاتها - وهي مخصصة للبرمجة الوصفية.

نصائح أخرى

اسمحوا لي أن قائمة أ بعض التفاصيل المهمة حول كيف البرمجة الفوقية يعمل في اللثغة (أو مخطط, ، أو لائحة, ، أو اختر لغتك "الديناميكية" المفضلة لديك):

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

أمثلة عشوائية على ماذا يمكنك تنفيذها كمكتبة مستخدم باستخدام برمجة LISP (هذه أمثلة فعلية لمكتبات LISP الشائعة):

  • توسيع اللغة مع استمرارية محددة (هو.دويم.ديليكو)
  • تنفيذ أ js-إلى-lisp-rpc الماكرو الذي يمكنك استخدامه في جافا سكريبت (الذي تم إنشاؤه من LISP).يتوسع إلى مزيج من كود js/lisp الذي ينشر تلقائيًا (في طلب http) جميع المتغيرات المحلية المشار إليها، ويفك تشفيرها على جانب الخادم، ويشغل نص كود lisp على الخادم، ويعيد القيمة المرجعة إلى جافا سكريبت. جانب.
  • أضف برولوج مثل التراجع إلى اللغة التي تتكامل بسلاسة شديدة مع كود اللثغة "العادي" (انظر الصراخ)
  • ان امتداد قوالب XML إلى اللثغة الشائعة (يتضمن مثالاً على وحدات ماكرو القارئ وهي مكونات إضافية لمحلل lisp)
  • طن من DSL الصغيرة، مثل حلقة أو أعاد لسهولة التكرار

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

كان العبث بهذا الأمر في عام 1998 تقريبًا هو ما دفعني للبحث عن حلول أفضل.كان بإمكاني كتابة أنظمة مفيدة تعتمد عليها، لكنها كانت جهنمية.قادني البحث في النهاية إلى Common Lisp.من المؤكد أن آلية القالب هي تورينج كاملة، ولكن مرة أخرى كذلك هي المقحمة.

تقوم لغة Lisp المشتركة بالبرمجة الوصفية "بشكل صحيح".لديك القوة الكاملة للغة المتاحة أثناء قيامك بذلك، ولا يوجد بناء جملة خاص، ولأن اللغة ديناميكية للغاية، يمكنك فعل المزيد بها.

هناك خيارات أخرى بالطبع.لم أستخدم أي لغة أخرى تقوم بالبرمجة الوصفية بشكل أفضل من Lisp، ولهذا السبب أستخدمها في كود البحث.هناك الكثير من الأسباب التي قد تجعلك ترغب في تجربة شيء آخر، ولكن كل ذلك سيكون عبارة عن مقايضات.يمكنك إلقاء نظرة على Haskell/ML/OCaml وما إلى ذلك.تتمتع الكثير من اللغات الوظيفية بشيء يقترب من قوة وحدات ماكرو Lisp.يمكنك العثور على بعض العناصر المستهدفة لـ .NET، ولكنها جميعها هامشية جدًا (من حيث قاعدة المستخدمين وما إلى ذلك).لا يوجد لدى أي من اللاعبين الكبار في اللغات المستخدمة صناعيًا أي شيء مثل هذا حقًا.

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

كلاهما يستهدف .NET، حتى يتمكنا من التعامل بسهولة مع لغة C# ولغات .NET الأخرى - حتى ثنائيات Java، إذا كنت تستخدم IKVM.

يحرر:للتوضيح، أعني وحدات الماكرو بالمعنى اللثغة للكلمة، وليس وحدات الماكرو للمعالج المسبق لـ C.تسمح هذه بتعريف بناء الجملة الجديد والبرمجة الوصفية الثقيلة في وقت الترجمة.على سبيل المثال، يأتي Nemerle مع وحدات الماكرو التي ستتحقق من صحة استعلامات SQL الخاصة بك مقابل خادم SQL الخاص بك في وقت الترجمة.

Nim هي لغة برمجة جديدة نسبيًا تتمتع بدعم واسع النطاق للبرمجة التعريفية الثابتة وتنتج تعليمات برمجية مجمعة فعالة (مثل C++).

http://nim-lang.org/

وهو يدعم تقييم وظيفة وقت الترجمة، وتحويلات كود AST الشبيهة بـ LISP من خلال وحدات الماكرو، وانعكاس وقت الترجمة، والأنواع العامة التي يمكن تحديد معلماتها بقيم عشوائية، وإعادة كتابة المصطلحات التي يمكن استخدامها لإنشاء معرفة عالية المستوى محددة من قبل المستخدم. تحسينات ثقب الباب.من الممكن أيضًا تنفيذ برامج خارجية أثناء عملية التجميع والتي يمكن أن تؤثر على إنشاء التعليمات البرمجية.على سبيل المثال، فكر في التحدث إلى خادم قاعدة بيانات يعمل محليًا للتحقق من أن تعريف ORM الموجود في التعليمات البرمجية الخاصة بك (المقدم من خلال بعض DSL) يطابق مخطط قاعدة البيانات.

ال لغة البرمجة "د". تشبه لغة C++‎ ولكنها تتمتع بدعم أفضل بكثير للبرمجة الوصفية.فيما يلي مثال على أداة تتبع الشعاع المكتوبة باستخدام البرمجة الوصفية لوقت الترجمة فقط:

كتريس

بالإضافة إلى ذلك، هناك فرع دول مجلس التعاون الخليجي يسمى "ConceptGC" الذي يدعم هياكل البرمجة الوصفية التي لا تدعمها لغة C++ (على الأقل حتى الآن).

مفهوم دول مجلس التعاون الخليجي

يدعم Common Lisp البرامج التي تكتب البرامج بعدة طرق مختلفة.

1) بيانات البرنامج و"شجرة بناء الجملة المجردة" للبرنامج موحدة (تعبيرات S!)

2) defmacro

3) وحدات الماكرو القارئ.

4) اجتماع الأطراف

من بين هؤلاء، منفاخ العقل الحقيقي هو MOP.اقرأ "فن بروتوكول MetaObject." سوف يغير الأشياء بالنسبة لك ، أعدك!

أوصي هاسكل.هنا أ ورق واصفًا قدرات البرمجة الفوقية في وقت الترجمة.

الكثير من العمل في هاسكل:اللغات الخاصة بالمجال (DSL)، المواصفات القابلة للتنفيذ، تحويل البرنامج، التطبيق الجزئي، الحساب المرحلي.بعض الروابط للبدء:

تم تصميم عائلة لغات ML خصيصًا لهذا الغرض.واحدة من قصص نجاح OCaml الأكثر شهرة هي FFTW مكتبة FFTs عالية الأداء وهي عبارة عن كود C تم إنشاؤه بالكامل تقريبًا بواسطة برنامج OCaml.

هتاف ، جون هاروب.

يحاول معظم الناس العثور على لغة لها "انعكاس نهائي" لتفتيش الذات وشيء مثل "eval" لإعادة تقليل التعليمات البرمجية الجديدة.من الصعب العثور على مثل هذه اللغات (Lisp كونها مثال مضاد رئيسي) وهي بالتأكيد ليست سائدة.

ولكن هناك طريقة أخرى تتمثل في استخدام مجموعة من الأدوات التي يمكنها فحص رمز البرنامج وإنشائه ومعالجته.الفوز بالجائزة الكبرى هي هذه الأداة التي تركز على جافا. http://jackpot.netbeans.org/

مجموعة أدوات إعادة هندسة DMS الخاصة بنا هي أداة ، تعمل على C ، C ++ ، C#، Java ، Cobol ، PHP ، JavaScript ، ADA ، Verilog ، VHDL ومجموعة متنوعة من اللغات الأخرى.(يستخدم نهايات أمامية جودة الإنتاج لتمكينه من قراءة كل هذه langauges).والأفضل من ذلك، أنه يمكنه القيام بذلك بلغات متعددة في نفس اللحظة.يرى http://www.semdesigns.com/Products/DMS/DMSToolkit.html

ينجح DMS لأنه يوفر طريقة عادية وبنية تحتية داعمة للوصول الكامل إلى بنية البرنامج مثل ASTs، وفي معظم الحالات بيانات إضافية مثل جداول الرموز ومعلومات النوع والتحكم وتحليل تدفق البيانات، وكلها ضرورية للقيام بمعالجة معقدة للبرامج.

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

  • ثابتة
  • تم تجميعها إلى لغة الآلة
  • الأمثل بشكل كبير للأداء في وقت الترجمة
  • قابلة للتوسيع مع أنواع البيانات المعرفة من قبل المستخدم (OOP في حالة C++)
  • تحظى بشعبية كبيرة

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

بالطبع، تدعم اللغات الديناميكية والعديد من اللغات الوظيفية مفاهيم مختلفة تمامًا يمكن أن تسمى أيضًا البرمجة الفوقية.

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

اللغة الوصفية (ML) بالطبع: http://cs.anu.edu.au/student/comp8033/ml.html

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top