ืฉื—ืจื•ืจ ืฉืคืช ื”ืชื›ื ื•ืช Ruby 3.2

Ruby 3.2.0 ื™ืฆื ืœืื•ืจ, ืฉืคืช ืชื›ื ื•ืช ื“ื™ื ืžื™ืช ืžื•ื ื—ื” ืขืฆืžื™ื, ื™ืขื™ืœื” ืžืื•ื“ ื‘ืคื™ืชื•ื— ืชื•ื›ื ื™ื•ืช ื•ืžืฉืœื‘ืช ืืช ืžื™ื˜ื‘ ื”ืชื›ื•ื ื•ืช ืฉืœ Perl, Java, Python, Smalltalk, Eiffel, Ada ื•-Lisp. ืงื•ื“ ื”ืคืจื•ื™ืงื˜ ืžื•ืคืฅ ืชื—ืช ืจื™ืฉื™ื•ื ื•ืช BSD ("2-ืกืขื™ืฃ BSDL") ื•-"Ruby", ื”ืžืชื™ื™ื—ืก ืœื’ืจืกื” ื”ืขื“ื›ื ื™ืช ื‘ื™ื•ืชืจ ืฉืœ ืจื™ืฉื™ื•ืŸ GPL ื•ืชื•ืื ื‘ืื•ืคืŸ ืžืœื ืœ-GPLv3.

ืฉื™ืคื•ืจื™ื ืขื™ืงืจื™ื™ื:

  • ื ื•ืกืคื” ื™ืฆื™ืื” ืจืืฉื•ื ื™ืช ืฉืœ ื”ืžืชื•ืจื’ืžืŸ Cruby, ืืฉืจ ืžืงืžืคืœ ืœืชื•ืš ืงื•ื“ ื‘ื™ื ื™ื™ื ืฉืœ WebAssembly ืœื”ืคืขืœื” ื‘ื“ืคื“ืคืŸ ืื™ื ื˜ืจื ื˜ ืื• ืชื—ืช ื–ืžื ื™ ืจื™ืฆื” ืขืฆืžืื™ื™ื ื›ื’ื•ืŸ wasmtime. ืœืื™ื ื˜ืจืืงืฆื™ื” ื™ืฉื™ืจื” ืขื ืžืขืจื›ืช ื”ื”ืคืขืœื” ื›ืืฉืจ ื”ื™ื ืคื•ืขืœืช ื‘ื ืคืจื“, ื ืขืฉื” ืฉื™ืžื•ืฉ ื‘ืžืžืฉืง ื”-API ืฉืœ WASI (WebAssembly System Interface). ื‘ื™ืŸ ื”ื™ืชืจ ืžืกื•ืคืงืช ืขืœ ื’ื‘ื™ WASI ืžืขื˜ืคืช VFS ื”ืžืืคืฉืจืช ืœืืจื•ื– ืืช ื›ืœ ืืคืœื™ืงืฆื™ื™ืช Ruby ืœืžืฆื’ืช ื‘ืฆื•ืจืช ืงื•ื‘ืฅ wasm ื‘ื•ื“ื“. ืจื™ืฆื” ื‘ื“ืคื“ืคืŸ ื™ื›ื•ืœื” ืœืฉืžืฉ ืœื™ืฆื™ืจืช ืฉื™ืจื•ืชื™ ืื™ื ื˜ืจื ื˜ ืœื”ื“ืจื›ื” ื•ื”ื“ื’ืžื” ื›ื’ื•ืŸ TryRuby. ื‘ืฉืœื‘ ื”ืคื™ืชื•ื— ื”ื ื•ื›ื—ื™, ื”ืคื•ืจื˜ ืขื•ื‘ืจ ื‘ื”ืฆืœื—ื” ืืช ื—ื‘ื™ืœื•ืช ื”ื‘ื“ื™ืงื” ื”ื‘ืกื™ืกื™ื•ืช ื•ื”-bootstrap, ืฉืื™ื ืŸ ืžืฉืชืžืฉื•ืช ื‘-Thread API. ื”ื ืžืœ ื’ื ืื™ื ื• ืชื•ืžืš ื‘ืกื™ื‘ื™ื, ื—ืจื™ื’ื™ื ืื• ืื™ืกื•ืฃ ืืฉืคื”.
  • ืžื”ื“ืจ JIT ื‘ืชื”ืœื™ืš ืฉืœ YJIT, ืฉื ื•ืฆืจ ืขืœ ื™ื“ื™ ืžืคืชื—ื™ ืคืœื˜ืคื•ืจืžืช ื”ืžืกื—ืจ ื”ืืœืงื˜ืจื•ื ื™ Shopify ื›ื—ืœืง ืžื™ื•ื–ืžื” ืœื”ื’ื‘ืจืช ื”ื‘ื™ืฆื•ืขื™ื ืฉืœ ืชื•ื›ื ื™ื•ืช Ruby ื”ืžืฉืชืžืฉื•ืช ื‘ืžืกื’ืจืช Rails ื•ืงื•ืจืื•ืช ืœื”ืจื‘ื” ืฉื™ื˜ื•ืช, ื”ื•ื›ืจื– ื™ืฆื™ื‘ ื•ืžื•ื›ืŸ ืฉื™ืžื•ืฉ ื‘ื™ื™ืฆื•ืจ. ื”ื”ื‘ื“ืœ ื”ืขื™ืงืจื™ ืžื”ืžื”ื“ืจ MJIT JIT ืฉื”ื™ื” ื‘ืฉื™ืžื•ืฉ ื‘ืขื‘ืจ, ื”ืžื‘ื•ืกืก ืขืœ ืขื™ื‘ื•ื“ ืฉื™ื˜ื•ืช ืฉืœืžื•ืช ื•ืžืฉืชืžืฉ ื‘ืžื”ื“ืจ ื—ื™ืฆื•ื ื™ ื‘ืฉืคืช C, ื”ื•ื ืฉ-YJIT ืžืฉืชืžืฉ ื‘-Lazy Basic Block Versioning (LBBV) ื•ืžื›ื™ืœ ืžื”ื“ืจ JIT ืžืฉื•ืœื‘. ืขื LBBV, JIT ืงื•ื“ื ื›ืœ ืงื•ืžืคื™ืœืฆื™ื” ืจืง โ€‹โ€‹ืืช ืชื—ื™ืœืช ื”ืฉื™ื˜ื”, ื•ืงื•ืžืคื™ืœืฆื™ื” ืืช ื”ืฉืืจ ื–ืžืŸ ืžื” ืœืื—ืจ ืžื›ืŸ, ืœืื—ืจ ืฉืกื•ื’ื™ ื”ืžืฉืชื ื™ื ื•ื”ืืจื’ื•ืžื ื˜ื™ื ื”ืžืฉืžืฉื™ื ื ืงื‘ืขื™ื ื‘ืžื”ืœืš ื”ื‘ื™ืฆื•ืข. YJIT ื–ืžื™ืŸ ืขื‘ื•ืจ ืืจื›ื™ื˜ืงื˜ื•ืจื•ืช x86-64 ื•-arm64/aarch64 ื‘-Linux, MacOS, BSD ื•ืคืœื˜ืคื•ืจืžื•ืช UNIX ืื—ืจื•ืช.

    ื‘ื ื™ื’ื•ื“ ืœืจื•ื‘ื™, ืงื•ื“ YJIT ื›ืชื•ื‘ ื‘ืฉืคืช Rust ื•ื“ื•ืจืฉ ืžื”ื“ืจ rustc 1.58.0+ ืœืฆื•ืจืš ื”ื™ื“ื•ืจ, ื›ืš ืฉื”-YJIT build ืžื•ืฉื‘ืช ื›ื‘ืจื™ืจืช ืžื—ื“ืœ ื•ื”ื•ื ืื•ืคืฆื™ื•ื ืœื™. ื‘ืขืช ืฉื™ืžื•ืฉ ื‘-YJIT, ื ืจืฉืžื” ืขืœื™ื™ื” ืฉืœ 41% ื‘ื‘ื™ืฆื•ืขื™ื ื‘ืขืช ื”ืคืขืœืช ืžื‘ื—ืŸ ื”-yjit-bench ื‘ื”ืฉื•ื•ืื” ืœืฉื™ืžื•ืฉ ื‘ืคืจืฉื ื•ืช.

    ืฉื—ืจื•ืจ ืฉืคืช ื”ืชื›ื ื•ืช Ruby 3.2

  • ื ื•ืกืคื” ื”ื’ื ื” ื ื•ืกืคืช ืžืคื ื™ ื”ืชืงืคื•ืช ืžื ื™ืขืช ืฉื™ืจื•ืช ื‘ืขืช ืขื™ื‘ื•ื“ ื ืชื•ื ื™ื ื—ื™ืฆื•ื ื™ื™ื ื‘ื‘ื™ื˜ื•ื™ื™ื ืจื’ื•ืœืจื™ื™ื ืœื ื™ืขื™ืœื™ื ื•ื’ื•ื–ืœื™ื ื–ืžืŸ (ReDoS). ืืœื’ื•ืจื™ืชื ื”ื”ืชืืžื”, ื”ืžืฉืชืžืฉ ื‘ื˜ื›ื ื™ืงืช ื”ืฉื™ื ื•ืŸ, ืฉื•ืคืจ ืžืฉืžืขื•ืชื™ืช. ืœื“ื•ื’ืžื”, ื–ืžืŸ ื”ื‘ื™ืฆื•ืข ืฉืœ ื”ื‘ื™ื˜ื•ื™ '/^a*b?a*$/ =~ "a" * 50000 + "x"' ื”ื•ืคื—ืช ืž-10 ืœ-0.003 ืฉื ื™ื•ืช. ืขืœื•ืช ื”ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ื”ื™ื ื’ื™ื“ื•ืœ ื‘ืฆืจื™ื›ืช ื”ื–ื™ื›ืจื•ืŸ, ืฉืฆืจื™ื›ืชื• ื’ื‘ื•ื”ื” ืคื™ 10 ื‘ืขืจืš ืžื’ื•ื“ืœ ื ืชื•ื ื™ ื”ืงืœื˜. ืืžืฆืขื™ ื”ืื‘ื˜ื—ื” ื”ืฉื ื™ ื”ื•ื ื”ื™ื›ื•ืœืช ืœื”ื’ื“ื™ืจ ืคืกืง ื–ืžืŸ (ืœื“ื•ื’ืžื”, "Regexp.timeout = 1.0") ืฉื‘ืžื”ืœื›ื• ื™ืฉ ืœืขื‘ื“ ืืช ื”ื‘ื™ื˜ื•ื™ ื”ืจื’ื•ืœืจื™.
  • ืžืฆื‘ syntax_suggest ื›ืœื•ืœ, ืฉืขื•ื–ืจ ืœืื‘ื—ืŸ ืืช ื”ืกื™ื‘ื•ืช ืœืฉื’ื™ืื•ืช ื”ืงืฉื•ืจื•ืช ืœื‘ื™ื˜ื•ื™ "ืกื•ืฃ" ื—ืกืจ ืื• ื ื•ืกืฃ. 'ืกื•ืฃ' ืœื ืชื•ืื, ืžื™ืœืช ืžืคืชื— ื—ืกืจื” ('ืขืฉื”', 'def', 'ืื' ื•ื›ื•') ? ื›ืœื‘ ืžื—ืœืงื” 1 > 2 ื“ืคื‘ืจืง > 3 ืžืงืฆื” 4 ืกื•ืฃ
  • ื”ื™ื›ื•ืœืช ืœืกืžืŸ ืืจื’ื•ืžื ื˜ื™ื ืขื‘ื•ืจ ืฉื’ื™ืื•ืช ื”ืงืฉื•ืจื•ืช ืœืกื•ื’ื™ื ื•ืœืืจื’ื•ืžื ื˜ื™ื ื ื•ืกืคื” ืœืžืฆื‘ ืชืฆื•ื’ืช ืžื™ืงื•ื ื”ืฉื’ื™ืื”, ืœื“ื•ื’ืžื”: test.rb:2:in `+': ืœื ื ื™ืชืŸ ืœื›ืคื•ืช ืขืœ nil ืœืžืกืคืจ ืฉืœื (TypeError) sum = ary [0] + ary [1] ^^^^^^
  • ื ื•ืกืฃ ืชื—ื‘ื™ืจ ื—ื“ืฉ ืœื”ืคื ื™ื™ืช ืงื‘ื•ืฆื•ืช ืฉืœ ืืจื’ื•ืžื ื˜ื™ื ืœืฉื™ื˜ื•ืช ืื—ืจื•ืช: def foo(*) bar(*) end def baz(**) quux(**) end
  • ืžื•ืฆืข Ruby_vm/mjit/compiler - ื’ืจืกื” ืฉืœ ืžื”ื“ืจ MJIT JIT ื”ื™ืฉืŸ, ืฉื ื›ืชื‘ ืžื—ื“ืฉ ื‘ืฉืคืช Ruby. ื•ื“ื ืฉ-MJIT ืคื•ืขืœ ื‘ืชื”ืœื™ืš ื ืคืจื“ ื‘ืžืงื•ื ืœืจื•ืฅ ื‘ืฉืจืฉื•ืจ ืขื•ื‘ื“ ืฉืœ MJIT.
  • ื‘-Bundler 2.4, ืขื™ื‘ื•ื“ ื”ืชืœื•ืช ืžืฉืชืžืฉ ื‘ื’ืœืื™ ื’ืจืกืช PubGrub, ื”ืžืฉืžืฉ ื’ื ื‘ืžื ื”ืœ ื—ื‘ื™ืœื•ืช ื”ืคืื‘ ืขื‘ื•ืจ ืฉืคืช Dart. ื”ืืœื’ื•ืจื™ืชื ืฉืœ Molinillo ืฉืฉื™ืžืฉ ื‘ืขื‘ืจ ืžืžืฉื™ืš ืœื”ื™ื•ืช ื‘ืฉื™ืžื•ืฉ ื‘-RubyGems, ืืš ื’ื ื™ื•ื—ืœืฃ ื‘-PubGrub ื‘ืขืชื™ื“.
  • ื’ืจืกืื•ืช ืžืขื•ื“ื›ื ื•ืช ืฉืœ ืžื•ื“ื•ืœื™ ืื‘ื ื™ ื—ืŸ ืžื•ื‘ื ื™ื ื•ืฉืœ ืืœื” ื”ื›ืœื•ืœื™ื ื‘ืกืคืจื™ื™ื” ื”ืกื˜ื ื“ืจื˜ื™ืช.

ืžืงื•ืจ: OpenNet.ru

ื”ื•ืกืคืช ืชื’ื•ื‘ื”