Ruby 3.4.0 veröffentlicht

Wir freuen uns, die Veröffentlichung von Ruby 3.4.0 bekannt zu geben. Ruby 3.4 führt den it-Blockparameter ein, ändert Prism zum Standardparser, bietet Happy Eyeballs Version 2-Unterstützung in der Socket-Bibliothek, verbessert YJIT, integriert Modular GC und mehr.

it wird eingeführt

it wurde hinzugefügt, um auf einen Blockparameter ohne Variablennamen zu verweisen. [Feature #18980]

ary = ["foo", "bar", "baz"]

p ary.map { it.upcase } #=> ["FOO", "BAR", "BAZ"]

it verhält sich weitgehend wie _1. Wenn die Absicht besteht, nur _1 in einem Block zu verwenden, sind andere nummerierte Parameter wie _2 eine zusätzliche kognitive Belastung für Leser. Daher wurde it als praktische Alternative eingeführt. Verwenden Sie it in einfachen Fällen, in denen es sich von selbst erklärt, z. B. in Einzeilern.

Prism ist jetzt der Standardparser

Der Standardparser wurde von parse.y auf Prism umgestellt. [Feature #20564]

Dies ist eine interne Verbesserung, und für den Benutzer sollte es kaum sichtbare Änderungen geben. Wenn Sie Kompatibilitätsprobleme bemerken, melden Sie diese bitte.

Um den konventionellen Parser zu verwenden, nutzen Sie das Kommandozeilenargument --parser=parse.y.

Die Socket-Bibliothek unterstützt jetzt Happy Eyeballs Version 2 (RFC 8305)

Die Socket-Bibliothek unterstützt jetzt Happy Eyeballs Version 2 (RFC 8305), die neueste standardisierte Version eines weit verbreiteten Ansatzes für bessere Konnektivität in vielen Programmiersprachen, in TCPSocket.new (TCPSocket.open) und Socket.tcp.

Diese Verbesserung ermöglicht Ruby, effiziente und zuverlässige Netzwerkverbindungen anzubieten, die an moderne Internetumgebungen angepasst sind.

Bis Ruby 3.3 wurden Namensauflösung und Verbindungsversuche seriell durchgeführt. Mit diesem Algorithmus funktionieren sie nun wie folgt:

  1. Gleichzeitige Ausführung von IPv6- und IPv4-Namensauflösung
  2. Verbindungsversuche mit den aufgelösten IP-Adressen, wobei IPv6 priorisiert wird, mit parallelen Versuchen im Abstand von 250ms
  3. Rückgabe der ersten erfolgreichen Verbindung, während alle anderen abgebrochen werden

Dies minimiert Verbindungsverzögerungen, selbst wenn ein bestimmtes Protokoll oder eine bestimmte IP-Adresse verzögert oder nicht verfügbar ist.

Diese Funktion ist standardmäßig aktiviert, sodass keine zusätzliche Konfiguration erforderlich ist. Um sie global zu deaktivieren, setzen Sie die Umgebungsvariable RUBY_TCP_NO_FAST_FALLBACK=1 oder rufen Sie Socket.tcp_fast_fallback=false auf. Um sie auf Methodenebene zu deaktivieren, verwenden Sie das Schlüsselwortargument fast_fallback: false.

YJIT

TL;DR

  • Bessere Leistung bei den meisten Benchmarks auf den Plattformen x86-64 und arm64.
  • Reduzierter Speicherverbrauch durch komprimierte Metadaten und ein einheitliches Speicherlimit.
  • Verschiedene Fehlerbehebungen: YJIT ist jetzt robuster und gründlicher getestet.

Neue Funktionen

  • Kommandozeilenoptionen
    • --yjit-mem-size führt ein einheitliches Speicherlimit ein (Standard 128 MiB), um die gesamte YJIT-Speichernutzung zu verfolgen, und bietet eine intuitivere Alternative zur alten Option --yjit-exec-mem-size.
    • --yjit-log aktiviert ein Kompilierungsprotokoll, um nachzuverfolgen, was kompiliert wird.
  • Ruby-API
    • RubyVM::YJIT.log bietet Zugriff auf das Ende des Kompilierungsprotokolls zur Laufzeit.
  • YJIT-Statistiken
    • RubyVM::YJIT.runtime_stats liefert jetzt immer zusätzliche Statistiken zu Invalidierung, Inline-Verarbeitung und Metadaten-Codierung.

Neue Optimierungen

  • Komprimierter Kontext reduziert den Speicherbedarf für die Speicherung von YJIT-Metadaten
  • Register für lokale Variablen und Ruby-Methodenargumente zuweisen
  • Wenn YJIT aktiviert ist, werden mehr in Ruby geschriebene Kernprimitive verwendet:
    • Array#each, Array#select, Array#map wurden in Ruby neu geschrieben, um die Leistung zu verbessern [Feature #20182].
  • Möglichkeit, kleine/triviale Methoden zu inlinen, wie z. B.:
    • Leere Methoden
    • Methoden, die eine Konstante zurückgeben
    • Methoden, die self zurückgeben
    • Methoden, die direkt ein Argument zurückgeben
  • Spezialisiertes Codegen für viele weitere Laufzeitmethoden
  • Optimierung von String#getbyte, String#setbyte und anderen String-Methoden
  • Optimierung von bitweisen Operationen zur Beschleunigung der Low-Level-Bit/Byte-Manipulation
  • Unterstützung von teilbaren Konstanten im Multi-Ractor-Modus
  • Verschiedene andere inkrementelle Optimierungen

Modularer GC

  • Alternative Implementierungen für den Garbage Collector (GC) können durch die modulare Garbage-Collector-Funktion dynamisch geladen werden. Um diese Funktion zu aktivieren, konfigurieren Sie Ruby zur Build-Zeit mit --with-modular-gc. GC-Bibliotheken können zur Laufzeit mithilfe der Umgebungsvariable RUBY_GC_LIBRARY geladen werden. [Feature #20351]

  • Der eingebaute Garbage Collector von Ruby wurde in eine separate Datei unter gc/default/default.c ausgelagert und interagiert über eine in gc/gc_impl.h definierte API mit Ruby. Der eingebaute Garbage Collector kann jetzt auch als Bibliothek gebaut werden, indem make modular-gc MODULAR_GC=default verwendet wird, und kann mit der Umgebungsvariable RUBY_GC_LIBRARY=default aktiviert werden. [Feature #20470]

  • Eine experimentelle GC-Bibliothek basierend auf MMTk wird bereitgestellt. Diese GC-Bibliothek kann mit make modular-gc MODULAR_GC=mmtk gebaut und mit der Umgebungsvariable RUBY_GC_LIBRARY=mmtk aktiviert werden. Dies erfordert die Rust-Toolchain auf der Build-Maschine. [Feature #20860]

Sprachänderungen

  • String-Literale in Dateien ohne einen frozen_string_literal-Kommentar geben jetzt eine Deprecation-Warnung aus, wenn sie mutiert werden. Diese Warnungen können mit -W:deprecated oder durch Setzen von Warning[:deprecated] = true aktiviert werden. Um diese Änderung zu deaktivieren, können Sie Ruby mit dem Kommandozeilenargument --disable-frozen-string-literal ausführen. [Feature #20205]

  • Keyword-Splatting von nil beim Aufrufen von Methoden wird jetzt unterstützt. **nil wird ähnlich wie **{} behandelt, übergibt keine Schlüsselwörter und ruft keine Konvertierungsmethoden auf. [Bug #20064]

  • Die Blockübergabe ist im Index nicht mehr erlaubt. [Bug #19918]

  • Keyword-Argumente sind im Index nicht mehr erlaubt. [Bug #20218]

  • Der Toplevel-Name ::Ruby ist jetzt reserviert, und die Definition wird verwarnt, wenn Warning[:deprecated] aktiviert ist. [Feature #20884]

Updates für Kernklassen

Hinweis: Es werden nur bemerkenswerte Updates der Kernklassen aufgeführt.

  • Exception

    • Exception#set_backtrace akzeptiert jetzt ein Array von Thread::Backtrace::Location. Auch Kernel#raise, Thread#raise und Fiber#raise akzeptieren dieses neue Format. [Feature #13557]
  • GC

    • GC.config hinzugefügt, um Konfigurationsvariablen für den Garbage Collector zu setzen. [Feature #20443]

    • Der GC-Konfigurationsparameter rgengc_allow_full_mark wird eingeführt. Wenn false, markiert GC nur junge Objekte. Standardwert ist true. [Feature #20443]

  • Ractor

    • require in einem Ractor ist erlaubt. Der Ladeprozess wird im Haupt-Ractor ausgeführt. Ractor._require(feature) wurde hinzugefügt, um den Ladeprozess im Haupt-Ractor auszuführen. [Feature #20627]

    • Ractor.main? wurde hinzugefügt. [Feature #20627]

    • Ractor.[] und Ractor.[]= wurden hinzugefügt, um auf den ractor-lokalen Speicher des aktuellen Ractors zuzugreifen. [Feature #20715]

    • Ractor.store_if_absent(key){ init } wurde hinzugefügt, um ractor-lokale Variablen threadsicher zu initialisieren. [Feature #20875]

  • Range

    • Range#size löst jetzt einen TypeError aus, wenn der Bereich nicht iterierbar ist. [Misc #18984]

Updates der Standardbibliothek

Hinweis: Es werden nur erwähnenswerte Updates der Standardbibliotheken aufgeführt.

  • RubyGems

    • Option --attestation zu gem push hinzugefügt. Sie ermöglicht das Speichern von Signaturen bei sigstore.dev.
  • Bundler

    • Eine lockfile_checksums-Konfiguration wurde hinzugefügt, um Prüfsummen in neue Lockfiles einzuschließen.
    • bundle lock --add-checksums wurde hinzugefügt, um Prüfsummen zu einem bestehenden Lockfile hinzuzufügen.
  • JSON

    • Leistungsverbesserungen von JSON.parse, etwa 1,5-mal schneller als json in Version 2.7.x.
  • Tempfile

    • Das Schlüsselwortargument anonymous: true wurde für Tempfile.create implementiert. Tempfile.create(anonymous: true) entfernt die erstellte temporäre Datei sofort. Anwendungen müssen die Datei daher nicht mehr entfernen. [Feature #20497]
  • win32/sspi.rb

Kompatibilitätsprobleme

Hinweis: Ausgenommen Fehlerbehebungen bei Funktionen.

  • Fehlermeldungen und Backtrace-Anzeigen wurden geändert.

    • Ein einfacher Anführungsstrich wird anstelle eines Backticks als öffnendes Anführungszeichen verwendet. [Feature #16495]
    • Ein Klassenname wird vor einem Methodennamen angezeigt (nur wenn die Klasse einen permanenten Namen hat). [Feature #19117]
    • Methoden von Kernel#caller, Thread::Backtrace::Location usw. wurden entsprechend geändert.
    Alt:
    test.rb:1:in `foo': undefined method `time' for an instance of Integer
            from test.rb:2:in `<main>'
    
    Neu:
    test.rb:1:in 'Object#foo': undefined method 'time' for an instance of Integer
            from test.rb:2:in '<main>'
    
  • Die Darstellung von Hash#inspect wurde geändert. [[Bug #20433]]

    • Symbolschlüssel werden in der modernen Symbolschlüssel-Syntax angezeigt: "{user: 1}"
    • Andere Schlüssel haben jetzt Leerzeichen um =>: '{"user" => 1}', während vorher keine da waren: '{"user"=>1}'
  • Kernel#Float() akzeptiert jetzt Dezimalzeichenketten ohne Dezimalteil. [Feature #20705]

    Float("1.")    #=> 1.0 (zuvor wurde ein ArgumentError ausgelöst)
    Float("1.E-1") #=> 0.1 (zuvor wurde ein ArgumentError ausgelöst)
    
  • String#to_f akzeptiert jetzt Dezimalzeichenketten ohne Dezimalteil. Beachten Sie, dass sich das Ergebnis ändert, wenn ein Exponent angegeben wird. [Feature #20705]

    "1.".to_f    #=> 1.0
    "1.E-1".to_f #=> 0.1 (zuvor wurde 1.0 zurückgegeben)
    
  • Refinement#refined_class wurde entfernt. [Feature #19714]

Kompatibilitätsprobleme in der Standardbibliothek

  • DidYouMean

    • DidYouMean::SPELL_CHECKERS[]= und DidYouMean::SPELL_CHECKERS.merge! wurden entfernt.
  • Net::HTTP

    • Die folgenden veralteten Konstanten wurden entfernt:

      • Net::HTTP::ProxyMod
      • Net::NetPrivate::HTTPRequest
      • Net::HTTPInformationCode
      • Net::HTTPSuccessCode
      • Net::HTTPRedirectionCode
      • Net::HTTPRetriableCode
      • Net::HTTPClientErrorCode
      • Net::HTTPFatalErrorCode
      • Net::HTTPServerErrorCode
      • Net::HTTPResponseReceiver
      • Net::HTTPResponceReceiver

      Diese Konstanten wurden seit 2012 als veraltet markiert.

  • Timeout

    • Negative Werte für Timeout.timeout werden abgelehnt. [Bug #20795]
  • URI

    • Standardparser wurde von RFC 2396-konform auf RFC 3986-konform umgestellt. [Bug #19266]

C-API-Updates

  • rb_newobj und rb_newobj_of (sowie die entsprechenden Makros RB_NEWOBJ, RB_NEWOBJ_OF, NEWOBJ, NEWOBJ_OF) wurden entfernt. [Feature #20265]
  • Die veraltete Funktion rb_gc_force_recycle wurde entfernt. [Feature #18290]

Sonstige Änderungen

  • Wenn ein Block an eine Methode übergeben wird, die den Block nicht nutzt, wird im verbosen Modus (-w) eine Warnung angezeigt. [Feature #15554]

  • Die Neudefinition einiger Kernmethoden, die speziell durch den Interpreter und JIT optimiert wurden, wie String.freeze oder Integer#+, gibt jetzt eine Performance-Warnung aus (-W:performance oder Warning[:performance] = true). [Feature #20429]

Siehe NEWS oder Commit-Logs für weitere Details.

Mit diesen Änderungen wurden 4942 Dateien geändert, 202244 Einfügungen(+), 255528 Löschungen(-) seit Ruby 3.3.0!

Frohe Weihnachten, schöne Feiertage und viel Spaß beim Programmieren mit Ruby 3.4!

Herunterladen

  • https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0.tar.gz

    SIZE: 23153022
    SHA1: 8ccb561848a7c460ae08e1a120a47c4a88a79335
    SHA256: 068c8523442174bd3400e786f4a6952352c82b1b9f6210fd17fb4823086d3379
    SHA512: bc70ecba27d1cdea00879f03487cad137a7d9ab2ad376cfb7a65780ad14da637fa3944eeeede2c04ab31eeafb970c64ccfeeb854c99c1093937ecc1165731562
    
  • https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0.tar.xz

    SIZE: 17215572
    SHA1: eb25447cc404e8d2e177c62550d0224ebd410e68
    SHA256: 0081930db22121eb997207f56c0e22720d4f5d21264b5907693f516c32f233ca
    SHA512: 776a2cf3e9ccc77c27500240f168aa3e996b0c7c1ee1ef5a7afc291a06c118444016fde38b5b139c0b800496b8eb1b5456562d833f0edc0658917164763b1af7
    
  • https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0.zip

    SIZE: 28310193
    SHA1: 26254ca5d3decc28a4e5faec255995265e5270b5
    SHA256: c120228038af04554f6363e716b0a32cbf53cf63c6adf9f2c22a24f43dc8b555
    SHA512: 4d535ed10db76a6aa74f8a025df319deb28483a7a781c24045906ee7663f1cff9d9f9e71dbc993c9e050113a34b37c7fa2143c355a0a6e1e1029bf2c92213ecc
    

Was ist Ruby

Ruby wurde erstmals 1993 von Matz (Yukihiro Matsumoto) entwickelt und wird jetzt als Open Source entwickelt. Es läuft auf mehreren Plattformen und wird weltweit vor allem für die Webentwicklung verwendet.