Апач Groovy
![]() Крутой логотип | |
Парадигма | Мультипарадигмальность : объектно-ориентированная , императивная , функциональная , аспектно-ориентированная , скриптовая. |
---|---|
Разработано | Джеймс Страчан |
Разработчик | Гийом Лафорж (председатель PMC) Йохен Теодору (технический руководитель) Пол Кинг Седрик Шампо |
Впервые появился | 2003 год |
Стабильная версия | 4.0.21 [1] ![]() |
Предварительный выпуск | 4.0.0-бета-1
/ 6 сентября 2021 г [2] |
Дисциплина набора текста | Динамичный , статичный , сильный , утиный |
Платформа | Ява SE |
Лицензия | Лицензия Апач 2.0 |
Расширения имен файлов | .groovy, .gvy, .gy, .gsh [3] |
Веб-сайт | просто классно |
Основные реализации | |
Градл , Грааль | |
Под влиянием | |
Java , Python , Руби , Smalltalk | |
Под влиянием | |
Котлин |
Apache Groovy — это Java , совместимый с синтаксисом объектно-ориентированный язык программирования , для платформы Java . Это одновременно статический и динамический язык с функциями, аналогичными функциям Python , Ruby и Smalltalk . Его можно использовать как язык программирования и язык сценариев для платформы Java, он компилируется в виртуальной машины Java (JVM) байт-код и легко взаимодействует с другим кодом и библиотеками Java . Groovy использует синтаксис фигурных скобок, аналогичный Java. Groovy поддерживает замыкания , многострочные строки и выражения, встроенные в строки . Большая часть возможностей Groovy заключается в преобразованиях AST , запускаемых посредством аннотаций.
Groovy 1.0 был выпущен 2 января 2007 г., а Groovy 2.0 — в июле 2012 г. Начиная с версии 2, Groovy можно компилировать статически , предлагая определение типа и производительность, близкую к Java. [4] [5] Groovy 2.4 был последним крупным релизом, спонсором которого выступила Pivotal Software , который закончился в марте 2015 года. [6] С тех пор Groovy изменил свою структуру управления на Комитет по управлению проектами в Apache Software Foundation . [7]
История [ править ]
Джеймс Страчан впервые рассказал о разработке Groovy в своем блоге в августе 2003 года. [8] В марте 2004 года Groovy был представлен JCP как JSR 241. [9] и принят голосованием. В период с 2004 по 2006 год было выпущено несколько версий. После начала усилий по стандартизации Java Community Process (JCP) нумерация версий изменилась, и 2 января 2007 года была выпущена версия под названием «1.0». После различных бета-версий и кандидатов на выпуск под номером 1.1, 7 декабря 2007 г. был выпущен Groovy 1.1 Final, номер которого сразу же был изменен на Groovy 1.5, чтобы отразить множество внесенных изменений.
В 2007 году Groovy получил первый приз на премии инноваций JAX 2007. [10] В 2008 году Grails , веб-фреймворк Groovy , получил вторую премию на премии JAX 2008 Innovation Award. [11]
В ноябре 2008 года SpringSource приобрела компанию Groovy and Grails (G2One). [12] В августе 2009 года VMware приобрела SpringSource. [13]
В апреле 2012 года, после восьми лет бездействия, руководитель спецификации изменил статус JSR 241 на неактивный. [9]
Страчан молча покинул проект за год до выпуска Groovy 1.0 в 2007 году. [ нужна цитата ] В октябре 2016 года Страчан заявил: «Я все еще люблю groovy (конвейеры Jenkins такие классные!), Java, go, typescript и kotlin». [14]
2 июля 2012 года был выпущен Groovy 2.0, в котором, помимо других новых функций, были добавлены статическая компиляция и статическая проверка типов .
Когда в апреле 2013 года совместное предприятие Pivotal Software было выделено корпорациями EMC (EMC) и VMware, Groovy и Grails вошли в его портфель продуктов. Pivotal прекратила спонсировать Groovy и Grails с апреля 2015 года. [6] В том же месяце Groovy изменил свою структуру управления с репозитория Codehaus на Комитет управления проектами (PMC) в Apache Software Foundation через свой инкубатор. [7] Groovy окончил инкубатор Apache и стал проектом высшего уровня в ноябре 2015 года. [15]
7 февраля 2020 года был выпущен Groovy 3.0. [16] Версия 4.0 была выпущена 25 января 2022 года. [17]
Особенности [ править ]
Большинство допустимых файлов Java также являются допустимыми файлами Groovy. Хотя эти два языка похожи, код Groovy может быть более компактным, поскольку ему не нужны все элементы, необходимые Java. [18] Это позволяет Java-программистам постепенно изучать Groovy, начиная со знакомого синтаксиса Java, а затем овладевая другими идиомами программирования Groovy . [19]
Функции Groovy, недоступные в Java, включают как статическую, так и динамическую типизацию (с ключевым словом def
), перегрузка операторов , собственный синтаксис для списков и ассоциативных массивов (карт), встроенная поддержка регулярных выражений , полиморфная итерация, интерполяция строк , добавленные вспомогательные методы и оператор безопасной навигации. ?.
для автоматической проверки нулевых указателей (например, variable?.method()
, или variable?.field
). [20]
Начиная с версии 2, Groovy также поддерживает модульность (возможность поставлять только необходимые jar-файлы в соответствии с потребностями проекта, тем самым уменьшая размер библиотеки Groovy), проверку типов, статическую компиляцию, улучшения синтаксиса Project Coin, блоки multicatch и постоянное повышение производительности с использованием invokedynamic
инструкция, представленная в Java 7 . [21]
Groovy обеспечивает встроенную поддержку различных языков разметки, таких как XML и HTML , посредством встроенного синтаксиса объектной модели документа (DOM). Эта функция позволяет определять и манипулировать многими типами гетерогенных данных с помощью единообразного и краткого синтаксиса и методологии программирования. [ нужна цитата ]
В отличие от Java, файл исходного кода Groovy может быть выполнен как (нескомпилированный) скрипт , если он содержит код вне какого-либо определения класса, если это класс с основным методом или если он является Runnable или GroovyTestCase . Сценарий Groovy полностью анализируется, компилируется и генерируется перед выполнением (аналогично Python и Ruby). Это происходит скрыто, и скомпилированная версия не сохраняется как артефакт процесса. [22]
GroovyBeans, свойства [ править ]
GroovyBeans от Groovy — это версия JavaBeans . Groovy неявно генерирует геттеры и сеттеры. В следующем коде setColor(String color)
и getColor()
генерируются неявно. Последние две строки, которые, по-видимому, напрямую обращаются к цвету, на самом деле вызывают неявно сгенерированные методы. [23]
класс AGroovyBean {
строки цвет
}
def myGroovyBean = новый AGroovyBean ()
myGroovyBean . setColor ( 'baby blue' )
утверждает myGroovyBean . getColor () == 'голубой'
myGroovyBean . color = 'олово'
утверждает myGroovyBean . цвет == 'олово'
Groovy предлагает простой и согласованный синтаксис для обработки списков и карт Java , напоминающий синтаксис массивов . [24]
def MovieList = [ Дерсу Узала' ' ' , ' ] массив
. список но ' , Выглядит как Семь
, собой представляет ' Ран самураев // Добавляет элемент в список
Assert MovieList . size ) == 4
defmonthMap Январь = [ ' : 31 , Февраль : 28 , ' : 31 ] карту
Объявляет . ' ' ' ' ( //
Март 'April' ] = 30 // Добавляет запись на карту
Assert MonthMap . размер () == 4
Расширение прототипа [ править ]
Groovy предлагает поддержку расширения прототипа посредством ExpandoMetaClass
типа Objective-C , Модули расширения (только в Groovy 2), Категории и DelegatingMetaClass
. [25]
ExpandoMetaClass
предлагает предметно-ориентированный язык (DSL) для простого выражения изменений в классе, аналогично Ruby концепции открытого класса :
Число . метакласс {
sqrt = { Math . sqrt ( делегат ) }
}
утверждать 9 . sqrt () == 3
утверждать 4 . кврт () == 2
Изменения кода Groovy в результате прототипирования не видны в Java, поскольку каждый вызов атрибута/метода в Groovy проходит через реестр метаклассов. Доступ к измененному коду можно получить только из Java, перейдя в реестр метаклассов.
Groovy также позволяет переопределять методы, например getProperty()
, propertyMissing()
среди прочего, позволяя разработчику перехватывать вызовы объекта и указывать для него действие упрощенным аспектно-ориентированным способом. Следующий код включает класс java.lang.String
ответить на hex
свойство:
enum Color {
ЧЕРНЫЙ ( '#000000' ), БЕЛЫЙ ( '#FFFFFF' ), RED ( '#FF0000' ), СИНИЙ ( '#0000FF' )
String hex
Color ( String hex ) {
this . шестнадцатеричный = шестнадцатеричный
}
}
Строка . метакласс . getProperty = { Строковое свойство ->
def stringColor = делегат,
если ( свойство == 'hex' ) {
Color . ценности (). Найди это . имя (). EqualsIgnoreCase stringColor }?. hex
}
}
утверждать «БЕЛЫЙ» . hex == "#FFFFFF"
утверждает "СИНИЙ" . hex == "#0000FF"
утверждает "ЧЕРНЫЙ" . hex == "#000000"
утверждает "ЗЕЛЕНЫЙ" . шестнадцатеричный == ноль
Платформа Grails широко использует метапрограммирование для обеспечения возможности динамического поиска GORM , например User.findByName('Josh')
и другие. [26]
Точка и скобки [ править ]
Синтаксис Groovy позволяет в некоторых ситуациях опускать круглые скобки и точки. Следующий заводной код
взять ( кофе ). с ( сахаром , молоком ). и ( ликер )
можно записать как
пейте кофе с сахаром , молоком и ликером
позволяя разрабатывать предметно-ориентированные языки (DSL), которые выглядят как обычный английский.
Функциональное программирование [ править ]
Хотя Groovy в основном является объектно-ориентированным языком, он также предлагает функционального программирования функции .
Замыкания [ править ]
Согласно документации Groovy: «Замыкания в Groovy работают аналогично «указателю метода», позволяя писать и запускать код в более поздний момент времени». [27] Замыкания Groovy поддерживают свободные переменные, то есть переменные, которые не были явно переданы ему в качестве параметра, но существуют в контексте его объявления, частичном применении (что он называет « каррированием ») . [28] ), делегирование, неявные, типизированные и нетипизированные параметры.
При работе с коллекциями определенного типа можно вывести замыкание, переданное операции над коллекцией:
list = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]
/*
* Ненулевые числа приводятся к истине, поэтому, когда % 2 == 0 (четное), это ложь.
* Тип неявного параметра «it» может быть выведен средой IDE как целое число.
* Это также можно записать так:
* list.findAll { Integer i -> i % 2 }
* list.findAll { i -> i % 2 }
*/
def chances = list . findAll { it % 2 }
утверждает шансы == [ 1 , 3 , 5 , 7 , 9 ]
Группа выражений может быть записана в блоке замыкания без ссылки на реализацию, а отвечающий объект может быть назначен позже с помощью делегирования:
// Этот блок кода содержит выражения без ссылки на реализацию
def Operations = {
объявление 5
сумма 4
деление 3
печать
}
/*
* Этот класс будет обрабатывать операции, которые можно использовать в приведенном выше замыкании. Другой класс
* может быть объявлен с теми же методами, но с использованием, например, операций
* веб-сервиса в вычислениях.
*/
class Expression {
BigDecimal value
/*
* Хотя в качестве параметра передается целое число, оно преобразуется в BigDecimal, как было
* определено. Если бы в классе был метод «объявить (целое значение)», вместо него использовался бы он.
*/
def декларировать ( BigDecimal значение ) {
this . значение = значение
}
Защита сумма ( BigDecimal valueToAdd ) {
this . значение += valueToAdd
}
Защита разделения ( BigDecimal делитель ) {
this . значение /= делитель
}
def propertyMissing ( String свойство ) {
if ( property == "print" ) println value
}
}
// Здесь определяется, кто будет отвечать на выражения в блоке кода выше.
операции . делегат = новое выражение ()
операции ()
Карри [ править ]
Обычно называется частичным применением , [28] эта функция Groovy позволяет устанавливать для параметров замыканий значение по умолчанию в любом из их аргументов, создавая новое замыкание со связанным значением. Предоставление одного аргумента curry()
метод исправит первый аргумент. Предоставление N аргументов зафиксирует аргументы 1 .. N.
def joinTwoWordsWithSymbol = { символ , первый , второй -> первый + символ + второй }
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'
Карри также можно использовать в обратном направлении (фиксируя последние N аргументов), используя rcurry()
.
def power = { BigDecimal значение , BigDecimal power ->
значение ** power
}
def Square = power . rcurry ( 2 )
def куб = мощность . rcurry ( 3 )
утверждает силу ( 2 , 2 ) == 4
утверждает квадрат ( 4 ) == 16
утверждает куб ( 3 ) == 27
Groovy также поддерживает отложенное вычисление . [29] [30] уменьшить/сложить , [31] бесконечные структуры и неизменяемость , [32] среди других. [33]
Обработка JSON и XML [ править ]
При нотации объектов JavaScript ( JSON ) и обработке XML Groovy использует шаблон Builder , что делает создание структуры данных менее многословным. Например, следующий XML:
<languages>
<language Year= "1995" >
<name> Java </name>
<paradigm> объектно- ориентированный </paradigm>
<typing> статический </typing>
</language>
<language Year= "1995" >
<name > Ruby </name>
<paradigm> функциональный, объектно- ориентированный </paradigm>
<typing> утиная типизация, динамическая </typing>
</language>
<languageyear = "2003" >
<name> Groovy </name>
<paradigm > функциональный, объектно- ориентированный </paradigm>
<typing> утиная типизация, динамическая, статическая </typing>
</language>
</languages>
можно сгенерировать с помощью следующего кода Groovy:
Защитный писатель = новый StringWriter ()
Защитный строитель = новый отличный . xml . MarkupBuilder ( писатель )
Построитель . языки {
язык ( год: 1995 ) {
название "Java"
парадигма "объектно-ориентированная"
типизация "статическая"
}
язык ( год: 1995 ) {
имя "Рубин"
парадигма "функциональная, объектно-ориентированная"
типизация "утиная типизация, динамическая"
}
язык ( год: 2003 ) {
название "Groovy"
парадигма "функциональная, объектно-ориентированная"
типизация "утиная типизация, динамическая, статическая"
}
}
а также может обрабатываться потоковым способом через StreamingMarkupBuilder
. Чтобы изменить реализацию на JSON, MarkupBuilder
можно поменять на JsonBuilder
. [34]
Чтобы проанализировать его и найти функциональный язык, Groovy's findAll
метод может служить:
def языки = новый XmlSlurper (). parseText автор . toString ()
// Здесь используется синтаксис регулярных выражений Groovy для средства сопоставления (=~), которое будет приведено
// к логическому значению: либо true, если значение содержит нашу строку, либо false в противном случае.
def функциональный = языки . язык . findAll { это . парадигма =~ "функционал" }
утверждать функционал . собирать его . name } == [ "Groovy" , "Ruby" ]
Строковая интерполяция [ править ]
В Groovy строки можно интерполировать с помощью переменных и выражений с помощью GStrings: [35]
BigDecimal account = 10.0
def text = "Счет в настоящее время показывает баланс в размере $account"
submit text == "Счет в настоящее время показывает баланс в размере 10,0"
GStrings, содержащие переменные и выражения, должны быть объявлены с использованием двойных кавычек.
Сложное выражение должно быть заключено в фигурные скобки. Это предотвращает интерпретацию его частей как принадлежащих окружающей строке, а не выражению:
BigDecimal minus = 4.0
text = "Счет в настоящее время показывает баланс ${account - minus}"
Assert text == "Счет показывает текущий баланс 6,0"
// Без скобок, изолирующих выражение, это привело бы к следующему:
текст = "Счет в настоящее время показывает баланс в размере $account - минус"
Assert text == "Счет в настоящее время показывает баланс в размере 10,0 - минус"
Вычисление выражения можно отложить, используя синтаксис стрелок:
BigDecimal Tax = 0.15
text = "На счете в настоящее время отображается баланс в размере ${->account - account*tax}"
налог = 0.10
// Значение налога было изменено ПОСЛЕ объявления GString. // Переменные выражения
привязываются только тогда, когда выражение
: вычислить необходимо действительно
Преобразование абстрактного синтаксического дерева [ править ]
Согласно собственной документации Groovy: «Когда компилятор Groovy компилирует сценарии и классы Groovy, в какой-то момент процесса исходный код будет представлен в памяти в форме конкретного синтаксического дерева, а затем преобразован в абстрактное синтаксическое дерево». Цель преобразований AST — предоставить разработчикам возможность подключиться к процессу компиляции, чтобы иметь возможность изменять AST до того, как он будет преобразован в байт-код, который будет выполняться JVM. Преобразования AST предоставляют Groovy улучшенные возможности метапрограммирования во время компиляции, обеспечивая высокую гибкость. на уровне языка, без снижения производительности во время выполнения». [36]
Примеры AST в Groovy:
- категорий и миксинов Преобразование
- Неизменяемый макрос AST
- Новая трансформация
- Синглтон-преобразование
среди других.
Среда тестирования Spock использует преобразования AST, чтобы позволить программисту писать тесты с синтаксисом, не поддерживаемым Groovy, но затем соответствующий код обрабатывается в AST для получения допустимого кода. [37] Пример такого теста:
def "максимум #a и #b равен #c" () {
ожидаем:
Math . max ( a , b ) == c
где:
a | б || с
3 | 5 || 5
7 | 0 || 7
0 | 0 || 0
}
Черты [ править ]
Согласно документации Groovy, « Трейты — это структурная конструкция языка, которая позволяет: композицию поведений, реализацию интерфейсов во время выполнения, переопределение поведения и совместимость со статической проверкой/компиляцией типов».
Трейты можно рассматривать как интерфейсы , несущие как реализации по умолчанию, так и состояние. Признак определяется с помощью ключевого слова типажа:
типаж FlyingAbility { /* объявление признака */
String fly () { "Я летаю!" } /* объявление метода внутри типажа */
}
Затем его можно использовать как обычный интерфейс, используя ключевое слово implements
:
class Bird реализует FlyingAbility {} /* Добавляет признак FlyingAbility к возможностям класса Bird */
= ( new Bird ) / * создает экземпляр нового Bird */
Assertbird defbird . летать () == "Я лечу!" /* класс Bird автоматически получает поведение черты FlyingAbility */
Черты позволяют использовать широкий спектр способностей: от простого составления до тестирования.
Принятие [ править ]
Яркие примеры внедрения Groovy включают в себя:
- Adaptavist ScriptRunner включает реализацию Groovy для автоматизации и расширения инструментов Atlassian , которые используются более чем 20 000 организациями по всему миру. [38] [39]
- Apache OFBiz , (ERP) с открытым исходным кодом система планирования ресурсов предприятия , использует Groovy. [40] [41]
- Eucalyptus , система управления облаком, в значительной степени использует Groovy.
- Gradle — популярный инструмент автоматизации сборки с использованием Groovy.
- LinkedIn использует Groovy и Grails для некоторых своих подсистем. [42]
- LogicMonitor, облачная платформа мониторинга, использует Groovy в источниках данных на основе сценариев. [43]
- Jenkins , платформа для непрерывной интеграции . В версию 2 Jenkins включает плагин Pipeline , который позволяет писать инструкции сборки в Groovy. [44]
- Liferay использует groovy в своем рабочем процессе Kaleo.
- Sky.com использует Groovy и Grails для обслуживания огромного онлайн-медиа-контента. [45]
- SmartThings , открытая платформа для умных домов и потребительского Интернета вещей , использует ориентированное на безопасность подмножество Groovy. [46]
- SoapUI предоставляет Groovy в качестве языка для разработки тестов веб-сервисов. [47]
- Survata , стартап по исследованию рынка, использует Groovy и Grails. [ нужна цитата ]
- Европейское патентное ведомство (ЕПВ) разработало язык программирования потоков данных на Groovy, «чтобы использовать сходство процессов взаимодействия с патентными ведомствами каждой отдельной страны и преобразовать их в единый универсальный процесс». [ нужна цитата ]
- Хотя Groovy можно интегрировать в любую среду JVM, среда JBoss Seam предоставляет Groovy, помимо Java, в качестве языка разработки «из коробки». [48]
- vCalc.com использует Groovy для всей заданной пользователем математики в своем математическом механизме краудсорсинга. [49]
- Wired.com использует Groovy и Grails для отдельного раздела веб-сайта «Обзоры продуктов». [50]
- XWiki SAS использует Groovy в качестве языка сценариев в своем совместном продукте с открытым исходным кодом. [51]
Поддержка IDE [ править ]
Многие интегрированные среды разработки (IDE) и текстовые редакторы поддерживают Groovy:
- Android Studio , IDE, используемая для создания для Android . приложений
- атома Редактор
- Eclipse через Groovy-Eclipse
- Emacs , используя groovy-mode проекта groovy-emacs-mode.
- IntelliJ IDEA , Community Edition, Grails/Griffon только в Ultimate Edition
- JDeveloper для использования с Oracle ADF.
- jEdit , расширенный текстовый редактор для платформы Java.
- Kate , расширенный текстовый редактор для KDE, поддерживает Groovy и более 200 других форматов файлов.
- NetBeans , начиная с версии 6.5.
- Notepad++ — расширенный текстовый редактор для Microsoft Windows.
- Sublime Text — кроссплатформенный текстовый редактор.
- ТекстМейт
- Код Visual Studio
- UltraEdit , редактор программ общего назначения.
Диалекты [ править ]
Существует одна альтернативная реализация Groovy:
- Grooscript преобразует код Groovy в код JavaScript . [52] Хотя Grooscript имеет некоторые ограничения по сравнению с Apache Groovy, он может использовать классы предметной области как на сервере, так и на клиенте. [53] поддержка плагинов для Grails версии 3.0, а также онлайн-преобразование кода. Обеспечена [54]
См. также [ править ]
- Сравнение языков программирования
- Griffon (фреймворк) – фреймворк рабочего стола.
- Проект Ноль
- Спок (фреймворк тестирования)
Ссылки [ править ]
Цитаты [ править ]
- ^ «Выпуск 4.0.21» . 6 апреля 2024 г. Проверено 23 апреля 2024 г.
- ^ «Релизы — apache/groovy» . Проверено 9 апреля 2020 г. - через GitHub .
- ^ «Groovy Goodness: расширения файлов сценариев Groovy по умолчанию» .
- ^ «Производительность Groovy 2.0 по сравнению с Java» . 25 августа 2012 г.
- ^ «Простой тест производительности Java, Groovy2.0 и Scala» . 10 июля 2012 г. Архивировано из оригинала 10 декабря 2012 г. Проверено 7 октября 2012 г.
- ^ Перейти обратно: а б «Groovy 2.4 и Grails 3.0 станут последними крупными релизами под основной спонсорской поддержкой» . 19 января 2015 г.
- ^ Перейти обратно: а б «Groovy присоединяется к инкубатору Apache» . 11 марта 2015 г.
- ^ Джеймс Страчан (29 августа 2003 г.). «Groovy — рождение нового динамического языка для платформы Java» . Архивировано из оригинала 1 сентября 2003 года.
- ^ Перейти обратно: а б «Процесс сообщества Java JSR 241» .
- ^ «Groovy получает первый приз на премии за инновации JAX 2007» . 26 апреля 2007 г. Архивировано из оригинала 13 мая 2015 г. Проверено 7 октября 2012 г.
- ^ «Говорят, за чашкой кофе многое может случиться» . Архивировано из оригинала 19 апреля 2011 г. Проверено 7 октября 2012 г.
- ^ «SpringSource приобретает компанию Groovy and Grails (G2One)» . 11 ноября 2008 г.
- ^ «VMWare приобретает SpringSource» . 10 августа 2009 г.
- ^ «Твит от Джеймса Страчана» . 24 ноября 2016 года . Проверено 24 ноября 2016 г.
- ^ «Объявление в списке рассылки разработчиков» .
- ^ «Выпуск GROOVY_3_0_0 · apache/groovy» . Гитхаб . Проверено 27 марта 2024 г.
- ^ «Выпуск GROOVY_4_0_0 · apache/groovy» . Гитхаб . Проверено 27 марта 2024 г.
- ^ Кинг 2007, стр. 32
- ^ «Руководство по стилю Groovy и функциям языка для разработчиков Java» . Groovy.codehaus.org. Архивировано из оригинала 17 января 2015 г. Проверено 22 января 2015 г.
- ^ «Groovy – Отличия от Java» . Groovy.codehaus.org. Архивировано из оригинала 17 марта 2009 г. Проверено 12 августа 2013 г.
- ^ «Что нового в Groovy 2.0?» . 28 июня 2012 г.
- ^ Кинг 2007, стр. 37-8.
- ^ Кинг 2007, стр. 38-9.
- ^ Кинг 2007, стр. 41-3.
- ^ «JN3525-Метаклассы» . Архивировано из оригинала 1 октября 2012 г. Проверено 7 октября 2012 г.
- ^ «Метапрограммирование в Groovy и Grails» . 11 июня 2009 г.
- ^ «Groovy — Замыкания» . Архивировано из оригинала 22 мая 2012 г.
- ^ Перейти обратно: а б «Называет ли groovy частичное приложение каррированием », 10 августа 2013 г.
- ^ «Groovy — ленивая трансформация» . Архивировано из оригинала 8 октября 2012 г. Проверено 7 октября 2012 г.
- ^ «Примечания: ленивые списки в Groovy» . 3 февраля 2011 г.
- ^ «Сгиб Груви» . 20 июня 2011 г. Архивировано из оригинала 13 февраля 2015 г. Проверено 12 февраля 2015 г.
- ^ «Функциональное программирование с помощью Groovy» . 5 ноября 2011 г.
- ^ «Программирование функций в Groovy» . Архивировано из оригинала 8 октября 2012 г. Проверено 7 октября 2012 г.
- ^ «ДжсонБилдер» . Архивировано из оригинала 2 октября 2012 г. Проверено 7 октября 2012 г.
- ^ «Groovy Strings — разные способы их создания» . 26 декабря 2009 г.
- ^ «Метапрограммирование во время компиляции — преобразования AST» . Архивировано из оригинала 14 октября 2012 г. Проверено 7 октября 2012 г.
- ^ Кинг, Пол (2020). «История языка программирования Groovy» . Учеб. Программа АКМ. Ланг . 4:53 . дои : 10.1145/3386326 .
- ^ «Документация ScriptRunner» .
- ^ «Пресс-релиз ScriptRunner со статистикой внедрения» .
- ^ «Groovy DSL для бизнес-логики OFBiz» . Открытая вики проекта Apache OFBiz .
- ^ «Примеры простых методов с использованием Groovy» . Открытая вики проекта Apache OFBiz .
- ^ «Грааль в LinkedIn» . Проверено 2 июня 2015 г.
- ^ «Встроенные сценарии Groovy» . www.logicmonitor.com . Проверено 20 ноября 2020 г.
- ^ «Пайплайн Дженкинса» .
- ^ Роше, Грэм (2 октября 2008 г.). «Блог Грэма Роше: перезапуск Sky.com, написанного на Grails» . Блог Грэма Роше . Проверено 2 июня 2015 г.
- ^ Анализ безопасности новых приложений для умного дома.
- ^ «Сценарии и библиотека сценариев | Сценарии и свойства» . www.soapui.org . Проверено 2 июня 2015 г.
- ^ «Глава 11. Groovy-интеграция» . docs.jboss.org . Проверено 2 июня 2015 г.
- ^ «vCalc, первая в истории социальная платформа для мира математики» . 4 ноября 2014 года . Проверено 5 мая 2016 г.
- ^ «Wired.Com» (PDF) . www.springsource.org . Проверено 2 июня 2015 г.
- ^ «XWiki SAS» (PDF) . www.springsource.org . Проверено 2 июня 2015 г.
- ^ «Документация Grooscript» . 12 сентября 2016 г. Архивировано из оригинала 28 июня 2017 г. . Проверено 4 июля 2017 г.
- ^ «Презентация Grooscript на SpringOne/2GX» . 13 декабря 2015 г.
- ^ «Онлайн-конверсии Grooscript» . 15 мая 2017 года. Архивировано из оригинала 9 июля 2017 года . Проверено 4 июля 2017 г.
Источники [ править ]
- Король, Дирк; Пол Кинг; Гийом Лафорж; Гамлет Д'Арси; Седрик Шампо; Эрик Прагт; Джон Скит (2015). Groovy в действии, второе издание . Мэннинг. ISBN 978-1-935182-44-3 .
- Барклай, Кеннет; Джон Сэвидж (2007). Программирование на Groovy: введение для разработчиков Java . Издательство Морган Кауфманн. ISBN 978-0-12-372507-3 . Архивировано из оригинала 12 января 2010 г. Проверено 19 июля 2007 г.
- Дэвис, Скотт (2008). Отличные рецепты: смазка колес Java . Прагматичная книжная полка. ISBN 978-0-9787392-9-4 .
- Субраманиам, Венкат (2008). Программирование Groovy: динамическая продуктивность для Java-разработчика . Прагматичная книжная полка. ISBN 978-1-934356-09-8 .
Внешние ссылки [ править ]
- Динамически типизированные языки программирования
- Семейство языков программирования Java
- Запросы спецификации Java
- Языки программирования JVM
- Объектно-ориентированные языки программирования
- Языки программирования, созданные в 2003 году.
- Языки сценариев
- Программное обеспечение, использующее лицензию Apache
- Языки программирования
- Динамические языки программирования
- программное обеспечение 2003 года
- Кроссплатформенное бесплатное программное обеспечение
- Кроссплатформенное программное обеспечение
- Языки программирования высокого уровня