Ruby 3.2.0 RC 1 veröffentlicht
Gepostet von naruse am 6. Dez 2022
Wir freuen uns, die Veröffentlichung von Ruby 3.2.0-rc1 bekannt zu geben. Ruby 3.2 bringt viele neue Funktionen und Leistungsverbesserungen mit sich.
WASI-basierte WebAssembly-Unterstützung
Dies ist ein erster Port der WASI-basierten WebAssembly-Unterstützung. Dies ermöglicht die Verfügbarkeit eines CRuby-Binärpakets in einem Webbrowser, einer serverlosen Edge-Umgebung oder anderen Arten von WebAssembly/WASI-Embeddern. Derzeit besteht dieser Port die grundlegenden und Bootstrap-Testsuiten, die die Thread-API nicht verwenden.

Hintergrund
WebAssembly (Wasm) wurde ursprünglich eingeführt, um Programme sicher und schnell in Webbrowsern auszuführen. Sein Ziel – Programme effizient und sicher in verschiedenen Umgebungen auszuführen – ist jedoch schon lange nicht nur für das Web, sondern auch für allgemeine Anwendungen gewünscht.
WASI (The WebAssembly System Interface) wurde für solche Anwendungsfälle entwickelt. Obwohl solche Anwendungen mit Betriebssystemen kommunizieren müssen, läuft WebAssembly auf einer virtuellen Maschine, die keine Systemschnittstelle hatte. WASI standardisiert diese.
Die WebAssembly/WASI-Unterstützung in Ruby zielt darauf ab, diese Projekte zu nutzen. Sie ermöglicht es Ruby-Entwicklern, Anwendungen zu schreiben, die auf solchen vielversprechenden Plattformen laufen.
Anwendungsfall
Diese Unterstützung ermutigt Entwickler, CRuby in einer WebAssembly-Umgebung zu nutzen. Ein Beispielanwendungsfall ist die CRuby-Unterstützung für TryRuby Playground. Jetzt können Sie originales CRuby in Ihrem Webbrowser ausprobieren.
Technische Punkte
Das heutige WASI und WebAssembly selbst fehlen einige Funktionen zur Implementierung von Fibern, Ausnahmen und GC aus Sicherheitsgründen und weil sie sich noch in der Entwicklung befinden. Daher füllt CRuby die Lücke durch die Verwendung von Asyncify, einer Binärtransformationstechnik zur Steuerung der Ausführung im Userland.
Darüber hinaus haben wir ein VFS über WASI erstellt, damit wir Ruby-Apps einfach in eine einzige .wasm-Datei packen können. Dies erleichtert die Verteilung von Ruby-Apps.
Verwandte Links
- Hinzufügen von WASI-basierter WebAssembly-Unterstützung #5407
- Ein Update zur WebAssembly/WASI-Unterstützung in Ruby
Regexp-Verbesserungen gegen ReDoS
Es ist bekannt, dass die Regexp-Übereinstimmung unerwartet lange dauern kann. Wenn Ihr Code versucht, einen möglicherweise ineffizienten Regexp mit nicht vertrauenswürdigen Eingaben abzugleichen, kann ein Angreifer dies für eine effiziente Denial of Service (sogenannte Regular Expression DoS oder ReDoS) ausnutzen.
Wir haben zwei Verbesserungen eingeführt, die ReDoS signifikant mildern.
Verbesserter Regexp-Matching-Algorithmus
Seit Ruby 3.2 wurde der Matching-Algorithmus von Regexp durch die Verwendung einer Memoisationstechnik erheblich verbessert.
# This match takes 10 sec. in Ruby 3.1, and 0.003 sec. in Ruby 3.2
/^a*b?a*$/ =~ "a" * 50000 + "x"

Der verbesserte Matching-Algorithmus ermöglicht es, die meisten Regexp-Übereinstimmungen (etwa 90 % in unseren Experimenten) in linearer Zeit abzuschließen.
(Für Vorschau-Benutzer: Diese Optimierung kann für jede Übereinstimmung Speicher proportional zur Eingabelänge verbrauchen. Wir erwarten keine praktischen Probleme, da diese Speicherzuweisung normalerweise verzögert wird und eine normale Regexp-Übereinstimmung höchstens das 10-fache des Speichers der Eingabelänge verbrauchen sollte. Wenn Ihnen bei der Abgleichung von Regexps in einer realen Anwendung der Speicher ausgeht, melden Sie dies bitte.)
Der ursprüngliche Vorschlag ist https://bugs.ruby-lang.org/issues/19104
Regexp-Timeout
Die obige Optimierung kann nicht auf einige Arten von regulären Ausdrücken angewendet werden, z. B. auf solche, die erweiterte Funktionen (z. B. Rückverweise oder Lookarounds) enthalten, oder mit einer riesigen festen Anzahl von Wiederholungen. Als Fallback-Maßnahme wurde auch eine Timeout-Funktion für Regexp-Übereinstimmungen eingeführt.
Regexp.timeout = 1.0
/^a*b?a*()\1$/ =~ "a" * 50000 + "x"
#=> Regexp::TimeoutError is raised in one second
Beachten Sie, dass Regexp.timeout eine globale Konfiguration ist. Wenn Sie unterschiedliche Timeouteinstellungen für einige spezielle Regexps verwenden möchten, möchten Sie möglicherweise das Schlüsselwort timeout für Regexp.new verwenden.
Regexp.timeout = 1.0
# This regexp has no timeout
long_time_re = Regexp.new('^a*b?a*()\1$', timeout: Float::INFINITY)
long_time_re =~ "a" * 50000 + "x" # never interrupted
Der ursprüngliche Vorschlag ist https://bugs.ruby-lang.org/issues/17837
Weitere bemerkenswerte neue Funktionen
SyntaxSuggest
-
Die Funktion
syntax_suggest(früherdead_end) ist in Ruby integriert. Dies hilft Ihnen, die Position von Fehlern wie fehlenden oder überflüssigenends zu finden, um Sie schneller wieder auf den Weg zu bringen, wie im folgenden BeispielUnmatched `end', missing keyword (`do', `def`, `if`, etc.) ? 1 class Dog > 2 defbark > 4 end 5 end
ErrorHighlight
- Zeigt nun auf das/die relevante(n) Argument(e) für TypeError und ArgumentError
test.rb:2:in `+': nil can't be coerced into Integer (TypeError)
sum = ary[0] + ary[1]
^^^^^^
Sprache
-
Anonyme Rest- und Keyword-Restargumente können nun als Argumente übergeben werden, nicht nur in Methodenparametern verwendet werden. [Feature #18351]
def foo(*) bar(*) end def baz(**) quux(**) end -
Ein Proc, das ein einzelnes positionsbezogenes Argument und Schlüsselwörter akzeptiert, wird nun nicht mehr automatisch gesprengt. [Bug #18633]
proc{|a, **k| a}.call([1, 2]) # Ruby 3.1 and before # => 1 # Ruby 3.2 and after # => [1, 2] -
Die Auswertungsreihenfolge von Konstanten-Zuweisungen für Konstanten, die an expliziten Objekten gesetzt werden, wurde mit der Auswertungsreihenfolge von einzelnen Attribut-Zuweisungen konsistent gemacht. Mit diesem Code
foo::BAR = bazfoowird jetzt vorbazaufgerufen. Ebenso wird für Mehrfachzuweisungen an Konstanten eine Auswertungsreihenfolge von links nach rechts verwendet. Mit diesem Codefoo1::BAR1, foo2::BAR2 = baz1, baz2Wird nun die folgende Auswertungsreihenfolge verwendet
foo1foo2baz1baz2
-
Das Find-Muster ist nicht mehr experimentell. [Feature #18585]
-
Methoden, die einen Restparameter (wie
*args) akzeptieren und Schlüsselwortargumente überfoo(*args)delegieren möchten, müssen nun mitruby2_keywordsmarkiert werden (falls dies nicht bereits der Fall ist). Mit anderen Worten, alle Methoden, die Schlüsselwortargumente über*argsdelegieren möchten, müssen nun mitruby2_keywordsmarkiert werden, ohne Ausnahme. Dies erleichtert den Übergang zu anderen Delegationsmethoden, sobald eine Bibliothek Ruby 3+ erfordern kann. Zuvor wurde dasruby2_keywordsFlag beibehalten, wenn die empfangende Methode*argsverwendete, aber dies war ein Fehler und eine Inkonsistenz. Eine gute Technik, um potenziell fehlenderuby2_keywordszu finden, ist die Ausführung der Testsuite, das Auffinden der letzten Methode, die Schlüsselwortargumente für jeden Ort empfangen muss, an dem die Testsuite fehlschlägt, und die Verwendung vonputs nil, caller, nildort. Überprüfen Sie dann, ob jede Methode/jeder Block in der Aufrufkette, der Schlüsselwörter delegieren muss, korrekt mitruby2_keywordsmarkiert ist. [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)
Leistungsverbesserungen
YJIT
- YJIT unterstützt nun x86-64 und 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 ARM64-Prozessoren.
- Das Erstellen von YJIT erfordert Rust 1.58.0+. [Feature #18481]
- Um sicherzustellen, dass CRuby mit YJIT erstellt wird, installieren Sie bitte rustc >= 1.58.0 und führen Sie
./configuremit--enable-yjitaus. - Bitte wenden Sie sich an das YJIT-Team, wenn Sie auf Probleme stoßen.
- Um sicherzustellen, dass CRuby mit YJIT erstellt wird, installieren Sie bitte rustc >= 1.58.0 und führen Sie
- Physischer Speicher für JIT-Code wird verzögert zugewiesen. Im Gegensatz zu Ruby 3.1 wird der RSS-Wert eines Ruby-Prozesses minimiert, da virtuelle Speicherseiten, die von
--yjit-exec-mem-sizezugewiesen werden, erst dann physisch abgebildet werden, wenn sie tatsächlich von JIT-Code genutzt werden. - Einführung von Code GC, das alle Code-Seiten freigibt, wenn der Speicherverbrauch durch JIT-Code
--yjit-exec-mem-sizeerreicht.- RubyVM::YJIT.runtime_stats gibt zusätzlich zu den vorhandenen Schlüsseln
inline_code_sizeundoutlined_code_sizenun auch Code-GC-Metriken zurück:code_gc_count,live_page_count,freed_page_countundfreed_code_size.
- RubyVM::YJIT.runtime_stats gibt zusätzlich zu den vorhandenen Schlüsseln
- Die meisten Statistiken, die von RubyVM::YJIT.runtime_stats erzeugt werden, sind jetzt in Release-Builds verfügbar.
- Führen Sie einfach Ruby mit
--yjit-statsaus, um Statistiken zu berechnen (verursacht einen gewissen Laufzeit-Overhead).
- Führen Sie einfach Ruby mit
- YJIT ist nun optimiert, um Objektformen zu nutzen. [Feature #18776]
- Nutzt eine feingranulare Konstanteninvalidierung, um beim Definieren neuer Konstanten weniger Code zu invalidieren. [Feature #18589]
MJIT
- Der MJIT-Compiler wurde in Ruby als Standardbibliothek
mjitneu implementiert. - Der MJIT-Compiler wird in einem geforkten Ruby-Prozess ausgeführt, anstatt in einem nativen Thread namens MJIT-Worker. [[Feature #18968]]
- Infolgedessen wird Microsoft Visual Studio (MSWIN) nicht mehr unterstützt.
- MinGW wird nicht mehr unterstützt. [[Feature #18824]]
- Umbenennung von
--mjit-min-callsin--mjit-call-threshold. - Änderung des Standardwerts von
--mjit-max-cachevon 10000 auf 100.
PubGrub
-
Bundler 2.4 verwendet nun den PubGrub Resolver anstelle von Molinillo.
- PubGrub ist der Solver-Algorithmus der nächsten Generation, der vom
pubPaketmanager für die Dart-Programmiersprache verwendet wird. - Nach dieser Änderung kann es zu unterschiedlichen Auflösungsergebnissen kommen. Bitte melden Sie solche Fälle an die RubyGems/Bundler Issues.
- PubGrub ist der Solver-Algorithmus der nächsten Generation, der vom
-
RubyGems verwendet weiterhin den Molinillo Resolver in Ruby 3.2. Wir planen, ihn zukünftig durch PubGrub zu ersetzen.
Weitere bemerkenswerte Änderungen seit 3.1
- Hash
- Hash#shift gibt nun immer nil zurück, wenn der Hash leer ist, anstatt den Standardwert zurückzugeben oder den Standard-Proc aufzurufen. [Bug #16908]
- MatchData
- MatchData#byteoffset wurde hinzugefügt. [Feature #13110]
- Module
- Module.used_refinements wurde hinzugefügt. [Feature #14332]
- Module#refinements wurde hinzugefügt. [Feature #12737]
- Module#const_added wurde hinzugefügt. [Feature #17881]
- Proc
- Proc#dup gibt eine Instanz einer Unterklasse zurück. [Bug #17545]
- Proc#parameters akzeptiert nun das Lambda-Schlüsselwort. [Feature #15357]
- Refinement
- Refinement#refined_class wurde hinzugefügt. [Feature #12737]
- RubyVM::AbstractSyntaxTree
- Option
error_tolerantfürparse,parse_fileundofhinzugefügt. [[Feature #19013]]
- Option
- Set
- Set ist nun als eingebaute Klasse verfügbar, ohne
require "set". [Feature #16989] Sie wird derzeit über dieSetKonstante oder einen Aufruf vonEnumerable#to_setautomatisch geladen.
- Set ist nun als eingebaute Klasse verfügbar, ohne
- String
- String#byteindex und String#byterindex wurden hinzugefügt. [Feature #13110]
- Unicode auf Version 15.0.0 und Emoji Version 15.0 aktualisiert. [Feature #18639] (gilt auch für Regexp)
- String#bytesplice wurde hinzugefügt. [Feature #18598]
- Struct
- Eine Struct-Klasse kann auch mit Schlüsselwortargumenten initialisiert werden, ohne
keyword_init: truebeiStruct.new[Feature #16806]
- Eine Struct-Klasse kann auch mit Schlüsselwortargumenten initialisiert werden, ohne
Kompatibilitätsprobleme
Hinweis: Ausgenommen sind Feature-Fehlerbehebungen.
Entfernte Konstanten
Die folgenden veralteten Konstanten wurden entfernt.
FixnumundBignum[Feature #12005]Random::DEFAULT[Feature #17351]Struct::GroupStruct::Passwd
Entfernte Methoden
Die folgenden veralteten 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]
Stdlib-Kompatibilitätsprobleme
Keine Bündelung von Drittanbieterquellen mehr
-
Wir bündeln keine Drittanbieterquellen mehr wie
libyaml,libffi.-
Die libyaml-Quelle wurde aus psych entfernt. Möglicherweise müssen Sie
libyaml-devauf Ubuntu/Debian-Plattformen installieren. Der Paketname ist je nach Plattform unterschiedlich. -
Die gebündelte libffi-Quelle wurde ebenfalls aus
fiddleentfernt.
-
-
Psych und fiddle unterstützten statische Builds mit spezifischen Versionen von libyaml- und libffi-Quellen. Sie können psych mit libyaml-0.2.5 wie folgt bauen
$ ./configure --with-libyaml-source-dir=/path/to/libyaml-0.2.5Und Sie können fiddle mit libffi-3.4.4 wie folgt bauen
$ ./configure --with-libffi-source-dir=/path/to/libffi-3.4.4
C-API-Aktualisierungen
Aktualisierte C-APIs
Die folgenden APIs wurden aktualisiert.
- PRNG-Update
rb_random_interface_twurde aktualisiert und versioniert. Erweiterungsbibliotheken, die diese Schnittstelle verwenden und für ältere Versionen erstellt wurden. Außerdem muss die Funktioninit_int32definiert werden.
Entfernte C-APIs
Die folgenden veralteten APIs wurden entfernt.
- Variable
rb_cData. - "taintedness" und "trustedness" Funktionen. [Feature #16131]
Aktualisierungen der Standardbibliothek
- Die folgenden Standard-Gems werden aktualisiert.
- RubyGems 3.4.0.dev
- benchmark 0.2.1
- bigdecimal 3.1.3
- bundler 2.4.0.dev
- cgi 0.3.6
- date 3.3.0
- delegate 0.3.0
- did_you_mean 1.6.2
- digest 3.1.1
- drb 2.1.1
- erb 4.0.2
- error_highlight 0.5.1
- etc 1.4.1
- fcntl 1.0.2
- fiddle 1.1.1
- fileutils 1.7.0
- forwardable 1.3.3
- getoptlong 0.2.0
- io-console 0.5.11
- io-nonblock 0.2.0
- io-wait 0.3.0.pre
- ipaddr 1.2.5
- irb 1.5.1
- json 2.6.2
- logger 1.5.2
- mutex_m 0.1.2
- net-http 0.3.1
- net-protocol 0.2.0
- nkf 0.1.2
- open-uri 0.3.0
- openssl 3.1.0.pre
- optparse 0.3.0
- ostruct 0.5.5
- pathname 0.2.1
- pp 0.4.0
- pstore 0.1.2
- psych 5.0.0
- racc 1.6.1
- rdoc 6.5.0
- reline 0.3.1
- resolv 0.2.2
- securerandom 0.2.1
- set 1.0.3
- stringio 3.0.3
- syntax_suggest 1.0.1
- timeout 0.3.1
- tmpdir 0.1.3
- tsort 0.1.1
- un 0.2.1
- uri 0.12.0
- win32ole 1.8.9
- zlib 3.0.0
- Die folgenden gebündelten Gems werden aktualisiert.
- minitest 5.16.3
- power_assert 2.0.2
- test-unit 3.5.5
- net-ftp 0.2.0
- net-imap 0.3.1
- net-pop 0.1.2
- net-smtp 0.3.3
- rbs 2.8.1
- typeprof 0.21.3
- debug 1.7.0
Siehe NEWS oder Commit-Logs für weitere Details.
Mit diesen Änderungen wurden 2846 Dateien geändert, 203950 Einfügungen(+), 127153 Löschungen(-) seit Ruby 3.1.0!
Herunterladen
-
https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-rc1.tar.gz
SIZE: 20253652 SHA1: 9b45af61ef1ae3c21ab88d7c9e30b80060116ac3 SHA256: 3bb9760c1ac1b66416aaa4899809f6ccd010e57038eaaeca19a383fd56275dac SHA512: 798157d785ebae94cb128d3c134fa35e0e90c654972e531cb6562823042f3fb68a270226f7b1cf0c42572ef2b1488a1a3e44f88389ad2a6f9ca4b280a2a8e759 -
https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-rc1.tar.xz
SIZE: 14934012 SHA1: 5576e304786d466410f27a345dc1cb66f2c773f6 SHA256: 0d45b3af14e84337882a2021235a091ae5dcfc0baaf31dccc479b71d96dd07bc SHA512: d38fcb1e09eb9984f3b2347e65ae7406129c2578d068a25d33b5b4f021ec3b567a9abe56c2acbec6d07a3c2b4bc7b485dbd330cbfbb3a96350f60a2bb94d016e -
https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-rc1.zip
SIZE: 24473024 SHA1: 8fdc85363ce61e0b8f04da36e709d49028d04a75 SHA256: 7ff32473be108534548e401aaa9092c37a27f73323ea4091c33901c714c87ee5 SHA512: 07adf6a9c89fdcf420e7b131f40f2b1f4aca036aa6f28539ade26ca552f84a75e0698f77a8b774d2ea52b8c756c4982ef319bda5afa786c081a31dd9873c5ef7
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