Die Veröffentlichung von Ruby 3.4.0, einer dynamischen objektorientierten Programmiersprache, die sich auf hohe Effizienz in der Softwareentwicklung konzentriert und die besten Eigenschaften von Perl, Java, Python, Smalltalk, Eiffel, Ada und Lisp vereint. Der Code des Projekts wird unter den Lizenzen BSD (â2-clause BSDLâ) und âRubyâ verbreitet, die sich auf die neueste Version der GPL beziehen und mit GPLv3 kompatibel sind.
Wesentliche Verbesserungen:
- Ein neuer Bezeichner âitâ wurde hinzugefĂŒgt, der mit dem unbenannten Parameter in einem Standardblock identifiziert wird. Der neue Bezeichner ist Ă€hnlich der zuvor verfĂŒgbaren Variablen â_1â, wenn ein Parameter an den Block ĂŒbergeben wird. Die EinfĂŒhrung des neuen Bezeichners erklĂ€rt sich aus dem Wunsch, Verwirrungen zu vermeiden, die durch die Möglichkeit entstehen, mehrere Parameter an den Block zu ĂŒbergeben (âitâ impliziert, dass immer nur ein Argument vorhanden ist, wĂ€hrend es bei Angabe von â_1â unklar bleibt, ob der Parameter â_2â existiert). [1, 2, 3].each { puts _1 } [1, 2, 3].each { puts it } ary = [âfooâ, âbarâ, âbazâ] p ary.map { it.upcase } #=> [âFOOâ, âBARâ, âBAZâ]
- StandardmĂ€Ăig ist der Prism-Parser aktiviert, der portabler, leichter zu warten und fehlerresistenter ist. FĂŒr die Analyse von Code in Ruby stehen in Ihren Programmen die Methoden Prism.parse(source) zur VerfĂŒgung, um die AST-Darstellung des Codes zu erhalten, Prism.parse_comments(source), um Kommentare aus dem Code zu extrahieren, und Prism.parse_success?(source), um auf Fehler im Code zu prĂŒfen. Um den zuvor verwendeten Parser âparse.yâ zurĂŒckzugeben, kann die Option ââparser=parse.yâ verwendet werden.
- In der Bibliothek âsocketâ ist die UnterstĂŒtzung des Happy Eyeballs-Algorithmus (RFC 8305) standardmĂ€Ăig implementiert und aktiviert, um das optimale Protokoll bei der Verbindung zu Hosts auszuwĂ€hlen, die gleichzeitig ĂŒber IPv4- und IPv6-Adressen verfĂŒgbar sind. Bei Verwendung des Happy Eyeballs-Algorithmus löst der Client sofort die IPv4- und IPv6-Adressen fĂŒr den Host auf und sendet einen Verbindungsantrag ĂŒber IPv6, wĂ€hrend er mit einer Verzögerung von 250 ms versucht, parallel ĂŒber andere an den Host gebundene Adressen eine Verbindung herzustellen, ohne auf das Ergebnis der vorherigen Verbindungsversuche zu warten. Die Verbindung, die zuerst hergestellt wurde, bleibt aktiv, wĂ€hrend die anderen geschlossen werden. Zuvor fĂŒhrten Aufrufe der Methoden TCPSocket.new und Socket.tcp in Ruby-Programmen zu sequenziellen Versuchen, IPv4-/IPv6-Adressen aufzulösen und Verbindungen herzustellen, was zu Verzögerungen fĂŒhrte, beispielsweise wenn der erste Versuch eine Verbindung ĂŒber IPv6 war, aber das System IPv6 nicht unterstĂŒtzte. Um das alte Verhalten wiederherzustellen, können die Umgebungsvariable âRUBY_TCP_NO_FAST_FALLBACK=1â, die Einstellung âSocket.tcp_fast_fallback=falseâ oder das Argument âfast_fallback: falseâ beim Aufruf der Methoden verwendet werden.
- Die Leistungsoptimierung des YJIT-Just-in-Time-Compilers, der von den Entwicklern der E-Commerce-Plattform Shopify im Rahmen der Initiative zur Leistungssteigerung von Ruby-Anwendungen, die das Rails-Framework verwenden und viele Methoden aufrufen, vorangetrieben wird, wurde fortgesetzt. Im Gegensatz zum MJIT-Compiler verwendet der neue YJIT die Versionierung von Basisblöcken (LBBV â Lazy Basic Block Versioning) anstelle einer umfassenden Verarbeitung der Methoden und ist in Form eines integrierten JIT-Compilers implementiert, der in Rust geschrieben wurde. Dank LBBV kompiliert der JIT zunĂ€chst nur den Anfang der Methode, wĂ€hrend der Rest zu einem spĂ€teren Zeitpunkt kompiliert wird, nachdem die Typen der verwendeten Variablen und Argumente wĂ€hrend der AusfĂŒhrung bestimmt wurden.
In der neuen Version konnte in den meisten Tests auf x86_64- und ARM64-Systemen eine Leistungssteigerung von YJIT erzielt werden. Neue Optimierungen wurden hinzugefĂŒgt: Verwendung von Registern fĂŒr lokale Variablen und Methodenargumente; Nutzung von Ruby-Implementierungen wie Array#each, Array#select und Array#map; Inline-Expansion von leeren Methoden und Methoden, die Konstanten, ihre eigene Instanz oder Eingabeparameter zurĂŒckgeben; separate Code-Generatoren fĂŒr bestimmte Methoden; Optimierung bei der Verarbeitung von Strings (String#getbyte, String#setbyte); Beschleunigung von Bitoperationen.
Der Speicherverbrauch wurde durch die Komprimierung von Metadaten und die Implementierung eines einheitlichen EinschrĂ€nkungssystems reduziert. Eine Option ââyjit-mem-sizeâ wurde hinzugefĂŒgt, die standardmĂ€Ăig auf 128MiB eingestellt ist und das gesamte Speicherverbrauch beeinflusst. Eine Option ââyjit-logâ wurde hinzugefĂŒgt, um die Verfolgung zu aktivieren, welcher Code genau kompiliert wird.
- Die Möglichkeit zur dynamischen Lade von alternativen Garbage Collectors, die in Form von Shared Libraries bereitgestellt werden, wurde eingefĂŒhrt. Um die benötigte Bibliothek mit dem entsprechenden Garbage Collector anzugeben, sollte die Umgebungsvariable RUBY_GC_LIBRARY verwendet werden. Der standardmĂ€Ăig verwendete integrierte Garbage Collector kann nun als separate Bibliothek kompiliert werden. ZusĂ€tzlich wurde ein Garbage Collector auf der Basis des MMTk-Frameworks hinzugefĂŒgt, der in Rust geschrieben ist.
- Die Ăbergabe von benannten Argumenten mit dem Wert nil in Methoden ist jetzt erlaubt. Argumente mit dem Wert "**nil" werden nun als leerer Hash "**{}" behandelt, ohne benannte Argumente an die Methode zu ĂŒbergeben.
- Die Ăbergabe von Blöcken und die Angabe von benannten Argumenten in Indizes ist untersagt, beispielsweise "a[&b]=c" und "o[1, a: 1]".
- Die Methode JSON.parse wurde optimiert, die jetzt eineinhalb Mal schneller als das Paket json 2.7 arbeitet.
Quelle: opennet.ru
