Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

JRuby - это реализация языка программирования Ruby поверх виртуальной машины Java , написанная в основном на Java . Это бесплатное программное обеспечение, выпущенное под трехсторонней лицензией EPL / GPL / LGPL . JRuby тесно интегрирован с Java, что позволяет встраивать интерпретатор в любое приложение Java с полным двусторонним доступом между Java и кодом Ruby (аналогично Jython для языка Python).

Ведущими разработчиками JRuby являются Чарльз Оливер Наттер и Томас Энебо , а также многие нынешние и прошлые участники, включая Ола Бини и Ника Зигера . В сентябре 2006 года Sun Microsystems наняла Энебо и Наттера для работы над JRuby на постоянной основе. [2] В июне 2007 года компания ThoughtWorks наняла Ола Бини для работы над Ruby и JRuby. [3]

В июле 2009 года разработчики JRuby покинули Sun, чтобы продолжить разработку JRuby в Engine Yard . [4] В мае 2012 года Наттер и Энебо покинули Engine Yard, чтобы работать над JRuby в Red Hat . [5]

История [ править ]

Первоначально JRuby был создан Яном Арне Петерсеном в 2001 году. В то время и в течение нескольких последующих лет код был прямым портом кода Ruby 1.6 C. С выпуском Ruby 1.8.6 были предприняты попытки обновить JRuby до 1.8.6 функций и семантики. С 2001 года проекту помогли несколько участников, в результате чего в настоящее время (2012 год ) основная команда состоит примерно из шести человек.

JRuby 1.1 добавил в JRuby режимы компиляции Just-in-time и Ahead-of-time, и в большинстве случаев он уже был быстрее, чем текущая на тот момент эталонная реализация Ruby 1.8.7. [6]

Пакеты JRuby доступны для большинства платформ; Fedora 9 была одной из первых, кто включил ее в качестве стандартного пакета в JRuby 1.1.1. [7] [8]

В июле 2009 года основные разработчики JRuby из Sun Microsystems, Чарльз Оливер Наттер , Томас Энебо и Ник Зигер , присоединились к Engine Yard, чтобы продолжить разработку JRuby. [4] [9] В мае 2012 года Наттер и Энебо покинули Engine Yard, чтобы работать над JRuby в Red Hat . [5]

JRuby поддерживает совместимость с Ruby MRI версий с 1.6 по 1.9.3. JRuby 1.0 поддерживает Ruby 1.8.6, а JRuby 1.4.0 обновляет эту совместимость до Ruby 1.8.7. В JRuby 1.6.0 добавлена ​​одновременная поддержка Ruby 1.9.2, при этом JRuby 1.7.0 делает Ruby 1.9.3 режимом выполнения по умолчанию (совместимость с Ruby 1.8.7 доступна через флаг командной строки). В JRuby 9.0.0.0 добавлена ​​поддержка Ruby 2.2.

Текущая версия JRuby (9.2.11.0) поддерживает Ruby 2.5.7. Предстоящая версия 9.3 будет поддерживать Ruby 2.6. [10]

Ruby on Rails [ править ]

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

Совместная работа с несколькими виртуальными машинами [ править ]

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

Динамический вызов на виртуальных машинах Java [ править ]

JSR 292 ( Поддержка динамически типизированных языков на платформе JavaTM ) [16] предлагает:

  • добавление новой invokedynamicинструкции на уровне JVM, позволяющей вызывать метод с использованием проверки динамического типа ,
  • динамически изменяющиеся классы и методы во время выполнения.

Проект Sun Open Source Multi Language Virtual Machine нацелен на создание прототипа этого JSR. [17] Первый рабочий прототип, разработанный как патч для OpenJDK , был объявлен и стал доступен в конце августа 2008 года. [18] [19]

Команда JRuby внедрила динамический вызов в свою кодовую базу. Динамический вызов изначально поставлялся с выпуском 1.1.5 в примитивной форме. [20] Версия 1.7.0 включила его по умолчанию в сборках Java 8. [21]

История выпусков [ править ]

В этой таблице представлены только выпуски, которые представляют собой важные шаги в истории JRuby, за исключением версий, в которых в основном исправлены ошибки и улучшена производительность. Улучшения производительности также не показаны в таблице ниже, поскольку каждый выпуск обычно вносил такие улучшения.

Дизайн [ править ]

С начала 2006 года текущая основная команда JRuby стремилась вывести JRuby за рамки простого порта C, чтобы поддерживать лучшую производительность и способствовать возможной компиляции в байт-код Java . Чтобы поддержать эту цель, команда поставила амбициозную цель: иметь возможность запускать Ruby on Rails без изменений с использованием JRuby. В процессе достижения этой цели набор тестов JRuby расширился до такой степени, что команда приобрела уверенность в «правильности» JRuby. В результате к концу 2006 и началу 2007 года они начали совершать гораздо более сложные редизайны и рефакторинги основных подсистем JRuby.

JRuby спроектирован для работы в качестве виртуальной машины смешанного режима для Ruby, где код можно либо интерпретировать напрямую, своевременно скомпилировать во время выполнения в байт-код Java, либо заблаговременно скомпилировать в байт-код Java перед выполнением. До октября 2007 года только интерпретируемый режим поддерживал все конструкции Ruby, но полный компилятор AOT / JIT доступен начиная с версии 1.1. [22] Конструкция компилятора позволяет интерпретируемому и скомпилированному коду работать бок о бок, а также декомпиляции для повторной оптимизации и вывода сгенерированного байт-кода в виде файлов классов Java.

Поддержка фреймворков [ править ]

JRuby имеет встроенную поддержку Rails, RSpec, Rake и RubyGems. Он включает в себя подсистему FFI, позволяющую использовать библиотеки C, объединенные в виде гемов. Он также позволяет запускать интерактивную оболочку Ruby Shell (irb), как это делает Ruby MRI.

Пакет Netbeans Ruby Pack , доступный в NetBeans 6, позволяет разрабатывать IDE с использованием Ruby и JRuby, а также Ruby on Rails для двух реализаций Ruby. [35] [36] Он больше не включен в NetBeans 7.0 и более поздних версий.

Программирование [ править ]

Руби встречает Java [ править ]

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

JRuby вызывает Java [ править ]

Одной из мощных возможностей JRuby является его способность вызывать классы платформы Java . Для этого необходимо сначала загрузить поддержку Java JRuby, вызвав «require 'java'». В следующем примере создается Java JFrame с JLabel:

требуется  'java'кадр  =  javax . качели . JFrame . новый каркас . getContentPane . добавить  javax . качели . JLabel . новый ( 'Hello, World!' ) фрейм . setDefaultCloseOperation  javax . качели . JFrame :: EXIT_ON_CLOSE рамка . упаковать раму . set_visible  истина

JRuby также позволяет пользователю вызывать Java-код, используя более Ruby-подобное именование методов подчеркивания и ссылаться на свойства JavaBean как на атрибуты: [ сомнительно ]

рамка . content_pane . добавить  рамку метки . visible = true  

Вызов JRuby из Java [ править ]

JRuby можно так же легко вызвать из Java, используя либо JSR 223 [38] Scripting для Java 6, либо инфраструктуру сценариев Apache Bean Scripting .

// Пример использования сценариев JSR 233 для Java 6 ScriptEngineManager  mgr  =  new  ScriptEngineManager (); ScriptEngine  rbEngine  =  мгр . getEngineByExtension ( "rb" ); попробуйте  {  rbEngine . eval ( "ставит 'Hello World!'" ); }  catch  ( ScriptException  ex )  {  ex . printStackTrace (); }

Производительность [ править ]

Согласно некоторым тестам, JRuby быстрее альтернатив. Поскольку реализации различаются по тому, сколько кода загружается перед выполнением, разные методы измерения скорости могут привести к предвзятой интерпретации преимуществ производительности. Время, необходимое для загрузки самой виртуальной машины Java, часто исключается из времени выполнения при вычислении тестов.

JRuby имеет значительное архитектурное преимущество, заключающееся в возможности использовать потоки JVM без ограничения глобальной блокировкой интерпретатора (аналогично Rubinius ), что позволяет достичь полного параллелизма внутри процесса, чего Ruby MRI не может достичь, несмотря на использование потоков ОС.

В реальном приложении веб-сервера Mongrel, протестированном в 2007 году, производительность JRuby выше, чем у Ruby MRI 1.8, после того как была создана виртуальная машина Java. [39]

В тесте 2007 года реализации Ruby JRuby был быстрее, чем Ruby MRI 1.8 в некоторых тестах, но YARV превзошел их обоих. [40]

По состоянию на апрель 2014 года в игре The Computer Language Benchmarks Game JRuby 1.7.4 обычно имеет ту же производительность, что и Ruby MRI 2.1.0, но использует больше памяти. [41] [42]

См. Также [ править ]

  • GraalVM
  • Список языков сценариев Java
  • ZK (framework) - фреймворк Ajax, поддерживающий JRuby

Ссылки [ править ]

  1. ^ "Релизы · jruby / jruby" . github.com . Проверено 5 апреля 2021 .
  2. ^ Jacki (2006-09-07). «Sun приветствует разработчиков JRuby» . На записи. Архивировано из оригинала на 2012-08-29 . Проверено 7 ноября 2013 .
  3. Ола Бини. «ThoughtWorks» . На записи.
  4. ^ a b «Команда Сан Дж. Руби прыгает с корабля на машинный двор» . PCWorld . 2009-07-28 . Проверено 2 июня 2012 .
  5. ^ a b «Red Hat заманивает в паре JRuby power» . Реестр . 2012-05-23 . Проверено 2 июня 2012 .
  6. ^ a b Cangiano, Антонио (2007-03-12). «Великая Рубиновая перестрелка» . Проверено 1 февраля 2008 .
  7. ^ Наттер, Чарльз (2008-04-25). «JRuby 1.1.1 в RedHat Fedora» . Проверено 26 апреля 2008 .
  8. ^ "Джруби" . fedoraproject.org . Проверено 26 апреля 2008 .[ постоянная мертвая ссылка ]
  9. Наттер, Чарльз (28 июля 2009 г.). «Будущее Дж. Руби на Моторном заводе» . Архивировано из оригинала на 2009-07-31 . Проверено 28 июля 2009 .
  10. ^ «Поддержка Ruby 2.6» . Команда JRuby . Проверено 9 апреля 2020 .
  11. ^ a b «Поддержка Rails» . Команда JRuby . Проверено 17 февраля 2008 .
  12. ^ Наттер, Чарльз (2008-08-24). «С нуля до производства за 15 минут» . Проверено 27 августа 2008 .
  13. ^ 98,6% из 2807 тестовых примеров, специфичных для Rails, выполняются успешно; см. Выпущенный JRuby 0.9.8, заархивированный 22 мая 2015 г., на Wayback Machine
  14. ^ «Истории успеха» . JRuby Wiki на GitHub. 2011-01-05 . Проверено 16 марта 2011 .
  15. ^ «Токийский университет и Sun Microsystems начинают совместные исследовательские проекты по высокопроизводительным вычислениям и языкам программирования на базе Интернета» . Sun Microsystems . 2008-02-27 . Проверено 28 февраля 2008 .
  16. ^ см. JSR 292
  17. ^ «Суб-проекты и исследования» . Sun Microsystems . 2007 . Проверено 6 февраля 2008 .
  18. ^ Роуз, Джон (2008-08-26). «С Международным днем ​​Invokedynamic!» . Проверено 3 сентября 2008 .
  19. Перейти ↑ Lorimer, RJ (2008-09-01). «Динамический вызов выполняется в OpenJDK» . infoq.com . Проверено 3 сентября 2008 .
  20. Наттер, Чарльз (11 сентября 2008 г.). «Первый вкус InvokeDynamic» . Проверено 13 сентября 2008 . Мне удалось успешно подключить InvokeDynamic непосредственно к процессу отправки JRuby! Какой азарт! Код уже находится в багажнике JRuby и будет поставляться с JRuby 1.1.5 (хотя, очевидно, он будет отключен на JVM без InvokeDynamic).
  21. ^ a b «Выпущен JRuby 1.7.0» . Команда JRuby. 2012-10-22 . Проверено 23 октября 2011 .
  22. ^ a b Наттер, Чарльз (27 сентября 2007). «Компилятор завершен» . Проверено 12 октября 2007 .
  23. ^ Enebo, Том (2008-08-28). «Выпущен JRuby 1.1.4» . Проверено 25 февраля 2009 .[ постоянная мертвая ссылка ]
  24. ^ Enebo, Том (2009-03-16). «Выпущен JRuby 1.2.0» . Команда JRuby. Архивировано из оригинала на 2009-03-19 . Проверено 17 марта 2009 .
  25. ^ Enebo, Том (2009-06-03). «Выпущен JRuby 1.3.0» . Команда JRuby. Архивировано из оригинала на 2009-06-12 . Проверено 3 июня 2009 .
  26. ^ «Выпущен JRuby 1.4.0» . Команда JRuby. 2009-11-02 . Проверено 3 ноября 2009 .
  27. ^ «Выпущен JRuby 1.4.0» . adtmag.com. 2009-11-10 . Проверено 21 ноября 2009 .
  28. ^ «Выпущен JRuby 1.5.0» . Команда JRuby. 2010-05-12 . Проверено 12 мая 2010 .
  29. ^ "Выпущен JRuby 1.6.0" . Команда JRuby. 2011-03-15 . Проверено 15 марта 2011 .
  30. ^ "Выпущен JRuby 1.7.4" . Команда JRuby. 2013-05-16 . Проверено 19 мая 2013 .
  31. ^ «Выпущен JRuby 9.0.0.0» . Команда JRuby. 2015-07-22 . Проверено 25 июля 2015 .
  32. ^ "Выпущен JRuby 9.1.7.0 - JRuby.org" . jruby.org . Проверено 13 января 2017 .
  33. ^ «Выпущен JRuby 9.2.0.0» . Проверено 27 мая 2018 .
  34. ^ «Выпущен JRuby 9.2.9.0» . Проверено 5 ноября 2019 .
  35. ^ «Поддержка Ruby и JRuby доступна в IDE NetBeans» . netbeans.org. 2007-03-06 . Проверено 4 июля 2009 .
  36. ^ «Ruby делает платформу NetBeans ярче» . infoworld.com. 2007-03-01 . Проверено 4 июля 2008 .
  37. Фокс, Джошуа (17 июля 2006 г.). «Ruby для мира Java» . JavaWorld . Проверено 26 июля 2020 .
  38. ^ JSR 223: Сценарий для запроса спецификации платформы Java
  39. ^ Зигер, Ник (2007-10-25). «JRuby on Rails: достаточно быстро» . Проверено 28 октября 2007 .
  40. ^ Cangiano, Антонио (2007-12-03). «Великая Рубиновая перестрелка» . Проверено 2 февраля 2014 .
  41. ^ "JRuby по сравнению с Ruby 1.9, компьютерной версией Benchmarks Game (1)" . Архивировано из оригинала на 2015-01-23 . Проверено 2 февраля 2014 .
  42. ^ "JRuby по сравнению с Ruby 1.9, компьютерной игрой для тестов (2)" . Архивировано из оригинала на 2014-07-23 . Проверено 2 февраля 2014 .

Дальнейшее чтение [ править ]

  • Катнер, Джо (22 августа 2012 г.). Развертывание с помощью JRuby: предоставление масштабируемых веб-приложений с использованием JVM (первое издание). Прагматическая книжная полка . п. 200. ISBN 978-1934356975.
  • О Наттер, Чарльз; Энебо, Томас; Зигер, Ник; Бини, Ола; Дис, Ян (4 февраля 2011 г.). Использование JRuby: перенос Ruby на Java (первое издание). Прагматическая книжная полка . С.  300 . ISBN 978-1934356654.
  • Эдельсон, Джастин; Лю, Генри (18 ноября 2008 г.). JRuby Cookbook (Первое издание). O'Reilly Media . С.  222 . ISBN 978-0-596-51980-3.
  • Бини, Ола (24 сентября 2007 г.). Практические проекты JRuby on Rails Web 2.0: перенос Ruby on Rails в Java (первое издание). Апресс . С.  330 . ISBN 978-1-59059-881-8.
  • Кутлер, Крис; Леонард, Брайан (4 мая 2009 г.). IDE NetBeans Ruby и Rails с JRuby (первое издание). Апресс . п. 160. ISBN 978-1-4302-1636-0. Архивировано из оригинального 27 августа 2012 года . Проверено 12 июля 2009 года .

Внешние ссылки [ править ]

  • Официальный веб-сайт