NEWS für Ruby 3.2.0
Dieses Dokument listet benutzerseitig sichtbare Feature-Änderungen seit der 3.1.0 Version auf, ausgenommen Fehlerbehebungen.
Beachten Sie, dass jeder Eintrag auf ein Minimum beschränkt ist, siehe Links für Details.
Sprachänderungen
-
Anonyme Rest- und Keyword-Rest-Argumente können nun als Argumente übergeben werden, anstatt nur in Methodenparametern verwendet zu werden. [Feature #18351]
def foo(*) bar(*) end def baz(**) quux(**) end
-
Ein Proc, der ein einzelnes positionsgebundenes Argument und Keywords akzeptiert, wird nicht mehr automatisch erweitert (autosplat). [Bug #18633]
proc{|a, **k| a}.call([1, 2]) # Ruby 3.1 and before # => 1 # Ruby 3.2 and after # => [1, 2]
-
Die Auswertungsreihenfolge für konstante Zuweisungen zu expliziten Objekten wurde mit der Auswertungsreihenfolge für einzelne Attributzuweisungen konsistent gemacht. Mit diesem Code
foo::BAR = baz
foowird nun vorbazaufgerufen. Ebenso wird für Mehrfachzuweisungen an Konstanten eine links-nach-rechts-Auswertungsreihenfolge verwendet. Mit diesem Codefoo1::BAR1, foo2::BAR2 = baz1, baz2
wird nun die folgende Auswertungsreihenfolge verwendet
-
foo1 -
foo2 -
baz1 -
baz2
-
-
"Find pattern" ist nicht mehr experimentell. [Feature #18585]
-
Methoden, die einen Restparameter (wie
*args) annehmen und Keyword-Argumente überfoo(*args)weiterleiten möchten, müssen nun mitruby2_keywordsmarkiert werden (sofern nicht bereits geschehen). Mit anderen Worten, alle Methoden, die Keyword-Argumente über*argsweiterleiten möchten, müssen nun mitruby2_keywordsmarkiert werden, ohne Ausnahme. Dies erleichtert den Übergang zu anderen Weiterleitungsmethoden, sobald eine Bibliothek Ruby 3+ erfordern kann. Zuvor wurde das Flagruby2_keywordsbeibehalten, wenn die empfangende Methode*argsannahm, aber das war ein Fehler und eine Inkonsistenz. Eine gute Technik, um potenziell fehlenderuby2_keywordszu finden, ist die Ausführung der Testsuite, um dort bei Fehlern die letzte Methode zu finden, die Keyword-Argumente empfangen muss, und dortputs nil, caller, nilzu verwenden und jede Methode/jeden Block in der Aufrufkette, der Keywords weiterleiten muss, korrekt alsruby2_keywordsmarkiert zu prüfen. [Bug #18625] [Bug #16466]def target(**kw) end # Accidentally worked without ruby2_keywords in Ruby 2.7-3.1, ruby2_keywords # needed in 3.2+. Just like (*args, **kwargs) or (...) would be needed on # both #foo and #bar when migrating away from ruby2_keywords. ruby2_keywords def bar(*args) target(*args) end ruby2_keywords def foo(*args) bar(*args) end foo(k: 1)
Aktualisierungen von Kernklassen
Hinweis: Wir listen nur wichtige Klassenaktualisierungen auf.
-
-
Einführung von
Fiber.[]undFiber.[]=für erbliche Faser-Speicher. Einführung vonFiber#storageundFiber#storage=(experimentell) zum Abrufen und Zurücksetzen des aktuellen Speichers. Einführung vonFiber.new(storage:)zum Festlegen des Speichers bei der Erstellung einer Faser. [Feature #19078]Vorhandene Thread- und Faser-lokale Variablen können schwierig zu verwenden sein. Thread-lokale Variablen werden zwischen allen Fasern geteilt, was die Isolierung erschwert, während Faser-lokale Variablen schwer zu teilen sein können. Es ist oft wünschenswert, eine Ausführungseinheit ("Ausführungskontext") zu definieren, so dass ein Teil des Zustands zwischen allen in diesem Kontext erstellten Fasern und Threads geteilt wird. Dies bietet der
Fiber-Speicher.def log(message) puts "#{Fiber[:request_id]}: #{message}" end def handle_requests while request = read_request Fiber.schedule do Fiber[:request_id] = SecureRandom.uuid request.messages.each do |message| Fiber.schedule do log("Handling #{message}") # Log includes inherited request_id. end end end end end
Sie sollten generell den
Fiber-Speicher für jeden Zustand in Betracht ziehen, der implizit zwischen allen Fasern und Threads, die in einem bestimmten Kontext erstellt werden, geteilt werden soll, z.B. ein Connection-Pool, eine Request-ID, ein Logger-Level, Umgebungsvariablen, Konfiguration usw.
-
-
-
Einführung von
Fiber::Scheduler#io_selectfür nicht-blockierendesIO.select. [Feature #19060]
-
-
-
Einführung von
IO#timeout=undIO#timeout, dieIO::TimeoutErrorauslösen können, wenn eine blockierende Operation das angegebene Timeout überschreitet. [Feature #18630]STDIN.timeout = 1 STDIN.read # => Blocking operation timed out! (IO::TimeoutError)
-
Einführung von
IO.new(..., path:)und Promotion vonFile#pathzuIO#path. [Feature #19036]
-
-
Class
-
Class#attached_object, die das Objekt zurückgibt, für das der Empfänger die Singleton-Klasse ist. LöstTypeErroraus, wenn der Empfänger keine Singleton-Klasse ist. [Feature #12084]class Foo; end Foo.singleton_class.attached_object #=> Foo Foo.new.singleton_class.attached_object #=> #<Foo:0x000000010491a370> Foo.attached_object #=> TypeError: `Foo' is not a singleton class nil.singleton_class.attached_object #=> TypeError: `NilClass' is not a singleton class
-
-
-
Neue Kernklasse zur Darstellung von einfachen unveränderlichen Wertobjekten. Die Klasse ist ähnlich wie
Structund teilt teilweise eine Implementierung, hat aber eine schlankere und strengere API. [Feature #16122]Measure = Data.define(:amount, :unit) distance = Measure.new(100, 'km') #=> #<data Measure amount=100, unit="km"> weight = Measure.new(amount: 50, unit: 'kg') #=> #<data Measure amount=50, unit="kg"> weight.with(amount: 40) #=> #<data Measure amount=40, unit="kg"> weight.amount #=> 50 weight.amount = 40 #=> NoMethodError: undefined method `amount='
-
-
-
Encoding#replicatewurde als veraltet markiert und wird in 3.3 entfernt. [Feature #18949] -
Die Dummy-Encodings
Encoding::UTF_16undEncoding::UTF_32versuchen nicht mehr, das Endianness dynamisch anhand eines Byte Order Mark zu erraten. Verwenden Sie stattdessenEncoding::UTF_16BE/UTF_16LEundEncoding::UTF_32BE/UTF_32LE. Diese Änderung beschleunigt das Abrufen der Kodierung einesString. [Feature #18949] -
Maximale Größe des Kodierungssets auf 256 begrenzt. Bei Überschreitung der Maximalgröße wird
EncodingErrorausgelöst. [Feature #18949]
-
-
-
Enumerator.productwurde hinzugefügt.Enumerator::Productist die Implementierung. [Feature #18685]
-
-
-
Exception#detailed_messagewurde hinzugefügt. Der Standard-Fehlerdrucker ruft diese Methode für dasException-Objekt anstelle der Nachricht auf. [Feature #18564]
-
-
-
Hash#shiftgibt nun immernilzurück, wenn der Hash leer ist, anstatt den Standardwert zurückzugeben oder die Standard-Proc aufzurufen. [Bug #16908]
-
-
-
Integer#ceildivwurde hinzugefügt. [Feature #18809]
-
-
-
Kernel#bindinglöstRuntimeErroraus, wenn es von einem nicht-Ruby-Frame (wie einer in C definierten Methode) aufgerufen wird. [Bug #18487]
-
-
-
MatchData#byteoffsetwurde hinzugefügt. [Feature #13110] -
MatchData#deconstructwurde hinzugefügt. [Feature #18821] -
MatchData#deconstruct_keyswurde hinzugefügt. [Feature #18821]
-
-
Module
-
Module.used_refinementswurde hinzugefügt. [Feature #14332] -
Module#refinementswurde hinzugefügt. [Feature #12737] -
Module#const_addedwurde hinzugefügt. [Feature #17881] -
Module#undefined_instance_methodswurde hinzugefügt. [Feature #12655]
-
-
-
Proc#dupgibt eine Instanz einer Unterklasse zurück. [Bug #17545] -
Proc#parametersakzeptiert nun das Lambda-Keyword. [Feature #15357]
-
-
Process
-
Konstante
RLIMIT_NPTSfür die FreeBSD-Plattform hinzugefügt
-
-
-
Die Cache-basierte Optimierung wurde eingeführt. Viele (aber nicht alle)
Regexp-Übereinstimmungen erfolgen nun in linearer Zeit, was eine Regular-Expression-Denial-of-Service (ReDoS)-Schwachstelle verhindert. [Feature #19104] -
Regexp.linear_time?wurde eingeführt. [Feature #19194] -
Regexp.newunterstützt nun das Übergeben der Regex-Flags nicht nur alsInteger, sondern auch alsString. Unbekannte Flags lösenArgumentErroraus. Andernfalls wird bei allem, was keintrue,false,niloderIntegerist, eine Warnung ausgegeben. [Feature #18788] -
Regexp.timeout=wurde hinzugefügt. Außerdem unterstütztRegexp.newnun das Timeout-Keyword. Siehe [Feature #17837]
-
-
-
Refinement#refined_classwurde hinzugefügt. [Feature #12737]
-
-
-
error_tolerant-Option fürparse,parse_fileundofhinzugefügt. [Feature #19013] Mit dieser Option-
SyntaxErrorwird unterdrückt -
Der AST wird für ungültige Eingaben zurückgegeben
-
endwird ergänzt, wenn ein Parser das Ende der Eingabe erreicht, aberendnicht ausreicht -
endwird basierend auf der Einrückung als Keyword behandelt
# Without error_tolerant option root = RubyVM::AbstractSyntaxTree.parse(<<~RUBY) def m a = 10 if end RUBY # => <internal:ast>:33:in `parse': syntax error, unexpected `end' (SyntaxError) # With error_tolerant option root = RubyVM::AbstractSyntaxTree.parse(<<~RUBY, error_tolerant: true) def m a = 10 if end RUBY p root # => #<RubyVM::AbstractSyntaxTree::Node:SCOPE@1:0-4:3> # `end` is treated as keyword based on indent root = RubyVM::AbstractSyntaxTree.parse(<<~RUBY, error_tolerant: true) module Z class Foo foo. end def bar end end RUBY p root.children[-1].children[-1].children[-1].children[-2..-1] # => [#<RubyVM::AbstractSyntaxTree::Node:CLASS@2:2-4:5>, #<RubyVM::AbstractSyntaxTree::Node:DEFN@6:2-7:5>]
-
-
keep_tokens-Option fürparse,parse_fileundofhinzugefügt.tokensundall_tokensfürRubyVM::AbstractSyntaxTree::Nodehinzugefügt. [Feature #19070]root = RubyVM::AbstractSyntaxTree.parse("x = 1 + 2", keep_tokens: true) root.tokens # => [[0, :tIDENTIFIER, "x", [1, 0, 1, 1]], [1, :tSP, " ", [1, 1, 1, 2]], ...] root.tokens.map{_1[2]}.join # => "x = 1 + 2"
-
-
Set
-
Setist nun als integrierte Klasse verfügbar, ohne dassrequire "set"erforderlich ist. [Feature #16989] Sie wird derzeit über dieSet-Konstante oder einen Aufruf vonEnumerable#to_setverzögert geladen.
-
-
-
String#byteindexundString#byterindexwurden hinzugefügt. [Feature #13110] -
Unicode auf Version 15.0.0 und Emoji auf Version 15.0 aktualisiert. [Feature #18639] (gilt auch für
Regexp) -
String#bytesplicewurde hinzugefügt. [Feature #18598] -
String#dedupwurde als Alias fürString#-@hinzugefügt. [Feature #18595]
-
-
-
Eine
Struct-Klasse kann auch mit Keyword-Argumenten initialisiert werden, ohnekeyword_init: truebeiStruct.new[Feature #16806]Post = Struct.new(:id, :name) Post.new(1, "hello") #=> #<struct Post id=1, name="hello"> # From Ruby 3.2, the following code also works without keyword_init: true. Post.new(id: 1, name: "hello") #=> #<struct Post id=1, name="hello">
-
-
-
Thread.each_caller_locationwurde hinzugefügt. [Feature #16663]
-
-
-
Thread::Queue#pop(timeout: sec) wurde hinzugefügt. [Feature #18774]
-
-
-
Thread::SizedQueue#pop(timeout: sec) wurde hinzugefügt. [Feature #18774] -
Thread::SizedQueue#push(timeout: sec) wurde hinzugefügt. [Feature #18944]
-
-
-
Time#deconstruct_keyswurde hinzugefügt, was die Verwendung vonTime-Instanzen in Mustervergleichsausdrücken ermöglicht [Feature #19071] -
Time.newkann nun einen String parsen, wie er vonTime#inspectgeneriert wird, und eineTime-Instanz basierend auf dem übergebenen Argument zurückgeben. [Feature #18033]
-
-
-
SyntaxError#pathwurde hinzugefügt. [Feature #19138]
-
-
-
TracePoint#bindinggibt nunnilfürc_call/c_returnTracePoints zurück. [Bug #18487] -
Das Keyword-Argument
target_threadvonTracePoint#enablehat nun standardmäßig den aktuellen Thread, wenn ein Block übergeben wird und die Keyword-Argumentetargetundtarget_linenicht übergeben werden. [Bug #16889]
-
-
-
UnboundMethod#==gibttruezurück, wenn die tatsächliche Methode dieselbe ist. Zum Beispiel gibtString.instance_method(:object_id) == Array.instance_method(:object_id)truezurück. [Feature #18798] -
UnboundMethod#inspectzeigt nicht den Empfänger voninstance_methodan. Zum Beispiel gibtString.instance_method(:object_id).inspect"#<UnboundMethod: Kernel#object_id()>"zurück (war"#<UnboundMethod: String(Kernel)#object_id()>").
-
-
-
need_major_gcwird überGC.latest_gc_infoverfügbar gemacht. GH-6791
-
-
-
ObjectSpace.dump_allgibt auch Shapes aus. GH-6868
-
Aktualisierungen der Standardbibliothek
-
-
Bundlerverwendet nun den PubGrub-Resolver anstelle von Molinillo zur Leistungsverbesserung. -
Unterstützung für --ext=rust wurde zu bundle gem hinzugefügt, um einfache Gems mit Rust-Erweiterungen zu erstellen. [GH-rubygems-6149]
-
Das Klonen von Git-Repos wurde beschleunigt [GH-rubygems-4475]
-
-
RubyGems
-
MSWIN-Unterstützung für den Cargo-Builder hinzugefügt. [GH-rubygems-6167]
-
-
-
CGI.escapeURIComponentundCGI.unescapeURIComponentwurden hinzugefügt. [Feature #18822]
-
-
-
Coverage.setupakzeptiert nuneval: true. Dadurch könnenevalund verwandte Methoden Code Coverage generieren. [Feature #19008] -
Coverage.supported?(mode)ermöglicht die Erkennung, welche Coverage-Modi unterstützt werden. [Feature #19026]
-
-
-
Date#deconstruct_keysundDateTime#deconstruct_keyswurden hinzugefügt, ähnlich wie bei [Feature #19071]
-
-
-
ERB::Util.html_escapeist schneller alsCGI.escapeHTML. -
ERB::Util.url_encodeist schneller durch die Verwendung vonCGI.escapeURIComponent. -
Die Option
-Swurde aus demerb-Befehl entfernt.
-
-
-
FileUtils.ln_sr-Methode und die Optionrelative:zuFileUtils.ln_shinzugefügt. [Feature #18925]
-
-
IRB
-
Integration-Befehle für debug.gem wurden hinzugefügt:
debug,break,catch,next,delete,step,continue,finish,backtrace,info-
Diese funktionieren auch, wenn Sie
gem "debug"nicht in Ihrer Gemfile haben. -
Siehe auch: Was ist neu in Rubys IRB 3.2?
-
-
Weitere pry-ähnliche Befehle und Features wurden hinzugefügt.
-
editundshow_cmds(ähnlich wie Pry'shelp) wurden hinzugefügt. -
lsnimmt die Option-goder-Gzur Filterung der Ausgaben. -
show_sourceist ein Alias von$und akzeptiert unquote Eingaben. -
whereamiist ein Alias von@.
-
-
-
Net::Protocol
-
Leistungsverbesserung von
Net::BufferedIO. [GH-net-protocol-14]
-
-
-
Pathname#lutimewurde hinzugefügt. [GH-pathname-20]
-
-
-
Folgende Konstanten für unterstützte Plattformen wurden hinzugefügt.
-
SO_INCOMING_CPU -
SO_INCOMING_NAPI_ID -
SO_RTABLE -
SO_SETFIB -
SO_USER_COOKIE -
TCP_KEEPALIVE -
TCP_CONNECTION_INFO
-
-
-
-
Das Feature von syntax_suggest, früher
dead_end, wurde in Ruby integriert. [Feature #18159]
-
-
-
Unterstützung für
UNIXSocketunter Windows hinzugefügt. Anonyme Sockets emuliert. Unterstützung fürFile.socket?undFile::Stat#socket?, wo möglich, hinzugefügt. [Feature #19135]
-
-
Die folgenden Standard-Gems wurden aktualisiert.
-
RubyGems 3.4.1
-
abbrev 0.1.1
-
benchmark 0.2.1
-
bigdecimal 3.1.3
-
bundler 2.4.1
-
cgi 0.3.6
-
csv 3.2.6
-
date 3.3.3
-
delegate 0.3.0
-
did_you_mean 1.6.3
-
digest 3.1.1
-
drb 2.1.1
-
english 0.7.2
-
erb 4.0.2
-
error_highlight 0.5.1
-
etc 1.4.2
-
fcntl 1.0.2
-
fiddle 1.1.1
-
fileutils 1.7.0
-
forwardable 1.3.3
-
getoptlong 0.2.0
-
io-console 0.6.0
-
io-nonblock 0.2.0
-
io-wait 0.3.0
-
ipaddr 1.2.5
-
irb 1.6.2
-
json 2.6.3
-
logger 1.5.3
-
mutex_m 0.1.2
-
net-http 0.3.2
-
net-protocol 0.2.1
-
nkf 0.1.2
-
open-uri 0.3.0
-
open3 0.1.2
-
openssl 3.1.0
-
optparse 0.3.1
-
ostruct 0.5.5
-
pathname 0.2.1
-
pp 0.4.0
-
pstore 0.1.2
-
psych 5.0.1
-
racc 1.6.2
-
rdoc 6.5.0
-
readline-ext 0.1.5
-
reline 0.3.2
-
resolv 0.2.2
-
resolv-replace 0.1.1
-
securerandom 0.2.2
-
set 1.0.3
-
stringio 3.0.4
-
strscan 3.0.5
-
syntax_suggest 1.0.2
-
syslog 0.1.1
-
tempfile 0.1.3
-
time 0.2.1
-
timeout 0.3.1
-
tmpdir 0.1.3
-
tsort 0.1.1
-
un 0.2.1
-
uri 0.12.0
-
weakref 0.1.2
-
win32ole 1.8.9
-
yaml 0.2.1
-
zlib 3.0.0
-
-
Die folgenden gebündelten Gems wurden aktualisiert.
-
minitest 5.16.3
-
power_assert 2.0.3
-
test-unit 3.5.7
-
net-ftp 0.2.0
-
net-imap 0.3.4
-
net-pop 0.1.2
-
net-smtp 0.3.3
-
rbs 2.8.2
-
typeprof 0.21.3
-
debug 1.7.1
-
Siehe GitHub Releases wie GitHub Releases von Logger oder Changelogs für Details zu den Standard-Gems oder gebündelten Gems.
Unterstützte Plattformen
-
WebAssembly/WASI wurde hinzugefügt. Mehr Details finden Sie unter wasm/README.md und ruby.wasm. [Feature #18462]
Kompatibilitätsprobleme
-
String#to_cbehandelt eine Folge von Unterstrichen derzeit als Ende einesComplex-Strings. [Bug #19087] -
Nun löst
ENV.cloneebenso wieENV.dupeineTypeErroraus. [Bug #17767]
Entfernte Konstanten
Die folgenden als veraltet markierten Konstanten wurden entfernt.
-
FixnumundBignum[Feature #12005] -
Random::DEFAULT[Feature #17351] -
Struct::Group -
Struct::Passwd
Entfernte Methoden
Die folgenden als veraltet markierten Methoden wurden entfernt.
-
Dir.exists?[Feature #17391] -
File.exists?[Feature #17391] -
Kernel#=~[Feature #15231] -
Kernel#taint,Kernel#untaint,Kernel#tainted?[Feature #16131] -
Kernel#trust,Kernel#untrust,Kernel#untrusted?[Feature #16131] -
Method#public?,Method#private?,Method#protected?,UnboundMethod#public?,UnboundMethod#private?,UnboundMethod#protected?[Bug #18729] [Bug #18751] [Bug #18435]
Inkompatibilität des Quellcodes von Erweiterungsbibliotheken
-
Erweiterungsbibliotheken, die PRNGs bereitstellen, Unterklassen von
Random, benötigen Updates. Weitere Informationen finden Sie unter [PRNG-Update] unten. [Bug #19100]
Fehlerdrucker
-
Ruby maskiert keine Steuerzeichen und Backslashes mehr in Fehlermeldungen. [Feature #18367]
Konstanten-Lookup bei der Definition einer Klasse/Moduls
-
Bei der direkten Definition einer Klasse/eines Moduls unter der
Object-Klasse durch eine Klassen-/Modulanweisung wurde, wenn bereits eine Klasse/ein Modul durchModule#includemit demselben Namen definiert war, die Anweisung in Ruby 3.1 oder früher als "offene Klasse" behandelt. Seit Ruby 3.2 wird stattdessen eine neue Klasse definiert. [Feature #18832]
Kompatibilitätsprobleme der Standardbibliothek
-
Psychbündelt keine libyaml-Quellen mehr. Außerdem bündelt Fiddle keine libffi-Quellen mehr. Benutzer müssen die libyaml/libffi-Bibliothek selbst über den Paketmanager wie apt, yum, brew usw. installieren.Psychund fiddle unterstützten den statischen Build mit bestimmten Versionen von libyaml- und libffi-Quellen. Sie können psych mit libyaml-0.2.5 wie folgt erstellen.$ ./configure --with-libyaml-source-dir=/path/to/libyaml-0.2.5
Und Sie können fiddle mit libffi-3.4.4 wie folgt erstellen.
$ ./configure --with-libffi-source-dir=/path/to/libffi-3.4.4
-
Überprüfung von Cookie-Namen/-Pfaden/-Domänenzeichen in
CGI::Cookie. [CVE-2021-33621] -
URI.parsegibt im Host einen leeren String stattnilzurück. [sec-156615]
Updates der C-API
Aktualisierte C-APIs
Die folgenden APIs wurden aktualisiert.
-
PRNG-Update
rb_random_interface_tin ruby/random.h wurde aktualisiert und versioniert. Erweiterungsbibliotheken, die diese Schnittstelle verwenden und für ältere Versionen erstellt wurden, müssen mit der Hinzufügung der Funktioninit_int32neu kompiliert werden.
Hinzugefügte C-APIs
-
VALUE rb_hash_new_capa(long capa)wurde hinzugefügt, um Hashes mit der gewünschten Kapazität zu erstellen. -
rb_internal_thread_add_event_hookundrb_internal_thread_add_event_hookwurden zur Instrumentierung der Thread-Planung hinzugefügt. Folgende Ereignisse sind verfügbar:-
RUBY_INTERNAL_THREAD_EVENT_STARTED -
RUBY_INTERNAL_THREAD_EVENT_READY -
RUBY_INTERNAL_THREAD_EVENT_RESUMED -
RUBY_INTERNAL_THREAD_EVENT_SUSPENDED -
RUBY_INTERNAL_THREAD_EVENT_EXITED
-
-
rb_debug_inspector_current_depthundrb_debug_inspector_frame_depthwurden für Debugger hinzugefügt.
Entfernte C-APIs
Die folgenden als veraltet markierten APIs wurden entfernt.
-
rb_cData-Variable. -
Funktionen für "taintedness" und "trustedness". [Feature #16131]
Implementierungsverbesserungen
-
Mehrere Race Conditions in
Kernel#autoloadbehoben. [Bug #18782] -
Die Cache-Invalidierung für Ausdrücke, die auf Konstanten verweisen, ist nun feingranularer.
RubyVM.stat(:global_constant_state)wurde entfernt, da es eng mit dem vorherigen Caching-Schema verbunden war, bei dem das Setzen einer beliebigen Konstante alle Caches im System invalidiert. Neue Schlüssel,:constant_cache_invalidationsund:constant_cache_misses, wurden eingeführt, um Anwendungsfälle für:global_constant_statezu unterstützen. [Feature #18589] -
Die Cache-basierte Optimierung für
Regexp-Matching wurde eingeführt. [Feature #19104] -
Variable Width Allocation ist nun standardmäßig aktiviert. [Feature #18239]
-
Ein neuer Mechanismus für die Instanzvariablen-Zwischenspeicherung, genannt "Object Shapes", wurde hinzugefügt, der die Trefferquote von Inline-Caches für die meisten Objekte verbessert und die Generierung sehr effizienten JIT-Codes ermöglicht. Objekte, deren Instanzvariablen in konsistenter Reihenfolge definiert sind, werden die größten Leistungsvorteile erzielen. [Feature #18776]
-
Beschleunigung der Markierung von Instruktionssequenzen durch die Verwendung einer Bitmap, um "markierbare" Objekte zu finden. Diese Änderung führt zu schnelleren Haupt-Garbage-Collection-Zyklen. [Feature #18875]
JIT
YJIT
-
YJIT ist nicht mehr experimentell
-
Wurde über ein Jahr lang auf Produktions-Workloads getestet und hat sich als sehr stabil erwiesen.
-
-
YJIT unterstützt nun sowohl x86-64- als auch arm64/aarch64-CPUs unter Linux, MacOS, BSD und anderen UNIX-Plattformen.
-
Diese Version bringt Unterstützung für Mac M1/M2, AWS Graviton und Raspberry Pi 4.
-
-
Das Erstellen von YJIT erfordert nun Rust 1.58.0+. [Feature #18481]
-
Um sicherzustellen, dass CRuby mit YJIT erstellt wird, installieren Sie bitte
rustc>= 1.58.0, bevor Sie./configureausführen. -
Bitte wenden Sie sich an das YJIT-Team, falls Sie auf Probleme stoßen.
-
-
Physischer Speicher für JIT-Code wird verzögert zugewiesen. Im Gegensatz zu Ruby 3.1 wird der RSS-Speicherbedarf eines Ruby-Prozesses minimiert, da virtuelle Speicherseiten, die von
--yjit-exec-mem-sizezugewiesen werden, erst dann physischen Speicherseiten zugeordnet werden, wenn sie tatsächlich von JIT-Code genutzt werden. -
Einführung von Code
GC, der alle Codeseiten freigibt, wenn der Speicherverbrauch durch JIT-Code--yjit-exec-mem-sizeerreicht.-
RubyVM::YJIT.runtime_statsgibt neben den vorhandenen Schlüsselninline_code_sizeundoutlined_code_sizeauch Metriken für den CodeGCzurück:code_gc_count,live_page_count,freed_page_countundfreed_code_size.
-
-
Die meisten Statistiken, die von
RubyVM::YJIT.runtime_statserzeugt werden, sind nun in Release-Builds verfügbar.-
Führen Sie einfach Ruby mit
--yjit-statsaus, um Statistiken zu berechnen und auszugeben (verursacht etwas Laufzeit-Overhead).
-
-
YJIT ist nun für die Nutzung von Objektformen optimiert. [Feature #18776]
-
Nutzt feingranularere Konstanteninvalidierung, um weniger Code bei der Definition neuer Konstanten zu invalidieren. [Feature #18589]
-
Der Standardwert für
--yjit-exec-mem-sizewurde auf 64 (MiB) geändert. -
Der Standardwert für
--yjit-call-thresholdwurde auf 30 geändert.
MJIT
-
Der MJIT-Compiler wurde in Ruby als
ruby_vm/mjit/compilerneu implementiert. -
Der MJIT-Compiler wird in einem geforkten Ruby-Prozess ausgeführt, anstatt in einem nativen Thread namens MJIT-Worker. [Feature #18968]
-
Als Ergebnis wird Microsoft Visual Studio (MSWIN) nicht mehr unterstützt.
-
-
MinGW wird nicht mehr unterstützt. [Feature #18824]
-
Umbenennung von
--mjit-min-callszu--mjit-call-threshold. -
Änderung des Standardwerts für
--mjit-max-cachevon 10000 zurück auf 100.