Veröffentlichung der Ruby-Programmiersprache 3.2

Ruby 3.2.0 wurde veröffentlicht, eine dynamische objektorientierte Programmiersprache, die in der Programmentwicklung hocheffizient ist und die besten Funktionen von Perl, Java, Python, Smalltalk, Eiffel, Ada und Lisp vereint. Der Projektcode wird unter den BSD- („2-Klausel-BSDL“) und „Ruby“-Lizenzen vertrieben, die sich auf die neueste Version der GPL-Lizenz beziehen und vollständig mit GPLv3 kompatibel sind.

Wichtigste Verbesserungen:

  • Ein erster Port des CRuby-Interpreters wurde hinzugefügt, der in WebAssembly-Zwischencode kompiliert wird, um ihn in einem Webbrowser oder unter eigenständigen Laufzeiten wie wasmtime auszuführen. Für die direkte Interaktion mit dem Betriebssystem bei separater Ausführung wird die WASI-API (WebAssembly System Interface) verwendet. Unter anderem wird zusätzlich zu WASI ein VFS-Wrapper bereitgestellt, der es Ihnen ermöglicht, die gesamte Ruby-Anwendung in Form einer einzelnen WASM-Datei in eine Präsentation zu packen. Durch die Ausführung in einem Browser können Schulungs- und Demo-Webdienste wie TryRuby erstellt werden. Im aktuellen Entwicklungsstadium besteht der Port erfolgreich die Basis- und Bootstrap-Testsuiten, die nicht die Thread-API verwenden. Der Port unterstützt außerdem keine Fasern, Ausnahmen oder Garbage Collection.
  • Der In-Process-JIT-Compiler YJIT, der von den Entwicklern der E-Commerce-Plattform Shopify im Rahmen einer Initiative zur Leistungssteigerung von Ruby-Programmen entwickelt wurde, die das Rails-Framework verwenden und viele Methoden aufrufen, wurde für stabil und einsatzbereit erklärt Produktionseinsatz. Der wesentliche Unterschied zum bisher verwendeten JIT-Compiler MJIT, der auf der Verarbeitung ganzer Methoden basiert und einen externen Compiler in der Sprache C verwendet, besteht darin, dass YJIT Lazy Basic Block Versioning (LBBV) verwendet und einen integrierten JIT-Compiler enthält. Bei LBBV kompiliert JIT zunächst nur den Anfang der Methode und kompiliert den Rest einige Zeit später, nachdem die verwendeten Variablen- und Argumenttypen während der Ausführung bestimmt wurden. YJIT ist für x86-64- und arm64/aarch64-Architekturen auf Linux, MacOS, BSD und anderen UNIX-Plattformen verfügbar.

    Im Gegensatz zu Ruby ist der YJIT-Code in der Rust-Sprache geschrieben und erfordert zum Kompilieren den Rustc 1.58.0+-Compiler, daher ist der YJIT-Build standardmäßig deaktiviert und optional. Bei der Verwendung von YJIT wurde beim Durchführen des Yjit-Bench-Tests eine Leistungssteigerung von 41 % im Vergleich zur Verwendung der Interpretation verzeichnet.

    Veröffentlichung der Ruby-Programmiersprache 3.2

  • Zusätzlicher Schutz vor Denial-of-Service-Angriffen bei der Verarbeitung externer Daten in ineffizienten und zeitaufwändigen regulären Ausdrücken (ReDoS) hinzugefügt. Der Matching-Algorithmus, der die Memorisierungstechnik nutzt, wurde deutlich verbessert. Beispielsweise wurde die Ausführungszeit des Ausdrucks '/^a*b?a*$/ =~ "a" * 50000 + "x"' von 10 auf 0.003 Sekunden reduziert. Der Optimierungsaufwand besteht in einem Anstieg des Speicherverbrauchs, dessen Verbrauch etwa zehnmal höher ist als die Größe der Eingabedaten. Die zweite Sicherheitsmaßnahme ist die Möglichkeit, ein Timeout zu definieren (z. B. „Regexp.timeout = 10“), während dem der reguläre Ausdruck verarbeitet werden muss.
  • Der syntax_suggest-Modus ist enthalten, der bei der Diagnose der Ursachen von Fehlern hilft, die mit einem fehlenden oder zusätzlichen abschließenden „End“-Ausdruck verbunden sind. Nicht übereinstimmendes „end“, fehlendes Schlüsselwort („do“, „def“, „if“ usw.)? 1 Klasse Hund > 2 Defbell > 3 Ende 4 Ende
  • Die Möglichkeit, Argumente für Fehler zu markieren, die sich auf Typen und Argumente beziehen, wurde dem Fehlerort-Anzeigemodus hinzugefügt, zum Beispiel: test.rb:2:in `+': nil kann nicht in Integer (TypeError) sum = ary umgewandelt werden [0] + ary [1] ^^^^^^
  • Neue Syntax zum Umleiten von Argumentsätzen auf andere Methoden hinzugefügt: def foo(*) bar(*) end def baz(**) quux(**) end
  • Ruby_vm/mjit/compiler wird vorgeschlagen – eine Variante des alten MJIT-JIT-Compilers, neu geschrieben in der Ruby-Sprache. Es wurde sichergestellt, dass MJIT in einem separaten Prozess und nicht in einem MJIT-Worker-Thread ausgeführt wird.
  • In Bundler 2.4 verwendet die Abhängigkeitsverarbeitung den PubGrub-Versionsdetektor, der auch im Pub-Paketmanager für die Dart-Sprache verwendet wird. Der bisher verwendete Molinillo-Algorithmus wird weiterhin in RubyGems verwendet, wird aber in Zukunft auch durch PubGrub ersetzt.
  • Aktualisierte Versionen der integrierten Gem-Module und der in der Standardbibliothek enthaltenen.

Source: opennet.ru

Kommentar hinzufügen