Die Veröffentlichung von Ruby 3.2.0, einer dynamischen objektorientierten Programmiersprache, die sich durch eine hohe Entwicklungs-effizienz auszeichnet und die besten Eigenschaften von Perl, Java, Python, Smalltalk, Eiffel, Ada und Lisp vereint. Der Code des Projekts wird unter den Lizenzen BSD („2-Klausel BSDL“) und „Ruby“ verteilt, die sich auf die neueste Version der GPL beziehen und vollständig mit GPLv3 kompatibel sind.
Wesentliche Verbesserungen:
- Ein erster Port des CRuby-Interpreters wurde hinzugefügt, der in WebAssembly-Bytecode kompiliert wird, um im Webbrowser oder unter isolierten Laufzeitumgebungen wie wasmtime ausgeführt zu werden. Für die direkte Interaktion mit dem Betriebssystem bei isolierter Ausführung wird die WASI-API (WebAssembly System Interface) verwendet. Unter anderem wurde eine VFS-Schicht über WASI bereitgestellt, die es ermöglicht, die gesamte Ruby-Anwendung in eine einzelne wasm-Datei zu packen. Der Betrieb im Browser kann zur Erstellung von Lern- und Demonstrations-Webdiensten wie TryRuby verwendet werden. In der aktuellen Entwicklungsphase besteht der Port erfolgreich aus den Test-Suiten basic und bootstrap, in denen die Thread-API nicht verwendet wird. Im Port werden auch keine Fiber, Ausnahmen und Garbage Collection unterstützt.
- Der stabile und arbeitsbereite In-Process JIT-Compiler YJIT wurde von den Entwicklern der E-Commerce-Plattform Shopify im Rahmen einer Initiative zur Leistungssteigerung von Ruby-Anwendungen, die das Rails-Framework nutzen und eine hohe Anzahl an Methoden aufrufen, entwickelt. Ein wesentliches Unterscheidungsmerkmal zum zuvor eingesetzten JIT-Compiler MJIT, der auf der Ganzmethodenverarbeitung basierte und einen externen Compiler in C verwendete, ist, dass YJIT die Versionierung grundlegender Blöcke (LBBV – Lazy Basic Block Versioning) anwendet und einen integrierten JIT-Compiler enthält. Dank LBBV kompiliert der JIT zunächst nur den Anfang der Methode und verarbeitet den restlichen Teil später, nachdem die Typen der verwendeten Variablen und Argumente während der Ausführung bestimmt wurden. YJIT ist für die Architekturen x86-64 und arm64/aarch64 in Linux, MacOS, BSD und anderen UNIX-Plattformen verfügbar.
Im Gegensatz zu C Ruby ist der YJIT-Code in Rust geschrieben und benötigt für die Kompilierung den Compiler rustc 1.58.0 oder höher. Daher ist die YJIT-Option standardmäßig deaktiviert und muss aktiviert werden. Bei der Verwendung von YJIT wurde eine Leistungssteigerung von 41 % beim Test yjit-bench im Vergleich zur herkömmlichen Interpretation festgestellt.

- Eine zusätzliche Schutzmaßnahme gegen Denial-of-Service-Angriffe wurde hinzugefügt, die bei der Verarbeitung externer Daten in ineffizienten und lang laufenden regulären Ausdrücken (ReDoS) entstehen können. Der Algorithmus zur Mustererkennung wurde erheblich verbessert und nutzt jetzt die Technik der Memoisierung. Beispielsweise wurde die Ausführungszeit des Ausdrucks ‘/^a*b?a*$/ =~ "a" * 50000 + "x"‘ von 10 Sekunden auf 0,003 Sekunden reduziert. Der Preis für diese Optimierung ist ein erhöhtes Speicherverbrauch, der etwa zehnmal so hoch ist wie die Größe der Eingabedaten. Eine zweite Schutzmaßnahme ist die Möglichkeit, ein Timeout festzulegen (z. B. ‚Regexp.timeout = 1,0‘), innerhalb dessen das reguläre Ausdruck verarbeitet werden muss.
- Der Modus syntax_suggest ist jetzt integriert und hilft, die Ursachen für Fehler im Zusammenhang mit fehlenden oder überflüssigen Abschlussausdrücken "end" zu diagnostizieren. Unpassendes `end`, fehlendes Schlüsselwort (`do`, `def`, `if` usw.)? 1 Klasse Hund > 2 defbark > 3 end 4 end
- Der Fehleranzeigenmodus wurde um die Möglichkeit erweitert, Argumente bei Fehlern, die mit Typen und Argumenten zusammenhängen, zu kennzeichnen, zum Beispiel: test.rb:2:in `+’: nil kann nicht in Integer umgewandelt werden (TypeError) sum = ary[0] + ary[1] ^^^^^^
- Eine neue Syntax für die Umleitung zu anderen Methoden mit Argumenten wurde hinzugefügt: def foo(*) bar(*) end def baz(**) quux(**) end
- Eine neue Implementierung von ruby_vm/mjit/compiler wurde vorgestellt – eine Variante des alten JIT-Compilers MJIT, der in Ruby neu geschrieben wurde. Es wird ermöglicht, dass MJIT in einem separaten Prozess ausgeführt wird, anstatt im MJIT-Worker-Thread.
- In Bundler 2.4 wird der Versionsbestimmer PubGrub zur Verarbeitung von Abhängigkeiten verwendet, der auch im Paketmanager pub für die Programmiersprache Dart eingesetzt wird. Der zuvor verwendete Algorithmus Molinillo wird weiterhin in RubyGems verwendet, aber in Zukunft ebenfalls durch PubGrub ersetzt.
- Die Versionen der eingebauten und in die Standardbibliothek integrierten Gem-Module wurden aktualisiert.
Quelle: opennet.ru

