Випуск мови програмування Ruby 3.2

Відбувся реліз Ruby 3.2.0, динамічної об'єктно-орієнтованої мови програмування, що відрізняється високою ефективністю розробки програм і увібрала в себе кращі риси Perl, Java, Python, Smalltalk, Eiffel, Ada та Lisp. Код проекту розповсюджується під ліцензіями BSD («2-clause BSDL») та «Ruby», яка посилається на останній варіант ліцензії GPL та повністю сумісна з GPLv3.

Основні покращення:

  • Доданий початковий порт інтерпретатора CRuby, що компілюється в проміжний код WebAssembly для запуску в web-браузері або під управлінням відокремлених runtime, таких як wasmtime. Для прямої взаємодії з операційною системою під час відокремленого запуску використовується API WASI (WebAssembly System Interface). Серед іншого надана VFS обв'язка поверх WASI, що дозволяє упаковувати весь додаток на мові Ruby у виставу у вигляді одного wasm-файлу. Запуск у браузері може використовуватися для створення навчальних та демонстраційних web-сервісів, таких як TryRuby. На поточному етапі розвитку порт успішно проходить тестові набори basic та bootstrap, у яких не застосовується API Thread. У порті також не підтримуються файбери (Fiber), винятки та складання сміття.
  • Оголошено стабільним і готовим для робітників застосування внутрішньопроцесний JIT-компілятор YJIT, створений розробниками платформи електронної комерції Shopify в рамках ініціативи щодо збільшення продуктивності Ruby-програм, що використовують фреймворк Rails і викликають багато методів. Ключовою відмінністю від раніше використовуваного JIT-компілятора MJIT, що базується на обробці методів цілком і використовує зовнішній компілятор мовою Сі, є те, що YJIT застосовує версіонування базових блоків (LBBV - Lazy Basic Block Versioning) і містить інтегрований JIT-компілятор. Завдяки LBBV, JIT спочатку компілює тільки початок методу, а частину, що залишилася, компілює через деякий час, після того як у процесі виконання буде визначено типи використовуваних змінних і аргументів. YJIT доступний для архітектур x86-64 та arm64/aarch64 у Linux, MacOS, BSD та інших UNIX-платформах.

    На відміну від Ruby код YJIT написаний мовою Rust і вимагає для компіляції наявність компілятора rustc 1.58.0+, тому збірка YJIT за замовчуванням відключена і є опціональною. При використанні YJIT зафіксовано збільшення продуктивності під час тесту yjit-bench на 41% порівняно з використанням інтерпретації.

    Випуск мови програмування Ruby 3.2

  • Додано додатковий захист від атак, що викликають відмову в обслуговуванні при обробці зовнішніх даних у неефективних і тривало виконуваних регулярних виразах (ReDoS). Значно покращено алгоритм зіставлення, у якому задіяна техніка меморизації. Наприклад, час виконання виразу '/^a*b?a*$/ =~ «a» * 50000 + «x»' скоротився з 10 до 0.003 секунд. Ціною оптимізації є збільшення споживання пам'яті, витрата якої приблизно в 10 разів вище за розмір вхідних даних. Другим заходом захисту є можливість визначення таймууту (наприклад, Regexp.timeout = 1.0), за який має встигнути обробитися регулярне вираження.
  • До складу включено режим syntax_suggest, що допомагає діагностувати причини помилок, пов'язаних з відсутнім або зайвим виразом «end», що закриває. Unmatched `end', missing keyword (`do', `def`, `if`, etc.)? 1 class Dog > 2 defbark > 3 end 4 end
  • У режимі показу місця помилок додано можливість позначення аргументів при помилках, пов'язаних з типами та аргументами, наприклад: test.rb:2:in `+': nil [0] ^^^^^^
  • Додано новий синтаксис для перенаправлення в інші методи наборів аргументів: def foo(*) bar(*) end def baz(**) quux(**) end
  • Запропоновано ruby_vm/mjit/compiler – варіант старого JIT-компілятора MJIT, переписаний мовою Ruby. Забезпечено виконання MJIT в окремому процесі, замість виконання у потоці MJIT worker.
  • У Bundler 2.4 при обробці залежностей задіяний визначник версій PubGrub, який також застосовується в пакетному менеджері pub для мови Dart. Раніше використовуваний алгоритм Molinillo продовжує застосовуватись у RubyGems, але в майбутньому також буде замінений на PubGrub.
  • Оновлено версії вбудованих та вхідних до стандартної бібліотеки gem-модулів.

Джерело: opennet.ru

Додати коментар або відгук