Рубиновый кофе
В СЕНТЯБРЕ 2006 ГОДА КОМПАНИЯ SUN MICROSYSTEMS ПРИНЯЛА В РЯДЫ СВОИХ ПРОГРАММИСТОВ ЧАРЛЬЗА НАТТЕРА (CHARLES NUTTER) И ТОМАСА ЭНЕБО (THOMAS ENEBO), ДВУХ ВЕДУЩИХ РАЗРАБОТЧИКОВ JRUBY. МНОГИЕ СПЕЦИАЛИСТЫ ПРОРОЧАТ ЭТОМУ ПРОЕКТУ НЕПЛОХОЕ БУДУЩЕЕ КАК В МИРЕ WEB-РАЗРАБОТОК, ТАК И В СЕГМЕНТЕ НАСТОЛЬНЫХ ПРИЛОЖЕНИЙ. В ЭТОЙ СТАТЬЕ АНАЛИЗИРУЮТСЯ ОСНОВНЫЕ ДОСТОИНСТВА И НЕДОСТАТКИ JRUBY И ИССЛЕДУЮТСЯ СЕГМЕНТЫ РЫНКА ПРИЛОЖЕНИЙ, ГДЕ ИСПОЛЬЗОВАНИЕ ЭТОЙ РЕАЛИЗАЦИИ ОБЕЩАЕТ БЫТЬ НАИБОЛЕЕ ПРОДУКТИВНЫМ.
JRuby
JRuby – это интерпретатор языка Ruby, написанный для Java-платформы, в то время как классическая реализация Ruby написана на языке C. Отличие, на первый взгляд, очень небольшое - только в языке реализации интерпретатора. Но команда JRuby пошла намного дальше, добавив тесную интеграцию с самой Java-платформой. Причем связь, что называется, двусторонняя: можно обращаться к Java-классам в JRuby и использовать JRuby в качестве языка скриптов в Java-программах. Именно это станет залогом успеха проекта, который рассматривается многими в качестве своеобразного «клея», соединяющего мощь платформы Java и огромный потенциал Ruby (и фреймворка Ruby on Rails в частности).
Именно это станет залогом успеха проекта, который рассматривается многими в качестве своеобразного «клея», соединяющего мощь платформы Java и огромный потенциал Ruby.
Интеграция с Java-платформой
Действительно ли миллионы строчек кода на Java теперь будут работать и на Ruby-программистов? Многолетняя история Java-платформы способствовала тому, что под нее создано гигантское количество библиотек и программ. Теперь их без особых трудностей можно использовать в скриптах на языке Ruby, ведь JRuby обеспечивает прозрачное обращение к элементам Java. Это означает, что Java-классы выглядят как обычные Ruby-объекты со стандартным для Ruby набором методов. Кроме этого, осуществляется маршаллинг примитивных типов из JRuby в Java и обратно. Обертки Java-классов, которые являются различными коллекциями, декорируются дополнительными методами, имитирующими поведение аналогов в Ruby. Методы Java-классов можно вызывать из JRuby, используя общепринятый в Ruby стиль именования методов: строчными буквами, с разделением слов подчеркиваниями.
JRuby автоматически преобразует такие вызовы к методам с соответствующими названиями в camel-case стиле. Классы JRuby могут реализовывать Java-интерфейсы (пока поддерживается только одиночное наследование). Они также могут расширять Java-классы путем наследования. Подобные механизмы обеспечивают достаточно тесную интеграцию, но что более важно, с каждой новой версией ее степень растет. Новые версии JRuby обеспечивают взаимодействие с Java-экосистемой на более высоком уровне.
Плавный переход на JRuby
JRuby в первую очередь нацелен на команды и компании, которые уже ранее применяли Ruby и/или Java-платформу для создания приложений. Стратегия внедрения JRuby в компаниях, ведущих разработку на Java, будет схожа с традиционным использованием Ruby, а на эту тему написано несколько специализированных книжек. Необходимо отметить фактор, который упрощает внедрение по сравнению с классической реализацией Ruby. Программисты смогут использовать хорошо знакомые им Java-библиотеки и Java-инструменты (например, IDE).
Что касается программистов, пишущих на Ruby, то они почувствуют себя как рыбы в воде: реализация языка не отличается от классической, и имеется возможность применять практически все библиотеки, написанные на Ruby. Инструменты, которые ранее использовались для разработки, также доступны и полностью совместимы. Теперь рассмотрим аспекты интеграции языков и платформ, которые на данный момент считаются достаточно перспективными.
Сравнение некоторых аспектов Java и Jruby
|
Java |
JRuby |
| Язык программирования |
Классический объектно-ориентированный язык |
"Чисто"-объектно-ориентированный язык с кратким синтаксисом |
| Исполнение программы |
Компиляция в байт-код |
Интерпретация (проекты по компиляции в стадии разработки) |
| Веб-приложения |
Сервера приложений и фреймворки общего назначения |
Веб-фреймворк Ruby on Rails |
| Базы данных |
Многочисленные ORM (например, Hibernate) |
Модуль Active Record |
Сравнение некоторых аспектов Ruby и JRuby
|
Ruby |
JRuby |
| Язык реализации |
C |
Java |
| Платформы |
Платформы с С-компилятором |
Java-платформа |
| Расширения (gems) |
Все (кроме специальных для JRuby) |
Только чистый Ruby без С |
| Базы данных |
Native-интерфейсы |
Java-интерфейсы (ОВИС) |
| Скорость работы |
Стандартная |
Примерно в 2 раза медленнее (когда будет использоваться компилятор в 2-10 раз быстрее) |
| Совместимость с Rails |
Полная |
Почти полная (98%) |
| GUI |
Богатый набор кросплатформенных библиотек: AWT, Swing, SWT |
FxRuby, Tk, Qt, GTK, wxRuby |
Ruby on Rails
Фреймворк для создания web-приложений Ruby on Rails, по причине своей популярности и грамотного продвижения, в сообществе разработчиков стал чуть ли не синонимом самого языка Ruby. Сегодня два этих понятия неотделимы друг от друга. Небывалый интерес к Ruby on Rails сформировал большое сообщество web-разработчиков, которые занимались совершенствованием фреймворка. Как следствие, на него обратили внимание и многие коммерческие компании. Ruby on Rails использовался не только для создания готовых сайтов, но и в качестве платформы разработки новых продуктов. Примерами служат система непрерывной интеграции CruiseControl.rb от фирмы Thought Works и многочисленные специализированные системы управления контентом на основе Ruby on Rails.
Дополнительными свидетельствами интереса к этому Фреймворку является выпуск множества книг, в которых описан не только способ создания блога за 10 минут, но и показана разработка качественных систем управления сайтами и приложений для электронной коммерции. Количество документации в интернете растет с каждым днем: многие программисты ведут блоги, а также выходит огромное количество специализированных статей. Для популярной платформы Eclipse существует набор плагинов для автоматизации разработки с использованием Ruby on Rails. Для NetBeans также имеется соответствующий плагин. Все вышеперечисленное показывает, что этот фреймворк надо рассматривать не как библиотеку для создания web-приложений, а уже как самостоятельную платформу с полным набором необходимых модулей, документацией (в том числе и бумажной), готовыми решениями и качественной средой разработки.
JRuby on Rails?
Так можно ли поставить JRuby на рельсы? Начиная с версии 0.9.8, официально поддерживается 98% (на момент написания статьи) функционала фреймворка Ruby on Rails. Разработка приложения практически не отличается от классического Ruby, а установка занимает несколько десятков минут (смотрите врезку). Разница лишь в рекомендованном режиме работы с базами данных через JDBC, который прозрачно реализуется с помощью модуля ActiveRecord JDBC. Таким образом, создается новая реализация платформы Ruby on Rails, со своим web-сервером WEBrick, версией модуля ActiveRecord для работы через Java-интерфейсы и работой на Java-платформе. Но на этом не стоит останавливаться, ведь Java-платформа представляет свою методологию разработки для интернета – технологии серверов приложений. Интеграция с ними даст необходимую гибкость и масштабируемость. Причем их ассортимент на сегодняшний день велик: можно выбрать и коммерческий сервер, и сервер приложений с отрытым исходным кодом.
Посмотрим на схему типовых решений обеих платформ.

Как видно, обе платформы используют схожие идеологии в реализации экосистемы для web-приложений. Во-первых, имеется web-сервер (возможно совмещенный с сервером приложений), на который поступает запрос пользователя. Обе платформы реализуют паттерн проектирования приложений MVC – Model/View/Controller.
Базы данных
Для разработки приложений, которые используют базы данных, Ruby предлагает замечательное средство – Active Record. Это модуль объектно-реляционного маппинга – процесса отображения элементов базы данных на классы и объекты приложения. Теперь программисту практически не надо писать SQL-код, и он может сосредоточиться на бизнес-логике приложения, что, несомненно, повысит производительность. Кроме поддержки различных опций маппинга, модуль Active Record также реализует средства проверки целостности и правильности данных, поддержку списочных и древовидных структур в БД, наследование иерархий, транзакции и механизм миграций (для последовательной разработки). Для Java-платформы есть несколько ORM, обычно маппинг описывается при помощи XML-файлов или аннотаций, что ближе к реализации Active Record. Важно отметить, что Java-решения являются более масштабируемыми и гибкими (чему способствует и сама архитектура платформы), поэтому они подходят для крупных приложений класса предприятия. А Ruby-платформа направлена на высокую скорость разработки. Таким образом, у проектировщика появляется возможность комбинировать два этих подхода для получения нужных результатов в зависимости от проекта.
GUI
Большое количество библиотек для создания GUI на Ruby, к сожалению, до сих пор не перетекло в качество, и здесь нет ни лидера, ни некоего стандарта. JRuby обещает частично исправить эту проблему, предлагая в качестве библиотек для создания интерфейса пользователя JFC, который включает в себя AWT, Swing и SWT. Уже сейчас имеются проекты, которые реализуют эту идею, и пока их останавливает только слабая производительность такого решения из-за больших накладных расходов взаимодействия JRuby и Java-платформы. При более тесной интеграции с Java-платформой, над которой уже идет работа, скорость выполнения программ возрастет, что позволит использовать для создания GUI и Java-библиотеки, и «родные» библиотеки Ruby.
Утилиты
Отдельно хотелось бы рассказать о нише утилит, в которой позиции классического Ruby традиционно сильны. JRuby не отстает от своего старшего брата. К тому же, второй «родственник» Java расширяет его сферу влияния. Поэтому сейчас JRuby применяют для создания утилит на Java-платформе. Достаточно ярким примером может послужить проект Raven – специализированная утилита сборки программных продуктов на Java-платформе. Его идеология похожа на традиционную build-утилиту для платформы Ruby – Rake.
Производительность
Единственным явным недостатком JRuby по сравнению с классической реализацией является производительность. Она оставляет желать лучшего, но подвижки в этой области уже есть. А прорыва следует ожидать после выхода первой версии. На момент написания статьи при обработке реальных приложений JRuby отставал почти в 2 раза, но в некоторых специально подобранных тестах JRuby уже обходит MRI.
Разработчики возлагают надежды не только на интерпретатор: уже сейчас ведутся работы по созданию компилятора в байт-код Java. В таком случае, по оценкам экспертов производительность возрастет в 2-4 раза.
Еще одна ветка разработки направлена на интеграцию с виртуальной машиной YARV, которая в дальнейшем будет использоваться для Ruby. На данный момент реализовано исполнение простых программ, что является первым шагом до полной поддержки этой виртуальной машины. Фактически на данный момент развиваются три направления исполнения программ для JRuby: интерпретатор, Java-компилятор и поддержка YARV, причем первое направление пока является приоритетным.
Будущее JRuby
На момент написания статьи JRuby был уже довольно стабильным интерпретатором, позволявшим запускать практически любые программы на Ruby. Вот почему он используется в различных проектах от web-приложений до утилит, главной особенностью которых является тесная интеграция с Java-платформой. С постепенным повышением производительности и переходом от интерпретации к компиляции программ в байт-код Java возрастет не только производительность, но и степень интеграции с самой платформой.
Особенно перспективным в данный момент выглядит работа Ruby on Rails под управлением серверов-приложений для Java, что даст возможность в полной мере использовать инструменты этой платформы.
Интервью
Иван Тарасов, Sun Microsystems
Вопрос: Представьтесь, пожалуйста.
Ответ: Меня зовут Иван Тарасов, я работаю в Sun Microsystems в группе Data Management Tools в команде Java SE. Большую часть времени я разрабатываю приложения и утилиты, которые используются внутри компании другими группами, для чего использую Java, Ruby и JRuby. С JRuby я работаю с лета 2006 года: начал его использовать, когда пришла мысль о том, что написание одной из небольших частей web-приложения будет гораздо проще, если делать это не на Java, а на скриптовом языке.
Вопрос: Для какой целевой аудитории предназначен JRuby?
Ответ: У JRuby, по-моему, нет единственной четко выделенной целевой группы. Имеет смысл перечислить основные области применения JRuby: встроенный скриптовый язык или DSL-интерпретатор в больших Java-приложениях, средство быстрого прототипирования, язык для написания независимых скриптов, использующих Java API (например, для управления удаленным application server'ом при помощи JMX, платформа для запуска Ruby on Rails приложений на Java-сервере приложений, написание unit-тестов и сборка при помощи rake Java-приложений). Но это, конечно, далеко не полный список.
Вопрос: Как будет позиционироваться JRuby на рынке продуктов для создания ПО?
Ответ: Сейчас очень много усилий разработчиков направлено на то, чтобы Ruby on Rails работал на JRuby так же хорошо, как и на MRI. Есть много преимуществ от запуска Ruby on Rails на Java application server'е (например, упрощение развертывания приложения, возможность взаимодействия с Java и EJB-компонентами, использование JMS). Главное только понять, насколько усложнение, привнесенное application server'ом, оправдывает себя. Разработчику-одиночке, пишущему движок для своего личного блога и фотогалереи, оно, скорее всего, будет только тратой времени. Зато компании, перед которой стоит задача быстро поднять, например, интранет-приложение, интегрированное с другими, уже написанными на Java приложениями, это может оказаться очень эффективным решением с точки зрения стоимости (интересующимся читателям также советую найти блог-пост Филиппа ‘moedusa’ Чудинова «Сумма опыта»). Эта ниша, по сути, находится посреди между нишей Ruby on Rails и enterprise-scale решениями на Java.
Очень вероятно, что JRuby также разделит с Groovy нишу инструментов для «склеивания» частей Java-приложений в одно целое, и, в частности, инструментов (языков) написания GUI. Другие две ниши, в которых я надеюсь увидеть серьезное участие JRuby — это сборка и configuration management Java-проектов, а еще unit-тестирование и Behaviour Driven Development framework для Java-платформы.
Вопрос: Какие компании уже применяют JRuby?
Ответ: Тривиальный пример компании, в которой используют JRuby — Sun Microsystems. Недавно я общался с американским коллегой, который использует JRuby как замену MRI на Solaris: установка и использование JRuby оказались проще. Другим плюсом такой замены является возможность использовать кросс-платформенность JRuby: нередки ситуации, когда приходится запускать Ruby-скрипты, используя инсталляцию Ruby на удаленном сервере. Так как у нас используются и SPARC, и x86-серверы, иногда возникают сложности с запуском программ, когда архитектура машины, на которой их запускаешь, отличается от архитектуры сервера.
Есть сообщения и о других компаниях, использующих JRuby, например Nagilum, Trampoline Systems, Bank of America, University of Auckland и другие.
Вопрос: Какое будущее ждет JRuby, и какие шаги фирма Sun Microsystems предпримет для продвижения этого продукта?
Ответ: Важно понимать, что Sun — это не какой-то бесформенный безликий монстр, это еще и люди, работающие в компании. И, в случае с JRuby, продвигает проект не столько компания, сколько люди, которым интересно то, чем они занимаются. Sun, несомненно, видит ценность JRuby в контексте своих продуктов, поэтому приглашение двух основных разработчиков JRuby для его улучшения — очень разумно. Этот ход также означает более плотное взаимодействие Чарльза и Тома с разработчиками Java VM, и уже видны результаты такого взаимодействия. Сейчас ведется активная подготовка к выпуску JRuby 1.0, в которой будет улучшена производительность и интеграция с Java.
Вопрос: Будут ли Ruby и JRuby конкурентами или партнерами – каждый в своей нише?
Ответ: Думаю, Ruby и JRuby являются одновременно и конкурентами, и партнерами, с сильным уклоном в сторону партнерства. Конкуренция проявляется в стремлении сделать JRuby быстрой масштабируемой версией Ruby. С другой стороны, JRuby зависит от определения Matz'ом Ruby как языка, и нет никакого смысла в отступлении от этого определения. Еще одна реализация языка позволяет быстрее обнаружить ошибки и латентные проблемы в MRI, в частности, с межплатформенной совместимостью.
Вопрос: Какие ближайшие конкуренты есть у JRuby?
Ответ: Ближайших конкурентов несколько. На мой взгляд, это Groovy, Jython, BeanShell и Rhino, но не сказал бы, что существует ярко выраженная борьба за user-base. Судя по блогам, многие действительно пробуют несколько разных скриптовых языков для решения своих задач, прежде чем остановиться на каком-то одном. Все основные реализации перенимают друг у друга идеи, многие разработчики пробуют «конкурирующие» языки — налицо здоровая конкуренция.
Вопрос: Как соотносится JRuby с новыми скриптовыми возможностями современных версий языка Java?
Ответ: JRuby совместим с JSR 223 (Scripting for the Java Platform), реализация которого доступна в Java SE 6, и с Jakarta BSF.
Вопрос: Можно ли уже сейчас использовать JRuby в крупных программных проектах?
Ответ: JRuby, на мой взгляд, уже достаточно стабилен для использования в крупных проектах, и уже имеются достаточно весомые примеры (я уже упоминал Bank of America, они используют JRuby в production-системе для реализации DSL-языка описания бизнес-процессов). К презентации JRuby версии 1.0 (которая произойдет достаточно скоро) планируется исправить известные проблемы интеграции с Java.
Вопрос: Какие популярные Java-проекты можно использовать, программируя на JRuby?
Ответ: JRuby успешно используют с Hibernate и Spring. В блоге Trampoline Systems даже приводится пример, как можно использовать DSL, реализованный на JRuby, вместо конфигурационных XML-файлов Spring Framework. Вообще говоря, большинство Java-проектов должно без проблем интегрироваться с JRuby.
Вопрос: Насколько перспективно использование продуктов на JRuby (например, Ruby on Rails) в Java-серверах приложений?
Ответ: Так как это одна из ниш, на которые нацелен сейчас JRuby, ответ прост: очень перспективно. Я использую JRuby в приложениях, развертываемых на GlassFish с осени. И я не встретил серьезных проблем, напротив, удалось преодолеть некоторые трудности в разработке этих приложений. В JRuby были проблемы с class-loader'ами при работе под управлением сервера приложений, но они уже исправлены. В интернете есть отзывы об успешном использовании JRuby на IBM WebSphere, BEA WebLogic, Apache Tomcat и JBoss, думаю, различия между серверами приложений здесь не принципиальны.
Вопрос: Имеются ли качественные интегрированные среды разработки для JRuby?
Ответ: Для NetBeans сейчас разрабатывается Ruby-плагин, который включает в себя подсветку кода, «умное автодополнение» и многое другое. Разрабатывается он Tor'ом Norbye, подробные отчеты об успехах в разработке и screen-shot'ы можно найти в его блоге (http://blogs.sun.com/tor). Для Eclipse есть RDT — Ruby Development Tools, но с прошлого лета активность его разработки упала. Одной из положительных сторон RDT является то, что в нем можно отлаживать JRuby-скрипты.
Вопрос: На каких операционных системах может работать JRuby?
Ответ: На всех, где работает хотя бы J2SE 1.5. А это значит, что JRuby может работать, например, на AIX, где есть определенные проблемы с Ruby. Другой положительной стороной является то, что нет качественной разницы между работой JRuby на Solaris, на SPARC и, например, на Linux, на x86, - JVM нивелирует большинство различий между платформами.
WWW
На заметку программисту: пять шагов к JRuby on Rails
- Скачайте и установите JRuby (http://jruby.codehaus.org/);
- Установите Ruby on Rails командой $JRUBY_HOME/bin/gem install rails -y;
- Сгенерируйте скелет приложения $JRUBY_HOME/bin/rails sample_app;
- Установите расширение ActiveRecord-JDBC для работы с базами данных;
- Запустите web-сервер: $JRUBY_HOME/bin/jruby script/server.
Скрипты – будущее кроссплатформенного ПО?
Ведущие разработчики ПО все активнее используют скриптовые языки в своих продуктах, и JRuby – отличное подтверждение этого правила. Конкурирующая с Java-платформой технология .NET от Майкрософт также активно использует скриптовые языки. Существует несколько реализаций Ruby для .NET, достаточно популярный продукт IronPython. Для Java-платформы скриптовые языки стали частью стандарта в новых версиях. А сами флагманские языки Java и C#, постепенно «заимствуют» элементы, которые присущи Ruby и Python.
C точки зрения концепции кроссплатформенности, скриптовые языки могут стать своеобразным мостом, который соединяет не только платформы Java и .NET, но и разные компьютерные системы в целом. Еще одним плюсом наличия различных реализаций является процесс спецификации и стандартизации самих языков, который увеличивает переносимость. Следует отметить, что ценность применения скриптовых языков возрастает именно в приложениях класса предприятия, где велики издержки на интеграцию и поддержку.
Особенности поддержки системных средств JRuby
- pipes: только минимальная поддержка в open;
- sockets: реализована большая часть функционала, но имеются зарегистрированные ошибки;
- Процессы: можно запускать другие процессы и отдельный JRuby runtime в текущем JVM;
- Потоки: в MRI используются green threads (в Ruby 2.0 они будут заменены системными потоками), а в JRuby используются Java-потоки, поэтому есть определенные различия;
- Файлы: поддержка ограничивается возможностями Java-платформы.
Литература
- From Java To Ruby: Things Every Manager Should Know
Bruce Tate
- Rails for Java Developers
Stuart Halloway and Justin Gehtland
- Agile Web Development with Rails (Second Edition)
Dave Thomas, and David Heinemeier Hansson with Leon Breedt, Mike Clark, James Duncan Davidson, Justin Gehtland, and Andreas Schwarz
- Enterprise Integration with Ruby
Maik Schmidt
- Ruby Cookbook
Lucas Carlson, Leonard Richardson
- Ruby on Rails: Up and Running
Bruce Tate, Curt Hibbs
- Beginning Ruby on Rails E-commerce: From Novice to Professional
Christian Hellsten, Jarkko Laine
- Ruby Developer's Guide
Robert Feldt, Lyle Johnson, Michael Neumann
YARV (Yet Another Ruby VM – «Еще одна виртуальная машина для Раби») – виртуальная машина, которую планируют использовать начиная со второй версии Ruby
MRI (Matz' Ruby Implementation – «Реализация Раби от Матца) – классический интерпретатор языка Ruby от создателя
Groovy и Jython – конкуренты JRuby на Java-платформе
Программы на JRuby могут прозрачно использовать библиотеки на Java
Миллионы строк кода на Java теперь будут работать на Ruby-программистов
Для Ruby будут созданы JIT- и AOT-компиляторы
Keywords: zPOSTz zCODEz z10077z
Для Авторов: edit delete
Автор: Борис Вольфсон Дата: 07.04.2009 11:43:39©
|