Введение

Java-реализация Ruby

JRuby — это реализация языка программирования Ruby на платформе виртуальной машины Java, написанная преимущественно на Java. Это свободное программное обеспечение, распространяемое по трехсторонней лицензии EPL/GPL/LGPL. JRuby тесно интегрирован с Java, что позволяет встраивать интерпретатор в любое Java-приложение с обеспечением полного двустороннего доступа между кодом Java и Ruby (аналогично Jython для языка Python). Ведущими разработчиками JRuby являются Чарльз Оливер Наттер и Томас Энебо, а также множество текущих и бывших участников, включая Олу Бини и Ника Сигера. В сентябре 2006 года Sun Microsystems наняла Энебо и Наттера для работы над JRuby на полную ставку. В июне 2007 года ThoughtWorks наняла Олу Бини для работы над Ruby и JRuby. В июле 2009 года разработчики JRuby покинули Sun, чтобы продолжить разработку JRuby в Engine Yard. В мае 2012 года Наттер и Энебо покинули Engine Yard, чтобы работать над JRuby в Red Hat.

История

JRuby был первоначально создан Яном Арне Петерсеном в 2001 году. В то время и на протяжении нескольких последующих лет код являлся прямой портированием кода Ruby 1.6 на C. С выходом Ruby 1.8.6 началась работа по обновлению JRuby до функциональности и семантики версии 1.8.6. С 2001 года в развитие проекта внесли вклад несколько разработчиков, что привело к формированию текущей (в 2012 году) основной команды, состоящей примерно из шести человек. В JRuby 1.1 были добавлены режимы JIT-компиляции (Just-in-time) и AOT-компиляции (Ahead-of-time), благодаря чему JRuby уже в большинстве случаев превосходил по скорости эталонную реализацию Ruby 1.8.7 того времени. Пакеты JRuby доступны для большинства платформ; Fedora 9 была одной из первых, включивших его в качестве стандартного пакета в версии JRuby 1.1.1. В июле 2009 года основные разработчики JRuby из Sun Microsystems – Чарльз Оливер Наттер, Томас Энебо и Ник Сигер – присоединились к Engine Yard для продолжения разработки JRuby. В мае 2012 года Наттер и Энебо покинули Engine Yard, чтобы работать над JRuby в Red Hat.

Руби на рельсах

JRuby поддерживает веб-фреймворк Ruby on Rails, начиная с версии 0.9 (май 2006 года), с возможностью запуска RubyGems и WEBrick. После того, как компания Sun наняла двух ведущих разработчиков, совместимость и производительность Rails значительно улучшились. Версия JRuby 1.0 успешно прошла почти все тесты Rails. С тех пор разработчики стали использовать JRuby для Rails-приложений в рабочих средах.

Сотрудничество с несколькими виртуальными машинами

27 февраля 2008 года Sun Microsystems и Токийский университет объявили о совместном исследовательском проекте по созданию виртуальной машины, способной выполнять несколько приложений Ruby или JRuby на одном интерпретаторе.

Дизайн

С начала 2006 года текущая команда разработчиков JRuby стремилась вывести JRuby за рамки простого C-порта, чтобы обеспечить более высокую производительность и способствовать последующей компиляции в Java-байткод. Для достижения этой цели команда поставила амбициозную задачу: обеспечить возможность запуска Ruby on Rails без изменений с использованием JRuby. В процессе достижения этой цели набор тестов JRuby значительно расширился, что позволило команде обрести уверенность в "корректности" JRuby. В результате, к концу 2006 года и в начале 2007 года они приступили к более сложным перепроектированиям и рефакторингу основных подсистем JRuby. JRuby разработан как виртуальная машина смешанного режима для Ruby, в которой код может быть либо интерпретирован напрямую, либо скомпилирован в Java-байткод во время выполнения (JIT), либо скомпилирован в Java-байткод заранее (AOT) перед исполнением. До октября 2007 года только интерпретируемый режим поддерживал все конструкции Ruby, но полный компилятор AOT/JIT доступен начиная с версии 1.1. Архитектура компилятора позволяет интерпретируемому и скомпилированному коду работать параллельно, а также осуществлять декомпиляцию для переоптимизации и вывода сгенерированного байт-кода в виде Java-файлов классов.

Поддержка рамок

JRuby имеет встроенную поддержку Rails, RSpec, Rake и RubyGems. Он включает в себя подсистему FFI, позволяющую использовать C-библиотеки, поставляемые в виде гемов. Также поддерживается запуск интерактивной оболочки Ruby (irb) аналогично Ruby MRI. Пакет Netbeans Ruby, доступный в NetBeans 6, обеспечивает разработку IDE для Ruby и JRuby, а также Ruby on Rails для обеих реализаций Ruby. Он больше не входит в состав NetBeans 7.0 и более новых версий.

Руби встречает Яву

JRuby похож на стандартный интерпретатор Ruby, за исключением того, что он написан на Java. JRuby включает в себя те же концепции, что и Ruby, такие как объектно-ориентированное программирование и динамическая типизация. Главное отличие состоит в том, что JRuby тесно интегрирован с Java и может быть вызван напрямую из Java-программ. Java занимает значительное место в разработке веб-приложений.

Выступление

Согласно некоторым тестам, JRuby работает быстрее, чем альтернативные реализации. Поскольку различные реализации по-разному загружают код перед началом выполнения, разные методы измерения скорости могут приводить к необъективным оценкам преимуществ в производительности. При расчете результатов тестов время, необходимое для загрузки самой Java Virtual Machine, часто исключается из общего времени выполнения. JRuby обладает значительным архитектурным преимуществом, позволяющим использовать потоки JVM без ограничений, накладываемых глобальной блокировкой интерпретатора (аналогично Rubinius), что обеспечивает полную параллельность в рамках одного процесса, чего не может достичь Ruby MRI, несмотря на использование потоков операционной системы. В реальном приложении веб-сервера Mongrel, протестированном в 2007 году, производительность JRuby превосходила производительность Ruby MRI 1.8 после запуска Java Virtual Machine. В бенчмарке реализаций Ruby, проведенном в 2007 году, JRuby в некоторых тестах был быстрее, чем Ruby MRI 1.8, однако YARV показал лучшие результаты, чем оба. По состоянию на апрель 2014 года в The Computer Language Benchmarks Game, JRuby 1.7.4 обычно демонстрирует такую же производительность, как и Ruby MRI 2.1.0, но потребляет больше памяти.