Wydanie języka programowania Ruby 3.2

Wydano Ruby 3.2.0, dynamiczny obiektowy język programowania, który jest bardzo wydajny w tworzeniu programów i zawiera najlepsze cechy języków Perl, Java, Python, Smalltalk, Eiffel, Ada i Lisp. Kod projektu dystrybuowany jest na licencji BSD („2-klauzulowej BSDL”) i „Ruby”, która odnosi się do najnowszej wersji licencji GPL i jest w pełni kompatybilna z GPLv3.

Główne ulepszenia:

  • Dodano początkowy port interpretera CRuby, który kompiluje się do kodu pośredniego WebAssembly w celu uruchomienia w przeglądarce internetowej lub w autonomicznych środowiskach wykonawczych, takich jak wasmtime. Do bezpośredniej interakcji z systemem operacyjnym, gdy działa on oddzielnie, używany jest interfejs API WASI (WebAssembly System Interface). Udostępnione jest między innymi wiązanie VFS na WASI, które pozwala spakować całą aplikację w języku Ruby do widoku w postaci pojedynczego pliku wasm. Uruchamianie w przeglądarce może służyć do tworzenia samouczków i demonstracyjnych usług internetowych, takich jak TryRuby. Na obecnym etapie rozwoju port pomyślnie przechodzi testy basic i bootstrap, które nie korzystają z Thread API. Port nie obsługuje również światłowodu, wyjątków ani wyrzucania elementów bezużytecznych.
  • Kompilator in-process JIT YJIT, stworzony przez twórców platformy e-commerce Shopify w ramach inicjatywy zwiększenia wydajności programów Ruby, które wykorzystują framework Rails i wywołują wiele metod, został uznany za stabilny i gotowy do wykorzystanie produkcyjne. Kluczową różnicą w stosunku do poprzednio używanego kompilatora MJIT JIT, który jest oparty na przetwarzaniu metod i korzysta z zewnętrznego kompilatora C, jest to, że YJIT używa Lazy Basic Block Versioning (LBBV) i zawiera zintegrowany kompilator JIT. Dzięki LBBV JIT kompiluje najpierw tylko początek metody, a resztę kompiluje po pewnym czasie, po określeniu typów użytych zmiennych i argumentów podczas wykonywania. YJIT jest dostępny dla architektur x86-64 i arm64/aarch64 w systemach Linux, MacOS, BSD i innych platformach UNIX.

    W przeciwieństwie do CRuby, kod YJIT jest napisany w języku Rust i wymaga kompilatora rustc 1.58.0+ do kompilacji, więc kompilacja YJIT jest domyślnie wyłączona i jest opcjonalna. Podczas korzystania z YJIT odnotowano 41% wzrost wydajności podczas przeprowadzania testu yjit-bench w porównaniu z użyciem interpretacji.

    Wydanie języka programowania Ruby 3.2

  • Dodano dodatkową ochronę przed atakami powodującymi odmowę usługi podczas przetwarzania danych zewnętrznych w nieefektywnych i długotrwałych wyrażeniach regularnych (ReDoS). Znacząco ulepszony algorytm dopasowywania, który wykorzystuje technikę zapamiętywania. Na przykład czas wykonania wyrażenia „/^a*b?a*$/ =~ "a" * 50000 + "x"' został skrócony z 10 do 0.003 sekundy. Ceną optymalizacji jest wzrost zużycia pamięci, której zużycie jest około 10-krotnie większe niż rozmiar danych wejściowych. Drugim zabezpieczeniem jest możliwość zdefiniowania limitu czasu (np. „Regexp.timeout = 1.0”), dla którego wyrażenie regularne musi mieć czas na przetworzenie.
  • Tryb syntax_suggest pomaga w diagnozowaniu przyczyn błędów związanych z brakującą lub nadmiarową instrukcją zamykającą „end”. Niedopasowany `end', brakujące słowo kluczowe (`do', `def`, `if` itd.)? 1 klasa Pies > 2 defbark > 3 koniec 4 koniec
  • Dodano możliwość oznaczania argumentów w przypadku błędów związanych z typami i argumentami w trybie lokalizacji błędów, na przykład: test.rb:2:in `+': nil nie można przekonwertować na Integer (TypeError) sum = ary[ 0] + ary [1] ^^^^^^
  • Dodano nową składnię przekierowania do innych metod zestawu argumentów: def foo(*) bar(*) end def baz(**) quux(**) end
  • Zaproponowano Ruby_vm/mjit/compiler - wariant starego kompilatora MJIT JIT, przepisany w języku Ruby. Zapewnione wykonanie MJIT w oddzielnym procesie, zamiast wykonywania w wątku roboczym MJIT.
  • W Bundlerze 2.4 obsługa zależności wykorzystuje wyszukiwarkę wersji PubGrub, używaną również przez menedżera pakietów pub dla Dart. Wcześniej używany algorytm Molinillo jest nadal używany w RubyGems, ale w przyszłości zostanie również zastąpiony przez PubGrub.
  • Zaktualizowane wersje wbudowanych i standardowych modułów klejnotów biblioteki.

Źródło: opennet.ru

Dodaj komentarz