О популярной в наши дни платформе Ruby on Rails и о языке программирования Ruby, лежащем в её основе, в наши дни, пожалуй, не слышал только тот, кто вовсе ничем никогда не интересуется. Впрочем, даже если вы и не слышали, не беда - сейчас как раз о нем немного и поговорим.
Почему J?
Если при виде буквы "J", стоящей в начале названия продукта, вы думаете, что это каким-то образом связано с Java, то ваш ассоциативный ряд идеологически верен и в корректировках не нуждается. Потому что первая буква в названии JRuby действительно имеет с Java очень близкое, если не сказать больше, родство.
Если характеризовать JRuby одной фразой, то можно сказать, что это - интерпретатор Ruby, написанный на Java. Причем JRuby относится к свободным программным продуктам (распространяется под лицензиями CPL/GPL/LGPL), чем наверняка приглянется многим из читателей "Компьютерных вестей". Конечно, тот факт, что JRuby, в отличие от "стандартного" Ruby-интерпретатора, реализован на Java, накладывает определенные, если можно так выразиться, ограничения на исполняемый им код, но это уже тонкости. Сейчас нам с вами достаточно того, что JRuby - это, фактически, Ruby и Java "в одном".
Зачем J?
Второй вопрос, который возникает уже после того, как мы определились с тем, откуда в названии этого программного продукта взялась буква "J", заключается в том, зачем вообще кому-либо могло понадобиться совмещать несовместимое (ну или, вернее, не совсем несовместимое, а, скорее, просто несколько экзотичное) - ведь, в самом деле, есть вполне хороший интерпретатор, написанный на Си, который отлично справляется с возложенными на него обязанностями. Оказывается, не все так просто.
Одной из ключевых особенностей JRuby является возможность получения доступа ко всем стандартным (да и нестандартным тоже) библиотекам Java. Фактически, JRuby имеет полную двухстороннюю интеграцию с Java - из Ruby-кода можно получить доступ к Java-классам, а из Java-приложений можно выполнять код на Ruby, манипулируя интерпретатором. И, пожалуй, именно в этой двусторонней интеграции с Java причина того, что в последнее время JRuby привлекает так много внимания - несмотря на покупку Sun Microsystems корпорацией Oracle, несмотря на завистников, говорящих, будто дни Java сочтены, эта платформа продолжает успешно существовать на рынке и актуальности пока что терять не собирается.
JRuby обеспечивает удобную интеграцию наработанных за годы Java-решений с достаточно передовыми методами разработки на Ruby On Rails, обеспечивая, таким образом, обратную совместимость и преемственность решений. Достаточно часто JRuby используется не в "рельсовом" контексте, а для реализации поддержки скриптинга в Java-приложениях.
Нужно отметить, что JRuby не является уникальным и единственным в своем роде решением, объединяющим скриптовый язык и Java в едином взаимовыгодном тандеме. Вполне возможно, вы слышали о таких проектах, как Jython и Groovy. Они, безусловно, также заслуживают отдельного рассмотрения на страницах "Компьютерных вестей", но сейчас я буду краток в изложении информации, которая касается их. Jython - это реализация на Java интерпретатора языка программирования Python, который также давно имеет "обычный" интерпретатор. Groovy - это совершенно особый язык программирования, объединяющий в себе преимущества самой Java, а также Python и Smalltalk. В отличие от Jython'а и JRuby, Groovy изначально разрабатывался с учетом специфики виртуальной машины Java, а потому не страдает многими недостатками, характерными для Java-реализаций разработанных уже давно тому назад языков.
Как это работает
Наверняка вам уже интересны некоторые технические подробности, касающиеся работы интерпретатора JRuby под управлением виртуальной машины Java. Что ж, не будем откладывать знакомство с ними в долгий ящик.
Прежде всего, следует сказать, что интерпретатор - не совсем точное определение того, чем на самом деле JRuby является для программного кода, написанного на языке Ruby. На самом деле, JRuby можно рассматривать в определенном смысле и как компилятор - с той оговоркой, что компилируется код не для какой-либо реальной процессорной архитектуры, а для виртуальной машины Java. При этом поддерживается как компиляция в реальном времени (JIT - Just-In-Time), так и компиляция предварительная, когда код для виртуальной машины подготавливается задолго до его запуска на выполнение. Впрочем, JRuby может работать и как "чистый" интерпретатор, если в этом есть такая уж насущная необходимость.
Что интересно, несмотря на то, что использование виртуальной машины Java должно было бы, по идее, сделать JRuby менее проворным, чем оригинальный интерпретатор, не имеющий под собой этой дополнительной "прослойки", на самом деле все выходит с точностью до наоборот - JRuby работает, в среднем, в два с половиной раза быстрее оригинального интерпретатора Ruby, чем приводит в восторг всех сторонников платформы Java, имеющих благодаря JRuby возможность аргументировано возражать против утверждений о её "тормознутости". Конечно, речь идет не о режиме чистого интерпретатора (хотя и в нем JRuby вполне может утереть нос своему "старшему брату"), а о режиме JIT-компиляции Ruby-кода в байт-код Java. Единственное, в чем "обычный" Ruby быстрее - это время загрузки интерпретатора.
Библиотеки и фреймворки
Несмотря на то, что сейчас многие поклонники Ruby подняли над своими стройными рядами лозунг "Ruby is not Rails", все-таки следует, наверное, признать тот факт, что во многом интерес к этому языку программирования обусловлен не чем иным, как интересом к этому замечательному фреймворку, который действительно упрощает и ускоряет создание самых разнообразных web-приложений. Разработчики JRuby, очевидно, были в курсе такого положения дел, потому что предусмотрели встроенную поддержку этого и некоторых других полезных Ruby-фреймворков в своём детище.
Собственно, список этих фреймворков, конечно, не так уж и велик, потому что и разных фреймворков для Ruby было разработано куда меньше, чем для той же Java. Среди основных поддерживаемых фреймворков, кроме того самого Rails, стоит отметить RSpec, Rake и RubyGems. RSpec - это фреймворк для behavior-driven разработки, во многом базирующийся на концепциях и идеях фреймворка JBehave. Rake - это, наверное, не столько отдельный фреймворк, сколько удобный инструмент для сборки билдов, который даже само свое название берет от популярной консольной утилиты make, до сих пор используемой сотнями тысяч программистов по всему миру. Наконец, RubyGems - это продукт, во многом аналогичный EasyInstall из арсенала Python-разработчиков; он упрощает распространение и инсталляцию Ruby-программ и библиотек.
Надо думать, что поддержка всех этих фреймворков и библиотек в JRuby была далеко не последним из всех тех факторов, которые способствовали популяризации данного программного продукта в буквальном смысле во всем мире.
Особенности
Когда не хотят говорить о недостатках, говорят об особенностях. В самом начале нашего с вами разговора об этом программном продукте я упомянул о том, что он не совсем полностью повторяет все возможности оригинального Ruby-интерпретатора в силу специфики Java-машины. Это не хорошо и не плохо (хотя, в зависимости от ситуации, может быть и так, и так), просто, работая с JRuby, необходимо всё время помнить об этих особенностях.
Первая (и, наверное, основная) особенность заключается в поддержке расширений, написанных на Си. Вполне естественно, что в силу особенностей виртуальной машины Java, достаточно сложно ожидать возможности запуска из-под JRuby программ, написанных не на чистом Ruby, а использующих в придачу к нему еще и C-расширения. Вторая особенность, которая несколько менее важна, но также может, что называется, "вылезти боком", заключается в том, что JRuby и Ruby используют различные модели работы с потоками, что, опять-таки, связано именно с Java-спецификой. Так что при использовании JRuby у программиста нет возможности обращаться ко всем без исключения API Ruby для работы с потоками. Наконец, третья особенность, о которой я уже упоминал выше, касается, в первую очередь, тех решений, где JRuby используется просто как удобный и мощный скриптовый движок. Нужно помнить о том, что для старта ему требуется некоторое время, и старт этот длится дольше, чем старт "обычного" Ruby.
Самостоятельное знакомство
Что ж, наверное, рассказ о JRuby можно считать успешно завершившимся - на мой взгляд, сказано было достаточно много, чтобы каждый, кому это интересно, мог себе представить, что же всё-таки за зверь этот JRuby, а те, кому этот зверь показался вдруг симпатичным, решили для себя, готовы ли они к тому, чтобы продолжать самостоятельное знакомство с ним.
Что касается самостоятельного знакомства, то я порекомендую вам самый надежный источник по всему, что касается JRuby - это, конечно же, официальный сайт проекта, расположенный по адресу jruby.org. Кстати, хочу отметить, что, в отличие от сайтов многих других свободных проектов, сайт JRuby может порадовать своего посетителя не только обилием различной информации, так или иначе касающейся JRuby, но ещё и очень приятным для глаз дизайном, за что его создателям отдельное спасибо. Вообще же в Сети уже достаточно много информации о JRuby и на русском языке - но здесь уже, как говорится, Google в помощь.
Вадим СТАНКЕВИЧ,
[email protected]
Комментарии