Ruby 3.3.0-rc1 veröffentlicht
Gepostet von naruse am 11. Dez 2023
Wir freuen uns, die Veröffentlichung von Ruby 3.3.0-rc1 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.
Nach der Veröffentlichung von RC1 werden wir ABI-Inkompatibilitäten möglichst vermeiden. Wenn wir dies tun müssen, werden wir dies in den Release Notes ankündigen.
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), was den AST als Teil eines ParseResult zurückgibtPrism.dump(source), was den serialisierten AST als String zurückgibtPrism.parse_comments(source), die die Kommentare zurückgibt
- Sie können Pull-Requests oder Issues direkt im Prism-Repository erstellen, wenn Sie am Beitrag interessiert sind
Verwenden Sie Lrama anstelle von Bison
- Bison durch Lrama LALR-Parsergenerator ersetzt 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
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.
YJIT
- Wesentliche Leistungsverbesserungen gegenüber 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.
- Ausnahmebehandler werden ebenfalls kompiliert.
- Instanzvariablen werden nicht mehr mit megamorphen Objektformen an den Interpreter übergeben.
- Nicht unterstützte Aufruftypen verlassen den Interpreter nicht mehr.
Integer#!=,String#!=,Kernel#block_given?,Kernel#is_a?,Kernel#instance_of?,Module#===sind speziell optimiert.- Jetzt mehr als 3x schneller als der Interpreter bei optcarrot!
- Der Speicherverbrauch wurde gegenüber 3.2 erheblich verbessert
- Metadaten für kompilierten Code verbrauchen deutlich weniger Speicher.
- Generiert kompakteren Code auf ARM64
- Die Kompilierungsgeschwindigkeit ist jetzt etwas schneller als bei 3.2.
- Fügt
RubyVM::YJIT.enablehinzu, womit YJIT zur Laufzeit aktiviert werden kann- Sie können YJIT starten, ohne Kommandozeilenargumente oder Umgebungsvariablen zu ändern.
- 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.
- Code GC ist jetzt standardmäßig deaktiviert, und
--yjit-exec-mem-sizewird als harte Grenze behandelt, bei der die Kompilierung von neuem Code stoppt.- Besseres Copy-on-Write-Verhalten auf Servern, die Unicorn und Forking verwenden
- Keine plötzlichen Leistungsabfälle aufgrund von Code GC.
- Sie können Code GC weiterhin bei Bedarf mit
--yjit-code-gcaktivieren
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.- Exit-Tracing-Option unterstützt jetzt Sampling
--trace-exits-sample-rate=N
- Es wird
--yjit-perfhinzugefügt, um das Profiling mit Linux perf zu erleichtern. - Umfassendere Tests und mehrere Fehlerbehebungen
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-Main-Raktoren aktiviert.
- Die Umgebungsvariable
- Die Umgebungsvariable
RUBY_MAX_CPU=nlegt die maximale Anzahl vonN(maximale Anzahl nativer Threads) fest. Der Standardwert ist 8.- Da zu einem Zeitpunkt nur ein Ruby-Thread pro Ractor laufen kann, wird die Anzahl der nativen Threads verwendet, die kleiner ist als die in
RUBY_MAX_CPUangegebene Anzahl und die Anzahl der laufenden Raktoren. Daher werden Single-Ractor-Anwendungen (die meisten Anwendungen) 1 nativen Thread verwenden. - Zur Unterstützung blockierender Operationen können mehr als
Nnative Threads verwendet werden.
- Da zu einem Zeitpunkt nur ein Ruby-Thread pro Ractor laufen kann, wird die Anzahl der nativen Threads verwendet, die kleiner ist als die in
Weitere bemerkenswerte neue Funktionen
Sprache
Leistungsverbesserungen
defined?(@ivar)wird mit Objektformen optimiert.- Namensauflösung wie z.B.
Socket.getaddrinfokann nun unterbrochen werden (in Umgebungen, in denen pthreads verfügbar sind). Feature #19965- Zu diesem Zweck wird nun ein pthread erstellt, wenn getaddrinfo oder getnameinfo aufgerufen wird. Dies verursacht einen gewissen Overhead bei der Namensauflösung (etwa das 2,5-fache in unseren Experimenten). Wir erwarten nicht, dass der Overhead der Namensauflösung für die meisten Anwendungen ein Problem darstellt, aber wenn Sie solche beobachten oder unerwartete Auswirkungen sehen, die Ihrer Meinung nach auf diese Änderung zurückzuführen sind, melden Sie diese bitte.
- Mehrere Leistungsverbesserungen am Garbage Collector
- Junge Objekte, auf die von alten Objekten verwiesen wird, werden nicht mehr sofort in die alte Generation befördert. 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 Kern-Typen implementiert, für die 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 Width Allocation, insbesondere
Hash,Time,Thread::Backtrace,Thread::Backtrace::Location,File::Stat,Method. Dies macht die Zuweisung und Freigabe dieser Klassen schneller, verbraucht weniger Speicher und reduziert die Heap-Fragmentierung. - Unterstützung für Weak References 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.
Kompatibilitätsprobleme
Hinweis: Ausgenommen sind Feature-Fehlerbehebungen.
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
Entfernte Konstanten
Die folgenden veralteten Konstanten wurden entfernt.
Entfernte Methoden
Die folgenden veralteten Methoden wurden entfernt.
Entfernte Umgebungsvariablen
Die folgenden veralteten Umgebungsvariablen werden 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.
C-API-Aktualisierungen
Aktualisierte C-APIs
Die folgenden APIs wurden aktualisiert.
Entfernte C-APIs
Die folgenden veralteten APIs wurden entfernt.
Aktualisierungen der Standardbibliothek
RubyGems und Bundler warnen, wenn Benutzer ein Gem anfordern, das in einer zukünftigen Ruby-Version zur gebündelten Gem-Liste werden soll.
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.15.1
Die folgenden Standard-Gems werden aktualisiert.
- RubyGems 3.5.0.dev
- base64 0.2.0
- benchmark 0.3.0
- bigdecimal 3.1.5
- bundler 2.5.0.dev
- cgi 0.4.0
- csv 3.2.8
- date 3.3.4
- delegate 0.3.1
- drb 2.2.0
- english 0.8.0
- erb 4.0.3
- etc 1.4.3.dev.1
- fcntl 1.1.0
- fiddle 1.1.2
- fileutils 1.7.2
- find 0.2.0
- getoptlong 0.2.1
- io-console 0.6.1.dev
- irb 1.8.3
- 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.0
- open3 0.2.0
- 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.1.1
- rdoc 6.6.0
- reline 0.3.9
- rinda 0.2.0
- securerandom 0.3.0
- shellwords 0.2.0
- singleton 0.2.0
- stringio 3.0.9
- strscan 3.0.7
- syntax_suggest 1.1.0
- tempfile 0.2.0
- 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-imap 0.4.4
- net-smtp 0.4.0
- rbs 3.2.2
- typeprof 0.21.8
- debug 1.8.0
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 5414 Dateien geändert, 306141 Einfügungen(+), 183575 Löschungen(-) seit Ruby 3.2.0!
Herunterladen
-
https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0-rc1.tar.gz
SIZE: 21783575 SHA1: c75a860e06f27b7f69b874757417277c21d1d3f4 SHA256: c4ff82395a90ef76c7f906b7687026e0ab96b094dcf3a532d9ab97784a073222 SHA512: 265fb2ffe55af47d8349edffcebe749cc170291227cef55529fe4e67363e4e84b88daa34ffb5364a99c8a0e32110266a34c9a11d62f3bd6f6d47fa76eca641f4 -
https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0-rc1.tar.xz
SIZE: 16163884 SHA1: 26503f9bdc7d0a05aaa9836f54d3aa9e74a9ead9 SHA256: 051815637f1fa75a1edf2c54b66d5d5b69563daad777da8dc39543b7754b5290 SHA512: 82f4acfaad1dc47db27ee3eb952481a95b3474a98059e9e9f5ceb035b690d1faabe99f2ec52371c4089ed1615eb10c395f029088418fec4d26399b65b4f259b9 -
https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0-rc1.zip
SIZE: 26735443 SHA1: 35583453a7734216b08829ef0ec9ea1bc0d4ae7f SHA256: 56dd82e1dd714f2889ca975ae7befbe005675de08839c2cc4a484de2ae65201c SHA512: 7fbe414c230aedc9f364512bcbc213038f8f6e4268929a559d2527e2f3e32a140b394e37098ab7e59161236eca8b89cc9e52d73a3be8d7bd44faa91681483f5d
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