डीएसएल का निर्माण: स्क्रिप्टेड एक सामान्य उद्देश्य वाली भाषा या स्टैंड-अलोन?


10

मैं किसी दिए गए, अस्पष्ट प्रोग्रामिंग मॉडल को सरल बनाने के लिए एक डोमेन विशिष्ट भाषा को डिजाइन करने पर बहस कर रहा हूं। बहस का एक हिस्सा यह है कि क्या इसे (एक स्क्रिप्ट के रूप में) एक मौजूदा भाषा / रनटाइम (जैसे जावा) के साथ बनाया जाए या इसे स्टैंड-अलोन (खुद कंपाइलर, और सी) बनाया जाए।

आप में से जो डीएसएल डिज़ाइन अनुभव के साथ हैं, क्या उनके पास उचित दृष्टिकोण के लिए आपके पास पेशेवरों / विपक्षों या एक निश्चित आग जवाब है?


इस DSL का उपभोक्ता कौन है? और क्या संभावित मेजबान हैं (आपने जावा का उल्लेख किया है, क्या आप अन्य संभावनाओं पर विचार कर रहे हैं)?
मौरिसियो शेफ़र

मैं मेजबानों के लिए किसी भी संभावना पर विचार करता हूं। उपभोक्ता वे अतुल्यकालिक कार्यक्रम (गंतव्य वाले संदेश) लिखने वाले होंगे।
जेई क्यू

जवाबों:


9

मैं एक मौजूदा भाषा (आंतरिक डीएसएल) के ऊपर अपना डीएसएल बनाने की सलाह दूंगा। मैंने इसे पायथन के साथ कुछ बार किया है, ऐसे सिस्टम बना रहा है जहां डीएसएल का उपभोक्ता एक पायथन फाइल लिखता है जो सिस्टम के लिए कॉन्फ़िगरेशन फाइल के रूप में उपयोग की जाती है। कॉन्फ़िगरेशन फ़ाइल कंस्ट्रक्शन (कक्षाएं, फ़ंक्शंस) का उपयोग करती है जिसे मैंने परिभाषित किया है। ये निर्माण डीएसएल बनाते हैं।

IMO, Python (IronPython या Jython जैसी भाषा यदि होस्ट सिस्टम .NET या जावा है) या रूबी (IronRuby, JRuby) जावा या C # की तुलना में आपके DSL पर आधारित है तो बेहतर है।

मेरे मामले में मेजबान सिस्टम भी (C) पायथन रहा है, इसलिए DSL के लिए अजगर का चयन करना स्वाभाविक बात रही है।

कुछ पेशेवरों:

  • इमारत की कम लागत। आपको लागू करने के लिए बहुत कम है। आप पार्सर / कंपाइलर / दुभाषिया को लागू करने के लिए समय बिताने के बजाय समस्या पर ध्यान केंद्रित कर सकते हैं।
  • मेजबान भाषा तक पहुंच: आपकी भाषा में मौजूदा भाषा / मंच की पूरी शक्ति तक पहुंच होगी।

मैं सुंदर भाषा अज्ञेय हूं, लेकिन आपको क्यों लगता है कि पायथन अवतार बेहतर अनुकूल हैं?
जेई क्यू

1
इससे बेहतर क्या होगा? मुझे लगता है कि रूबी और पायथन के कई समान लाभ हैं, रूबी शायद अधिक आंतरिक सिंटैक्स के कारण आंतरिक डीएसएल के लिए बेहतर अनुकूल है। जावा और C # के लिए, मैंने उन भाषाओं में बहुत से बढ़िया धाराप्रवाह इंटरफ़ेस देखा है (और नए संस्करणों में निर्माण हैं जो आंतरिक DSL निर्माण / उपयोग को आसान बनाते हैं, जैसे ऑब्जेक्ट इनिशियल सिंटैक्स) - लेकिन IMO "कम समारोह" भाषाएं हैं "उच्च समारोह" भाषाओं की तुलना में थोड़ा बेहतर है।
कोडेपे

1
मैंने "नि: शुल्क" संकलन-समय स्थिर प्रकार की जाँच करने के लिए आंतरिक डीएसएल को लागू करने के लिए सी # चुना। डायनेमिक भाषा के DSLs बाहरी DSLs पर बहुत अधिक लाभ नहीं देते हैं।
डेन

@ जब मैंने पायथन में iDSLs करने की कोशिश की है, तो मुझे इससे निराशा हुई है। जावा में आपका iDSL ऐसा महसूस करता है कि उसे IDE से तुरंत सहायता मिलती है। ऐसा कोई आईडीई नहीं मिला जो पायथन के लिए ऐसा करेगा।
कैंडिड_ऑरेंज

2

पर देखो Xtext (http://www.eclipse.org/Xtext/) और Xbase (http://blog.efftinge.de/2010/09/xbase-new-programming-language.html)। यदि उपयोगकर्ता गैर प्रोग्रामर हैं, तो मुझे नहीं लगता कि आपको एक मौजूदा प्रोग्रामिंग भाषा पर अपने डीएसएल को आधार बनाना चाहिए। यह उनके लिए बहुत जटिल होगा। अगर सही तरीके से बनाया जाए तो "क्लीन" डीएसएल बहुत ही कुशल हो सकता है।


2

किसी विशेष दृष्टिकोण की सिफारिश करने के बजाय, मुझे निर्णय लेने के लिए एक उत्कृष्ट संसाधन के रूप में मार्टिन फाउलर की डोमेन-विशिष्ट भाषाओं की सिफारिश करने की अनुमति दें । इसमें आंतरिक और बाह्य डीएसएल के सापेक्ष गुणों की एक व्यापक, सोची-समझी परीक्षा है।


1

एक तीसरा विकल्प है - एक सामान्य उद्देश्य भाषा के संकलक के रूप में एक डीएसएल का निर्माण करें। मेट्रोपोग्रामिंग क्षमताओं की कुछ उचित डिग्री वाली कोई भी भाषा काम करेगी, जिसमें सी ++ जैसी निम्न-स्तरीय चीज़ भी शामिल है। मैं इस तरह की चीजों के लिए लिस्प और समान भाषाओं को पसंद करता हूं, लेकिन टेम्प्लेट हास्केल या नेमर्ले को समान स्तर का लचीलापन प्रदान कर सकता है।


1

अपनी पुस्तक "डोमेन-स्पेसिफिक लैंग्वेजेस" में, मार्टिन फोलेवर ने आंतरिक और बाहरी डीएसएल का वर्णन किया है ।
Internal DSL= मौजूदा प्रोग्रामिंग भाषा का एक उप-समूह है जैसे रूबी / जावा आदि
External DSL= आप एक वाक्यविन्यास और एक शब्दावली को परिभाषित करते हैं।
एक बाहरी डीएसएल बहुत अधिक अभिव्यंजक हो सकता है, लेकिन एक बाहरी पार्सिंग और कोड पीढ़ी की आवश्यकता हो सकती है।
हालांकि एक आंतरिक डीएसएल को एक अतिरिक्त प्रसंस्करण की आवश्यकता नहीं होती है, लेकिन कभी-कभी गैर-प्रोग्रामिंग डोमेन विशेषज्ञों (जैसे व्यापार विश्लेषकों, परीक्षकों) के लिए समझना मुश्किल होता है।

अपने प्रकार के DSL को चुनते समय, यह विश्लेषण करना महत्वपूर्ण है कि इसके उपयोगकर्ता कौन हैं। यदि वे ज्यादातर गैर-तकनीकी लोग हैं, तो एक बाहरी DSL एक बेहतर विकल्प हो सकता है। अनुभवी प्रोग्रामर की एक छोटी टीम के लिए एक आंतरिक डीएसएल को चुना जा सकता है, अगर वे जिस प्रोग्रामिंग भाषा का उपयोग करते हैं वह पर्याप्त अभिव्यंजक है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.