2008-09-19 27 views
11

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

मैं जानता हूँ कि विकसित किया जा रहा कुछ भाषा workbenches देखते हैं और मैं नेट के लिए "विडंबना" जैसी चीजों के बारे में सुना है कि। और, ज़ाहिर है, एएनटीएलआर, लेक्स/याएक इत्यादि हैं, लेकिन मुझे डर है कि जो कुछ मैं करने की कोशिश कर रहा हूं उसके लिए वे बहुत जटिल हैं।

एक डीएसएल बिल्डर उपकरण आप का इस्तेमाल किया या सुना होगा के बारे में है और यह कैसे मदद करता है पर अपने छापों और क्या इसकी कमियां हैं के बारे में बात करें।

+0

नोट: मैं जरूरी नहीं है कि यहां ट्यूरिंग पूर्णता की तलाश भी हो। मेरे मॉडल में चीजों को कॉन्फ़िगर करने के लिए ज्यादातर अभिव्यक्ति वाक्यविन्यास। – chadmyers

उत्तर

9

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

मेरी राय यह है: यदि आपकी लक्षित भाषा इतनी सरल है कि इसे एक कमजोर दृश्य डिजाइनर द्वारा संभाला जा सकता है, तो इसके लिए एक पार्सर जनरेटर का उपयोग करके इसके लिए व्याकरण लिखना काफी आसान होना चाहिए।

यदि आपका लक्ष्य डीएसएल इतना जटिल है कि आपको एक व्याकरण लिखने के लिए पसीना तोड़ने की आवश्यकता होगी, तो डूबने वाले दृश्य उपकरण वैसे भी सरसों को काट नहीं पाएंगे और आप एक व्याकरण लिखना सीखेंगे वैसे भी।

हालांकि मैं आंतरिक बनाम बाहरी डीएसएल के बारे में लंबी अवधि में सहमत हूं। मैंने बू में एक आंतरिक डीएसएल लिखा और इसे काम करने के लिए अपने डीएसएल वाक्यविन्यास को संशोधित करना पड़ा, और यह हमेशा एक हैक की तरह महसूस किया। Irony.NET या ANTLR का उपयोग करने वाला वही व्याकरण अधिक लचीलापन के साथ पूरा करना उतना ही आसान होगा।

मेरे पास blog post कुछ विकल्पों पर चर्चा कर रहा है। पद रनटाइम अभिव्यक्ति मूल्यांकन के लिए एक डीएसएल लिखने के आसपास केंद्रित है, लेकिन उपकरण सभी समान हैं।

Irony.NET के साथ मेरा अनुभव सभी सकारात्मक रहा है, और इसका उपयोग करके कई संदर्भ भाषा लागू की गई हैं, जो शुरू करने के लिए एक अच्छी जगह है। यदि आपकी भाषा सरल है, तो उठना और दौड़ना बिल्कुल जटिल नहीं है। कोडप्रोजेक्ट पर लाइब्रेसर नामक लाइब्रेरी भी है - यह वास्तव में दिलचस्प है, क्योंकि यह पार्सर को शुद्ध स्रोत कोड के रूप में उत्पन्न करता है, जिसका अर्थ है कि आपका अंतिम उत्पाद किसी तीसरे पक्ष के संदर्भ से पूरी तरह से मुक्त है। हालांकि, मैंने इसे स्वयं नहीं इस्तेमाल किया है।

4

आपको वास्तव में Ragel देखें। यह आपके नियमित स्रोत कोड में राज्य मशीनों को एम्बेड करने के लिए एक ढांचा है। रैगेल सी, सी ++, उद्देश्य-सी, डी, जावा और रूबी का समर्थन करता है।

Ragel की फाइल और प्रोटोकॉल पारसर्स लेखन के साथ-साथ बाहरी डीएसएल सामान के माध्यम से कदम के लिए महान। मुख्य रूप से क्योंकि यह आपको राज्य संक्रमणों और इस तरह के किसी भी प्रकार के कोड को निष्पादित करने की अनुमति देता है।

उल्लेखनीय परियोजनाओं कि Ragel का उपयोग कर रहे हैं, Mongrel, एक महान माणिक वेब सर्वर के एक जोड़े। और Hpricot, एक रूबी आधारित एचटीएमएल-पार्सर, jQuery द्वारा प्रेरित की तरह।

Ragel का एक और बढ़िया सुविधा है कि यह कैसे graphviz आधारित चार्ट है कि अपने राज्य मशीनों कल्पना उत्पन्न कर सकते हैं। नीचे Zed Shaw'sarticle on ragel state charts से लिया गया एक उदाहरण दिया गया है।

ragel state chart http://www.zedshaw.com/tips/HelloMachine_small.png

+0

उत्कृष्ट। मैं निश्चित रूप से यह जांच लेंगे! – chadmyers

8

आप लेखन स्टैंड-अलोन DSLs में देख रहे हैं, तो आप इमारत compilers में देख रहे हैं - यह चारों ओर कोई रास्ता नहीं। कंपाइलर निर्माण आवश्यक प्रोग्रामिंग ज्ञान है, और यह वास्तव में सामान्य रूप से सोचा मुश्किल नहीं है। स्टीव येगेज Righ Programmer Food यह जानने के मूल्य को सारांशित करता है कि कंपाइलर्स को अच्छी तरह से कैसे बनाया जाए।

शुरू करने के कई तरीके हैं। मैं लेख में उल्लिखित 2 पेपरों की जांच करने की सलाह देता हूं: Want to write a compiler? Just read these Two papers। पहला, Let's build a compiler, बहुत ही सुलभ है। यह टर्बो पास्कल को कार्यान्वयन भाषा के रूप में उपयोग करता है, लेकिन आप इसे किसी अन्य भाषा में आसानी से कार्यान्वित कर सकते हैं - स्रोत कोड बहुत स्पष्ट है। पास्कल एक साधारण भाषा है।

एक बार जब आप और कैसे चीजें काम के लिए एक अच्छा लग रहा है शब्दावली शामिल मिलता है, मैं ANTLR की तरह कुछ में जाने पर सलाह देते हैं। एएनटीएलआर में एक अच्छा आईडीई है, ANTLRWorks, जो एक दुभाषिया और एक डीबगर के साथ आता है। यह फ्लाई पर आपके व्याकरण की वास्तव में वास्तव में अच्छी विज़ुअलाइज़ेशन भी बनाता है। मैंने इसे सीखने में अमूल्य पाया।

एएनटीएलआर में कई अच्छे ट्यूटोरियल हैं, हालांकि वे पहले थोड़ा सा भारी हो सकते हैं। This one अच्छा है, हालांकि यह एएनटीएलआर 2.0 के खिलाफ है, इसलिए आप हालिया संस्करण (वर्तमान में नवीनतम 3.1) के साथ असंगतताओं में भाग ले सकते हैं।

अंत में, डीएसएल के लिए एक और दृष्टिकोण है: लिस्प दृष्टिकोण। लिस्प के वाक्यविन्यास-कम प्रकृति को देखते हुए (आपका कोड मूल रूप से अमूर्त वाक्यविन्यास पेड़ है), आप अंतहीन भाषाओं को आकार दे सकते हैं, बशर्ते आप कोष्ठक में उपयोग किया जाए :)।

यदि आप उस दृष्टिकोण के साथ जाते हैं, तो आप एक एम्बेड करने योग्य लिस्प का उपयोग करना चाहते हैं। जावा के तहत, आपके पास Clojure है, जो एक लिस्प बोली है जो JVM और इसकी पुस्तकालयों के साथ निष्पक्ष रूप से इंटरऑपरेट करती है। मैंने इसे व्यक्तिगत रूप से उपयोग नहीं किया है, लेकिन यह अच्छा लग रहा है।योजना के लिए, जीएनयू Guile है, जो licensed under LGPL है। सामान्य लिस्प के लिए, एलजीपीएल के तहत ECL भी है। दोनों इंटरऑपरेबिलिटी के लिए सी इंटरफ़ेस का उपयोग करते हैं, ताकि आप उन्हें किसी अन्य भाषा में बहुत अधिक एम्बेड कर सकें। ईसीएल लिस्पस के बीच अद्वितीय है जिसमें प्रत्येक लिस्प फ़ंक्शन को सी फ़ंक्शन के रूप में कार्यान्वित किया जाता है, ताकि आप सी में लिस्प कोड लिख सकें (अगर आप अपने एक्सटेंशन विधियों के अंदर (कहना चाहते हैं कि आप सी फ़ंक्शन बना सकते हैं जो लिस्प ऑब्जेक्ट्स पर काम करते हैं, और फिर उन्हें लिस्प से बुलाओ)। मैं थोड़ी देर के लिए मेरी साइड-प्रोजेक्ट के लिए ईसीएल का उपयोग कर रहा हूं, और मुझे यह पसंद है। रखरखाव काफी सक्रिय और उत्तरदायी है।

+0

आप मेरी मदद नहीं कर रहे हैं। हाहा मैंने पहले एएनटीएलआर के साथ गड़बड़ कर ली है और मुझे इसकी क्षमताओं को पता है, लेकिन मैं कुछ ऐसी परिष्कृत/जटिल नहीं होने की उम्मीद कर रहा था। मुझे लगता है मुझे इसे एक और दिखाना होगा। – chadmyers

1

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

1

यदि आप बाहरी डीएसएल को लागू करने की योजना बना रहे हैं, तो स्पूफैक्स (http://strategoxt.org/Spoofax) ऐसा करने के लिए एक अच्छी भाषा वर्कबेंच है। यह एक पार्सर-आधारित टेक्स्ट लैंगौज वर्कबेंच है जो कई अत्याधुनिक तकनीक जैसे एसडीएफ, स्ट्रेटगो का लाभ उठाता है। डीएसएल लागू करने के अलावा, आप कोड समृद्ध, रूपरेखा दृश्य, इंटेलिजेंस इत्यादि जैसी बहुत समृद्ध संपादक सेवाएं प्राप्त कर सकते हैं। इसका उपयोग कई भाषाओं को बनाने के लिए किया गया है। http://mobl-lang.org/। प्रदान किए गए समर्थन के बारे में विचार प्राप्त करने के लिए इसे देखें।

स्पूफैक्स प्रोजेक्ट आउट-ऑफ-बॉक्स बॉक्स के अच्छे नमूने डीएसएल कार्यान्वयन और जावा कोड जनरेटर के साथ आता है। यह उपकरण के साथ शुरू करने के लिए एक शुरुआती बिंदु के रूप में काम कर सकता है।

इस लैंगेज वर्कबेंच के उपयोग के बारे में ट्यूटोरियल विवरण के बाद: http://strategoxt.org/Spoofax/Tour

उम्मीद है कि यह मदद करता है!

0

गंभीर बाह्य डीएसएल के लिए, आप पार्सिंग समस्या से बच नहीं सकते हैं; एएनटीएलआर आपको जो चाहिए वह कम से कम है। आप जो प्रोग्राम देखना चाहते हैं वह प्रोग्राम ट्रांसफ़ॉर्मेशन सिस्टम है, जिसका उपयोग जावा जैसी लक्षित भाषाओं में मनमाने ढंग से डीएसएल सिंटैक्स को मैप करने के लिए किया जा सकता है।

देखें http://en.wikipedia.org/wiki/Program_transformation

2

Xtext इस के लिए बनाया गया था।

वेबसाइट से:

Xtext प्रोग्रामिंग भाषाओं और डोमेन विशिष्ट भाषाओं के विकास के लिए एक रूपरेखा है। पूरी तरह से विकसित करने के लिए

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

संबंधित मुद्दे