Релиз 19.3.0 виртуальной машины GraalVM и реализаций Python, JavaScript, Ruby и R на её основе

Компания Oracle опубликовала выпуск универсальной виртуальной машины GraalVM 19.3.0, поддерживающей запуск приложений на JavaScript (Node.js), Python, Ruby, R, любых языках для JVM (Java, Scala, Clojure, Kotlin) и языках, для которых может формироваться биткод LLVM (C, C++, Rust). Ветка 19.3 отнесена к категории выпусков с длительным сроком поддержки (LTS) и примечательна поддержкой JDK 11, в том числе с возможностью компиляции Java-кода в исполняемые файлы (GraalVM Native Image). Код проекта распространяется под лицензией GPLv2. Одновременно выпущены новые версии использующих GraalVM реализаций языков Python, JavaScript, Ruby и R — GraalPython, GraalJS, TruffleRuby и FastR.

GraalVM предоставляет JIT-компилятор, который может на лету выполнять в JVM код любых скриптовых языков, включая JavaScript, Ruby, Python и R, а также даёт возможность запускать нативный код в JVM, преобразованный в биткод LLVM. Предоставляемый GraalVM инструментарий включает независимые от языков программирования отладчик, систему профилирования и анализатор распределения памяти. GraalVM даёт возможность создавать комбинированные приложения с компонентами на разных языках, позволяя обращаться к объектам и массивам из кода на других языках. Для языков на базе JVM имеется возможность создания скомпилированных в машинный код исполняемых файлов, которые можно выполнять напрямую с минимальным потреблением памяти (управление памятью и потоками реализовано через подключение фреймворка Substrate VM).

Изменения в GraalJS:

  • Обеспечена совместимость с Node.js 12.10.0;
  • Отключены по умолчанию нестандартные глобальные свойства и функции:
    global (заменено на globalThis, для возвращения предусмотрена настройка js.global-property), performance (js.performance), print и printErr (js.print);

  • Реализованы Promise.allSettled и nullish coalescing proposal, которые доступны в режиме ECMAScript 2020 («—js.ecmascript-version=2020»);
  • Обновлены зависимости ICU4J до 64.2, ASM до 7.1.

Изменения в GraalPython:

  • Добавлены заглушки gc.{enable,disable,isenabled}, реализованы charmap_build, sys.hexversion и _lzma;
  • Обновлена стандартная библиотека Python 3.7.8;
  • Добавлена поддержка NumPy 1.16.4 и Pandas 0.25.0;
  • Добавлена поддержка timeit;
  • socket.socket доведён до состояния, позволяющего запускать «graalpython -m http.server» и загружать нешифрованные (без TLS) http-ресурсы;
  • Исправлены проблемы, связанные с выводом объектов pandas.DataFrame,
    некорректной обработкой кортежей в bytes.startswith,
    деструктурирующим присвоением итераторов и использованием dict.__contains__ для словарей;

  • Добавлена поддержка ast.PyCF_ONLY_AST, которая позволила обеспечить работу pytest;
  • Добавлена поддержка PEP 498 (интерполяция строк в литералах);
  • Реализован флаг «—python.EmulateJython» для импорта JVM-классов с помощью нормального Python-синтаксиса import и ловли JVM-исключений из кода на Python;
  • Улучшена производительность парсера, кеширования исключений,
    доступа к объектам Python из JVM-кода. Улучшены результаты в тестах производительности для кода python и нативных расширений (исполнение нативных расширений поверх llvm подразумевает, что bitcode llvm передаётся GraalVM для JIT-компиляции).

Изменения в TruffleRuby:

  • Для компиляции нативных расширений теперь применяется встроенный инструментарий LLVM, создающий и нативный код, и биткод. Это значит, что больше нативных расширений должны компилироваться из коробки, позволяя решить большинство проблем, связанных с компоновкой;
  • Отдельная установка LLVM для установки нативных расширений в TruffleRuby;
  • Для установки C++ расширений на TruffleRuby теперь не требуется установка libc++ и libc++abi;
  • Лицензия обновлена до EPL 2.0/GPL 2.0/LGPL 2.1, как и в недавнем JRuby;
  • Добавлена поддержка опциональных аргументов в GC.stat;
  • Реализован метод Kernel#load с обёрткой и Kernel#spawn с :chdir;
  • Добавлен rb_str_drop_bytes, замечательный тем, что его использует OpenSSL;
  • Включены расширения предустановленных gem-ов, нужные для rails new в Rails 6;
  • Для компиляции нативных расширений задействованы флаги, как в MRI;
  • Внесены оптимизации производительности и сокращено потребление памяти.

Изменения в FastR:

  • Обеспечена совместимость с R 3.6.1;
  • Добавлена предварительная поддержка исполнения нативных расширений на основе LLVM. При сборке нативных пакетов R FastR сконфигурирован для использования встроенного в GraalVM инструментария LLVM. Результирующие бинарные файлы будут содержать и нативный код и LLVM-биткод.

    Предустановленные пакеты также собраны этим образом.
    FastR загружает и запускает нативный код расширений по умолчанию, но, когда запущен с опцией «—R.BackEnd=llvm», будет использоваться биткод. LLVM бэкэнд можно использовать избирательно для некоторых R пакетов, указывая «—R.BackEndLLVM=pkg1,pkg2». В случае проблем при установке пакетов, можно вернуть всё назад, вызвав fastr.setToolchain(«native») или вручную подредактировав файл $FASTR_HOME/etc/Makeconf;

  • В этом релизе FastR поставляется без библиотек GCC runtime;
  • Исправлены утечки памяти;
  • Исправлены проблемы при работе с большими векторами (>1GB);
  • Реализован grepRaw, но только для fixed=T.

Источник: opennet.ru

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