Ruby 3.3.0 veröffentlicht
Gepostet von naruse am 25. Dez 2023
Wir freuen uns, die Veröffentlichung von Ruby 3.3.0 bekannt zu geben. Ruby 3.3 fügt einen neuen Parser namens Prism hinzu, verwendet Lrama als Parser-Generator, fügt einen neuen reinen Ruby-JIT-Compiler namens RJIT hinzu und bietet viele Leistungsverbesserungen, insbesondere YJIT.
Prism
- Eingeführt den Prism-Parser als Standard-Gem
- Prism ist ein portabler, fehlertoleranter und wartbarer rekursiver Abstiegs-Parser für die Ruby-Sprache
- Prism ist produktionsreif und wird aktiv gepflegt. Sie können es anstelle von Ripper verwenden.
- Es gibt umfangreiche Dokumentation zur Verwendung von Prism
- Prism ist 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 Prism-API sind
Prism.parse(source), das die AST als Teil eines Parse-Ergebnisobjekts zurückgibtPrism.parse_comments(source), die die Kommentare zurückgibtPrism.parse_success?(source), das true zurückgibt, wenn keine Fehler vorhanden sind
- Sie können Pull-Requests oder Issues direkt im Prism-Repository erstellen, wenn Sie am Beitrag interessiert sind
- Sie können jetzt
ruby --parser=prismoderRUBYOPT="--parser=prism"verwenden, um mit dem Prism-Compiler zu experimentieren. Bitte beachten Sie, dass dieses Flag nur zum Debuggen dient.
Verwenden Sie Lrama anstelle von Bison
- Bison durch Lrama LALR-Parsergenerator ersetzen [Feature #19637]
- Wenn Sie interessiert sind, lesen Sie bitte Die Zukunftsvision des Ruby-Parsers
- Der interne Lrama-Parser wurde aus Wartungsgründen durch einen LR-Parser ersetzt, der von Racc generiert wird
- Parametrisierte Regeln
(?, *, +)werden unterstützt und in Ruby parse.y verwendet
YJIT
- Wesentliche 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 zugewiesen.
- Mehr Aufrufe mit optionalen Argumenten werden kompiliert. Ausnahmebehandlungsroutinen werden ebenfalls kompiliert.
- Nicht unterstützte Aufruftypen und megamorphe Aufrufstellen verlassen den Interpreter nicht mehr.
- Grundlegende Methoden wie Rails
#blank?und spezialisierte#present?werden inline eingebunden. Integer#*,Integer#!=,String#!=,String#getbyte,Kernel#block_given?,Kernel#is_a?,Kernel#instance_of?undModule#===werden speziell optimiert.- Die Kompilierungsgeschwindigkeit ist jetzt etwas schneller als bei Ruby 3.2.
- Jetzt mehr als 3-mal schneller als der Interpreter bei Optcarrot!
- Erheblich verbesserter Speicherverbrauch gegenüber Ruby 3.2
- Metadaten für kompilierten Code 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-thresholdwird hinzugefügt, um das Kompilieren von kalten ISEQs zu überspringen.- Kompakterer Code wird auf Arm64 generiert.
- Code GC ist jetzt 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-Verhaltensweise auf Servern, die mit Pitchfork neu gestartet werden.
- Sie können Code GC immer noch bei Bedarf mit
--yjit-code-gcaktivieren
- Fügt
RubyVM::YJIT.enablehinzu, womit YJIT zur Laufzeit aktiviert werden kann- Sie können YJIT starten, ohne Kommandozeilenargumente oder Umgebungsvariablen zu ändern. Rails 7.2 wird YJIT auf diese Weise standardmäßig aktivieren.
- Dies kann auch verwendet werden, um YJIT erst zu aktivieren, nachdem Ihre Anwendung vollständig gebootet ist.
--yjit-disablekann verwendet werden, wenn Sie andere YJIT-Optionen nutzen und YJIT während des Bootens deaktivieren möchten.
- Mehr YJIT-Statistiken sind standardmäßig verfügbar
yjit_alloc_sizeund mehrere weitere Metadaten-bezogene Statistiken sind jetzt standardmäßig verfügbar.ratio_in_yjit-Statistik, erzeugt von--yjit-stats, ist jetzt in Release-Builds verfügbar; eine spezielle Statistik oder ein Dev-Build ist nicht mehr erforderlich, um auf die meisten Statistiken zuzugreifen.
- Mehr Profiling-Fähigkeiten hinzugefügt
- Es wird
--yjit-perfhinzugefügt, um das Profiling mit Linux perf zu erleichtern. --yjit-trace-exitsunterstützt jetzt Sampling mit--yjit-trace-exits-sample-rate=N
- Es wird
- Umfassendere Tests und mehrere Fehlerbehebungen
RJIT
- Eingeführt wurde ein reiner Ruby JIT-Compiler RJIT, der MJIT ersetzt hat.
- RJIT unterstützt nur die x86-64-Architektur auf Unix-Plattformen.
- Im Gegensatz zu MJIT ist zur Laufzeit kein C-Compiler erforderlich.
- RJIT existiert nur zu experimentellen Zwecken.
- Sie sollten weiterhin YJIT in der Produktion verwenden.
- Wenn Sie daran interessiert sind, JIT für Ruby zu entwickeln, sehen Sie sich bitte die Präsentation von k0kubun am Tag 3 der RubyKaigi an.
M:N Thread-Scheduler
- Der M:N Thread-Scheduler wurde eingeführt. [Feature #19842]
- M Ruby-Threads werden von N nativen Threads (OS-Threads) verwaltet, wodurch die Kosten für Thread-Erstellung und -Verwaltung reduziert werden.
- Dies kann die Kompatibilität von C-Erweiterungen beeinträchtigen, daher ist der M:N-Thread-Scheduler im Haupt-Ractor standardmäßig deaktiviert.
- Die Umgebungsvariable
RUBY_MN_THREADS=1aktiviert M:N-Threads im Haupt-Ractor. - M:N-Threads sind auf Nicht-Haupt-Ractoren immer aktiviert.
- Die Umgebungsvariable
- Die Umgebungsvariable
RUBY_MAX_CPU=nlegt die maximale Anzahl vonN(maximale Anzahl nativer Threads) fest. Der Standardwert ist 8.- Da nur ein Ruby-Thread pro Ractor gleichzeitig laufen kann, wird die Anzahl der nativen Threads verwendet, die das kleinere der in
RUBY_MAX_CPUangegebenen Anzahl und der Anzahl der laufenden Raktoren ist. Einzel-Ractor-Anwendungen (die meisten Anwendungen) verwenden also nur 1 nativen Thread. - Zur Unterstützung blockierender Operationen können mehr als
Nnative Threads verwendet werden.
- Da nur ein Ruby-Thread pro Ractor gleichzeitig laufen kann, wird die Anzahl der nativen Threads verwendet, die das kleinere der in
Leistungsverbesserungen
defined?(@ivar)wird mit Objektformen optimiert.- Namensauflösung wie
Socket.getaddrinfokann jetzt unterbrochen werden (in Umgebungen, in denen pthreads verfügbar sind). [Feature #19965] - Mehrere Leistungsverbesserungen für den Garbage Collector
- 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] - Write Barriers wurden für viele fehlende Kern-Typen implementiert, insbesondere
Time,Enumerator,MatchData,Method,File::Stat,BigDecimalund einige andere. Dies reduziert die Laufzeit von Minor GC-Sammlungen und die Häufigkeit von Major GC-Sammlungen erheblich. - Die meisten Kernklassen verwenden jetzt Variable Width Allocation, 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. - Unterstützung für schwache Referenzen wurde zum Garbage Collector hinzugefügt. [Feature #19783]
Weitere bemerkenswerte Änderungen seit 3.2
IRB
IRB hat mehrere Verbesserungen erhalten, darunter aber nicht beschränkt auf
- Erweiterte
irb:rdbg-Integration, die ein gleichwertiges Debugging-Erlebnis wiepry-byebugbietet (Doku). - Pager-Unterstützung für die Befehle
ls,show_sourceundshow_cmds. - Genauere und hilfreichere Informationen, die von den Befehlen
lsundshow_sourcebereitgestellt werden. - Experimentelle Autovervollständigung mittels Typanalyse (Doku).
- Es ist jetzt möglich, die Schriftfarbe und den Schriftschnitt im Vervollständigungsdialog mit einer neu eingeführten Klasse Reline::Face zu ändern (Doku)
Darüber hinaus wurde IRB umfangreich refaktorisiert und Dutzende von Fehlern behoben, um zukünftige Erweiterungen zu erleichtern.
Für detailliertere Updates siehe Unveiling the big leap in Ruby 3.3’s IRB.
Kompatibilitätsprobleme
Hinweis: Ausgenommen sind Feature-Fehlerbehebungen.
-
itAufrufe ohne Argumente in einem Block ohne normale Parameter sind veraltet.itwird in Ruby 3.4 eine Referenz auf den ersten Blockparameter sein. [Feature #18980] -
Regexp::newakzeptiert jetzt nur noch bis zu 2 Argumente statt 3. Dies war in Ruby 3.2 veraltet. [Bug #18797]
Entfernte Umgebungsvariablen
Die folgenden veralteten Methoden wurden entfernt.
- Die Umgebungsvariable
RUBY_GC_HEAP_INIT_SLOTSist veraltet und hat keine Funktion mehr. Bitte verwenden Sie stattdessen die UmgebungsvariablenRUBY_GC_HEAP_{0,1,2,3,4}_INIT_SLOTS. [Feature #19785]
Stdlib-Kompatibilitätsprobleme
ext/readline wird eingestellt
- Wir haben
reline, eine reine Ruby-Implementierung, die mit derext/readlineAPI kompatibel ist. Wir setzen 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.
Aktualisierungen der Standardbibliothek
RubyGems und Bundler warnen, wenn Benutzer die folgenden Gems requiren, ohne sie zu Gemfile oder gemspec hinzuzufügen. Dies liegt daran, dass sie in zukünftigen Ruby-Versionen zu gebündelten Gems werden.
Diese Warnung wird unterdrückt, wenn Sie die bootsnap-Gem verwenden. Wir empfehlen, Ihre Anwendung mindestens einmal mit der Umgebungsvariable DISABLE_BOOTSNAP=1 auszuführen. Dies ist eine Einschränkung dieser Version.
Die Zielbibliotheken sind
- abbrev
- base64
- bigdecimal
- csv
- drb
- getoptlong
- mutex_m
- nkf
- observer
- racc
- resolv-replace
- rinda
- syslog
Das folgende Standard-Gem wird hinzugefügt.
- prism 0.19.0
Die folgenden Standard-Gems werden 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 befördert.
- racc 1.7.3
Die folgenden gebündelten Gems werden 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
Details zu den Standard-Gems oder gebündelten Gems finden Sie in den GitHub-Releases wie Logger oder im Changelog.
Siehe NEWS oder Commit-Logs für weitere Details.
Mit diesen Änderungen wurden 5532 Dateien geändert, 326851 Einfügungen(+), 185793 Löschungen(-) seit Ruby 3.2.0!
Frohe Weihnachten, schöne Feiertage und viel Spaß beim Programmieren mit Ruby 3.3!
Herunterladen
-
https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0.tar.gz
SIZE: 22065999 SHA1: 1a7e56851bf29bda1183aca99b3b323c58e0187b SHA256: 96518814d9832bece92a85415a819d4893b307db5921ae1f0f751a9a89a56b7d SHA512: 26074009b501fc793d71a74e419f34a6033c9353433919ca74ba2d24a3de432dbb11fd92c2bc285f0e4d951a6d6c74bf5b69a2ab36200c8c26e871746d6e0fc6 -
https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0.tar.xz
SIZE: 16345456 SHA1: c8f68e1b0a114b90460a0b44165a3b2f540fa5b6 SHA256: 676b65a36e637e90f982b57b059189b3276b9045034dcd186a7e9078847b975b SHA512: 7959c5753bfa0bfc4d6d74060869aabbe9815c1c97930659da11b917ee0803ddbbd80e869e00c48b8694b4ba48709c3b6493fd045568e36e902616c35ababf01 -
https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0.zip
SIZE: 26935108 SHA1: a433eef1d7f96daeaf3b4cb842d0ed2dd82e7dc1 SHA256: 0e6563f679dd3694732eb3addf9de681c67b584602ac574376b60e7a509d2cd8 SHA512: a94a85937a14b217c1f4b90d24185289ed4aee79239c4f3eecf8034d3fd34e65ee8d66869473857ed153067188adc9b70c0471e4ebe842c9f98ef60c34090450
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
Ruby 4.0.0 veröffentlicht
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.
Veröffentlicht von naruse am 25. Dez 2025
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