Вышел Ruby 4.0 — высокоуровневый язык программирования общего назначения, в котором появились новые технологии изоляции и компиляции, а также были значительно улучшены производительность, параллелизм и стандартная библиотека.
Главное нововведение — Ruby Box, новый экспериментальный механизм, предназначенный для изоляции определений в работающем процессе Ruby. Если включить Ruby Box с помощью RUBY_BOX=1 переменной среды, классы, модули, глобальные переменные, «обезьяньи патчи» и даже загруженные библиотеки будут ограничены определённым блоком.
Это позволяет безопасно запускать наборы тестов при использовании «обезьяньих патчей», параллельно выполнять несколько версий веб-приложения для сине-зелёного развёртывания или параллельно оценивать обновления зависимостей, сравнивая поведение во время выполнения.
Ещё одно важное изменение — внедрение ZJIT, нового экспериментального JIT-компилятора, пришедшего на смену YJIT. ZJIT — это JIT-компилятор на основе методов, использующий более крупные единицы компиляции и промежуточное представление на основе SSA, что позволяет повысить производительность Ruby в долгосрочной перспективе и сделать компилятор более доступным для внешних разработчиков.
Для сборки ZJIT требуется Rust 1.85 или более новая версия. Его можно включить с помощью опции –zjit или во время выполнения. В Ruby 4.0 ZJIT уже превосходит интерпретатор, хотя всё ещё отстаёт от YJIT. Основная команда Ruby не рекомендует использовать его в продакшене и предлагает поэкспериментировать, чтобы в Ruby 4.1 ZJIT стал готовым к использованию в продакшене и работал быстрее, чем YJIT.
Кроме того, в Ruby 4.0 появился новый класс Ractor::Port для более понятного и надёжного взаимодействия между Ractors. Он заменил более ранние API, такие как Ractor.yield и Ractor#take, которые теперь удалены. Ractors также выигрывают от снижения конкуренции за глобальную блокировку, уменьшения общего внутреннего состояния и улучшения работы кэша ЦП. Всё это способствует повышению производительности при параллельной обработке.
На уровне языка Ruby 4.0 включает в себя несколько заметных изменений. Логические операторы в начале строки теперь продолжают предыдущую строку, что повышает читаемость многострочных условных выражений. Обработка *nil была приведена в соответствие с другими способами распаковки, а сообщения об ошибках при несоответствии количества аргументов стали более понятными благодаря обратным трассировкам и фрагментам контекстного кода.
Основные классы и модули получили множество улучшений. Массивы стали более эффективными в поиске, Enumerator стал лучше определять размер, File::Stat показывает время создания файла в Linux, если это поддерживается ядром и файловой системой, а Set был перенесён из стандартной библиотеки в основной класс с упрощённым inspect выводом.
Pathname теперь также является основным классом, а поддержка Unicode была обновлена до версии 17.0, включая Emoji 17.0. Многие API в модулях IO, Fiber, Thread, Socket и Kernel были доработаны, расширены или очищены от давно устаревших функций.
Стандартная библиотека также была реорганизована. Несколько встроенных гемов были повышены до статуса по умолчанию, другие обновлены до более новых основных версий, а некоторые компоненты были удалены или выделены в отдельные библиотеки, например библиотека CGI, которая больше не предоставляется в полном объёме по умолчанию.
Что касается реализации, Ruby 4.0 обеспечивает значительное повышение производительности. Создание объектов происходит быстрее, особенно при использовании аргументов с ключевыми словами. Сбор мусора стал более эффективным во многих аспектах, доступ к переменным экземпляра был оптимизирован на внутреннем уровне, а количество блокировок во многих «горячих» точках было сокращено.
Наконец, в Ruby 4.0 внесены изменения в совместимость, о которых разработчикам следует знать. Удалены некоторые устаревшие API, в том числе устаревшие методы создания процессов и старые методы Ractor, а некоторые API на языке C были признаны устаревшими или изменены для повышения безопасности и корректности. Для поддержки Windows теперь требуется Visual Studio 2015 или более новая версия.
Для получения дополнительной информации см. объявление.