سؤال

ما هي الأدوات المتوفرة لبناء حقيقية صادقة إلى الخير DSL خارجي.و لا أنا لا أتحدث عن استغلال روبي, بو, XML أو آخر القائمة اللغة أو الجملة أعني الحقيقي DSL خارجي -- لغتي الخاصة للأغراض الخاصة بي.

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

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

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

المحلول

لقد كتبت DSLs في بو ، Irony.NET و أدوات دعا Grammatica.أنت تقول أن محلل-مولد معقد جدا ، ولكن قد تكون متسرعة في الحكم ، في الواقع فهي بسيطة جدا للاستخدام مرة واحدة يمكنك الحصول على أكثر من صغير منحنى التعلم ، وفتح عالم واسع من إمكانية أن يتجاوز بسهولة الجهد.وجدت تعلم النوتة المطلوبة لكتابة قواعد النحو معظم محلل مولدات تشبه إلى حد ما تعلم التعابير العادية - يجب أن ينحني عقلك قليلا فقط السماح لهم بالدخول ، ولكن المكافآت كبيرة.

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

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

أنا أوافق على المدى الطويل عن الداخلية مقابل الخارجية DSL ، على الرغم من.كتبت داخلي DSL في بو و قد لتعديل بلدي DSL الجملة أن تجعل من العمل, و شعرت دائما مثل هاك.نفس قواعد استخدام Irony.NET أو ANTLR أن من السهل تحقيقه مع المزيد من المرونة.

لدي بلوق وظيفة مناقشة بعض الخيارات.بعد تتمحور حول كتابة DSL لوقت التشغيل تقييم التعبير, ولكن الأدوات هي كل نفس.

تجربتي مع Irony.NET كانت كلها إيجابية ، وهناك العديد من مرجعية اللغة تنفيذها باستخدام الأمر الذي هو مكان جيد للبدء.إذا كانت لغتك بسيطة ، وهي بالتأكيد ليست معقدة للحصول على وتشغيلها.هناك أيضا مكتبة في CodeProject يسمى TinyParser - هذا واحد هو حقا مثيرة للاهتمام ، لأنه يولد محلل نقية كما شفرة المصدر, مما يعني أن المنتج النهائي الخاص بك خالية تماما من أي طرف ثالث إشارة.أنا لم تستخدم نفسي ، وإن.

نصائح أخرى

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

هناك الكثير من الطرق للبدء.أوصي التحقق 2 الاوراق المذكورة في المادة: أريد أن أكتب مترجم?مجرد قراءة هذه ورقتين.أول واحد ، دعونا نبني مترجم, هو الوصول للغاية.ويستخدم توربو باسكال تنفيذا اللغة ، ولكن يمكنك تنفيذها بسهولة في أي لغة أخرى-مصدر رمز واضح جدا.باسكال هي لغة بسيطة.

مرة واحدة يمكنك الحصول على فكرة جيدة عن كيفية عمل الأشياء و المصطلحات المعنية ، أوصي الخوض في شيء مثل ANTLR.ANTLR لطيفة IDE ، ANTLRWorks, هذا يأتي مع مترجم و مصحح أخطاء.كما أنها تنتج حقا جيدة حقا تصورات من قواعد النحو الخاصة بك على الطاير.لقد وجدت أنها لا تقدر بثمن في التعلم.

ANTLR له عدة دروس جيدة, على الرغم من أنها قد يكون قليلا الساحق في البداية. هذا واحد هي لطيفة على الرغم من انها ضد ANTLR 2.0, إذا كنت قد واجهت عدم التوافق مع إصدار أحدث (حاليا أحدث 3.1).

وأخيرا ، هناك نهج آخر DSLs:يسب النهج.نظرا اللثغة جملة أقل الطبيعة (الكود الخاص بك هو في الأساس جملة مجردة من الأشجار) ، يمكنك الشكل لا نهاية لها لغات من ذلك شريطة أن تعتاد على الأقواس :).

إذا كنت اذهب مع هذا النهج ، كنت ترغب في استخدام ادراجها Lisp.تحت جافا لديك Clojure, Lisp اللهجة التي يتبادل لا تشوبه شائبة مع JVM و المكتبات.أنا لم تستخدم شخصيا ، ولكن يبدو جيد.عن مخطط هناك جنو المكر, الذي هو المرخص لها بموجب LGPL.بالنسبة Common Lisp, هناك ECL, أيضا بموجب LGPL.تستخدم كل من ج واجهة التشغيل البيني ، لذلك يمكنك تضمين لهم في أي لغة أخرى.ECL هي فريدة من نوعها بين اللثغ في أن كل واحد يسب تنفيذ وظيفة مثل وظيفة C, حتى تتمكن من كتابة اللثغة التعليمات البرمجية في C إذا كنت تريد (مثلا ، داخل امتداد الطرق--يمكنك إنشاء C الوظائف التي تعمل على اللثغة كائنات ثم ندعو لهم من Lisp).لقد تم استخدام ECL على جانبي المشروع من الألغام لفترة من الوقت, و أنا أحب ذلك.المشرف نشطة جدا ومتجاوبة.

يجب أن تحقق فعلا Ragel.إنه إطار تضمين أجهزة الدولة في العادي الخاص بك التعليمات البرمجية المصدر.Ragel يدعم C, C++, Objective-C, D, جافا و روبي.

Ragel رائع لكتابة ملف البروتوكول موزعي فضلا عن التنقل خلال DSL خارجي الأشياء.أساسا لأنه يسمح لك لتنفيذ أي نوع من التعليمات البرمجية على التحولات الدولة هذه.

اثنين من أبرز المشاريع التي تستخدم Ragel ، الهجين, عظيم روبي ملقم ويب.و Hpricot, روبي القائمة على html-محلل نوعا ما مستوحاة من مسج.

آخر ميزة كبيرة من Ragel هو كيف يمكن أن تولد graphvizالقائم على الرسوم البيانية التي تصور أجهزة الدولة.وفيما يلي مثال مأخوذ من زيد شو المادة على ragel الدولة الرسوم البيانية.

ragel state chart

Xtext بنيت هذه.

من موقع:

Xtext هو إطار تطوير لغات البرمجة المجال لغات معينة.

وهو يغطي جميع جوانب كاملة لغة البنية التحتية ، موزعي, على رابط مترجم أو مترجم بالكامل في مهب أرفع Eclipse IDE التكامل.لأنه يأتي مع كل هذه الافتراضات الجوانب و في نفس الوقت كل جانب واحد يمكن أن يكون متلائما الاحتياجات الخاصة بك.

لقد تم استخدام السخرية مع نتائج جيدة.جزء كبير عن السخرية هو أنه يمكنك بسهولة إدراجه في أي وقت كنت تستخدم DSL لمدة.أنا خلق خارجي DSL التي لا تعيش في النموذج الدلالي مكتوب في C# حتى المفارقة كبيرة.ثم يمكنني استخدام النموذج الدلالي لتوليد رمز مع StringTemplate.

إذا كنت تخطط لتنفيذ خارجي DSLs , Spoofax ( http://strategoxt.org/Spoofax )هو لطيف اللغة منضدة للقيام بذلك.وهو محلل ومقرها النصوص الناطقة منضدة أن النفوذ عدة الدولة من أحدث التكنولوجيا مثل قوات الدفاع الذاتى ، Stratego.إلى جانب DSL implemenation , هل يمكن الحصول على غنية جدا محرر الخدمات مثل إنجاز قانون , عرض المخطط التفصيلي ، التحسس.... الخوقد تم استخدامه لبناء عدة لغات مثل http://mobl-lang.org/.تحقق من هذا للحصول على فكرة عن الدعم.

Spoofax المشروع يأتي مع الخروج من مربع لطيفة عينة DSL تنفيذ جافا رمز مولد.قد تعمل كنقطة انطلاق للحصول بدأت مع الأدوات.

البرنامج التعليمي التالية تفاصيل حول استخدام هذا الناطقة منضدة : http://strategoxt.org/Spoofax/Tour.

نأمل أن يساعد!

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

انظر http://en.wikipedia.org/wiki/Program_transformation

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