2010-07-22 15 views
5

दोस्तों ... लड़कियों, मैं एक परियोजना पर काम कर रहा हूं जो मुझे लगता है कि कुछ प्रकार के कार्य प्रवाह के नियमों और/या शर्तों के एक सेट को परिभाषित करने के लिए एक डोमेन विशिष्ट भाषा को लागू करके मुझे बढ़ाया जा सकता है।जावा पर डीएसएल के साथ पहला कदम?

मैं विशेष रूप से कैसे जावा के साथ किसी भी तरह उन्हें लागू करने के विषय, बुनियादी बातों, सर्वोत्तम प्रथाओं, आदि पर अच्छी पकड़ करना चाहते हैं।

आप क्या सुझाव देते हैं?

+2

गंभीर सुझाव: ग्रोवी, स्कैला या क्लोजर का उपयोग करके इसे कार्यान्वित करें। – Mike

+0

यह पूरी तरह से निर्भर करता है कि आप डीएसएल को कितना जटिल बनाना चाहते हैं। इसके लिए जावा का उपयोग न करने के लिए – NawaMan

+0

+1। अगर कुछ भी है, तो मैं रूबी (या जेआरबी) का उपयोग करूंगा। – cletus

उत्तर

8

सबसे पहले मैं Kernighan और पाईक द्वारा पढ़ने अध्याय 9 The Practice of Programming की (नोटेशन) की सिफारिश करेंगे।

जब आप किया है कि, यहाँ वापस कैसे को हल करने के समस्याओं के लिए विशिष्ट डिजाइन करने के लिए कि अध्याय में अवधारणाओं को मैप करने पर विशिष्ट प्रश्न के साथ आते हैं।

बुनियादी पैटर्न एक दुभाषिया है कि एक 'कमांड' तर्क पारित हो जाता है, और संभवतः एक 'पर्यावरण' तर्क लिखना है और आदेश निष्पादित करता है (वातावरण में)। उसके बाद आपके पास एक पार्सर लिखने का विकल्प होता है, जो 'स्क्रिप्ट' स्ट्रिंग लेता है और उसे वैध 'कमांड' ऑब्जेक्ट (यानी बाहरी-डीएसएल) में परिवर्तित करता है; या आप एक लाइब्रेरी प्रदान करते हैं जो उपयोगकर्ताओं को 'कमांड' ऑब्जेक्ट को उसी भाषा में स्पष्ट रूप से बनाने में मदद करता है जो आप उपयोग कर रहे हैं (आंतरिक-डीएसएल)।

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

हालांकि मैं एक छोटी सी डीएसएल पहली बार में अपने हाथ की कोशिश कर रहा सुझाव है, अन्यथा यह सब सिर्फ सिद्धांत-एक किताब भी बहुत कुछ दिलचस्प जब यह प्रासंगिक नहीं है और अपने पिछले अनुभव से व्यावहारिक किया जाता है है।

+0

यदि मैं स्पष्ट नहीं था, तो मेरा सुझाव है: 1. प्रोग्रामिंग के अभ्यास के अध्याय 9 पढ़ें। 2. एक साधारण डीएसएल लागू करने पर अपना हाथ आज़माएं 3. जब आप परेशानी में भाग लेते हैं तो विशिष्ट प्रश्न पूछें 4. प्रोग्रामिंग भाषाओं की अनिवार्यताएं पढ़ें जब आप अपने डीएसएल में सुविधाओं को शामिल करना चाहते हैं जो अधिक 'प्रोग्रामिंग जैसे' हैं, यानी । चर, फ़ंक्शन, स्कोप्स इत्यादि ... – Recurse

+0

मजेदार, मेरे पास उस पुस्तक का पेज 216 अभी खुला है, और मैंने सोचा कि मैं 'नोटेशन' और लेखक के नामों के लिए Google खोज करूंगा और यह आया। मैं इस अध्याय को पढ़ने के लिए बहुत उत्साहित हूं (और मुझे केवल $ 8 के लिए पुस्तक मिल गई है!) – Rob

+0

वाह, मैं रेगेक्स के साथ खेल रहा हूं और (मेरे लिए) पृष्ठ पर एक छोटी सी गलती है। 225 और मैं उनकी इरेटा में नहीं देखता हूं। यदि आप ऐसा कर रहे हैं: grep के लिए कॉल होना चाहिए (grep (argv [1], f, argc> 2? Argv [i]: NULL)> 0)/* नहीं argc> 3 */ – Rob

3

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

+0

मैं निश्चित रूप से स्कैला और ग्रोवी पर एक नज़र डालेगा :) –

0

एक बार मैं openArchitectureware इस्तेमाल किया परिभाषित करने और एक डीएसएल उपयोग करने के लिए। ओएड ग्रहण करने के लिए एक प्लगइन है और अब ग्रहण मॉडलिंग ढांचे का हिस्सा है, लेकिन निश्चित रूप से इसका उपयोग ईएमएफ के बाहर भी किया जा सकता है।

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

और यह एक टेम्पलेट इंजन बहुत आरामदायक है कि यदि आप जावा, एक्सएमएल या अन्य फ़ाइलें autogenerate करने के लिए अपने डीएसएल में लिखित दस्तावेजों का उपयोग करना चाहते प्रदान करता है।

(मैं पुराने oAW यूआरएल लिंक हैं, क्योंकि यह पृष्ठ अभी भी कुछ विवरण और ग्रहण परियोजना पृष्ठों के लिए सभी लिंक प्रदान करता है है)

0

बस एक @Recurse के अलावा।मैं वास्तव में 9 वह करने के लिए बात कर रहे थे अध्याय में regex उदाहरण कर रहा हूँ और जब तक मैं मुख्य समारोह में एक पंक्ति बदल यह काम नहीं किया:

  if (grep(argv[1], f, argc>3 ? argv[i] : NULL) > 0) 

वास्तव में होना चाहिए:

  if (grep(argv[1], f, argc>2 ? argv[i] : NULL) > 0) 

नोटिस argc> 2। यह उसके बाद मेरे लिए काम किया। किताबों इरेटा पर नहीं था (जो इसकी उम्र के बाद आश्चर्यजनक नहीं है)।

हाँ, यह एक किताब का घना लेकिन खजाना ट्रोव है इसलिए मुझे कहना है कि मैं @Recurse से सहमत हूं। ईमानदारी से, यह छात्र के लिए एक समय संवेदनशील किताब है (शायद मैं कुछ साल पहले भ्रमित हो गया होता)।

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