अपाचे ग्रूवी
Groovy Logo | |
| Paradigm | Multi-paradigm: object-oriented, imperative, functional, aspect-oriented, scripting |
|---|---|
| द्वारा डिज़ाइन किया गया | James Strachan |
| Developer | Guillaume Laforge (PMC Chair) Jochen Theodorou (Tech Lead) Paul King Cedric Champeau |
| पहली प्रस्तुति | 2003 |
| Preview release | 4.0.0-beta-1
/ September 6, 2021[1] |
| टाइपिंग अनुशासन | Dynamic, static, strong, duck |
| प्लेटफॉर्म | Java SE |
| लाइसेंस | Apache License 2.0 |
| फ़ाइल नाम एक्सटेंशनएस | .groovy, .gvy, .gy, .gsh[2] |
| Major implementations | |
| Gradle, Grails | |
| Influenced by | |
| Java, Python, Ruby, Smalltalk | |
| Influenced | |
| Kotlin | |
अपाचे ग्रूवी जावा (प्रोग्रामिंग भाषा) - प्लेटफॉर्म के लिए जावा-रचनाक्रम-संगत वस्तु अभिमुखित प्रोग्रामन भाषा है। यह एक स्थिर और गतिशील भाषा दोनों है, जिसमें पायथन (प्रोग्रामिंग भाषा), रूबी (प्रोग्रामिंग भाषा), और स्मॉलटाक जैसी विशेषताएं हैं। इसे जावा प्लेटफॉर्म के लिए प्रोग्रामन भाषा और लिपिबद्धन भाषा दोनों के रूप में उपयोग किया जा सकता है, तथा इसे जावा आभासी मशीन (जेवीएम) बाईटकोड में संकलित किया जा सकता है, और अन्य जावा कोड और पुस्तकालयों (कम्प्यूटिंग) के साथ सहजता से अंतर्संचालन किया जा सकता है। ग्रूवी जावा के समान एक धनु कोष्ठक रचनाक्रम का उपयोग करता है। ग्रूवी संवरक (कंप्यूटर प्रोग्रामिंग), बहु श्रृंखला और श्रृंखला में अंतः स्थापित अभिव्यक्ति का समर्थन करता है। ग्रूवी की अधिकांश शक्ति इसके एएसटी रूपांतरणों में निहित है, जो एनोटेशन (टिप्पणी) के माध्यम से प्रवर्तित होती है।
ग्रूवी 1.0 को 2 जनवरी, 2007 को और ग्रूवी 2.0 को जुलाई, 2012 में प्रकाशित किया गया था। संस्करण 2 के बाद से, ग्रूवी को स्थिर रूप से संकलित किया जा सकता है, जो जावा के निकट प्रकार के अनुमान और प्रदर्शन की पेशकश करता है।[3][4] निर्णायक सॉफ्टवेयर के प्रायोजन के तहत ग्रूवी 2.4 अंतिम प्रमुख प्रकाशन था जो मार्च 2015 में समाप्त हो गया।[5] ग्रूवी ने तब से अपाचे सॉफ्टवेयर संस्था में एक परियोजना प्रबंधन समिति के लिए अपनी शासन संरचना को बदल दिया है।[6]
इतिहास
जेम्स स्ट्रेचन (प्रोग्रामर) ने पहली बार अगस्त 2003 में अपने ब्लॉग पर ग्रूवी के विकास के बारे में बात की थी।[7] मार्च 2004 में, ग्रूवी को, जेसीपी को जेएसआर 241[8] के रूप में प्रस्तुत किया गया और मतपत्र द्वारा स्वीकार किया गया थ। 2004 और 2006 के बीच कई संस्करण प्रकशित किए गए। जावा सामुदायिक प्रक्रिया (जेसीपी) मानकीकरण के प्रयास शुरू होने के बाद, संस्करण क्रमांकन बदल गया, और 1.0 नामक एक संस्करण 2 जनवरी, 2007 को प्रकशित किया गया। 7 अक्टूबर, 2007 को विभिन्न बीटा और प्रकशित उम्मीदवारों की संख्या 1.1 के बाद, ग्रूवी 1.1 अंतिम जारी किया गया था और किए गए कई बदलावों को प्रतिबिंबित करने के लिए तुरंत ग्रूवी 1.5 के रूप में पुन: नामित किया गया था।
2007 में, ग्रूवी ने जेएएक्स 2007 नवीनीकरण पुरस्कार में पहला पुरस्कार जीता।[9] 2008 में, ग्रेल्स, एक ग्रूवी वेब ढांचा, ने जेएएक्स 2008 नवीनीकरण पुरस्कार में दूसरा पुरस्कार जीता।[10]
नवंबर 2008 में, स्प्रिंगसोर्स ने ग्रूवी एंड ग्रेल्स कंपनी (जी2वन) का अधिग्रहण कर लिया।[11] अगस्त 2009 में वीएमवेयर ने स्प्रिंगसोर्स का अधिग्रहण किया।[12]
अप्रैल 2012 में, आठ साल की निष्क्रियता के बाद, स्पेक लीड ने जेएसआर 241 की स्थिति को निष्क्रिय कर दिया।[8]
2007 में ग्रूवी 1.0 प्रकशित होने से एक साल पहले स्ट्रेचन ने इस परियोजना को चुपचाप छोड़ दिया था।।[citation needed] अक्टूबर 2016 में, स्ट्रेचन ने कहा कि मुझे अभी भी ग्रूवी (जेनकींस पाइपलाइन बहुत ग्रूवी हैं!), जावा, गो, टाइपप्रति और कोटलिन से प्यार है।[13]
2 जुलाई 2012 को, ग्रूवी 2.0 प्रकशित किया गया था, जिसमें अन्य नई सुविधाओं के साथ, स्थिर संकलन और स्थिर प्रकार की जाँच सम्मिलित थी।
जब अप्रैल 2013 में ईएमसी संस्था (ईएमसी) और वीएमवेयर द्वारा निर्णायक सॉफ्टवेयर संयुक्त उद्यम को अलग कर दिया गया, तो ग्रूवी और ग्रेल्स ने इसके उत्पाद पोर्टफोलियो का हिस्सा बना लिया। निर्णायक ने अप्रैल 2015 से ग्रूवी और ग्रेल्स को प्रायोजित करना बंद कर दिया।[5] उसी महीने, ग्रूवी ने अपने ऊष्मायित्र के माध्यम से अपाचे सॉफ्टवेयर संस्था में कोडहॉस संग्रहालय से परियोजना प्रबंधन समिति (पीएमसी) में अपनी शासन संरचना को बदल दिया।[6] ग्रूवी ने अपाचे के ऊष्मायित्र से स्नातक किया और नवंबर 2015 में एक शीर्ष-स्तरीय परियोजना बन गई।[14]
विशेषताएं
अधिकांश मान्य जावा फ़ाइलें भी मान्य ग्रूवी फ़ाइलें हैं। हालाँकि दो भाषाएँ समान हैं, ग्रूवी कोड अधिक संक्षिप्त हो सकता है, क्योंकि इसमें उन सभी अवयवो की आवश्यकता नहीं होती है जिनकी जावा को आवश्यकता होती है।[15] यह जावा प्रोग्रामर्स के लिए ग्रूवी कार्यरचना मुहावरों को प्राप्त करने से पहले परिचित जावा रचनाक्रम के साथ धीरे-धीरे ग्रूवी सीखना संभव बनाता है।[16]
जावा में उपलब्ध ग्रूवी सुविधाओं में स्थिर और गतिशील टाइपिंग (कीवर्ड डीईएफ़ के साथ) दोनों शामिल हैं def), ऑपरेटर ओवरलोडिंग, सूचियों और साहचर्य सरणियों (मानचित्रों) के लिए मूल समर्थन, नियमित अभिव्यक्तियों के लिए मूल समर्थन, बहुरूपी पुनरावृत्ति, स्ट्रिंग इंटरपोलेशन, अतिरिक्त सहायक तरीके और सुरक्षित नेविगेशन ऑपरेटर ?. नल पॉइंटर्स के लिए स्वचालित रूप से जाँच करने के लिए (उदाहरण के लिए, variable?.method(), या variable?.field).[17]
चूंकि संस्करण 2 ग्रूवी मॉड्यूलरिटी का भी समर्थन करता है (प्रोजेक्ट की जरूरतों के अनुसार केवल आवश्यक जार को शिप करने में सक्षम होने के कारण, इस प्रकार ग्रूवी की लाइब्रेरी के आकार को कम करता है), टाइप चेकिंग, स्टैटिक कंपाइलिंग, प्रोजेक्ट कॉइन सिंटैक्स एन्हांसमेंट, जावा सिंटैक्स # कोड ब्लॉक और चल रहे प्रदर्शन संवर्द्धन का उपयोग कर invokedynamic निर्देश जावा संस्करण के इतिहास में पेश किया गया#Java SE 7.[18]
ग्रूवी विभिन्न मार्कअप भाषाओं जैसे XML और HTML के लिए मूल समर्थन प्रदान करता है, जो एक इनलाइन दस्तावेज़ वस्तु मॉडल (DOM) सिंटैक्स के माध्यम से पूरा किया जाता है। यह सुविधा एक समान और संक्षिप्त सिंटैक्स और प्रोग्रामिंग पद्धति के साथ कई प्रकार की विषम डेटा संपत्तियों की परिभाषा और हेरफेर को सक्षम बनाती है।[citation needed]
जावा के विपरीत, एक ग्रूवी स्रोत कोड फ़ाइल को एक (असंकलित) स्क्रिप्टिंग भाषा के रूप में निष्पादित किया जा सकता है, यदि इसमें किसी भी वर्ग परिभाषा के बाहर कोड शामिल है, यदि यह मुख्य विधि वाला वर्ग है, या यदि यह रननेबल या ग्रूवीटेस्टकेस है। एक ग्रूवी स्क्रिप्ट पूरी तरह से पार्स, संकलित और निष्पादित करने से पहले उत्पन्न होती है (पायथन और रूबी के समान)। यह हुड के नीचे होता है, और संकलित संस्करण को प्रक्रिया के आर्टिफैक्ट के रूप में सहेजा नहीं जाता है।[19]
ग्रूवीबीन्स, गुण
ग्रूवीबीन्स जावाबीन्स का ग्रूवी का संस्करण है। ग्रूवी निहित रूप से ग्राही और सुरेखक उत्पन्न करता है। निम्नलिखित कोड में, सेटकोलर (स्ट्रिंग कलर) तथा गेटकलर() निहित रूप से उत्पन्न होते हैं। अंतिम दो पंक्तियाँ, जो सीधे रंग तक पहुँचती दिखाई देती हैं, वास्तव में निहित रूप से उत्पन्न विधियों को बुला रही हैं।[20]
क्लास एग्रूवीबीन {
तार का रंग
}
डिफ माई ग्रूवीBean = नया Aग्रूवीBean ()
myग्रूवीBean.setColor ('बेबी ब्लू') जोर myग्रूवीBean.getColor() == 'बेबी ब्लू'
myग्रूवीBean.color = 'पेवर' जोर myग्रूवीBean.color == 'पेवर' </वाक्यविन्यास हाइलाइट>
ग्रूवी सूची और मानचित्रों को संभालने के लिए सरल, सुसंगत सिंटैक्स प्रदान करता है, जो जावा के सरणी सिंटैक्स की याद दिलाता है।[21] <वाक्यविन्यास लैंग = ग्रूवी> def MovieList = ['देर्सु उजाला', 'रैन', 'सात समुराई'] // एक सरणी की तरह दिखता है, लेकिन एक सूची है Assert MovieList[2] == 'सात समुराई' मूवीलिस्ट [3] = 'कैसाब्लांका' // सूची में एक तत्व जोड़ता है Assert MovieList.size() == 4
डीईएफ़ मंथ मैप = [ 'जनवरी' : 31, 'फ़रवरी' : 28, 'मार्च' : 31] // मैप डिक्लेयर करता है महीने का नक्शा ['मार्च'] == 31 // एक प्रविष्टि तक पहुँचता है महीनामैप ['अप्रैल'] = 30 // मानचित्र में एक प्रविष्टि जोड़ता है महीने का नक्शा। आकार () == 4 पर जोर दें </वाक्यविन्यास हाइलाइट>
प्रोटोटाइप एक्सटेंशन
ग्रूवी प्रोटोटाइप-आधारित प्रोग्रामिंग के लिए समर्थन प्रदान करता है ExpandoMetaClass, एक्सटेंशन मॉड्यूल (केवल ग्रूवी 2 में), ऑब्जेक्टिव-सी-जैसे ऑब्जेक्टिव-सी#श्रेणियां और DelegatingMetaClass.[22]
ExpandoMetaClass रूबी (प्रोग्रामिंग लैंग्वेज) के समान आसानी से कक्षा में परिवर्तन को व्यक्त करने के लिए एक डोमेन-विशिष्ट भाषा (डीएसएल) प्रदान करता है। रूबी की ओपन क्लास अवधारणा:
<वाक्यविन्यास लैंग = ग्रूवी> संख्या.मेटाक्लास {
sqrt = {गणित.sqrt (प्रतिनिधि)}
}
जोर दें 9.sqrt() == 3 जोर दें 4.sqrt() == 2 </वाक्यविन्यास हाइलाइट>
प्रोटोटाइप के माध्यम से कोड में ग्रूवी के परिवर्तन जावा में दिखाई नहीं दे रहे हैं, क्योंकि ग्रूवी में प्रत्येक विशेषता/विधि आमंत्रण मेटाक्लास रजिस्ट्री के माध्यम से जाता है। परिवर्तित कोड को केवल जावा से मेटाक्लास रजिस्ट्री में जाकर एक्सेस किया जा सकता है।
ग्रूवी भी ओवरराइडिंग विधियों की अनुमति देता है getProperty(), propertyMissing() दूसरों के बीच में, डेवलपर को किसी ऑब्जेक्ट पर कॉल को इंटरसेप्ट करने और उनके लिए एक क्रिया निर्दिष्ट करने में सक्षम बनाता है, एक सरल पहलू-उन्मुख प्रोग्रामिंग|पहलू-उन्मुख तरीके से। निम्न कोड वर्ग को सक्षम बनाता है java.lang.String जवाब देने के लिए hex संपत्ति:
<वाक्यविन्यास लैंग = ग्रूवी> एनम रंग {
काला ('#000000'), सफेद ('#FFFFFF'), लाल ('#FF0000'), नीला ('#0000FF')
स्ट्रिंग हेक्स
रंग (स्ट्रिंग हेक्स) {
यह.हेक्स = हेक्स
}
}
String.metaClass.getProperty = {स्ट्रिंग संपत्ति ->
def stringColor = प्रतिनिधि
अगर (संपत्ति == 'हेक्स') {
Color.values().ढूंढें {it.name().equalsIgnoreCase stringColor}?.hex
}
}
जोर सफेद। हेक्स == #FFFFFF जोर नीला .hex == #0000FF जोर काला .hex == #000000 हरे रंग का जोर दें। हेक्स == अशक्त </वाक्यविन्यास हाइलाइट>
ग्रेल्स फ्रेमवर्क व्यापक रूप से ग्रेल्स (ढांचे) को सक्षम करने के लिए मेटाप्रोग्रामिंग का उपयोग करता है # दृढ़ता गतिशील खोजकर्ता, जैसे User.findByName('Josh') और दूसरे।[23]
डॉट और कोष्ठक
ग्रूवी का सिंटैक्स कुछ स्थितियों में कोष्ठकों और बिंदुओं को छोड़ने की अनुमति देता है। निम्नलिखित ग्रूवी कोड
<वाक्यविन्यास लैंग = ग्रूवी> (कॉफी) .साथ (चीनी, दूध) .और (शराब) लें </वाक्यविन्यास हाइलाइट>
रूप में लिखा जा सकता है
<वाक्यविन्यास लैंग = ग्रूवी> चीनी, दूध और शराब के साथ कॉफी लें </वाक्यविन्यास हाइलाइट>
डोमेन-विशिष्ट भाषाओं (डीएसएल) के विकास को सक्षम करना जो सादे अंग्रेजी की तरह दिखती हैं।
कार्यात्मक प्रोग्रामिंग
हालाँकि ग्रूवी ज्यादातर एक वस्तु-उन्मुख भाषा है, यह कार्यात्मक प्रोग्रामिंग सुविधाएँ भी प्रदान करती है।
क्लोजर
ग्रूवी के दस्तावेज़ीकरण के मुताबिक: ग्रूवी में क्लोजर एक 'विधि सूचक' के समान काम करता है, जिससे कोड को बाद के समय में लिखा जा सकता है और चलाया जा सकता है।[24] ग्रूवी के क्लोजर फ्री वेरिएबल्स का समर्थन करते हैं, यानी वैरिएबल जिन्हें स्पष्ट रूप से पैरामीटर के रूप में पारित नहीं किया गया है, लेकिन इसके घोषणा संदर्भ में मौजूद है, आंशिक अनुप्रयोग (यह 'करी' शब्द है)[25]), प्रतिनिधिमंडल, अंतर्निहित, टाइप किए गए और अनटाइप किए गए पैरामीटर।
एक निर्धारित प्रकार के संग्रह पर काम करते समय, संग्रह पर एक ऑपरेशन को बंद करने का अनुमान लगाया जा सकता है:
<वाक्यविन्यास लैंग = ग्रूवी> सूची = [1, 2, 3, 4, 5, 6, 7, 8, 9]
/*
* गैर-शून्य संख्याओं को सत्य के लिए मजबूर किया जाता है, इसलिए जब यह% 2 == 0 (सम) होता है, तो यह असत्य होता है।
* निहित आईटी पैरामीटर के प्रकार को आईडीई द्वारा पूर्णांक के रूप में अनुमान लगाया जा सकता है।
* इसे इस प्रकार भी लिखा जा सकता है:
* list.findAll {पूर्णांक i -> i% 2}
* list.findAll {i -> i% 2}
*/
def बाधाओं = list.findAll {यह% 2}
बाधाओं पर जोर दें == [1, 3, 5, 7, 9] </वाक्यविन्यास हाइलाइट>
अभिव्यक्तियों के एक समूह को कार्यान्वयन के संदर्भ के बिना क्लोजर ब्लॉक में लिखा जा सकता है और प्रतिसाद देने वाली वस्तु को प्रतिनिधिमंडल का उपयोग करके बाद के बिंदु पर असाइन किया जा सकता है:
<वाक्यविन्यास लैंग = ग्रूवी> // कोड के इस ब्लॉक में कार्यान्वयन के संदर्भ के बिना भाव शामिल हैं डीईएफ़ ऑपरेशन = {
घोषित 5 योग 4 विभाजित करना 3 प्रिंट
} </वाक्यविन्यास हाइलाइट> <वाक्यविन्यास लैंग = ग्रूवी> /*
* यह क्लास उन ऑपरेशंस को हैंडल करेगी जिनका इस्तेमाल ऊपर क्लोजर में किया जा सकता है। एक और वर्ग * को एक ही तरीके से घोषित किया जा सकता है, लेकिन उदाहरण के लिए, webservice संचालन का उपयोग करना * हिसाब में। */
वर्ग अभिव्यक्ति {
बिगडेसिमल मान
/*
* हालांकि एक पूर्णांक को एक पैरामीटर के रूप में पारित किया जाता है, यह एक बिगडिसीमल में ज़ब्त किया जाता है, जैसा कि था
* परिभाषित। यदि कक्षा में 'घोषित (पूर्णांक मान)' विधि होती है, तो इसका उपयोग इसके बजाय किया जाएगा।
*/
डिफ डिक्लेयर (बिगडिसीमल वैल्यू) {
यह मूल्य = मूल्य
}
डीईएफ़ योग (बिगडिसीमल वैल्यू टू ऐड) {
this.value += valueToAdd
}
डिफ डिवाइड (बिगडिसीमल डिवाइडर) {
this.value /= भाजक
}
def संपत्ति गुम (स्ट्रिंग संपत्ति) {
अगर (संपत्ति == प्रिंट) प्रिंटलाइन मूल्य
}
} </वाक्यविन्यास हाइलाइट> <वाक्यविन्यास लैंग = ग्रूवी> // यहां परिभाषित किया गया है कि उपरोक्त कोड के ब्लॉक में भावों का जवाब कौन देगा। संचालन.प्रतिनिधि = नई अभिव्यक्ति () संचालन () </वाक्यविन्यास हाइलाइट>
करी
आमतौर पर आंशिक आवेदन कहा जाता है,[25] यह ग्रूवी फीचर क्लोजर के मापदंडों को उनके किसी भी तर्क में व्यतिक्रम मापदंडों पर सेट करने की अनुमति देता है, जिससे बाउंड वैल्यू के साथ एक नया क्लोजर बनता है।curry() विधि में एक तर्क देने से तर्क एक ठीक हो जाएगा। । एन तर्क देने से तर्क 1 ठीक हो जाएगा ... एन।
def joinTwoWordsWithSymbol = { symbol, first, second -> first + symbol + second } assert joinTwoWordsWithSymbol('#', 'Hello', 'World') == 'Hello#World' def concatWords = joinTwoWordsWithSymbol.curry(' ') assert concatWords('Hello', 'World') == 'Hello World' def prependHello = concatWords.curry('Hello') //def prependHello = joinTwoWordsWithSymbol.curry(' ', 'Hello') assert prependHello('World') == 'Hello World'
करी का उपयोग rcurry () का उपयोग करके विपरीत दिशा (अंतिम N तर्कों को ठीक करते हुए) में भी किया जा सकता है।
def power = { BigDecimal value, BigDecimal power -> value**power } def square = power.rcurry(2) def cube = power.rcurry(3) assert power(2, 2) == 4 assert square(4) == 16 assert cube(3) == 27
ग्रूवी दूसरों के बीच अनुयोगी मूल्यांकन[26][27] ,कम/गुना,[28] अनंत संरचना और अपरिवर्तनीयता[29] का भी समर्थन करता है।[30]
JSON और XML प्रसंस्करण
जावास्क्रिप्ट ऑब्जेक्ट नोटेशन (JSON) और XML प्रसंस्करण पर, ग्रूवी बिल्डर पैटर्न को नियोजित करता है, जिससे डेटा संरचना का उत्पादन कम वर्बोज़ हो जाता है। उदाहरण के लिए, निम्नलिखित एक्सएमएल,
<languages>
<language year="1995">
<name>Java</name>
<paradigm>object oriented</paradigm>
<typing>static</typing>
</language>
<language year="1995">
<name>Ruby</name>
<paradigm>functional, object oriented</paradigm>
<typing>duck typing, dynamic</typing>
</language>
<language year="2003">
<name>Groovy</name>
<paradigm>functional, object oriented</paradigm>
<typing>duck typing, dynamic, static</typing>
</language>
</languages>
निम्नलिखित ग्रूवी कोड के माध्यम से उत्पन्न किया जा सकता है,
def writer = new StringWriter()
def builder = new groovy.xml.MarkupBuilder(writer)
builder.languages {
language(year: 1995) {
name "Java"
paradigm "object oriented"
typing "static"
}
language (year: 1995) {
name "Ruby"
paradigm "functional, object oriented"
typing "duck typing, dynamic"
}
language (year: 2003) {
name "Groovy"
paradigm "functional, object oriented"
typing "duck typing, dynamic, static"
}
}
और स्ट्रीमिंगमार्कअपबिल्डर के माध्यम से स्ट्रीमिंग तरीके से भी संसाधित किया जा सकता है। जेएसओएन में कार्यान्वयन को बदलने के लिए, मार्कअपबिल्डर को जेसनबिल्डर में बदल दिया जा सकता है।[31]
def languages = new XmlSlurper().parseText writer.toString()
// Here is employed Groovy's regex syntax for a matcher (=~) that will be coerced to a
// boolean value: either true, if the value contains our string, or false otherwise.
def functional = languages.language.findAll { it.paradigm =~ "functional" }
assert functional.collect { it.name } == ["Groovy", "Ruby"]
स्ट्रिंग प्रक्षेप
ग्रूवी में, Gस्ट्रिंग का उपयोग करके स्ट्रिंग्स को वेरिएबल्स और एक्सप्रेशंस के साथ इंटरपोलेट किया जा सकता है[32]
BigDecimal account = 10.0 def text = "The account shows currently a balance of $account" assert text == "The account shows currently a balance of 10.0"
वेरिएबल्स और एक्सप्रेशन वाले Gस्ट्रिंग को दोहरे उद्धरण चिह्नों का उपयोग करके घोषित किया जाना चाहिए।
एक जटिल अभिव्यक्ति को घुंघराले ब्रैकेट में संलग्न किया जाना चाहिए। यह इसके कुछ हिस्सों को अभिव्यक्ति के बजाय आस-पास की स्ट्रिंग से संबंधित होने से रोकता है,
BigDecimal minus = 4.0
text = "The account shows currently a balance of ${account - minus}"
assert text == "The account shows currently a balance of 6.0"
// Without the brackets to isolate the expression, this would result:
text = "The account shows currently a balance of $account - minus"
assert text == "The account shows currently a balance of 10.0 - minus"
एरो सिंटैक्स को नियोजित करके अभिव्यक्ति मूल्यांकन को स्थगित किया जा सकता है,
BigDecimal tax = 0.15
text = "The account shows currently a balance of ${->account - account*tax}"
tax = 0.10
// The tax value was changed AFTER declaration of the GString. The expression
// variables are bound only when the expression must actually be evaluated:
assert text == "The account shows currently a balance of 9.000"
सार वाक्य रचना वृक्ष परिवर्तन
ग्रूवी के स्वयं के प्रलेखन के अनुसार, जब ग्रूवी कंपाइलर ग्रूवी स्क्रिप्ट और कक्षाओं को संकलित करता है, तो प्रक्रिया के किसी बिंदु पर, स्रोत कोड को कंक्रीट सिंटैक्स ट्री के रूप में मेमोरी में प्रदर्शित किया जाएगा, फिर एक सार सिंटैक्स ट्री में बदल दिया जाएगा। एएसटी ट्रांसफ़ॉर्मेशन का उद्देश्य डेवलपर्स को एएसटी को संशोधित करने में सक्षम होने के लिए संकलन प्रक्रिया में हुक करने देना है, जो कि जेवीएम द्वारा चलाए जाने वाले बायटेकोड में बदल जाएगा। एएसटी ट्रांसफॉर्मेशन ग्रूवी को बेहतर संकलन-समय मेटाप्रोग्रामिंग क्षमताओं के साथ प्रदान करता है, जिससे रनटाइम प्रदर्शन दंड के बिना भाषा स्तर पर शक्तिशाली लचीलेपन की अनुमति मिलती है।[33]
ग्रूवी में एएसटी के उदाहरण हैं,
- श्रेणी और मिक्सिन परिवर्तन
- अपरिवर्तनीय एएसटी मैक्रो
- परिवर्तन को नया रूप दें
- सिंगलटन परिवर्तन
दूसरों के बीच में।
विशेषताएँ
ग्रूवी के प्रलेखन के अनुसार, विशेषता भाषा का एक संरचनात्मक निर्माण है जो अनुमति देता है व्यवहारों की संरचना, अंतरापृष्ठ के कार्यावधि कार्यान्वयन, व्यवहार अध्यारोही, और स्थिर प्रकार की जांच/संकलन के साथ संगतता।
लक्षणों को व्यतिक्रम कार्यान्वयन और स्थिति दोनों को ले जाने वाले अंतरापृष्ठ के रूप में देखा जा सकता है। विशेषता कीवर्ड का उपयोग करके एक विशेषता को परिभाषित किया गया है,
trait FlyingAbility { /* declaration of a trait */
String fly() { "I'm flying!" } /* declaration of a method inside a trait */
फिर, इसे कीवर्ड उपकरण का उपयोग करके एक सामान्य अंतरापृष्ठ की तरह इस्तेमाल किया जा सकता है,
class Bird implements FlyingAbility {} /* Adds the trait FlyingAbility to the Bird class capabilities */
def bird = new Bird() /* instantiate a new Bird */
assert bird.fly() == "I'm flying!" /* the Bird class automatically gets the behavior of the FlyingAbility trait */
लक्षण सरल संरचना से परीक्षण तक क्षमताओं की एक विस्तृत श्रृंखला की अनुमति देते हैं।
अभिग्रहण
ग्रूवी अभिग्रहण के उल्लेखनीय उदाहरणों में शामिल हैं,
- एडैप्टाविस्ट स्क्रिप्टरनर, दुनिया भर के 20000 से अधिक संगठनों द्वारा उपयोग किए जाने वाले एटलसियन टूल्स को स्वचालित और विस्तारित करने के लिए ग्रूवी कार्यान्वयन को एम्बेड करता है।[34][35]
- Apache OFBiz, खुला स्रोत उद्यम संसाधन योजना (ईआरपी) प्रणाली, ग्रूवी का उपयोग करता है।[36][37]
- नीलगिरी , एक क्लाउड प्रबंधन प्रणाली, ग्रूवी की एक महत्वपूर्ण मात्रा का उपयोग करती है।
- ग्रेडल ग्रूवी का उपयोग करके एक लोकप्रिय बिल्ड ऑटोमेशन टूल है।
- लिंक्डइन अपने कुछ उप-प्रणालियों के लिए ग्रूवी और ग्रेल्स का उपयोग करता है।[38]
- लॉजिकमॉनिटर, एक क्लाउड-आधारित निगरानी प्लेटफ़ॉर्म, स्क्रिप्ट-आधारित डेटा स्रोतों में ग्रूवी का उपयोग करता है।[39]
- जेनकिंस, निरंतर एकीकरण के लिए एक मंच। संस्करण 2 के साथ, जेनकींस में एक पाइपलाइन प्लगइन शामिल है जो ग्रूवी में लिखे जाने वाले निर्देशों के निर्माण की अनुमति देता है।[40]
- लिफ़ेरे,उनके कलियो कार्य प्रगति में ग्रूवी का उपयोग करता है
- बड़े पैमाने पर ऑनलाइन मीडिया सामग्री प्रदान करने के लिए Sky.com ग्रूवी और ग्रेल्स का उपयोग करता है।[41]
- SmartThings, स्मार्ट घरों और उपभोक्ता चीजों की इंटरनेट के लिए एक खुला मंच, ग्रूवी के सुरक्षा-उन्मुख सबसेट का उपयोग करता है[42]
- सोपूआई ग्रूवी को वेबसर्विस परीक्षण विकास के लिए एक भाषा के रूप में प्रदान करता है।[43]
- सुरवता, एक बाजार अनुसंधान उद्घाटन,, ग्रूवी और ग्रेल्स का उपयोग करता है।[citation needed]
- यूरोपीय पेटेंट कार्यालय (ईपीओ) ने प्रत्येक देश के पेटेंट कार्यालय के साथ संचार करने के लिए प्रक्रियाओं में समानता का लाभ उठाने और उन्हें एक एकल, सार्वभौमिक प्रक्रिया में बदलने के लिए ग्रूवी में एक डेटा प्रवाह कार्यरचना भाषा विकसित की।[citation needed]
- हालांकि ग्रूवी को किसी भी जेवीएम वातावरण में एकीकृत किया जा सकता है, JBoss सीम फ्रेमवर्क ग्रूवी को जावा के अलावा, एक विकास भाषा के रूप में, बॉक्स से बाहर प्रदान करता है।[44]
- vCalc.com अपने गणित क्राउड-सोर्सिंग इंजन में सभी उपयोगकर्ता परिभाषित गणित के लिए ग्रूवी का उपयोग करता है।[45]
- Wired.com वेबसाइट के उत्पाद समीक्षा स्टैंडअलोन अनुभाग के लिए ग्रूवी और ग्रेल्स का उपयोग करता है।[46]
- XWiki SAS अपने सहयोगी खुला स्त्रोत उत्पाद में ग्रूवी को स्क्रिप्टिंग भाषा के रूप में उपयोग करता है।[47]
आईडीई समर्थन
कई एकीकृत विकास वातावरण (आईडीई) और पाठ संपादक ग्रूवी का समर्थन करते हैं,
- एंड्रॉइड स्टूडियो, आईडीई का उपयोग एंड्रॉइड ऐप बनाने के लिए किया जाता है
- परमाणु संपादक
- ग्रहण , ग्रूवी-ग्रहण के माध्यम से
- ईमैकस, ग्रूवी-ईमैकस-मोड प्रक्षेपण के ग्रूवी-मोड का उपयोग करते हुए।
- IntelliJ IDEA, सामुदायिक संस्करण, ग्रेल्स/Griffon केवल अल्टीमेट एडिशन में
- JDeveloper, Oracle ADF के साथ प्रयोग के लिए
- jEdit, जावा प्लेटफॉर्म के लिए एक उन्नत पाठ संपादक
- केडीई के लिए एक उन्नत पाठ संपादक केट ग्रूवी और 200 से अधिक अन्य फ़ाइल स्वरूपों का समर्थन करता है
- NetBeans, संस्करण 6.5 के बाद से
- नोटपैड++ ++, माइक्रोसॉफ़्ट विंडोज़ के लिए एक उन्नत पाठ संपादक
- उदात्त पाठ, एक संकरीकरण प्लेटफॉर्म पाठ संपादक
- टेक्स्टमैट
- दृष्टि स्टूडियो कोड
- अल्ट्राएडिट, सामान्य प्रयोजन प्रोग्राम संपादक
उपभाषा
ग्रूवी का एक वैकल्पिक कार्यान्वयन है,
- ग्रूस्क्रिप्ट ग्रूवी कोड को जावास्क्रिप्ट कोड में परिवर्तित करता है।[48] हालाँकि अपाचे ग्रूवी की तुलना में ग्रूस्क्रिप्ट की कुछ सीमाएँ हैं, यह परिवेषक और ग्राहक दोनों में प्रक्षेत्र कक्षाओ का उपयोग कर सकता है।[49] ग्रेल्स संस्करण 3.0 के लिए प्लगइन समर्थन प्रदान किया गया है, साथ ही ऑनलाइन कोड रूपांतरण भी प्रदान किया गया है।[50]
यह भी देखें
- प्रोग्रामिंग भाषाओं की तुलना
- ग्रिफॉन (संरचना) - एक डेस्कटॉप संरचना
- जीरो प्रक्षेपण
- स्पॉक (परीक्षण संरचना)