ما تكنولوجيا الاستخدام في إنشاء DSL لمحرك القواعد؟

StackOverflow https://stackoverflow.com/questions/545937

  •  23-08-2019
  •  | 
  •  

سؤال

ما هي التكنولوجيا التي تنصح بها لإنشاء DSL ل قواعد الأعمال وحظر تطبيق التحقق من الصحة ل .NETب و لماذا؟

يتم إنشاء بنية الإطار وإثبات اختبارها من قبل الإنتاج. أريد فقط إنشاء معالج .NET لتحويل القواعد القابلة للقراءة من قبل الإنسان إلى تطبيقات القاعدة المترجمة.

الخيارات التي أعرفها هي:

  • استخدام خط أنابيب المحول البرمجي .NET بو
  • استخدم بناة المحللين التي تأتي مع F # - fslex و fsyacc.

لسوء الحظ، لا توفر أي من هذه الأساليب أي شيء لبناء المزيد من IDE أكثر ودية لتحرير DSL، بالنظر إلى بناء جملة DSL (والتي من شأنها أن تتطور).

أي أفكار أو تلميحات؟

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

المحلول

منصة تطوير تطبيقات تطبيق Microsoft القادم من Microsoft أوسلو

يجعل من الأسهل على الأشخاص كتابة الأمور بطرق منطقية على نطاق المشكلة التي يعملون فيها

يبدو أن Oslo يتكون من أداة تصميم مرئي تسمى "Quadrant"، وهي لغة النمذجة المسماة "M"، ومستودع "OSLO" (قاعدة بيانات SQL Server) تخزين القواعد.

لذلك إذا قرأت الأشياء بشكل صحيح، فيمكنك تحديد لغة النمذجة في م، واستخدام الربع لتحديد قواعد التحقق من صحة وتحريرها باستخدام لغة النمذجة الخاصة بك، واكتب تطبيقا يستخدم مستودع OSLO، وإنشاء قواعد عملك وتطبيق التحقق من الصحة كتلة ل .NET.

نصائح أخرى

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

أنت أفضل حالا بكثير بلغة نصية لوصف قواعد العمل.

للحصول على تجربة مستخدم هادئة لتحرير الكود الذي تحتاجه:

  1. محلل مع استرداد خطأ جيد
  2. القدرة على إجراء إعادة تجميع تدريجي

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

تمنحك القدرة على إجراء إعادة التحويل المتزايد القدرة على القيام بتجميع خلفية فعالة استجابة لتعديلات المستخدمين.

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

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

يتطلب منك تنفيذ إعادة التجميع الفعالي أن تكون قادرا على: 1) كسر التحليل الدلالي بشكل صحيح في المراحل (لشيء مثل C # هذا سيكون: أولا إنشاء مساحة الاسم ونوع الرموز، ثم حل استخدام البيانات، ثم حل الفئات الأساسية، إلخ). 2) القدرة على بناء خوارزميات الرسم البياني للتخشيد في المرحلة 3) لمعالجة الرسم البياني التبعي، وإبطال أجزاء منه استجابة لتعديلات المستخدم

للحصول على لغة البرمجة Flow-Flow-Flegged، يمكن أن تصبح تطبيق إعادة التجميع مخادئا حقا. في حالتك، لأنك تصف قواعد العمل، قد يكون الكثير من Simpiler بالنسبة لك (أو إذا كان التجميع سريعا بما يكفي، فقد لا تحتاج حتى إلى ذلك).

لذلك، أود أن أبدأ مع المحلل المحلل، ثم بناء إنسي إيثاني على رأسه.

إذا كنت تستطيع تجنب التكامل مقابل، فسأفعل ذلك. يتطلب الاندماج في VS الكثير من السباكة، ومن المرجح أن تسبب الترابط بين الصداع. هناك عدد قليل من الشركات التي تبيع عناصر تحكم Windows Forms Editor التي تقوم بربط محللك. من الأسهل بكثير الاندماج مع مقابل

بديل آخر مثير للاهتمام هو استخدام عروض الأسعار F #.

تتيح لك الاقتباسات معالجة جزء من البرنامج كبيانات، حتى تتمكن من الحصول على AST، وتحليلها وترجمتها إلى لغة أخرى أو تنفيذها في بعض الطرق غير القياسية. جنبا إلى جنب مع مرونة F #، يجب أن تكون قادرا على التعبير عن أشياء كثيرة، لذلك يجب عليك تطوير مكتبة DSL / COMFINATION داخلية داخلي لوصف القواعد ومترجم / مترجم ل اقتباسات F # لتشغيلها.

لست متأكدا من أن قاعدة Bussines قد تبدو، ولكن يمكنك كتابة شيء مثل هذا:

let rule = <@
  if (exists customer having validEmail) then success
  else require whatever 
@>

كتبت مقدمة لهذا الموضوع على مدونتي. لسوء الحظ، كانت هناك بعض التغييرات الكبيرة في F # CTP وأنا لم أقم بتحديث شفرة المصدر بعد، لكن يجب أن تعطيك فكرة جيدة عن ما هي إمكانيات وقيود هذا النهج.

مثال جيد على DSL هو F # وحدة اختبار Framewrok:

تعديلفقط لتوضيح لماذا أعتقد أن هذا قد يكون نهجا جيدا:

  • إذا كنت تستخدم Visual Studio لإعادة تشغيل DSLs (ويمكنك استخدام إصدار Shell مع تثبيت F # مجانا)، فستحصل على تجربة تحرير جيدة للغاية مجانا. ليس فقط تسليط الضوء على بناء الجملة، ولكن أيضا التحسس الذكي الذي يقترح البنيات المحتملة وأيضا التحقق من نوع الخلفية الذي يعمل بمثابة مدقق "قواعد النحوية ل DSL الخاص بك.
  • بالمقارنة مع النهج الأخرى هذا هو ربما واحدة من أسهل تنفيذها.
  • القيد الوحيد هو أنك يحدها بناء جملة F #. ومع ذلك، فإن تصميم لغتك الخاصة صعبة حقا، لذلك قد لا يكون هذا سيئا على الإطلاق. خاصة بالنظر إلى مرونة F #.

/تعديل

أتمنى أن يساعدك هذا!

كنت أستخدم بو، أعتقد أنها حاليا واحدة من أكثر الأدوات المرنة لإنشاء DSL. هناك كتاب جيد جدا عن الموضوع. Ayende. و رودريغو المدونات هي مصدر إلهام جيد أيضا.

حول IDE، يمكنك تمديد Sharpdeveld., ، إلقاء نظرة على هذه.

الأداة القياسية لبناء طبقات DSL ليكون antlr. - إنه مولد Lexer / محلل محلل قوي مع الكثير من اللغات المستهدفة لإخراج المحول البرمجي. لقد ترجع إلى C # و Java و C / C ++ أو بيثون وما إلى ذلك (انظر أهداف جيل الرموز القائمة) وتتيح لك حقن رمز مخصص في مترجمك في لغتك المستهدفة بسهولة.

هناك أيضا IDE قوية جدا (AntlrWorks) والكثير من الوثائق. (الدفع مرجع Antlr المستنفد من Terrence Parr، مؤلف Antlr) للحصول على المراجع التي تستخدمها testImonlals. صفحة.

لا تزال بحاجة إلى القيام بمعظم السباكة من أجل IDE بنفسك، ولكن يجب أن تكون أسهل بكثير بالنظر إلى إطار التحويل البرمجي القوي الذي ستحصل عليه من Antlr. يجب أن يكون هذا هو الحال بالنسبة لمعظم الحلول المنشورة هنا ...

أنا حاليا باستخدام مترجم مكتوب مع Antlr إلى Preprocess لدينا DSL الخاص بنا إلى إخراج C / C ++ وأنا سعيد جدا به. ما يكفي من الإعلان، يجب أن تحاول ذلك بنفسك :) استمتع!

JetBrains. نظام برمجة ميتا

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

أنا جديد في ذلك، ولكن Ometa. يبدو وكأنه أداة مثالية لتطوير DSLS. لا يبدو أن هناك IDE حولها، لكن الخبر السار هو أن "القواعد" يمكن للمرء أن يكتب في Ometa قابلة للقراءة للغاية. (وهو يتعامل مع العودية اليسرى، وهو بارد للغاية.)

هناك حاليا تطبيقات Ometa في JavaScript على الأقل (مثيرة للغاية بالنسبة لي) وبيثون، ربما غيرها. أما بالنسبة ل C #، جيف مومس يعمل على واحد، والذي يمكنك أن تقرأ عنه مدونته وانظر في codeplex. وبعد حظ سعيد.

بو + Ometa = boo.ometa.parser

حاليا المحلل المحلل قيد التطوير ولكن يمكن استخدامه بالفعل لإنشاء DSL خارجي معقدة. OMETA هي أداة قوية تتيح للمبرمجين تنفيذ محلل ومحافل معجمية بسهولة. يسمح بنية خط أنابيب مترجم قابلة للتمديد لاستبدال BOO.Parser القياسية مع boo.ometa.parser. يمكن استخدامه لتوسيع بناء جملة BOO مع أي نوع من بناء الجملة تقريبا. المثال يمكن أن تجد هنا.

مشروعي meta # يحاول حل هذه المشكلة.

إذا كنت ترغب في إنشاء IDE ودية يقوم بتحرير DSLS، فقم بإجراء أجهزة IDE بالكامل، وتجميع كائنات .NET (أو استخدام شيء مثل IronPython ككلغة غراء).

إذا كانت القواعد بسيطة بما فيه الكفاية، فيمكنك تطبيق بنية القواعد بأكملها بيانيا. إذا كانت القواعد معقدة بما فيه الكفاية، فإن "قابلية القراءة الإنسانية" تصبح هدفا مستحيلا.

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

ومع ذلك، إذا كنت ترغب فقط في إنشاء لغة بسيطة يمكن للمبرمجين استخدامها لإنشاء قواعد تجارية، فلا تتردد في استخدام أي مما سبق، وجعل بناء الجملة أضيق الحدود بما يكفي لعدم الحاجة إلى IDE في Visual Studio.

روبي هي لغة رائعة لإنشاء DSLs. علي سبيل المثال مجرفة هو Script Script DSL مكتوب مع روبي.

مع القادم ايكريبي من الممكن كتابة البرامج النصية التي تسمون رمز C # مباشرة.

هنا بعض مقالات على كتابة DSLs في روبي.

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