Апач Groovy
![]() Крутой логотип | |
Парадигма | Мультипарадигмальность : объектно-ориентированная , императивная , функциональная , аспектно-ориентированная , скриптовая. |
---|---|
Разработано | Джеймс Страчан |
Разработчик | Гийом Лафорж (председатель PMC) Йохен Теодору (технический руководитель) Пол Кинг Седрик Шампо |
Впервые появился | 2003 год |
Стабильная версия | 4.0.22 [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]
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 , напоминающий синтаксис массивов . [24]
def movieList = ['Dersu Uzala', 'Ran', 'Seven Samurai'] // Looks like an array, but is a list
assert movieList[2] == 'Seven Samurai'
movieList[3] = 'Casablanca' // Adds an element to the list
assert movieList.size() == 4
def monthMap = [ 'January' : 31, 'February' : 28, 'March' : 31 ] // Declares a map
assert monthMap['March'] == 31 // Accesses an entry
monthMap['April'] = 30 // Adds an entry to the map
assert monthMap.size() == 4
Расширение прототипа
[ редактировать ]Groovy предлагает поддержку расширения прототипа посредством ExpandoMetaClass
типа Objective-C , Модули расширения (только в Groovy 2), Категории и DelegatingMetaClass
. [25]
ExpandoMetaClass
предлагает предметно-ориентированный язык (DSL) для простого выражения изменений в классе, аналогично концепции открытого класса Ruby :
Number.metaClass {
sqrt = { Math.sqrt(delegate) }
}
assert 9.sqrt() == 3
assert 4.sqrt() == 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
}
}
assert "WHITE".hex == "#FFFFFF"
assert "BLUE".hex == "#0000FF"
assert "BLACK".hex == "#000000"
assert "GREEN".hex == null
Платформа Grails широко использует метапрограммирование для обеспечения возможности динамического поиска GORM , например User.findByName('Josh')
и другие. [26]
Точка и скобки
[ редактировать ]Синтаксис Groovy позволяет в некоторых ситуациях опускать круглые скобки и точки. Следующий заводной код
take(coffee).with(sugar, milk).and(liquor)
можно записать как
take coffee with sugar, milk and liquor
позволяя разрабатывать предметно-ориентированные языки (DSL), которые выглядят как обычный английский.
Функциональное программирование
[ редактировать ]Хотя Groovy в основном является объектно-ориентированным языком, он также предлагает функционального программирования функции .
Замыкания
[ редактировать ]Согласно документации Groovy: «Замыкания в Groovy работают аналогично «указателю метода», позволяя писать и запускать код в более поздний момент времени». [27] Замыкания Groovy поддерживают свободные переменные, то есть переменные, которые не были явно переданы ему в качестве параметра, но существуют в контексте его объявления, частичном применении (что он называет « каррированием »). [28] ), делегирование, неявные, типизированные и нетипизированные параметры.
При работе с коллекциями определенного типа можно вывести замыкание, переданное операции над коллекцией:
list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
/*
* Non-zero numbers are coerced to true, so when it % 2 == 0 (even), it is false.
* The type of the implicit "it" parameter can be inferred as an Integer by the IDE.
* It could also be written as:
* list.findAll { Integer i -> i % 2 }
* list.findAll { i -> i % 2 }
*/
def odds = list.findAll { it % 2 }
assert odds == [1, 3, 5, 7, 9]
Группа выражений может быть записана в блоке замыкания без ссылки на реализацию, а отвечающий объект может быть назначен позже с помощью делегирования:
// This block of code contains expressions without reference to an implementation
def operations = {
declare 5
sum 4
divide 3
print
}
/*
* This class will handle the operations that can be used in the closure above. Another class
* could be declared having the same methods, but using, for example, webservice operations
* in the calculations.
*/
class Expression {
BigDecimal value
/*
* Though an Integer is passed as a parameter, it is coerced into a BigDecimal, as was
* defined. If the class had a 'declare(Integer value)' method, it would be used instead.
*/
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
}
}
// Here is defined who is going to respond the expressions in the block of code above.
operations.delegate = new Expression()
operations()
Карри
[ редактировать ]Обычно называется частичным применением , [28] эта функция Groovy позволяет устанавливать для параметров замыканий значение по умолчанию в любом из их аргументов, создавая новое замыкание со связанным значением. Предоставление одного аргумента curry()
метод исправит первый аргумент. Предоставление N аргументов зафиксирует аргументы 1 .. N.
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'
Карри также можно использовать в обратном направлении (фиксируя последние N аргументов), используя rcurry()
.
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
Groovy также поддерживает отложенное вычисление . [29] [30] уменьшить/сложить , [31] бесконечные структуры и неизменяемость , [32] среди других. [33]
Обработка JSON и XML
[ редактировать ]При нотации объектов JavaScript ( JSON ) и обработке XML Groovy использует шаблон Builder , что делает создание структуры данных менее многословным. Например, следующий 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>
можно сгенерировать с помощью следующего кода 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
. [34]
Чтобы проанализировать его и найти функциональный язык, Groovy's findAll
метод может служить:
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"]
Строковая интерполяция
[ редактировать ]В Groovy строки можно интерполировать с помощью переменных и выражений с помощью GStrings: [35]
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"
GStrings, содержащие переменные и выражения, должны быть объявлены с использованием двойных кавычек.
Сложное выражение должно быть заключено в фигурные скобки. Это предотвращает интерпретацию его частей как принадлежащих окружающей строке, а не выражению:
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"
Преобразование абстрактного синтаксического дерева
[ редактировать ]Согласно собственной документации Groovy: «Когда компилятор Groovy компилирует сценарии и классы Groovy, в какой-то момент процесса исходный код будет представлен в памяти в виде конкретного синтаксического дерева, а затем преобразован в абстрактное синтаксическое дерево». Цель преобразований AST — предоставить разработчикам возможность подключиться к процессу компиляции, чтобы иметь возможность изменять AST до того, как он будет преобразован в байт-код, который будет выполняться JVM. Преобразования AST предоставляют Groovy улучшенные возможности метапрограммирования во время компиляции, обеспечивая высокую гибкость. на уровне языка, без снижения производительности во время выполнения». [36]
Примеры AST в Groovy:
- категорий и миксинов Преобразование
- Неизменяемый макрос AST
- Новая трансформация
- Синглтон-преобразование
среди других.
Среда тестирования Spock использует преобразования AST, чтобы позволить программисту писать тесты с синтаксисом, не поддерживаемым Groovy, но затем соответствующий код обрабатывается в AST для получения допустимого кода. [37] Пример такого теста:
def "maximum of #a and #b is #c" () {
expect:
Math.max (a, b) == c
where:
a | b || c
3 | 5 || 5
7 | 0 || 7
0 | 0 || 0
}
Функции
[ редактировать ]Согласно документации Groovy, « Трейты — это структурная конструкция языка, которая позволяет: композицию поведений, реализацию интерфейсов во время выполнения, переопределение поведения и совместимость со статической проверкой/компиляцией типов».
Трейты можно рассматривать как интерфейсы, несущие как реализации по умолчанию, так и состояние. Признак определяется с помощью ключевого слова типажа:
trait FlyingAbility { /* declaration of a trait */
String fly() { "I'm flying!" } /* declaration of a method inside a trait */
}
Затем его можно использовать как обычный интерфейс, используя ключевое слово implements
:
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 */
Черты позволяют использовать широкий спектр способностей: от простого составления до тестирования.
Принятие
[ редактировать ]Яркие примеры внедрения 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.22» . 27 июня 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 г.
- ^ Jump up to: Перейти обратно: а б «Groovy 2.4 и Grails 3.0 станут последними крупными релизами под основной спонсорской поддержкой» . 19 января 2015 г.
- ^ Jump up to: Перейти обратно: а б «Groovy присоединяется к инкубатору Apache» . 11 марта 2015 г.
- ^ Джеймс Страчан (29 августа 2003 г.). «Groovy — рождение нового динамического языка для платформы Java» . Архивировано из оригинала 1 сентября 2003 года.
- ^ Jump up to: Перейти обратно: а б «Процесс сообщества 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 г.
- ^ Jump up to: Перейти обратно: а б «Называет ли 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 года
- Кроссплатформенное бесплатное программное обеспечение
- Кроссплатформенное программное обеспечение
- Языки программирования высокого уровня