מעלדונג פון די Ruby פּראָגראַממינג שפּראַך 3.2

Ruby 3.2.0 איז באפרייט, אַ דינאַמיש כייפעץ-אָריענטיד פּראָגראַממינג שפּראַך וואָס איז העכסט עפעקטיוו אין פּראָגראַם אַנטוויקלונג און ינקאָרפּערייץ די בעסטער פֿעיִקייטן פון Perl, Java, Python, Smalltalk, Eiffel, Ada און Lisp. די פּרויעקט קאָד איז פונאנדערגעטיילט אונטער די BSD ("2-קלאָז 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 can’t be coerced into Integer (TypeError) sum = ary[0] + ary[1] ^^^^^^
  • Добавлен новый синтаксис для перенаправления в другие методы наборов аргументов: 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.
  • דערהייַנטיקט ווערסיעס פון געבויט-אין יידלשטיין מאַדזשולז און די אַרייַנגערעכנט אין די נאָרמאַל ביבליאָטעק.

מקור: opennet.ru

לייגן אַ באַמערקונג