वास्तव में! एक समस्या के लिए एक शक्तिशाली और अभिव्यंजक भाषा का उपयोग क्यों नहीं किया जाता है जो लोगों की तुलना में अधिक जटिल है (शुरू में) लगता है? खासकर जब समस्या का सामना कर रहे लोग पहले से ही ऐसी भाषा के साथ सक्षम हैं। (बिल्डिंग प्रोग्रामर की अपनी समस्या है और प्रोग्रामर द्वारा सबसे अच्छा हल किया गया है।)
मैंने वर्षों पहले खुद से यह सवाल भी पूछा और निर्णय लिया कि जावा बिल्डिंग को परिभाषित करने के लिए एक अच्छी भाषा है, विशेष रूप से जावा प्रोजेक्ट्स के लिए। और, परिणामस्वरूप, मैंने इसके बारे में कुछ करना शुरू कर दिया।
अस्वीकरण : इस उत्तर में मैं इवांट को बढ़ावा दे रहा हूं , एक निर्माण प्रणाली जिसे मैं विकसित कर रहा हूं। लेकिन जब से यह एक राय चर्चा है, मुझे यकीन है कि यह ठीक है।
मैं विशेष रूप से जावा (शक्ति और अभिव्यक्ति) या iwant के लाभों के बारे में विस्तार से नहीं बताऊंगा। यदि आप रुचि रखते हैं, तो आप iwant पृष्ठ पर अधिक पढ़ सकते हैं ।
इसके बजाय मैं इस बात पर विचार करूंगा कि जावा (और अन्य जीपीएल) को निर्माण के लिए अनुपयुक्त के रूप में इतनी आसानी से खारिज क्यों किया जाता है। यहाँ कई उत्तर और टिप्पणियाँ ऐसी सोच के अच्छे उदाहरण हैं। आइए कुछ विशिष्ट तर्कों पर विचार करें:
"जावा अनिवार्य है, लेकिन निर्माणों को एक घोषणात्मक तरीके से परिभाषित किया जाता है" , वे कह सकते हैं।
सच। लेकिन जब आंतरिक डीएसएल के लिए मेटलंगेज के रूप में एक भाषा का उपयोग किया जाता है , तो वास्तव में इसका सिंटैक्स क्या है । यहां तक कि जावा की तरह एक अनिवार्य भाषा जा सकती है, धोखा दिया कथात्मक किया जाना है। यदि यह घोषणात्मक दिखता है और लगता है, तो यह (व्यावहारिक उद्देश्यों के लिए) घोषणात्मक है। उदाहरण के लिए:
JacocoTargetsOfJavaModules.with()
.jacocoWithDeps(jacoco(), modules.asmAll.mainArtifact())
.antJars(TestedIwantDependencies.antJar(),
TestedIwantDependencies.antLauncherJar())
.modules(interestingModules).end().jacocoReport(name)
यह इवांट के डेमो प्रोजेक्ट का एक वास्तविक उदाहरण है ।
वास्तव में, इसकी तुलना कुछ कथित रूप से घोषित निर्माण प्रणालियों से की जाती है जो अपने उपयोगकर्ताओं को "परीक्षण" या "संकलन" के रूप में ऐसी अनिवार्य क्रियाओं के लिए उजागर करते हैं। उपरोक्त घोषणा में केवल संज्ञाएं हैं, कोई क्रिया नहीं। संकलन और परीक्षण वे कार्य हैं, जो उपयोगकर्ता द्वारा उन संज्ञाओं को प्रदान करने के लिए iwant द्वारा संकलित किए गए हैं जो वह चाहता है। यह भाषा नहीं है। यह है कि आप इसका उपयोग कैसे करते हैं।
"जावा क्रिया है"
हाँ, जावा कोड का एक बहुत बाहर क्रिया है। लेकिन फिर, यह भाषा नहीं है, यह है कि आप इसका उपयोग कैसे करते हैं। यदि एक कार्यान्वयन क्रिया है, तो बस इसे एक अच्छा अमूर्त के पीछे संलग्न करें। कई जीपीएल इसके लिए पर्याप्त तंत्र प्रदान करते हैं।
एक्सएमएल में लिखे गए उपरोक्त जावा स्निपेट की कल्पना करें। कोष्ठक को कोष्ठक से बदलें और उन्हें चारों ओर घुमाएँ। और फिर हर कीवर्ड को एक समापन टैग के रूप में डुप्लिकेट करें ! एक के रूप में जावा वाक्य रचना है नहीं वर्बोज़।
(मुझे पता है, एक्सएमएल की तुलना एक बच्चे से कैंडी लेने के समान है, लेकिन इतने सारे बिल्ड सिर्फ एक्सएमएल में परिभाषित होने के लिए होते हैं।)
"आपको अपनी बिल्ड स्क्रिप्ट संकलित करनी होगी"
यह एक मान्य बिंदु है। फिर भी, यह सिर्फ हल करने के लिए एक छोटी सी तकनीकी समस्या है। मैं इसे सेमशेल या कुछ अन्य दुभाषिया का उपयोग करके हल कर सकता था । इसके बजाय, मैंने इसे केवल एक अन्य बिल्ड समस्या के रूप में समझाकर हल किया और एक सरल शेल या चींटी स्क्रिप्ट के साथ iwant को बूटस्ट्रैपिंग किया जो एक सरल जावा बूटस्ट्रैपर को संकलित करता है और चलाता है।
"जावा में बॉयलरप्लेट है"
सच। आपको कक्षाएं आयात करनी होंगी, आपको "सार्वजनिक", "वर्ग" और इसी तरह का उल्लेख करना होगा। और यहां सरल बाहरी DSLs एक प्रारंभिक आसान जीत दर्ज करते हैं।
और अगर आपकी परियोजना इतनी तुच्छ है कि यह बॉयलरप्लेट महत्वपूर्ण है, बधाई हो। आपकी समस्या कठिन नहीं है और यह वास्तव में मायने नहीं रखता कि आप इसे कैसे हल करते हैं।
लेकिन कई परियोजनाओं को संकलन, कवरेज रिपोर्ट और पैकेजिंग की तुलना में बहुत अधिक की आवश्यकता है। यदि जावा का बॉयलरप्लेट ग्राहकों की समस्याओं के लिए स्वीकार्य है, तो समस्याओं का निर्माण क्यों नहीं किया जाता है? केवल दूसरों के बच्चों के लिए जूते क्यों बनाते हैं?