Geschrieben von naruse am 25.12.2024
Übersetzt von Thomas Ritter
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:
- Gleichzeitige Ausführung von IPv6- und IPv4-Namensauflösung
- Verbindungsversuche mit den aufgelösten IP-Adressen, wobei IPv6 priorisiert wird, mit parallelen Versuchen im Abstand von 250ms
- 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 UmgebungsvariableRUBY_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 ingc/gc_impl.h
definierte API mit Ruby. Der eingebaute Garbage Collector kann jetzt auch als Bibliothek gebaut werden, indemmake modular-gc MODULAR_GC=default
verwendet wird, und kann mit der UmgebungsvariableRUBY_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 UmgebungsvariableRUBY_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 vonWarning[: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, wennWarning[: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 vonThread::Backtrace::Location
. AuchKernel#raise
,Thread#raise
undFiber#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. Wennfalse
, markiert GC nur junge Objekte. Standardwert isttrue
. [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.[]
undRactor.[]=
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 einenTypeError
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
zugem push
hinzugefügt. Sie ermöglicht das Speichern von Signaturen bei sigstore.dev.
- Option
-
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.
- Eine
-
JSON
- Leistungsverbesserungen von
JSON.parse
, etwa 1,5-mal schneller als json in Version 2.7.x.
- Leistungsverbesserungen von
-
Tempfile
- Das Schlüsselwortargument
anonymous: true
wurde fürTempfile.create
implementiert.Tempfile.create(anonymous: true)
entfernt die erstellte temporäre Datei sofort. Anwendungen müssen die Datei daher nicht mehr entfernen. [Feature #20497]
- Das Schlüsselwortargument
-
win32/sspi.rb
- Diese Bibliothek wurde aus dem Ruby-Repository nach ruby/net-http-sspi extrahiert. [Feature #20775]
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}'
- Symbolschlüssel werden in der modernen Symbolschlüssel-Syntax angezeigt:
-
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[]=
undDidYouMean::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
undrb_newobj_of
(sowie die entsprechenden MakrosRB_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
oderInteger#+
, gibt jetzt eine Performance-Warnung aus (-W:performance
oderWarning[: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.