Выпуск мовы праграмавання 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 can't be [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

Дадаць каментар