Статьи

В динамике на JVM: JRuby против Groovy

JVM потрясающая!

Многие люди, использующие Java, делают ошибку, смешивая язык Java и платформу Java. Конечно, язык Java многословен; ему не хватает замыканий, миксинов и т. д. Но JVM чертовски хороша. Он работает быстро, работает везде, имеет несколько сборщиков мусора, имеет собственные потоки и отличные инструменты мониторинга. В результате вы все равно можете запускать серверные приложения на JVM. Самое приятное то, что вам не нужно использовать язык Java. Если вы являетесь поклонником динамических языков, есть много доступных вариантов. Самые зрелые — это JRuby и Groovy. Если вы спрашиваете себя: «Должен ли я выбрать Groovy или JRuby», прочитайте этот пост, и, надеюсь, вы сможете принять решение.

Groovy

Groovy Logo

Начнем с Groovy. Groovy — это динамический язык, разработанный для виртуальной машины Java. Он берет много идей из таких языков, как Ruby и Python (и добавляет несколько собственных), и оборачивает их в Java-подобный синтаксис. Будучи разработанным для JVM Groovy имеет несколько преимуществ по сравнению с портированными языками. Одним из них является бесшовная совместимость с языком Java (от Groovy до Java и от Java до Groovy). Однако, чтобы сделать его ближе к Java, разработчикам языка пришлось пойти на некоторые компромиссы. Например, Groovy использует геттеры и сеттеры для определения свойств.

Groovy Домашняя страница

JRuby

JRuby Logo

Это реализация языка Ruby поверх JVM. Поэтому самая крутая вещь в JRuby — это тот факт, что это Ruby. Это означает, что вы можете использовать все достоинства платформы Ruby на JVM. Это не только рельсы. Rubyists разработали много действительно крутых вещей, и умение использовать все эти библиотеки просто потрясающе. Однако есть и обратная сторона. Взаимодействие JRuby с Java не так гладко, как в Groovy.

Главная страница JRuby

Groovy против JRuby

Давайте сравним следующие аспекты языков: зрелость, языковые возможности, библиотеки Killer, взаимодействие с Java, производительность и инструменты.

зрелость

В прошлом году проект JRuby отметил 10-летний юбилей. Он поддерживает Ruby 1.8 и 1.9. Большинство драгоценных камней работают с JRuby без проблем. Те, кто не работает, имеют аналоги, написанные на Java (например, Nokogiri Java). Существует несколько облачных решений, поддерживающих JRuby, и несколько надежных серверов приложений. На сегодняшний день это самая быстрая реализация Ruby. Я думаю, что JRuby сейчас набирает обороты. Люди говорят и пишут о преимуществах JRuby перед МРТ везде. Он используется в производстве во многих компаниях (например, LinkedIn и Square).

Проект Groovy был запущен в 2003 году. Он стал стабильным в 2008 году. В самом начале он использовался главным образом в качестве языка сценариев для платформы Java, но за последние пару лет его экосистема действительно достигла зрелости. Появилось много идиоматических библиотек Groovy (например, Spork, Geb и Gradle). Существуют также варианты облачного развертывания для Groovy. Groovy используется во многих компаниях, которые имеют существующую инфраструктуру Java (например, Netflix).

Особенности языка

Поскольку Groovy был во многом вдохновлен Ruby, оба языка очень похожи. Акцент, хотя и отличается. Groovy имеет необязательную типизацию и интерфейсы, и его структура больше похожа на Java, что делает его более статичным, чем Ruby. Одной из этих «более статичных» функций, отличающих Groovy от других динамически типизированных языков, является метапрограммирование во время компиляции. В Groovy вы можете написать расширения для компилятора, которые будут изменять семантику языка. Это открывает множество возможностей для реализации классных предметно-ориентированных языков. Спок, инфраструктура тестирования, является хорошим примером:

def «length of Spock’s and his friends’ names«() {
expect:
name.size() == length
where:
name | length
«Spock« | 5
«Kirk« | 4
«Scotty« | 6
}

view raw
spock.groovy
hosted with ❤ by GitHub

Подобный тест JUnit будет выглядеть так:

def «length of Spock’s and his friends’ names«() {
assert «Spock«.size() == 5
assert «Kirk«.size() == 3
assert «Scotty«.size() == 6
}

view raw
junit.groovy
hosted with ❤ by GitHub

Важно отметить, что Groovy не поддерживает ключевые слова «ожидаем:» и «где:» из коробки. Спок расширяет Groovy-компилятор, чтобы изменить ход выполнения ваших тестов. Потрясающие!

JRuby (или лучше сказать Ruby) также имеет множество приятных функций для написания DSL. Например, тот факт, что тела классов являются исполняемыми, позволяет вам написать действительно интересные DSL:

class Person
validates_presence_of :name
has_many :addresses
end

view raw
person.rb
hosted with ❤ by GitHub

В целом, я пишу более динамический код на Ruby, чем в Groovy. Например, я могу генерировать классы на лету:

class Person < Struct.new(:name, :age)
def to_s
«#{name} is #{age} years old»
end
end

view raw
struct.rb
hosted with ❤ by GitHub

Можно написать подобный код в Groovy, но он не такой элегантный.

Killer Libs

Есть несколько действительно фантастических технологий, построенных на Groovy.

Будучи реализацией Ruby, JRuby дает вам доступ ко всему доброму, созданному сообществом Ruby.

Взаимодействие с Java

Использование веб-сервисов и очередей сообщений является правильным способом интеграции новой системы в существующую инфраструктуру. Однако иногда это невозможно, и вам необходимо выполнить интеграцию на уровне объекта. Будучи разработанным для JVM, Groovy делает здесь лучшую работу. Он легко интегрируется с Java. Groovy вызывает Java, Java вызывает Groovy. Это просто работает. Ruby, с другой стороны, имеет другую объектную модель, другие соглашения об именах. В Ruby нет такой вещи как интерфейс. Кроме того, библиотеки тоже разные. Хотя команда JRuby проделала потрясающую работу, сделав эту интеграцию настолько гладкой, насколько это возможно, это даже близко не похоже на то, что делает Groovy.

Производительность

Я не собираюсь показывать вам графики. И нет, я не собираюсь говорить вам, какой язык быстрее. Почему? Это не важно. Вы не должны принимать решение, основываясь на том факте, что один из них на 10% быстрее другого. JRuby и Groovy работают медленнее, чем Java. С этим ничего не поделаешь. Но это нормально, потому что они достаточно быстрые (и они будут намного быстрее после использования InvokeDynamic). Если каким-то образом вы столкнетесь с ситуацией, когда это не так, переключение с JRuby на Groovy (и наоборот) не улучшит ситуацию. Просто перепишите этот класс в Java и интегрируйте его с остальной частью вашего приложения.

Инструменты (IDE и текстовые редакторы)

Оба языка поддерживаются всеми основными текстовыми редакторами: Vim, Emacs, TextMate, Sublime. Если вы предпочитаете IDE, есть плагины для Eclipse, NetBeans и IntelliJ IDEA (RubyMine). Я лично предпочитаю IntelliJ IDEA и RubyMine.

Так Groovy или JRuby?

Надеюсь, теперь у вас есть представление о плюсах и минусах. Если, взвесив их, вы все еще не уверены, вот несколько советов, которые я могу дать вам исходя из собственного опыта.

  • Вы работаете с большой базой кода Java. Новый модуль, который вы планируете написать, будет активно взаимодействовать с существующим кодом Java. Groovy — твой выбор. В JVM нет другого языка, который бы имел такую ​​плавную интеграцию с Java.
  • Вы работаете в магазине Java, а ваша команда состоит из опытных разработчиков Java, которые не очень знакомы с динамически типизированными языками, такими как Smalltalk или Python. Опять же, выберите Groovy. Имеет опциональную типизацию и интерфейсы. Кроме того, ваша команда сможет использовать существующие инструменты и библиотеки. Я бы не сказал, что это похоже на Java, но это определенно более легкий переход.
  • Вы и ваша команда можете потратить немного больше времени на изучение новых навыков. Существующая инфраструктура может быть изолирована от нового модуля, который вы собираетесь построить, с помощью антикоррупционного уровня. Возможно, вы создаете веб-приложение или веб-сервис REST. Попробуйте JRuby. Экосистема Rails фантастическая. Я считаю, что сейчас это лучшее полнофункциональное решение для создания веб-приложений.
  • Ваша команда имеет опыт работы с другими динамически типизированными языками, такими как PHP, Python или Smalltalk. Перейти на JRuby.