أباتشي غروفي

أباتشي جروفي هي لغة برمجة كائنية التوجه متوافقة مع بنية جافا ، مصممة لمنصة جافا. وهي لغة ثابتة وديناميكية في آنٍ واحد، تتميز بخصائص مشابهة للغات بايثون وروبي وسمول توك . يمكن استخدامها كلغة برمجة ولغة نصية لمنصة جافا ، ويتم تجميعها إلى بايت كود آلة جافا الافتراضية (JVM) ، وتتكامل بسلاسة مع أكواد ومكتبات جافا الأخرى . تستخدم جروفي بنية أقواس معقوفة مشابهة لبنية جافا. تدعم جروفي الدوال المغلقة ، والسلاسل النصية متعددة الأسطر، والتعبيرات المضمنة في السلاسل النصية . يكمن جزء كبير من قوة جروفي في تحويلات شجرة بناء الجملة المجردة (AST)، التي يتم تفعيلها من خلال التعليقات التوضيحية.

صدرت Groovy 1.0 في 2 يناير 2007، وGroovy 2.0 في يوليو 2012. ومنذ الإصدار الثاني، أصبح بالإمكان تجميع Groovy بشكل ثابت ، مما يوفر استنتاجًا للأنواع وأداءً قريبًا من أداء Java. [ 3 ] [ 4 ] وكان Groovy 2.4 آخر إصدار رئيسي برعاية Pivotal Software ، والتي انتهت في مارس 2015. [ 5 ] ومنذ ذلك الحين، غيّرت Groovy هيكل إدارتها إلى لجنة إدارة مشاريع تابعة لمؤسسة Apache Software Foundation . [ 6 ]

تاريخ

تحدث جيمس ستراشان لأول مرة عن تطوير لغة Groovy على مدونته في أغسطس 2003. [ 7 ] في مارس 2004، قُدِّمت Groovy إلى عملية مجتمع جافا (JCP) تحت مسمى JSR 241 [ 8 ] وتم قبولها بالتصويت. صدرت عدة إصدارات بين عامي 2004 و2006. بعد بدء جهود التقييس في JCP، تغير ترقيم الإصدارات، وصدر إصدار باسم "1.0" في 2 يناير 2007. بعد عدة إصدارات تجريبية ومرشحة للإصدار تحمل الرقم 1.1، في 7 ديسمبر 2007، صدر Groovy 1.1 النهائي وأُعيد ترقيمه فورًا إلى Groovy 1.5 ليعكس التغييرات العديدة التي أُجريت.

في عام 2007، فازت لغة Groovy بالجائزة الأولى في جوائز الابتكار JAX 2007. [ 9 ] وفي عام 2008، فاز إطار عمل Grails ، وهو إطار عمل ويب مبني على لغة Groovy ، بالجائزة الثانية في جوائز الابتكار JAX 2008. [ 10 ]

في نوفمبر 2008، استحوذت شركة SpringSource على شركة Groovy and Grails (G2One). [ 11 ] وفي أغسطس 2009، استحوذت شركة VMware على SpringSource. [ 12 ]

في أبريل 2012، وبعد ثماني سنوات من عدم النشاط، قام قائد المواصفات بتغيير حالة JSR 241 إلى حالة خمول. [ 8 ]

غادر ستراشان المشروع بهدوء قبل عام من إصدار Groovy 1.0 في عام 2007. وفي أكتوبر 2016، صرّح ستراشان قائلاً: "ما زلتُ أحب Groovy (خطوط أنابيب Jenkins رائعة للغاية!)، وJava، وGo، وTypeScript، وKotlin". [ 13 ]

في 2 يوليو 2012، تم إصدار Groovy 2.0، والذي أضاف، من بين ميزات جديدة أخرى، التجميع الثابت والتحقق من النوع الثابت .

عندما انفصلت شركة Pivotal Software، وهي مشروع مشترك بين شركتي EMC وVMware، في أبريل 2013، أصبحت Groovy وGrails جزءًا من محفظة منتجاتها. توقفت Pivotal عن رعاية Groovy وGrails اعتبارًا من أبريل 2015. [ 5 ] في الشهر نفسه، غيّرت Groovy هيكل إدارتها من مستودع Codehaus إلى لجنة إدارة المشاريع (PMC) في مؤسسة Apache Software Foundation عبر حاضنتها. [ 6 ] تخرجت Groovy من حاضنة Apache وأصبحت مشروعًا رئيسيًا في نوفمبر 2015. [ 14 ]

في 7 فبراير 2020، تم إصدار Groovy 3.0. [ 15 ] وتم إصدار الإصدار 4.0 في 25 يناير 2022. [ 16 ]

سمات

معظم ملفات جافا الصالحة هي أيضًا ملفات جروفي صالحة. على الرغم من تشابه اللغتين، إلا أن كود جروفي يتميز بصغر حجمه، لأنه لا يحتاج إلى جميع العناصر التي تحتاجها جافا. [ 17 ] وهذا يُمكّن مبرمجي جافا من تعلم جروفي تدريجيًا بالبدء بقواعد جافا المألوفة قبل اكتساب المزيد من أساليب برمجة جروفي . [ 18 ]

تتضمن ميزات Groovy غير المتوفرة في Java كلاً من الكتابة الثابتة والديناميكية (باستخدام الكلمة المفتاحية defوتحميل المعاملات الزائد ، والصيغة الأصلية للقوائم والمصفوفات الترابطية (الخرائط)، والدعم الأصلي للتعبيرات النمطية ، والتكرار متعدد الأشكال، واستيفاء السلاسل النصية ، وأساليب مساعدة إضافية، ومعامل التنقل الآمن?. للتحقق تلقائيًا من المؤشرات الفارغة (على سبيل المثال، variable?.method()أو variable?.field). [ 19 ]

منذ الإصدار 2، يدعم Groovy أيضًا النمطية (شحن فقط jars التي يستخدمها المشروع، مما يقلل من حجم مكتبة Groovy)، والتحقق من النوع، والترجمة الثابتة، وتحسينات بناء جملة Project Coin، وكتل multicatch ، وتحسينات الأداء المستمرة باستخدام invokedynamicالتعليمات التي تم تقديمها في Java 7. [ 20 ]

يدعم Groovy لغات الترميز مثل XML و HTML بشكل أصلي باستخدام بنية نموذج كائن المستند (DOM) المضمنة. تُمكّن هذه الميزة من تعريف ومعالجة أنواع عديدة من أصول البيانات غير المتجانسة باستخدام بنية موحدة وموجزة ومنهجية برمجة موحدة.

على عكس جافا، يمكن تنفيذ ملف كود مصدر Groovy كبرنامج نصي (غير مُجمَّع) إذا احتوى على كود خارج تعريف أي فئة، أو إذا كان فئة تحتوي على دالة رئيسية ، أو إذا كان Runnable أو GroovyTestCase . يتم تحليل برنامج Groovy النصي وتجميعه وتوليده بالكامل قبل تنفيذه (على غرار بايثون وروبي). يحدث هذا في الخلفية، ولا يتم حفظ النسخة المُجمَّعة كمنتج ثانوي للعملية. [ 21 ]

خصائص GroovyBeans

GroovyBeans هي نسخة Groovy من JavaBeans . تُنشئ Groovy ضمنيًا دوال الوصول والتعديل (getters and setters). في الكود التالي، يتم إنشاء `color` setColor(String color)و` getColor()color` ضمنيًا. السطران الأخيران، اللذان يبدو أنهما يصلان إلى اللون مباشرةً، يستدعيان في الواقع الدوال المُنشأة ضمنيًا. [ 22 ]

class AGroovyBean { String color }def myGroovyBean = new AGroovyBean ()myGroovyBean.setColor ( ' baby blue' ) assert myGroovyBean.getColor ( ) == ' baby blue'myGroovyBean.color = ' pewter ' assert myGroovyBean.color == ' pewter '

توفر لغة Groovy بنية بسيطة ومتسقة للتعامل مع القوائم والخرائط ، تذكرنا ببنية المصفوفات في لغة Java . [ 23 ]

def movieList = [ 'Dersu Uzala' , 'Ran' , 'Seven Samurai' ] // تبدو كمصفوفة، لكنها قائمة assert movieList [ 2 ] == 'Seven Samurai' movieList [ 3 ] = 'Casablanca' // إضافة عنصر إلى القائمة assert movieList . size () == 4def monthMap = [ 'يناير' : 31 , 'فبراير' : 28 , 'مارس' : 31 ] // تعريف خريطة assert monthMap [ 'مارس' ] == 31 // الوصول إلى عنصر monthMap [ 'أبريل' ] = 30 // إضافة عنصر إلى الخريطة assert monthMap . size () == 4

امتداد النموذج الأولي

يوفر Groovy دعمًا لتوسيع النموذج الأولي من خلال وحدات التوسيع (فقط في Groovy 2) والفئاتExpandoMetaClass الشبيهة بـ Objective-C و . [ 24 ]DelegatingMetaClass

ExpandoMetaClassيوفر لغة خاصة بالمجال (DSL) للتعبير عن التغييرات في الفئة بسهولة، على غرار مفهوم الفئة المفتوحة في لغة روبي :

Number.metaClass { sqrt = { Math.sqrt ( delegate ) } }يؤكد 9 . sqrt () == 3 يؤكد 4 . الجذر التربيعي () == 2

لا تظهر التغييرات التي تُجريها لغة Groovy على الكود من خلال عملية النمذجة الأولية في Java، لأن كل استدعاء لخاصية/طريقة في Groovy يمر عبر سجل الفئات الوصفية. ولا يمكن الوصول إلى الكود المُعدَّل من Java إلا من خلال سجل الفئات الوصفية.

تتيح لغة Groovy أيضًا إمكانية تجاوز الدوال getProperty()، propertyMissing()من بين أمور أخرى، مما يمكّن المطور من اعتراض استدعاءات كائن ما وتحديد إجراء له، بطريقة مبسطة تعتمد على الجوانب . يمكّن الكود التالي الفئة java.lang.Stringمن الاستجابة للخاصية hex:

enum Color { BLACK ( '#000000' ), WHITE ( '#FFFFFF' ), RED ( '#FF0000' ), BLUE ( '#0000FF' ) String hex Color ( String hex ) { this . hex = hex } }String.metaClass.getProperty = { String property - > def stringColor = delegate if ( property == ' hex ' ) { Color.values ( ) . find { it.name ( ) . equalsIgnoreCase stringColor } ?. hex } }تحقق من أن قيمة "WHITE" بالنظام الست عشري تساوي "#FFFFFF" ، وتحقق من أن قيمة "BLUE" بالنظام الست عشري تساوي "#0000FF" ، وتحقق من أن قيمة "BLACK" بالنظام الست عشري تساوي "#000000" ، وتحقق من أن قيمة "GREEN" بالنظام الست عشري تساوي null .

يستخدم إطار عمل Grails البرمجة الوصفية على نطاق واسع لتمكين أدوات البحث الديناميكية GORMUser.findByName('Josh') ، مثل وغيرها. [ 25 ]

النقطة والأقواس

تسمح بنية لغة Groovy بحذف الأقواس والنقاط في بعض الحالات. إليك كود Groovy التالي

تناول ( القهوة ). مع ( السكر ، الحليب ). و ( المشروب الكحولي ).

يمكن كتابتها على النحو التالي

تناول القهوة مع السكر والحليب والمشروبات الكحولية

تمكين تطوير لغات خاصة بالمجال (DSLs) تبدو مثل اللغة الإنجليزية البسيطة.

البرمجة الوظيفية

على الرغم من أن Groovy هي في الغالب لغة كائنية التوجه، إلا أنها توفر أيضًا ميزات البرمجة الوظيفية .

عمليات الإغلاق

بحسب توثيق Groovy: "تعمل الدوال المغلقة في Groovy بشكل مشابه لمؤشر الدالة، مما يُمكّن من كتابة التعليمات البرمجية وتشغيلها في وقت لاحق". [ 26 ] تدعم الدوال المغلقة في Groovy المتغيرات الحرة، أي المتغيرات التي لم يتم تمريرها صراحةً كمعامل لها، ولكنها موجودة في سياق تعريفها، والتطبيق الجزئي (الذي يُطلق عليه " التطبيق الجزئي " [ 27 ] )، والتفويض، والمعاملات الضمنية، والمعاملات ذات النوع المحدد، والمعاملات غير ذات النوع المحدد.

عند العمل على مجموعات من نوع محدد، يمكن استنتاج الإغلاق الذي تم تمريره إلى عملية على المجموعة:

القائمة = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]/* * يتم تحويل الأعداد غير الصفرية إلى صحيح، لذا عندما يكون ناتج قسمة it على 2 يساوي صفرًا (زوجي)، يكون الناتج خطأً. * يمكن لبيئة التطوير المتكاملة (IDE) استنتاج نوع المعامل الضمني "it" على أنه عدد صحيح. * يمكن كتابته أيضًا على النحو التالي: * list.findAll { Integer i -> i % 2 } * list.findAll { i -> i % 2 } */ def odds = list . findAll { it % 2 }assert odds == [ 1 , 3 , 5 , 7 , 9 ]

يمكن كتابة مجموعة من التعبيرات في كتلة إغلاق دون الرجوع إلى التنفيذ، ويمكن تعيين الكائن المستجيب في وقت لاحق باستخدام التفويض:

// تحتوي هذه الكتلة البرمجية على تعابير بدون الإشارة إلى أي تطبيق. def operations = { declare 5 sum 4 divide 3 print }
/* * ستتولى هذه الفئة العمليات التي يمكن استخدامها في الإغلاق أعلاه. يمكن تعريف فئة أخرى * تحتوي على نفس الأساليب، ولكن باستخدام، على سبيل المثال، عمليات خدمة الويب * في الحسابات. */ class Expression { BigDecimal value/*  * على الرغم من تمرير عدد صحيح كمعامل، إلا أنه يتم تحويله إلى عدد عشري كبير، كما هو  مُعرّف. * لو كان للفئة دالة 'declare(Integer value)'، لكانت ستُستخدم بدلاً من ذلك.  */ def declare ( BigDecimal value ) { this . value = value } def sum ( BigDecimal valueToAdd ) { this . value += valueToAdd } def divide ( BigDecimal divisor ) { this . value /= divisor } def propertyMissing ( String property ) { if ( property == "print" ) println value } }
// هنا يتم تحديد من سيستجيب للتعبيرات في كتلة التعليمات البرمجية أعلاه. operations.delegate = new Expression ( ) operations ( )

كاري

تُعرف هذه الخاصية في لغة Groovy عادةً بالتطبيق الجزئي ، [ 27 ] وهي تسمح بتعيين معلمات الدوال المغلقة إلى قيمة افتراضية في أي من وسائطها، مما يُنشئ دالة مغلقة جديدة بالقيمة المُحددة. يؤدي تمرير وسيط واحد إلى الدالة curry()إلى تثبيت الوسيط الأول. أما تمرير N وسيطًا فيؤدي إلى تثبيت الوسائط من 1 إلى N.

دالة joinTwoWordsWithSymbol = { symbol , first , second -> first + symbol + second } assert joinTwoWordsWithSymbol ( '#' , 'Hello' , 'World' ) == 'Hello#World'دالة concatWords = joinTwoWordsWithSymbol.curry ( ' ' ) تحقق من أن concatWords ( ' Hello ' , 'World' ) == 'Hello World'def prependHello = concatWords.curry ( 'Hello' ) // def prependHello = joinTwoWordsWithSymbol.curry(' ', 'Hello') assert prependHello ( ' World' ) == 'Hello World'

يمكن أيضًا استخدام Curry في الاتجاه المعاكس (تثبيت آخر N وسيطة) باستخدام rcurry().

def power = { BigDecimal value , BigDecimal power -> value ** power }def square = power.rcurry ( 2 ) def cube = power.rcurry ( 3 )تحقق من أن ( 2 , 2 ) أس يساوي وتحقق من أن ( 4 ) مربع يساوي 16، وتحقق من أن ( 3 ) مكعب يساوي 27

يدعم Groovy أيضًا التقييم الكسول ، [ 28 ] [ 29 ] والاختزال/الطي ، [ 30 ] والهياكل اللانهائية وعدم قابلية التغيير ، [ 31 ] من بين أمور أخرى. [ 32 ]

معالجة JSON و XML

فيما يتعلق بمعالجة بيانات JSON و XML باستخدام لغة Groovy، تعتمد Groovy نمط البناء (Builder pattern ) ، مما يجعل عملية إنشاء بنية البيانات أقل إسهابًا. على سبيل المثال، XML التالي:

<languages> <language year= "1995" > <name> Java </name> <paradigm> كائنية التوجه </paradigm> <typing> ثابتة </typing> </language> <language year= "1995" > <name> Ruby </name> <paradigm> وظيفية، كائنية التوجه </paradigm> <typing> كتابة ديناميكية ، ديناميكية </typing> </language> <language year= "2003" > <name> Groovy </name> <paradigm> وظيفية، كائنية التوجه </paradigm> <typing> كتابة ديناميكية، ديناميكية ، ثابتة </typing> </language> </languages>

يمكن توليدها باستخدام كود Groovy التالي:

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" } }

ويمكن أيضًا معالجتها بطريقة متدفقة من خلال StreamingMarkupBuilder. لتغيير التنفيذ إلى JSON، MarkupBuilderيمكن استبدال بـ JsonBuilder. [ 33 ]

لتحليلها والبحث عن لغة وظيفية، findAllيمكن استخدام طريقة Groovy التالية:

def languages ​​= new XmlSlurper ( ). parseText writer.toString ( )// هنا يتم استخدام صيغة التعبير النمطي ( regex ) الخاصة بلغة Groovy للمطابقة (=~) والتي سيتم تحويلها إلى قيمة منطقية: إما true إذا كانت القيمة تحتوي على السلسلة النصية، أو false خلاف ذلك. def functional = languages.language.findAll { it.paradigm = ~ " functional " } assert functional.collect { it.name } == [ " Groovy " , " Ruby " ]

استيفاء السلاسل

في Groovy، يمكن دمج السلاسل النصية مع المتغيرات والتعبيرات باستخدام GStrings: [ 34 ]

BigDecimal account = 10.0 def text = "يُظهر الحساب حاليًا رصيدًا قدره $account" assert text == "يُظهر الحساب حاليًا رصيدًا قدره 10.0"

يجب تعريف سلاسل GString التي تحتوي على متغيرات وتعبيرات باستخدام علامات اقتباس مزدوجة.

يجب وضع التعبير المعقد بين قوسين معقوفين. هذا يمنع تفسير أجزاء منه على أنها تنتمي إلى السلسلة المحيطة بدلاً من التعبير نفسه.

BigDecimal minus = 4.0 text = "يُظهر الحساب حاليًا رصيدًا قدره ${account - minus}" assert text == "يُظهر الحساب حاليًا رصيدًا قدره 6.0"// بدون الأقواس لعزل التعبير، ستكون النتيجة كالتالي: text = "يُظهر الحساب حاليًا رصيدًا قدره $account - ناقص" assert text == "يُظهر الحساب حاليًا رصيدًا قدره 10.0 - ناقص"

يمكن تأجيل تقييم التعبير باستخدام صيغة السهم:

BigDecimal tax = 0.15 text = "يُظهر الحساب حاليًا رصيدًا قدره ${->account - account*tax}" tax = 0.10// تم تغيير قيمة الضريبة بعد تعريف GString. // يتم ربط متغيرات التعبير فقط عندما يجب تقييم التعبير فعليًا: assert text == "يُظهر الحساب حاليًا رصيدًا قدره 9.000"

تحويل شجرة بناء الجملة المجردة

بحسب وثائق Groovy نفسها، "عندما يُجمّع مُصرّف Groovy نصوص Groovy البرمجية وفئاتها، في مرحلة ما من العملية، يُخزّن الكود المصدري في الذاكرة على شكل شجرة بناء جملة ملموسة، ثم يُحوّل إلى شجرة بناء جملة مجردة. والغرض من تحويلات شجرة بناء الجملة المجردة هو تمكين المطورين من المشاركة في عملية التجميع لتعديل شجرة بناء الجملة المجردة قبل تحويلها إلى رمز بايت يُشغّله JVM. تُزوّد ​​تحويلات شجرة بناء الجملة المجردة Groovy بقدرات برمجة وصفية مُحسّنة في وقت التجميع، مما يُتيح مرونة فائقة على مستوى اللغة، دون أي تأثير سلبي على أداء وقت التشغيل." [ 35 ]

أمثلة على نصوص بناء الجملة المجردة (ASTs) في Groovy هي:

  • تحويل الفئة والمزيج
  • ماكرو AST غير قابل للتغيير
  • تحول نيويفاي
  • تحويل سينجلتون

من بين أمور أخرى.

يستخدم إطار الاختبار Spock تحويلات AST لتمكين المبرمج من كتابة الاختبارات بصيغة لا يدعمها Groovy، ولكن يتم بعد ذلك تعديل الكود ذي الصلة في AST ليصبح كودًا صالحًا. [ 36 ] مثال على هذا النوع من الاختبارات:

دالة "أكبر قيمة بين a و b هي c" ( ) { توقع : Math.max ( a , b ) == cحيث: أ | ب || ج 3 | 5 || 5 7 | 0 || 7 0 | 0 || 0 }

سمات

وفقًا لوثائق Groovy، " السمات هي بنية هيكلية للغة تسمح بما يلي: تركيب السلوكيات، وتنفيذ الواجهات في وقت التشغيل، وتجاوز السلوك، والتوافق مع فحص النوع الثابت / الترجمة."

يمكن اعتبار السمات بمثابة واجهات تحمل كلاً من التطبيقات الافتراضية والحالة. يتم تعريف السمة باستخدام الكلمة المفتاحية trait.

trait FlyingAbility { /* تعريف السمة */ String fly () { "أنا أطير!" } /* تعريف الدالة داخل السمة */ }

بعد ذلك، يمكن استخدامه كواجهة عادية باستخدام الكلمة المفتاحية implements:

class Bird implements FlyingAbility {} /* إضافة السمة FlyingAbility إلى قدرات فئة Bird */ def bird = new Bird () /* إنشاء كائن Bird جديد */ assert bird . fly () == "أنا أطير!" /* تحصل فئة Bird تلقائيًا على سلوك السمة FlyingAbility */

تتيح السمات نطاقًا واسعًا من القدرات، بدءًا من التركيب البسيط وصولًا إلى الاختبار.

تاريخ إصدارات Groovy

إصدارالإصدار الأوليأحدث إصدارالدعم الفعالإصلاحات للأخطاء الأمنيةملحوظات
5.x20255.0.4 (2026)نشيطنعمأداء مُحسّن، ودعم مُعزز لـ JDK 17+، وواجهة REPL مُجددة
4.x20224.0.30 (2026)لانعمدعم السجلات الأصلية لـ JDK16+
3.x20203.0.25 (2025)لانعمتم تحسين حلقة for، و try-with-resources، و lambda
2.5.x20182.5.23 (2023)لانعمتحويلات شجرة بناء الجملة المجردة، أدوات بناء واجهة سطر الأوامر الجديدة
2.4.x20152.4.21 (2020)لالاتحسينات في الأداء وتقليل حجم التعليمات البرمجية الوسيطة
  • لا يوجد لدى Groovy دورة إصدار ثابتة؛ وعادةً ما يتغير الدعم عند إصدار نسخة رئيسية جديدة.
  • يمكن تنزيل أحدث إصدار من: تنزيل Groovy [ 37 ]
  • يعتمد سجل الإصدارات على [ 38 ]

التبني

من الأمثلة البارزة على استخدام لغة Groovy ما يلي:

دعم بيئة التطوير المتكاملة

تدعم العديد من بيئات التطوير المتكاملة (IDEs) ومحررات النصوص لغة Groovy:

اللهجات

يوجد تطبيق بديل واحد للغة Groovy:

  • يحوّل Grooscript كود Groovy إلى كود JavaScript . [ 48 ] على الرغم من وجود بعض القيود في Grooscript مقارنةً بـ Apache Groovy، إلا أنه يدعم استخدام فئات المجال في كلٍ من الخادم والعميل. [ 49 ] كما يوفر دعمًا للملحقات لإصدار Grails 3.0، بالإضافة إلى تحويلات الكود عبر الإنترنت. [ 50 ]

انظر أيضاً

مراجع

الاقتباسات

  1. "الإصدار 5.0.7" . 25 يونيو 2026. تم الاطلاع عليه بتاريخ 25 يونيو 2026 .
  2. "Groovy Goodness: Default Groovy Script File Extensions" .
  3. "مقارنة أداء Groovy 2.0 مع Java" . 25 أغسطس 2012.
  4. "اختبار أداء بسيط بين Java و Groovy 2.0 و Scala" . 10 يوليو 2012. مؤرشف من الأصل في 10 ديسمبر 2012. تم الاطلاع عليه في 7 أكتوبر 2012 .
  5. 1 2 "Groovy 2.4 و Grails 3.0 ستكون آخر الإصدارات الرئيسية برعاية Pivotal" . 19 يناير 2015.
  6. 1 2 "Groovy ينضم إلى حاضنة أباتشي" . 11 مارس 2015.
  7. جيمس ستراشان (29 أغسطس 2003). "Groovy - ميلاد لغة ديناميكية جديدة لمنصة Java" . مؤرشف من الأصل في 1 سبتمبر 2003.
  8. 1 2 "عملية مجتمع جافا JSR 241" .
  9. "Groovy يفوز بالجائزة الأولى في جوائز الابتكار JAX 2007" . 26 أبريل 2007. مؤرشف من الأصل في 13 مايو 2015. تم الاطلاع عليه في 7 أكتوبر 2012 .
  10. «يقولون إن الكثير قد يحدث أثناء احتساء فنجان من القهوة» . مؤرشف من الأصل بتاريخ 19 أبريل 2011. تم الاطلاع عليه بتاريخ 7 أكتوبر 2012 .
  11. "شركة SpringSource تستحوذ على شركة Groovy وGrails (G2One)" . 11 نوفمبر 2008.
  12. "شركة VMware تستحوذ على SpringSource" . 10 أغسطس 2009.
  13. "تغريدة من جيمس ستراشان" . 24 نوفمبر 2016. تم الاطلاع عليها بتاريخ 24-11-2016 .
  14. "إعلان على القائمة البريدية للمطورين" .
  15. "إصدار GROOVY_3_0_0 · apache/groovy" . GitHub . تم الاطلاع عليه بتاريخ 27-03-2024 .
  16. "إصدار GROOVY_4_0_0 · apache/groovy" . GitHub . تم الاطلاع عليه بتاريخ 27-03-2024 .
  17. كونيغ 2007، صفحة 32
  18. "إرشادات أسلوب لغة Groovy وميزاتها لمطوري Java" . Groovy.codehaus.org. مؤرشف من الأصل بتاريخ 17 يناير 2015. تم الاطلاع عليه بتاريخ 22 يناير 2015 .
  19. "Groovy – الاختلافات عن Java" . Groovy.codehaus.org. مؤرشف من الأصل بتاريخ 17-03-2009 . تم الاطلاع عليه بتاريخ 12-08-2013 .
  20. "ما الجديد في Groovy 2.0؟" . 28 يونيو 2012.
  21. كونيغ 2007، ص 37-8
  22. كونيغ 2007، ص 38-39
  23. كونيغ 2007، ص 41-3
  24. "JN3525-MetaClasses" . مؤرشف من الأصل بتاريخ 2012-10-01 . تم الاطلاع عليه بتاريخ 2012-10-07 .
  25. "تقنيات البرمجة الوصفية في Groovy و Grails" . 11 يونيو 2009.
  26. "Groovy - Closures" . مؤرشف من الأصل بتاريخ 22-05-2012.
  27. 1 2 "هل تُطلق لغة Groovy على التطبيق الجزئي اسم 'currying'؟ "، 10 أغسطس 2013
  28. "Groovy - Lazy Transformation" . مؤرشف من الأصل بتاريخ 2012-10-08 . تم الاطلاع عليه بتاريخ 2012-10-07 .
  29. "ملاحظات جانبية: قوائم Lazy في Groovy" . 3 فبراير 2011.
  30. "Groovy's Fold" . 20 يونيو 2011. مؤرشف من الأصل في 13 فبراير 2015. تم الاطلاع عليه في 12 فبراير 2015 .
  31. "البرمجة الوظيفية باستخدام Groovy" . 5 نوفمبر 2011.
  32. "برمجة الدوال في Groovy" . مؤرشف من الأصل بتاريخ 2012-10-08 . تم الاطلاع عليه بتاريخ 2012-10-07 .
  33. "JsonBuilder" . مؤرشف من الأصل بتاريخ 2012-10-02 . تم الاطلاع عليه بتاريخ 2012-10-07 .
  34. "Groovy Strings - Different methods to creation them" . 26 ديسمبر 2009.
  35. "البرمجة الوصفية في وقت الترجمة - تحويلات شجرة بناء الجملة المجردة" . مؤرشف من الأصل بتاريخ 14-10-2012 . تم الاطلاع عليه بتاريخ 07-10-2012 .
  36. كينغ، بول (2020). "تاريخ لغة برمجة Groovy" . وقائع مؤتمر ACM للغات البرمجة. 4 : 53. doi : 10.1145/3386326 .
  37. "تنزيل Groovy" .
  38. "أباتشي جروفي" . تاريخ انتهاء الدعم (EOL) .
  39. "لغة Groovy DSL لمنطق أعمال OFBiz" . ويكي مشروع Apache OFBiz المفتوح .
  40. "أمثلة على طرق بسيطة باستخدام Groovy" . مشروع Apache OFBiz، ويكي مفتوح .
  41. "Grails at LinkedIn" . تم الاطلاع عليه بتاريخ 2015-06-02 .
  42. "خط أنابيب جينكينز" .
  43. روشيه، غرايم (2 أكتوبر 2008). "مدونة غرايم روشيه: إعادة إطلاق Sky.com مكتوبة بلغة Grails" . مدونة غرايم روشيه . تم الاطلاع بتاريخ 2 يونيو 2015 .
  44. تحليل أمني لتطبيقات المنازل الذكية الناشئة
  45. "البرمجة النصية ومكتبة البرامج النصية | البرمجة النصية والخصائص" . www.soapui.org . تم الاطلاع عليه بتاريخ 2015-06-02 .
  46. "Wired.Com" (ملف PDF) . www.springsource.org . تاريخ الاسترجاع: 2015-06-02 .
  47. "XWiki SAS" (ملف PDF) . www.springsource.org . تاريخ الاسترجاع: 2015-06-02 .
  48. "وثائق Grooscript" . 12 سبتمبر 2016. مؤرشف من الأصل في 28 يونيو 2017. تم الاطلاع عليه في 4 يوليو 2017 .
  49. "عرض تقديمي في مؤتمر SpringOne/2GX حول Grooscript" . 13 ديسمبر 2015.
  50. "تحويلات Grooscript عبر الإنترنت" . 15 مايو 2017. مؤرشف من الأصل في 9 يوليو 2017. تم الاسترجاع في 4 يوليو 2017 .

مصادر