NEWS für Ruby 3.3.0
Dieses Dokument listet benutzersichtbare Funktionsänderungen seit der Veröffentlichung von 3.2.0 auf, ausgenommen Fehlerbehebungen.
Beachten Sie, dass jeder Eintrag auf ein Minimum beschränkt ist, siehe Links für Details.
Kommandozeilenoptionen
-
Eine neue Warnkategorie
performancewurde eingeführt. Sie wird standardmäßig auch im ausführlichen Modus nicht angezeigt. Aktivieren Sie sie mit-W:performanceoderWarning[:performance] = true. [Feature #19538] -
Eine neue Umgebungsvariable
RUBY_CRASH_REPORTwurde eingeführt, um Ruby-Absturzberichte in eine Datei oder einen Unterbefehl umzuleiten. Weitere Details finden Sie im AbschnittBUG REPORT ENVIRONMENTder Ruby-Manpage. [Feature #19790]
Aktualisierungen von Kernklassen
Hinweis: Wir listen nur wichtige Klassenaktualisierungen auf.
-
-
Array#packlöst nunArgumentErrorfür unbekannte Direktiven aus. [Bug #19150]
-
-
-
Dir.for_fdwurde hinzugefügt, um einDir-Objekt für das durch den bereitgestellten Verzeichnisfile-Deskriptor angegebene Verzeichnis zurückzugeben. [Feature #19347] -
Dir.fchdirwurde hinzugefügt, um in das durch den bereitgestellten Verzeichnisfile-Deskriptor angegebene Verzeichnis zu wechseln. [Feature #19347] -
Dir#chdirwurde hinzugefügt, um in das durch das bereitgestellteDir-Objekt angegebene Verzeichnis zu wechseln. [Feature #19347]
-
-
-
Encoding#replicatewurde entfernt, es war bereits als veraltet markiert. [Feature #18949]
-
-
-
Einführung von
Fiber#kill. [Bug #595]fiber = Fiber.new do while true puts "Yielding..." Fiber.yield end ensure puts "Exiting..." end fiber.resume # Yielding... fiber.kill # Exiting...
-
-
-
MatchData#named_capturesakzeptiert nun optional das Schlüsselwortsymbolize_names. [Feature #19591]
-
-
Module
-
Module#set_temporary_namewurde hinzugefügt, um einem Modul einen temporären Namen zu geben. [Feature #19521]
-
-
-
Neue Kernklasse zum Erstellen von Sammlungen mit schwachen Referenzen. Die Klasse verwendet Semantik der Gleichheit zur Suche nach Schlüsseln wie eine normale Hash-Tabelle, hält aber keine starken Referenzen auf die Schlüssel. [Feature #18498]
-
-
-
ObjectSpace::WeakMap#deletewurde hinzugefügt, um schwache Karten-Einträge nachdrücklich zu löschen. [Feature #19561]
-
-
-
Proc#dupundProc#clonerufen nun die Hooks initialize_dup bzw. initialize_clone auf. [Feature #19362]
-
-
Process
-
Neue Methode
Process.warmup, die die Ruby-virtuelle Maschine benachrichtigt, dass die Bootsequenz abgeschlossen ist und dies ein guter Zeitpunkt für die Optimierung der Anwendung ist. Dies ist nützlich für langlaufende Anwendungen. Die tatsächlich durchgeführten Optimierungen sind vollständig implementierungsspezifisch und können sich zukünftig ohne Vorankündigung ändern. [Feature #18885]
-
-
-
Process::Status#& und Process::Status#>> sind veraltet. [Bug #19868]
-
-
-
Range#reverse_eachkann nun beginnungslose Bereiche mit einemInteger-Endpunkt verarbeiten. [Feature #18515] -
Range#reverse_eachlöst nunTypeErrorfür endlose Bereiche aus. [Feature #18551] -
Range#overlap?wurde hinzugefügt, um zu prüfen, ob sich zwei Bereiche überschneiden. [Feature #19839]
-
-
-
Hinzufügen von
Refinement#targetals Alternative zu Refinement#refined_class. Refinement#refined_class ist veraltet und wird in Ruby 3.4 entfernt. [Feature #19714]
-
-
-
Die Cache-basierte Optimierung unterstützt nun Lookarounds und atomare Gruppierungen. Das heißt, Matches für
Regexp, die diese Erweiterungen enthalten, können nun auch in linearer Zeit zur Länge der Eingabezeichenkette durchgeführt werden. Sie dürfen jedoch keine Erfassungen enthalten und nicht verschachtelt sein. [Feature #19725]
-
-
-
String#unpacklöst nunArgumentErrorfür unbekannte Direktiven aus. [Bug #19150] -
String#bytespliceakzeptiert nun neue Argumente für Index/Länge oder einen Bereich der zu kopierenden Quellzeichenkette. [Feature #19314]
-
-
-
Thread::Queue#freezelöst nunTypeErroraus. [Bug #17146]
-
-
-
Thread::SizedQueue#freezelöst nunTypeErroraus. [Bug #17146]
-
-
-
Time.newmit einem Zeichenkettenargument ist strenger geworden. [Bug #19293]Time.new('2023-12-20') # no time information (ArgumentError)
-
-
-
TracePointunterstützt das Ereignisrescue. Wenn die ausgelöste Ausnahme abgefangen wurde, wirdTracePointden Hook auslösen. Das Ereignisrescueunterstützt nur Ruby-Levelrescue. [Feature #19572]
-
Aktualisierungen der Standardbibliothek
-
RubyGems und
Bundlerwarnen, wenn Benutzer versuchen, die folgenden Gems zurequiren, ohne sie zu Gemfile oder gemspec hinzuzufügen. Dies liegt daran, dass sie in zukünftigen Ruby-Versionen gebündelte Gems werden. Diese Warnung wird unterdrückt, wenn Sie das gem bootsnap verwenden. Wir empfehlen, Ihre Anwendung mindestens einmal mit der UmgebungsvariableDISABLE_BOOTSNAP=1auszuführen. Dies ist eine Einschränkung dieser Version. [Feature #19351] [Feature #19776] [Feature #19843]-
abbrev
-
base64
-
bigdecimal
-
csv
-
drb
-
getoptlong
-
mutex_m
-
nkf
-
observer
-
racc
-
resolv-replace
-
rinda
-
syslog
-
abbrev
-
base64
-
bigdecimal
-
csv
-
drb
-
getoptlong
-
mutex_m
-
nkf
-
observer
-
racc
-
resolv-replace
-
rinda
-
syslog
-
-
Socket#recvundSocket#recv_nonblockgeben bei geschlossenen Verbindungennilanstelle einer leeren Zeichenkette zurück.Socket#recvmsgundSocket#recvmsg_nonblockgeben bei geschlossenen Verbindungennilanstelle eines leeren Pakets zurück. [Bug #19012] -
Namensauflösung wie
Socket.getaddrinfo,Socket.getnameinfo,Addrinfo.getaddrinfousw. kann nun unterbrochen werden. [Feature #19965] -
Random::Formatter#alphanumericwurde erweitert, um das optionale Schlüsselwortargumentcharszu akzeptieren. [Feature #18183]
Das folgende Standard-Gem wurde hinzugefügt.
-
prism 0.19.0
Die folgenden Standard-Gems wurden aktualisiert.
-
RubyGems 3.5.3
-
abbrev 0.1.2
-
base64 0.2.0
-
benchmark 0.3.0
-
bigdecimal 3.1.5
-
bundler 2.5.3
-
cgi 0.4.1
-
csv 3.2.8
-
date 3.3.4
-
delegate 0.3.1
-
drb 2.2.0
-
english 0.8.0
-
erb 4.0.3
-
error_highlight 0.6.0
-
etc 1.4.3
-
fcntl 1.1.0
-
fiddle 1.1.2
-
fileutils 1.7.2
-
find 0.2.0
-
getoptlong 0.2.1
-
io-console 0.7.1
-
io-nonblock 0.3.0
-
io-wait 0.3.1
-
ipaddr 1.2.6
-
irb 1.11.0
-
json 2.7.1
-
logger 1.6.0
-
mutex_m 0.2.0
-
net-http 0.4.0
-
net-protocol 0.2.2
-
nkf 0.1.3
-
observer 0.1.2
-
open-uri 0.4.1
-
open3 0.2.1
-
openssl 3.2.0
-
optparse 0.4.0
-
ostruct 0.6.0
-
pathname 0.3.0
-
pp 0.5.0
-
prettyprint 0.2.0
-
pstore 0.1.3
-
psych 5.1.2
-
rdoc 6.6.2
-
readline 0.0.4
-
reline 0.4.1
-
resolv 0.3.0
-
rinda 0.2.0
-
securerandom 0.3.1
-
set 1.1.0
-
shellwords 0.2.0
-
singleton 0.2.0
-
stringio 3.1.0
-
strscan 3.0.7
-
syntax_suggest 2.0.0
-
syslog 0.1.2
-
tempfile 0.2.1
-
time 0.3.0
-
timeout 0.4.1
-
tmpdir 0.2.0
-
tsort 0.2.0
-
un 0.3.0
-
uri 0.13.0
-
weakref 0.1.3
-
win32ole 1.8.10
-
yaml 0.3.0
-
zlib 3.1.0
Das folgende gebündelte Gem wird von den Standard-Gems gefördert.
-
racc 1.7.3
Die folgenden gebündelten Gems wurden aktualisiert.
-
minitest 5.20.0
-
rake 13.1.0
-
test-unit 3.6.1
-
rexml 3.2.6
-
rss 0.3.0
-
net-ftp 0.3.3
-
net-imap 0.4.9
-
net-smtp 0.4.0
-
rbs 3.4.0
-
typeprof 0.21.9
-
debug 1.9.1
Sehen Sie GitHub-Releases wie Logger oder Changelogs für Details zu den Standard-Gems oder gebündelten Gems.
Prism
-
Eingeführt den Prism-Parser als Standard-Gem
-
Prismist ein portabler, fehlertoleranter und wartbarer rekursiver Abstiegsparser für die Ruby-Sprache
-
-
Prismist produktionsreif und wird aktiv gepflegt, Sie können es anstelle vonRipperverwenden-
Es gibt umfangreiche Dokumentation zur Verwendung von
Prism -
Prismist sowohl eine C-Bibliothek, die intern von CRuby verwendet wird, als auch ein Ruby-Gem, das von jeder Tooling verwendet werden kann, die Ruby-Code parsen muss -
Bemerkenswerte Methoden in der
PrismAPI sind:-
Prism.parse(source)gibt die AST als Teil eines Parse-Ergebnisobjekts zurück -
Prism.parse_comments(source)gibt die Kommentare zurück -
Prism.parse_success?(source)gibt true zurück, wenn keine Fehler vorhanden sind
-
-
-
Sie können Pull-Anfragen oder Issues direkt im Prism-Repository erstellen, wenn Sie am Beitrag interessiert sind
-
Sie können nun
ruby --parser=prismoderRUBYOPT="--parser=prism"verwenden, um mit demPrism-Compiler zu experimentieren. Bitte beachten Sie, dass diese Flagge nur zum Debuggen dient.
Kompatibilitätsprobleme
-
Die Erstellung/das Forken von Unterprozessen über die folgenden Methoden zum Öffnen von Dateien ist veraltet. [Feature #19630]
-
Wenn ein nicht-Lambda, nicht-literaler Block übergeben wird, löst
Kernel#lambdanun stattdessenArgumentErroraus, anstatt ihn unverändert zurückzugeben. Diese Verwendungen geben seit Ruby 3.0.0 Warnungen unter der KategorieWarning[:deprecated]aus. [Feature #19777] -
Die Umgebungsvariable
RUBY_GC_HEAP_INIT_SLOTSist veraltet und wurde entfernt. Stattdessen sollten die UmgebungsvariablenRUBY_GC_HEAP_%d_INIT_SLOTSverwendet werden. [Feature #19785] -
it-Aufrufe ohne Argumente in einem Block ohne normale Parameter sind veraltet.itwird in Ruby 3.4 eine Referenz auf den ersten Blockparameter sein. [Feature #18980] -
Die Fehlermeldung für
NoMethodErrorwurde geändert, um den Inspect des Zielobjekts aus Effizienzgründen nicht mehr zu verwenden und stattdessen "instance of ClassName" anzuzeigen. [Feature #18285]([1] * 100).nonexisting # undefined method `nonexisting' for an instance of Array (NoMethodError)
-
Die Weiterleitung von anonymen Parametern ist nun innerhalb eines Blocks, der anonyme Parameter verwendet, nicht mehr erlaubt. [Feature #19370]
Kompatibilitätsprobleme der Standardbibliothek
-
raccwird zu den gebündelten Gems befördert.-
Sie müssen
racczu IhremGemfilehinzufügen, wenn Sieraccin einer Bundler-Umgebung verwenden.
-
-
ext/readlinewird ausgemustert-
Wir haben
reline, eine reine Ruby-Implementierung, die mit der API vonext/readlinekompatibel ist. Wir verlassen uns zukünftig aufreline. Wenn Sieext/readlineverwenden müssen, können Sieext/readlineüber rubygems.org mitgem install readline-extinstallieren. -
Wir müssen keine Bibliotheken wie
libreadlineoderlibeditmehr installieren.
-
Updates der C-API
-
rb_postponed_job-Updates -
Neue APIs und veraltete APIs (siehe Kommentare für Details)
-
hinzugefügt:
rb_postponed_job_preregister() -
hinzugefügt:
rb_postponed_job_trigger() -
veraltet:
rb_postponed_job_register()(und semantische Änderung. siehe unten) -
veraltet:
rb_postponed_job_register_one() -
hinzugefügt:
rb_postponed_job_preregister() -
hinzugefügt:
rb_postponed_job_trigger() -
veraltet:
rb_postponed_job_register()(und semantische Änderung. siehe unten) -
veraltet:
rb_postponed_job_register_one()
-
-
Die APIs für verzögerte Jobs wurden geändert, um einige seltene Abstürze zu beheben. Um das Problem zu lösen, haben wir zwei neue APIs eingeführt und die aktuellen APIs als veraltet markiert. Die Semantik dieser Funktionen hat sich ebenfalls leicht geändert;
rb_postponed_job_registerverhält sich nun wie die Varianteonce, sodass mehrere Aufrufe mit derselbenfunczu einer einzigen Ausführung derfunczusammengefasst werden können. [Feature #20057] -
Einige Updates für interne Thread-Event-Hook-APIs
-
rb_internal_thread_event_data_tmit einem Ziel-Ruby-Thread (VALUE) und Callback-Funktionen (rb_internal_thread_event_callback) empfangen diese. github.com/ruby/ruby/pull/8885 -
Die folgenden Funktionen wurden eingeführt, um Thread-lokale Daten aus internen Thread-Event-Hook-APIs zu manipulieren (eingeführt seit Ruby 3.2). github.com/ruby/ruby/pull/8936
-
rb_internal_thread_specific_key_create() -
rb_internal_thread_specific_get() -
rb_internal_thread_specific_set()
-
-
rb_profile_thread_frames()wurde eingeführt, um Frames von einem bestimmten Thread zu erhalten. [Feature #10602] -
rb_data_define()wurde eingeführt, umDatazu definieren. [Feature #19757] -
rb_ext_resolve_symbol()wurde eingeführt, um Funktionen aus Erweiterungsbibliotheken zu suchen. [Feature #20005] -
IO-bezogene Updates -
Die Details von
rb_io_twerden ausgeblendet und veraltete Attribute für jedes Mitglied hinzugefügt. [Feature #19057] -
rb_io_path(VALUE io)wurde eingeführt, um einen Pfad voniozu erhalten. -
rb_io_closed_p(VALUE io), um zu prüfen, obiogeöffnet oder geschlossen ist. -
rb_io_mode(VALUE io), um den Modus voniozu erhalten. -
rb_io_open_descriptor()wurde eingeführt, um einIO-Objekt aus einem Dateideskriptor zu erstellen.
Implementierungsverbesserungen
Parser
-
Bison wurde durch den LALR-Parser-Generator Lrama ersetzt. Es ist nicht mehr notwendig, Bison zu installieren, um Ruby aus dem Quellcode zu kompilieren. Wir werden keine Bison-Kompatibilitätsprobleme mehr haben und können neue Funktionen nutzen, indem wir sie einfach in Lrama implementieren. [Feature #19637]
-
Siehe The future vision of Ruby Parser für weitere Details.
-
Der interne Lrama-Parser ist ein LR-Parser, der von Racc zur Wartbarkeit generiert wird.
-
Regelparameterisierung
(?, *, +)werden unterstützt, sie werden in Ruby parse.y verwendet.
GC / Speicherverwaltung
-
Erhebliche Leistungsverbesserungen gegenüber Ruby 3.2
-
Junge Objekte, auf die von alten Objekten verwiesen wird, werden nicht mehr sofort in die alte Generation verschoben. Dies reduziert die Häufigkeit von Major-
GC-Sammlungen erheblich. [Feature #19678] -
Eine neue Tuning-Variable
REMEMBERED_WB_UNPROTECTED_OBJECTS_LIMIT_RATIOwurde eingeführt, um die Anzahl der ungeschützten Objekte zu steuern, die eine Major-GC-Sammlung auslösen. Der Standardwert ist0.01(1%). Dies reduziert die Häufigkeit von Major-GC-Sammlungen erheblich. [Feature #19571] -
Schreibbarrieren wurden für viele Kern-Datentypen implementiert, denen sie fehlten, insbesondere
Time,Enumerator,MatchData,Method,File::Stat,BigDecimalund einige andere. Dies reduziert die Zeit für Minor-GC-Sammlungen und die Häufigkeit von Major-GC-Sammlungen erheblich. -
Die meisten Kernklassen verwenden nun variable Breitenallokation, insbesondere
Hash,Time,Thread::Backtrace,Thread::Backtrace::Location,File::Stat,Method. Dies macht die Allokation und Freigabe dieser Klassen schneller, reduziert den Speicherverbrauch und die Heap-Fragmentierung.
-
-
defined?(@ivar)wird mitObjectShapes optimiert.
YJIT
-
Erhebliche Leistungsverbesserungen gegenüber Ruby 3.2
-
Die Unterstützung für Splat- und Rest-Argumente wurde verbessert.
-
Register werden für Stack-Operationen der virtuellen Maschine allokiert.
-
Mehr Aufrufe mit optionalen Argumenten werden kompiliert.
Exception-Handler werden ebenfalls kompiliert. -
Nicht unterstützte Aufruftypen und megamorphe Aufrufstellen verlassen den Interpreter nicht mehr.
-
Basis-Methoden wie Rails' blank? und spezialisierte
#present?werden inline gesetzt. -
Integer#*,Integer#!=,String#!=,String#getbyte,Kernel#block_given?,Kernel#is_a?,Kernel#instance_of?undModule#===werden speziell optimiert. -
Die Kompilierungsgeschwindigkeit ist nun geringfügig schneller als bei Ruby 3.2.
-
Nun mehr als 3x schneller als der Interpreter auf Optcarrot!
-
Deutlich verbesserter Speicherverbrauch gegenüber Ruby 3.2
-
Metadaten für kompilierte Codes verbrauchen deutlich weniger Speicher.
-
--yjit-call-thresholdwird automatisch von 30 auf 120 erhöht, wenn die Anwendung mehr als 40.000 ISEQs hat. -
--yjit-cold-thresholdwurde hinzugefügt, um das Kompilieren von Cold-ISEQs zu überspringen. -
Kompakterer Code wird auf Arm64 generiert.
-
-
Code-
GCist nun standardmäßig deaktiviert -
--yjit-exec-mem-sizewird als harte Grenze behandelt, an der die Kompilierung neuer Codes stoppt. -
Keine plötzlichen Leistungseinbrüche aufgrund von Code-
GC. Bessere Copy-on-Write-Verhalten auf Servern, die mit Pitchfork erneut gestartet werden. -
Sie können Code-
GCimmer noch aktivieren, wenn gewünscht, mit--yjit-code-gc -
Hinzufügen von
RubyVM::YJIT.enable, das YJIT zur Laufzeit aktivieren kann -
Sie können YJIT starten, ohne Befehlszeilenargumente oder Umgebungsvariablen zu ändern. Rails 7.2 wird YJIT mit dieser Methode standardmäßig aktivieren.
-
Dies kann auch verwendet werden, um YJIT erst zu aktivieren, wenn Ihre Anwendung das Booten abgeschlossen hat.
--yjit-disablekann verwendet werden, wenn Sie andere YJIT-Optionen verwenden möchten, während YJIT beim Booten deaktiviert ist. -
Mehr YJIT-Statistiken sind standardmäßig verfügbar
-
yjit_alloc_sizeund mehrere weitere Metadaten-bezogene Statistiken sind nun standardmäßig verfügbar. -
ratio_in_yjit-Statistik, die von--yjit-statserzeugt wird, ist nun in Release-Builds verfügbar; eine spezielle Statistik oder ein Entwickler-Build ist nicht mehr erforderlich, um auf die meisten Statistiken zuzugreifen. -
Mehr Profiling-Funktionen hinzufügen
-
--yjit-perfwurde hinzugefügt, um das Profiling mit Linux perf zu erleichtern. -
--yjit-trace-exitsunterstützt nun das Sampling mit--yjit-trace-exits-sample-rate=N -
Umfassendere Tests und mehrere Fehlerbehebungen
-
--yjit-stats=quietwurde hinzugefügt, um die Ausgabe von Statistiken beim Beenden zu vermeiden.
MJIT
-
MJIT wurde entfernt.
-
--disable-jit-supportwurde entfernt. Erwägen Sie stattdessen die Verwendung von--disable-yjit --disable-rjit.
-
RJIT
-
Eingeführt wurde ein reiner Ruby JIT-Compiler RJIT.
-
RJIT unterstützt nur die x86_64-Architektur auf Unix-Plattformen.
-
Im Gegensatz zu MJIT benötigt es zur Laufzeit keinen C-Compiler.
-
-
RJIT existiert nur zu experimentellen Zwecken.
-
Sie sollten YJIT weiterhin in der Produktion verwenden.
-
M:N Thread-Scheduler
-
Der M:N
Thread-Scheduler wurde eingeführt. [Feature #19842]-
Hintergrund: Ruby 1.8 und früher wurde der M:1 Thread-Scheduler verwendet (M Ruby-Threads mit 1 nativen Thread. Genannt User-Level-Threads oder Green Threads). Ruby 1.9 und später, der 1:1 Thread-Scheduler (1 Ruby-Thread mit 1 nativen Thread). M:1 Threads benötigen weniger Ressourcen als 1:1 Threads, da sie nur 1 nativen Thread benötigen. Es ist jedoch schwierig, Kontextwechsel für alle blockierenden Operationen zu unterstützen, daher wurden ab Ruby 1.9 1:1 Threads verwendet. Der M:N Thread-Scheduler verwendet N native Threads für M Ruby-Threads (N ist im Allgemeinen eine kleine Zahl). Er benötigt nicht die gleiche Anzahl nativer Threads wie Ruby-Threads (ähnlich dem M:1 Thread-Scheduler). Außerdem unterstützen unsere M:N Threads blockierende Operationen gut, genau wie 1:1 Threads. Siehe das Ticket für weitere Details. Unser M:N Thread-Scheduler bezieht sich auf den Goroutine-Scheduler in der Go-Sprache.
-
In einem Ractor kann zu einem bestimmten Zeitpunkt aufgrund der Implementierung nur 1 Thread ausgeführt werden. Daher funktioniert für Anwendungen, die nur 1
Ractorverwenden (die meisten Anwendungen), der M:N Thread-Scheduler als M:1 Thread-Scheduler mit Erweiterungen ab Ruby 1.8. -
Der M:N Thread-Scheduler kann Inkompatibilitäten für C-Erweiterungen verursachen, daher ist er auf den Haupt-Raktoren standardmäßig deaktiviert. Die Umgebungsvariable
RUBY_MN_THREADS=1aktiviert ihn. Auf Nicht-Haupt-Raktoren ist der M:N Thread-Scheduler aktiviert (und kann derzeit nicht deaktiviert werden). -
N(die Anzahl der nativen Threads) kann mit der UmgebungsvariableRUBY_MAX_CPUangegeben werden. Der Standardwert ist 8. Beachten Sie, dass mehr alsNnative Threads verwendet werden, um viele Arten von blockierenden Operationen zu unterstützen.
-