Ruby 2.6 добавляет JIT-компилятор


Ruby 2.6 был выпущен с экспериментальным JIT-компилятором и модулем абстрактного синтаксического дерева.

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

Ruby 2.6

JIT является основным усовершенствованием новой версии, и хотя оно все еще находится на экспериментальной стадии, улучшит производительность кода, особенно для рабочих нагрузок, интенсивно использующих CPU. Разработчики утверждают, что их бенчмарки показали улучшение в 1,7 раза по сравнению с Ruby 2.5 для программ, подобных этой (реальным тестом был бенчмарк под названием Optcarrot. Разработчики отмечают, что компилятор все еще является экспериментальным, и многие другие нагрузки, требующие много памяти, такие как Rails, могут не получить от него преимущества в данный момент.

JIT-компилятор также заслуживает внимания, потому что он работает иначе, чем JIT-компиляторы в других языках. JIT-компилятор Ruby печатает C-код на диск и порождает обычный процесс компилятора C для генерации родного кода.

JIT-компилятор поддерживается, когда Ruby собирается с помощью GCC, Clang или Microsoft VC++, который должен быть доступен во время выполнения. Будущие версии будут включать инлайнинг методов, что, как ожидается, увеличит производительность Ruby на порядок.

Помимо JIT-компилятора, предварительная версия включает новый модуль RubyVM::AST. Этот модуль имеет метод parse, который анализирует заданный код Ruby, являющийся строкой, и возвращает набор узлов AST (Abstract Syntax Tree). Модуль также имеет метод parse_file, который анализирует заданный файл с кодом Ruby и возвращает узлы AST. Еще один класс, который был введен, – RubyVM::AbstractSyntaxTree::Node. Он позволяет получать исходное расположение и дочерние узлы из объектов Node. Эта функция является экспериментальной.

Другие новые возможности включают добавление бесконечного диапазона, который можно использовать, не указывая, насколько велик диапазон; и метод Add Binding#source_location, возвращающий местоположение источника.


Добавить комментарий