Использование Java от Ruby: JRuby vs. Rjb - PullRequest
1 голос
/ 10 февраля 2012

Можете ли вы прокомментировать сильные и слабые стороны каждого с точки зрения:

  • Производительность (тесты?)
  • Охват функций Java
  • Кроссплатформенная совместимость

1 Ответ

1 голос
/ 10 февраля 2012

Я не использовал rjb , но концептуально он похож на JPype, мост Python-Java, который я использовал .Похоже, что оба загружают среду выполнения JVM, как общий объект или DLL, в работающий интерпретатор Python или Ruby.

По моему опыту, этот подход работает хорошо, пока не работает, а когда нетработать, это имеет тенденцию катастрофически потерпеть неудачу.Проблемы, с которыми я столкнулся с JPype, были связаны с различными допущениями, которые среда выполнения Java и среда Python делали в отношении операционной среды.Проблемные области включают в себя:

  • Модели сбора мусора.Модель сборки мусора в JVM отличается от Python и Ruby.Если вы не будете осторожны, это может (теоретически, в любом случае) вызвать проблемы.
  • Threads.Это было настоящей проблемой для меня с JPype, когда я использовал его несколько лет назад.Модель многопоточности JVM конфликтовала с моделью Python, что приводило к странным ошибкам во время выполнения.

У меня было достаточно неудачного опыта с этим подходом, и я опасался его.

Имеясказал, что, однако, rjb не является JPype, а Ruby не является Python.Модель потоков Ruby может лучше сосуществовать с JVM, чем модель потоков Python.Кроме того, я не играл с подобными технологиями более двух лет, поэтому все могло измениться.

Итог: может работать нормально, но будьте осторожны.

Что касается вашегоконкретные проблемы:

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

Я даже не собираюсь рисковать догадкой здесь, потому что характеристики производительности любого подхода во многом будут зависеть от того, что вывы делаете, и вы не обрисовали в общих чертах ваше предполагаемое использование какой-либо технологии.

Кроссплатформенный

Все, что чисто Java (например, JRuby) будет портировать чисто везде, где естьJava VM.Это не обязательно верно для решения rjb .Например, вы можете столкнуться с несовместимыми проблемами с общей библиотекой.Вы можете обнаружить, что вам нужно собрать rjb на платформе, для чего сначала нужно собрать много других вещей.И т.д.

С другой стороны, проблема, с которой вы столкнетесь с JRuby, заключается в том, что многие драгоценные камни просто недоступны.В мире Java JNI (т. Е. Переход к коду C или C ++) обычно не одобряется.«Лучший» код - это 100% Java.В мире Ruby (и в этом отношении в мире Python) общение с C API является обычной практикой.Это делают множество драгоценных камней (например, драйверы баз данных, некоторые драгоценные камни, которые используют существующие API-интерфейсы C с открытым исходным кодом, некоторые драгоценные камни, которые действительно хотят отличную производительность).Мост между C-Ruby и C полностью отличается от моста между Java и C. Gems, написанные для C-Ruby, которые связывают в коде C, просто не будут работать, как в JRuby.Таким образом, перенос кода из C-Ruby в JRuby может быть проблематичным.

Охват функций Java

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

...