Ruby 4.0.0 veröffentlicht
Veröffentlicht von naruse am 25. Dez 2025
Wir freuen uns, die Veröffentlichung von Ruby 4.0.0 bekannt zu geben. Ruby 4.0 führt „Ruby Box“ und „ZJIT“ ein und bringt viele Verbesserungen mit sich.
Ruby Box
Ruby Box ist ein neues (experimentelles) Feature zur Trennung von Definitionen. Ruby Box wird aktiviert, wenn eine Umgebungsvariable RUBY_BOX=1 gesetzt ist. Die Klasse ist Ruby::Box.
In einer Box geladene Definitionen sind in der Box isoliert. Ruby Box kann Monkey-Patches, Änderungen an globalen/Klassenvariablen, Klassen-/Moduldefinitionen und geladene native/Ruby-Bibliotheken von anderen Boxen isolieren/trennen.
Erwartete Anwendungsfälle sind:
- Testfälle in einer Box ausführen, um andere Tests zu schützen, wenn der Testfall Monkey-Patches verwendet, um etwas zu überschreiben
- Web-App-Boxen parallel ausführen, um Blue-Green-Deployments auf einem App-Server in einem Ruby-Prozess durchzuführen
- Web-App-Boxen parallel ausführen, um Abhängigkeitsaktualisierungen über einen bestimmten Zeitraum zu bewerten, indem Antwortunterschiede mithilfe von Ruby-Code überprüft werden
- Als Grundlage (Low-Level) API verwendet werden, um eine Art „Paket“ (High-Level) API zu implementieren (diese ist noch nicht entworfen)
Für Details zu „Ruby Box“ siehe Ruby::Box. [Feature #21311] [Misc #21385]
ZJIT
ZJIT ist ein neuer Just-in-Time (JIT) Compiler, der als nächste Generation von YJIT entwickelt wird. Sie benötigen Rust 1.85.0 oder neuer, um Ruby mit ZJIT-Unterstützung zu kompilieren, und ZJIT wird aktiviert, wenn --zjit angegeben wird.
Wir entwickeln einen neuen Compiler für Ruby, da wir sowohl die Leistungsgrenze erhöhen (größere Kompilierungseinheitengröße und SSA IR) als auch mehr externe Beiträge fördern möchten (indem wir ein traditionellerer Methodencompiler werden). Lesen Sie unseren Blogbeitrag für weitere Details.
ZJIT ist schneller als der Interpreter, aber noch nicht so schnell wie YJIT. Wir ermutigen Sie, ZJIT auszuprobieren, aber vielleicht sollten Sie es vorerst nicht in der Produktion einsetzen. Bleiben Sie dran für Ruby 4.1 ZJIT.
Ractor-Verbesserungen
Ractor, Rubys Mechanismus für parallele Ausführung, hat mehrere Verbesserungen erhalten. Eine neue Klasse, Ractor::Port, wurde eingeführt, um Probleme beim Senden und Empfangen von Nachrichten zu beheben (siehe unseren Blogbeitrag). Darüber hinaus erleichtert Ractor.shareable_proc das Teilen von Proc-Objekten zwischen Ractors.
Auf der Performance-Seite wurden viele interne Datenstrukturen verbessert, um die Blockierung durch ein globales Schloss erheblich zu reduzieren und eine bessere Parallelität zu ermöglichen. Ractors teilen nun auch weniger interne Daten, was zu weniger CPU-Cache-Konflikten bei paralleler Ausführung führt.
Ractor wurde erstmals in Ruby 3.0 als experimentelles Feature eingeführt. Wir beabsichtigen, seinen „experimentellen“ Status im nächsten Jahr zu entfernen.
Sprachänderungen
-
*nilruft nicht mehrnil.to_aauf, ähnlich wie**nilnichtnil.to_hashaufruft. [Feature #21047] -
Logische binäre Operatoren (
||,&&,andundor) am Anfang einer Zeile setzen die vorherige Zeile fort, ähnlich wie ein flüssiger Punkt. Die folgenden Codebeispiele sind gleich:if condition1 && condition2 ... endZuvor
if condition1 && condition2 ... endif condition1 && condition2 ... end
Aktualisierungen der Kernklassen
Hinweis: Hier werden nur herausragende Klassenaktualisierungen aufgeführt.
-
Array
Array#rfindwurde als effizientere Alternative zuarray.reverse_each.findhinzugefügt [Feature #21678]Array#findwurde als effizientere Überschreibung vonEnumerable#findhinzugefügt [Feature #21678]
-
Binding
-
Binding#local_variablesenthält keine nummerierten Parameter mehr. Außerdem lehnenBinding#local_variable_get,Binding#local_variable_setundBinding#local_variable_defined?die Behandlung von nummerierten Parametern ab. [Bug #21049] -
Binding#implicit_parameters,Binding#implicit_parameter_getundBinding#implicit_parameter_defined?wurden hinzugefügt, um nummerierte Parameter und den „it“-Parameter abzurufen. [Bug #21049]
-
-
Enumerator
-
Enumerator.produceakzeptiert jetzt ein optionales Schlüsselwortargumentsize, um die Größe des Enumerators anzugeben. Dies kann eine Ganzzahl,Float::INFINITY, ein aufrufbares Objekt (wie ein Lambda) odernilsein, um die unbekannte Größe anzuzeigen. Wenn nicht angegeben, ist die StandardgrößeFloat::INFINITY.# Infinite enumerator enum = Enumerator.produce(1, size: Float::INFINITY, &:succ) enum.size # => Float::INFINITY # Finite enumerator with known/computable size abs_dir = File.expand_path("./baz") # => "/foo/bar/baz" traverser = Enumerator.produce(abs_dir, size: -> { abs_dir.count("/") + 1 }) { raise StopIteration if it == "/" File.dirname(it) } traverser.size # => 4
-
-
ErrorHighlight
-
Wenn ein
ArgumentErrorausgelöst wird, werden nun Codeausschnitte sowohl für den Methodenaufruf (Aufrufer) als auch für die Methodendefinition (Aufgerufener) angezeigt. [Feature #21543]test.rb:1:in 'Object#add': wrong number of arguments (given 1, expected 2) (ArgumentError) caller: test.rb:3 | add(1) ^^^ callee: test.rb:1 | def add(x, y) = x + y ^^^ from test.rb:3:in '<main>'
-
-
Fiber
- Unterstützung für das Argument
Fiber#raise(cause:)ähnlich zuKernel#raiseeingeführt. [Feature #21360]
- Unterstützung für das Argument
-
Fiber::Scheduler
-
Fiber::Scheduler#fiber_interrupteingeführt, um eine Fiber mit einer gegebenen Ausnahme zu unterbrechen. Der anfängliche Anwendungsfall ist das Unterbrechen einer Fiber, die auf eine blockierende E/A-Operation wartet, wenn die E/A-Operation geschlossen wird. [Feature #21166] -
Fiber::Scheduler#yieldeingeführt, um dem Fiber-Scheduler die Fortsetzung der Verarbeitung zu ermöglichen, wenn Signal-Ausnahmen deaktiviert sind. [Bug #21633] -
Der
Fiber::Scheduler#io_closeHook für asynchroneIO#closewieder eingeführt. -
Fiber::Scheduler#io_writeaufgerufen beim Leeren des E/A-Schreibpuffers. [Bug #21789]
-
-
File
File::Stat#birthtimeist jetzt unter Linux über den statx-Systemaufruf verfügbar, wenn vom Kernel und Dateisystem unterstützt. [Feature #21205]
-
IO
-
IO.selectakzeptiertFloat::INFINITYals Timeout-Argument. [Feature #20610] -
Ein veraltetes Verhalten, die Prozess-Erstellung durch
IO-Klassenmethoden mit einem führenden|, wurde entfernt. [Feature #19630]
-
-
Kernel
-
Kernel#inspectprüft nun auf die Existenz einer#instance_variables_to_inspect-Methode, was die Kontrolle darüber ermöglicht, welche Instanzvariablen im#inspect-String angezeigt werdenclass DatabaseConfig def initialize(host, user, password) @host = host @user = user @password = password end private def instance_variables_to_inspect = [:@host, :@user] end conf = DatabaseConfig.new("localhost", "root", "hunter2") conf.inspect #=> #<DatabaseConfig:0x0000000104def350 @host="localhost", @user="root"> -
Ein veraltetes Verhalten, die Prozess-Erstellung durch
Kernel#openmit einem führenden|, wurde entfernt. [Feature #19630]
-
-
Math
Math.log1pundMath.expm1wurden hinzugefügt. [Feature #21527]
-
Pathname
- Pathname wurde von einem Standardgem zu einer Kernklasse von Ruby befördert. [Feature #17473]
-
Proc
Proc#parameterszeigt nun anonyme optionale Parameter als[:opt]anstelle von[:opt, nil], was die Ausgabe konsistent mit dem Fall macht, wenn der anonyme Parameter erforderlich ist. [Bug #20974]
-
Ractor
-
Die Klasse
Ractor::Portwurde für einen neuen Synchronisationsmechanismus zur Kommunikation zwischen Ractors hinzugefügt. [Feature #21262]port1 = Ractor::Port.new port2 = Ractor::Port.new Ractor.new port1, port2 do |port1, port2| port1 << 1 port2 << 11 port1 << 2 port2 << 12 end 2.times{ p port1.receive } #=> 1, 2 2.times{ p port2.receive } #=> 11, 12Ractor::Portbietet die folgenden Methoden:Ractor::Port#receiveRactor::Port#send(oderRactor::Port#<<)Ractor::Port#closeRactor::Port#closed?
Infolge dessen wurden
Ractor.yieldundRactor#takeentfernt. -
Die Methoden
Ractor#joinundRactor#valuewurden hinzugefügt, um auf die Beendigung eines Ractors zu warten. Diese sind ähnlich wieThread#joinundThread#value. -
Ractor#monitorundRactor#unmonitorwurden als Low-Level-Interfaces hinzugefügt, die intern zur Implementierung vonRactor#joinverwendet werden. -
Ractor.selectakzeptiert nun nur noch Ractors und Ports. Wenn Ractors angegeben werden, wird zurückgegeben, wenn ein Ractor beendet wird. -
Ractor#default_portwurde hinzugefügt. JederRactorhat einen Standardport, der vonRactor.sendundRactor.receiveverwendet wird. -
Ractor#close_incomingundRactor#close_outgoingwurden entfernt. -
Ractor.shareable_procundRactor.shareable_lambdawurden eingeführt, um teilbare Proc- oder Lambda-Objekte zu erstellen. [Feature #21550], [Feature #21557]
-
-
Range
-
Range#to_setführt nun Größenprüfungen durch, um Probleme mit endlosen Bereichen zu vermeiden. [Bug #21654] -
Range#overlap?behandelt nun korrekt unendliche (unbegrenzte) Bereiche. [Bug #21185] -
Das Verhalten von
Range#maxbei beginnlosen ganzzahligen Bereichen wurde behoben. [Bug #21174] [Bug #21175]
-
-
Ruby
- Ein neues Top-Level-Modul
Rubywurde definiert, das Ruby-bezogene Konstanten enthält. Dieses Modul wurde in Ruby 3.4 reserviert und ist nun offiziell definiert. [Feature #20884]
- Ein neues Top-Level-Modul
-
Ruby::Box
- Ein neues (experimentelles) Feature zur Trennung von Definitionen. Für Details zu „Ruby Box“ siehe doc/language/box.md. [Feature #21311] [Misc #21385]
-
Set
-
Setist nun eine Kernklasse, anstatt einer automatisch geladenen Standardbibliothek. [Feature #21216] -
Set#inspectverwendet nun eine einfachere Anzeige, ähnlich wie literale Arrays. (z. B.Set[1, 2, 3]anstelle von#<Set: {1, 2, 3}>). [Feature #21389] -
Das Übergeben von Argumenten an
Set#to_setundEnumerable#to_setist nun veraltet. [Feature #21390]
-
-
Socket
Socket.tcp&TCPSocket.newakzeptieren ein Schlüsselwortargumentopen_timeout, um das Timeout für die anfängliche Verbindung anzugeben. [Feature #21347]- Wenn in
TCPSocket.newein vom Benutzer angegebener Timeout auftrat, konnten zuvor entwederErrno::ETIMEDOUToderIO::TimeoutErrorausgelöst werden, abhängig von der Situation. Dieses Verhalten wurde vereinheitlicht, sodass nun konsistentIO::TimeoutErrorausgelöst wird. (Bitte beachten Sie, dass inSocket.tcpweiterhin Fälle auftreten können, in denenErrno::ETIMEDOUTin ähnlichen Situationen ausgelöst wird, und dass in beiden FällenErrno::ETIMEDOUTausgelöst werden kann, wenn der Timeout auf Betriebssystemebene auftritt.)
-
String
-
Unicode auf Version 17.0.0 und Emoji auf Version 17.0 aktualisiert. [Feature #19908][Feature #20724][Feature #21275] (gilt auch für Regexp)
-
String#strip,strip!,lstrip,lstrip!,rstripundrstrip!wurden erweitert, um*selectors-Argumente zu akzeptieren. [Feature #21552]
-
-
Thread
- Unterstützung für das Argument
Thread#raise(cause:)ähnlich zuKernel#raiseeingeführt. [Feature #21360]
- Unterstützung für das Argument
Aktualisierungen der Standardbibliothek
Wir listen nur bemerkenswerte Feature-Änderungen der Standardbibliothek auf.
Andere Änderungen sind in den folgenden Abschnitten aufgeführt. Wir haben auch die Releaseliste der zuvor gebündelten Version Ruby 3.4.0 aufgeführt, falls diese GitHub-Releases hat.
Die folgenden gebündelten Gems werden von Standard-Gems befördert.
- ostruct 0.6.3
- pstore 0.2.0
- 0.1.4 bis v0.2.0
- benchmark 0.5.0
- logger 1.7.0
- rdoc 7.0.2
- win32ole 1.9.2
- 1.9.1 bis v1.9.2
- irb 1.16.0
- reline 0.6.3
- readline 0.0.4
- fiddle 1.1.8
Das folgende Standard-Gem wird hinzugefügt.
- win32-registry 0.1.2
Die folgenden Standard-Gems werden aktualisiert.
- RubyGems 4.0.3
- bundler 4.0.3
- date 3.5.1
- delegate 0.6.1
- digest 3.2.1
- 3.2.0 bis v3.2.1
- english 0.8.1
- 0.8.0 bis v0.8.1
- erb 6.0.1
- error_highlight 0.7.1
- etc 1.4.6
- fcntl 1.3.0
- 1.2.0 bis v1.3.0
- fileutils 1.8.0
- 1.7.3 bis v1.8.0
- forwardable 1.4.0
- 1.3.3 bis v1.4.0
- io-console 0.8.2
- 0.8.1 bis v0.8.2
- io-nonblock 0.3.2
- io-wait 0.4.0
- 0.3.2 bis v0.3.3, v0.3.5.test1, v0.3.5, v0.3.6, v0.4.0
- ipaddr 1.2.8
- json 2.18.0
- net-http 0.9.1
- openssl 4.0.0
- optparse 0.8.1
- pp 0.6.3
- 0.6.2 bis v0.6.3
- prism 1.7.0
- psych 5.3.1
- resolv 0.7.0
- stringio 3.2.0
- strscan 3.1.6
- time 0.4.2
- 0.4.1 bis v0.4.2
- timeout 0.6.0
- uri 1.1.1
- weakref 0.1.4
- 0.1.3 bis v0.1.4
- zlib 3.2.2
- 3.2.1 bis v3.2.2
Die folgenden gebündelten Gems werden aktualisiert.
- minitest 6.0.0
- power_assert 3.0.1
- rake 13.3.1
- test-unit 3.7.3
- rexml 3.4.4
- rss 0.3.2
- 0.3.1 bis 0.3.2
- net-ftp 0.3.9
- 0.3.8 bis v0.3.9
- net-imap 0.6.2
- net-smtp 0.5.1
- 0.5.0 bis v0.5.1
- matrix 0.4.3
- 0.4.2 bis v0.4.3
- prime 0.1.4
- 0.1.3 bis v0.1.4
- rbs 3.10.0
- 3.8.0 bis v3.8.1, v3.9.0.dev.1, v3.9.0.pre.1, v3.9.0.pre.2, v3.9.0, v3.9.1, v3.9.2, v3.9.3, v3.9.4, v3.9.5, v3.10.0.pre.1, v3.10.0.pre.2, v3.10.0
- typeprof 0.31.1
- debug 1.11.1
- 1.11.0 bis v1.11.1
- base64 0.3.0
- 0.2.0 bis v0.3.0
- bigdecimal 4.0.1
- drb 2.2.3
- 2.2.1 bis v2.2.3
- syslog 0.3.0
- 0.2.0 bis v0.3.0
- csv 3.3.5
- repl_type_completor 0.1.12
RubyGems und Bundler
Ruby 4.0 gebündelte RubyGems und Bundler Version 4. Weitere Informationen finden Sie unter den folgenden Links.
- Upgrading to RubyGems/Bundler 4 - RubyGems Blog
- 4.0.0 Released - RubyGems Blog
- 4.0.1 Released - RubyGems Blog
- 4.0.2 Released - RubyGems Blog
- 4.0.3 Released - RubyGems Blog
Unterstützte Plattformen
-
Windows
- Unterstützung für MSVC-Versionen älter als 14.0 (_MSC_VER 1900) wurde eingestellt. Dies bedeutet, dass Visual Studio 2015 oder neuer jetzt erforderlich ist.
Kompatibilitätsprobleme
-
Die folgenden Methoden wurden aus Ractor entfernt, da
Ractor::Porthinzugefügt wurde.Ractor.yieldRactor#takeRactor#close_incomingRactor#close_outgoing
-
ObjectSpace._id2refist veraltet. [Feature #15408] -
Process::Status#&undProcess::Status#>>wurden entfernt. Sie waren in Ruby 3.3 veraltet. [Bug #19868] -
rb_path_checkwurde entfernt. Diese Funktion wurde für die Überprüfung von Pfaden unter$SAFEverwendet, die in Ruby 2.7 entfernt wurde, und war bereits veraltet. [Feature #20971] -
Ein Backtrace für
ArgumentErrormit „falsche Anzahl von Argumenten“ enthält nun den Klassennamen oder Modulnamen des Empfängers (z. B. inFoo#baranstelle vonbar). [Bug #21698] -
Backtraces zeigen keine
internalFrames mehr an. Diese Methoden erscheinen nun so, als ob sie sich in der Ruby-Quelldatei befinden, konsistent mit anderen C-implementierten Methoden. [Bug #20968]Vorher
ruby -e '[1].fetch_values(42)' <internal:array>:211:in 'Array#fetch': index 42 outside of array bounds: -1...1 (IndexError) from <internal:array>:211:in 'block in Array#fetch_values' from <internal:array>:211:in 'Array#map!' from <internal:array>:211:in 'Array#fetch_values' from -e:1:in '<main>'Nachher
$ ruby -e '[1].fetch_values(42)' -e:1:in 'Array#fetch_values': index 42 outside of array bounds: -1...1 (IndexError) from -e:1:in '<main>'
Stdlib-Kompatibilitätsprobleme
-
Die CGI-Bibliothek wurde aus den Standardgems entfernt. Wir stellen nun nur noch
cgi/escapefür die folgenden Methoden zur Verfügung:CGI.escapeundCGI.unescapeCGI.escapeHTMLundCGI.unescapeHTMLCGI.escapeURIComponentundCGI.unescapeURIComponentCGI.escapeElementundCGI.unescapeElement
-
Da
Setvon der Standardbibliothek zu einer Kernklasse verschoben wurde, wurdeset/sorted_set.rbentfernt undSortedSetist keine automatisch geladene Konstante mehr. Bitte installieren Sie dassorted_setGem undrequire 'sorted_set', umSortedSetzu verwenden. [Feature #21287] -
Net::HTTP
- Das Standardverhalten, automatisch den
Content-TypeHeader aufapplication/x-www-form-urlencodedfür Anfragen mit Body (z. B.POST,PUT) zu setzen, wenn der Header nicht explizit gesetzt war, wurde entfernt. Wenn Ihre Anwendung von diesem automatischen Standardwert abhängig war, werden Ihre Anfragen nun ohne Content-Type-Header gesendet, was die Kompatibilität mit bestimmten Servern beeinträchtigen kann. [GH-net-http #205]
- Das Standardverhalten, automatisch den
C-API-Aktualisierungen
-
IO
rb_thread_fd_closeist veraltet und nun eine No-Op. Wenn Sie Dateideskriptoren von C-Erweiterungen an Ruby-Code übergeben müssen, erstellen Sie eineIO-Instanz mitRUBY_IO_MODE_EXTERNALund verwenden Sierb_io_close(io), um sie zu schließen (dies unterbricht und wartet auch auf alle ausstehenden Operationen auf derIO-Instanz). Das direkte Schließen von Dateideskriptoren unterbricht keine ausstehenden Operationen und kann zu undefiniertem Verhalten führen. Mit anderen Worten, wenn zweiIO-Objekte denselben Dateideskriptor teilen, hat das Schließen des einen keine Auswirkungen auf das andere. [Feature #18455]
-
GVL
rb_thread_call_with_gvlfunktioniert nun mit oder ohne GVL. Dies ermöglicht es Gems,ruby_thread_has_gvl_pnicht mehr überprüfen zu müssen. Seien Sie bitte weiterhin sorgfältig mit dem GVL. [Feature #20750]
-
Set
-
Eine C-API für
Setwurde hinzugefügt. Die folgenden Methoden werden unterstützt: [Feature #21459]rb_set_foreachrb_set_newrb_set_new_caparb_set_lookuprb_set_addrb_set_clearrb_set_deleterb_set_size
-
Implementierungsverbesserungen
Class#new(z. B.Object.new) ist in allen Fällen schneller, insbesondere wenn Schlüsselwortargumente übergeben werden. Dies wurde auch in YJIT und ZJIT integriert. [Feature #21254]- GC-Heaps verschiedener Größen wachsen nun unabhängig voneinander, was den Speicherverbrauch reduziert, wenn nur einige Pools langlebige Objekte enthalten.
- Die GC-Bereinigung ist auf Seiten großer Objekte schneller.
- „Generic ivar“-Objekte (String, Array,
TypedDatausw.) verwenden nun ein neues internes „fields“-Objekt für einen schnelleren Zugriff auf Instanzvariablen. - Der GC vermeidet die Wartung einer internen
id2ref-Tabelle, bis sie zum ersten Mal verwendet wird, was die Zuweisung vonobject_idund die GC-Bereinigung beschleunigt. object_idundhashsind bei Class- und Module-Objekten schneller.- Größere Bignum-Integer können eingebettet bleiben, indem variable Breiten für die Allokation verwendet werden.
Random,Enumerator::Product,Enumerator::Chain,Addrinfo,StringScannerund einige interne Objekte sind nun schreibsperrgeschützt, was den GC-Overhead reduziert.
Ractor
Es wurde viel Arbeit geleistet, um Ractors stabiler, leistungsfähiger und nutzbarer zu machen. Diese Verbesserungen bringen die Ractor-Implementierung dem Verlassen des experimentellen Status näher.
- Leistungsverbesserungen
- Eingefrorene Strings und die Symboltabelle verwenden intern eine lock-freie Hash-Menge [Feature #21268]
- Methoden-Cache-Lookups vermeiden in den meisten Fällen Sperren.
- Der Zugriff auf Klassen- (und generische ivar-) Instanzvariablen ist schneller und vermeidet Sperren.
- CPU-Cache-Konflikte werden bei der Objekterstellung vermieden, indem ein pro-Ractor-Zähler verwendet wird.
- CPU-Cache-Konflikte werden in xmalloc/xfree vermieden, indem ein Thread-lokaler Zähler verwendet wird.
object_idvermeidet in den meisten Fällen Sperren.
- Fehlerbehebungen und Stabilität
- Behobene mögliche Deadlocks bei der Kombination von Ractors und Threads.
- Behobene Probleme mit `require` und `autoload` in einem Ractor.
- Behobene Kodierungs-/Transkodierungsprobleme über Ractors hinweg.
- Behobene Race Conditions bei GC-Operationen und Methodeninvalidierung.
- Behobene Probleme mit Prozessen, die nach dem Starten eines Ractors geforkt wurden.
- Die GC-Allokationszählungen sind nun unter Ractors korrekt.
- Behobene TracePoints, die nach GC nicht mehr funktionierten [Bug #19112]
JIT
- ZJIT
- Einführung eines experimentellen methodenbasierten JIT-Compilers. Wo verfügbar, kann ZJIT zur Laufzeit mit der Option
--zjitoder durch Aufruf vonRubyVM::ZJIT.enableaktiviert werden. Beim Erstellen von Ruby ist Rust 1.85.0 oder neuer erforderlich, um die ZJIT-Unterstützung einzuschließen. - Ab Ruby 4.0.0 ist ZJIT schneller als der Interpreter, aber noch nicht so schnell wie YJIT. Wir ermutigen zur Experimentation mit ZJIT, raten jedoch derzeit von der Bereitstellung in Produktionsumgebungen ab.
- Unser Ziel ist es, ZJIT in Ruby 4.1 schneller als YJIT und produktionsreif zu machen.
- Einführung eines experimentellen methodenbasierten JIT-Compilers. Wo verfügbar, kann ZJIT zur Laufzeit mit der Option
- YJIT
RubyVM::YJIT.runtime_statsratio_in_yjitfunktioniert im Standard-Build nicht mehr. Verwenden Sie--enable-yjit=statsbeiconfigure, um es bei--yjit-statszu aktivieren.invalidate_everythingzu den Standardstatistiken hinzugefügt, die erhöht wird, wenn jeder Code durch TracePoint invalidiert wird.
- Optionen
mem_size:undcall_threshold:zuRubyVM::YJIT.enablehinzugefügt.
- RJIT
--rjitwurde entfernt. Wir werden die Implementierung der Drittanbieter-JIT-API in das Repository ruby/rjit verschieben.
Weitere Details finden Sie unter NEWS oder in den Commit-Logs.
Mit diesen Änderungen wurden 3889 Dateien geändert, 230769 Einfügungen (+), 297003 Löschungen (-) seit Ruby 3.4.0!
Frohe Weihnachten, ein gutes neues Jahr und frohes Hacking mit Ruby 4.0!
Herunterladen
-
https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.tar.gz
SIZE: 23955109 SHA1: 754e39e9ad122e1b6deaed860350bac133a35ed3 SHA256: 2e8389c8c072cb658c93a1372732d9eac84082c88b065750db1e52a5ac630271 SHA512: 688254e939b197d564e896fb951bc1abf07142f489e91c5ed0b11f68f52d6adb6b1f86616fe03f1f0bb434beeef7e75e158b9c616afb39bb34403b0b78d2ee19 -
https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.tar.xz
SIZE: 18008368 SHA1: 05ec670e86f84325c5353ef2f2888e53b6adc602 SHA256: a72bacee9de07283ebc19baa4ac243b193129f21aa4e168c7186fb1fe7d07fe1 SHA512: 2d5b2e566eaf70a5f3ea6ce6afc0611c0415de58a41336ef7a0b855c9a91eda9aa790a5f8b48e40a1eb9d50f8ea0f687216e617f16c8d040a08474f3116518a4 -
https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.zip
SIZE: 29253204 SHA1: 0b69f89d1d140157251c0d3a6032f6c45cdf81e8 SHA256: 70cb1bf89279b86ab9a975d504607c051fc05ee03e311d550a5541b65e373455 SHA512: a72e076ef618c0aeb9d20cf22e6fb12fda36809c0064ef0f98153b95a0bac257ef606342444a38f992c4594bf376a4d264686cf597463aa6f111220798784302
Was ist Ruby
Ruby wurde erstmals 1993 von Matz (Yukihiro Matsumoto) entwickelt und wird nun als Open Source entwickelt. Es läuft auf mehreren Plattformen und wird weltweit, insbesondere für die Webentwicklung, eingesetzt.
Aktuelle Nachrichten
Ein neuer Look für Rubys Dokumentation
Nach dem Redesign von ruby-lang.org gibt es weitere Neuigkeiten zur Feier des 30-jährigen Jubiläums von Ruby: docs.ruby-lang.org hat ein komplett neues Erscheinungsbild mit Aliki – dem neuen Standard-Theme von RDoc.
Veröffentlicht von Stan Lo am 23. Dez 2025
Neues Website-Erscheinungsbild
Wir freuen uns, ein umfassendes Redesign unserer Website bekannt zu geben. Das Design für dieses Update wurde von Taeko Akatsuka erstellt.
Veröffentlicht von Hiroshi SHIBATA am 22. Dez 2025
Ruby 4.0.0 preview3 veröffentlicht
Wir freuen uns, die Veröffentlichung von Ruby 4.0.0-preview3 bekannt zu geben. Ruby 4.0 führt Ruby::Box und „ZJIT“ ein und bringt viele Verbesserungen mit sich.
Veröffentlicht von naruse am 18. Dez 2025
Ruby 3.4.8 veröffentlicht
Ruby 3.4.8 wurde veröffentlicht.
Veröffentlicht von k0kubun am 17. Dez 2025