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.

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üher dead_end) ist in Ruby integriert. Dies hilft Ihnen, die Position von Fehlern wie fehlenden oder überflüssigen ends zu finden, um Sie schneller wieder auf den Weg zu bringen, wie im folgenden Beispiel

    Unmatched `end', missing keyword (`do', `def`, `if`, etc.) ?
    
      1  class Dog
    > 2    defbark
    > 4    end
      5  end
    

    [Feature #18159]

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 = baz
    

    foo wird jetzt vor baz aufgerufen. Ebenso wird für Mehrfachzuweisungen an Konstanten eine Auswertungsreihenfolge von links nach rechts verwendet. Mit diesem Code

        foo1::BAR1, foo2::BAR2 = baz1, baz2
    

    Wird nun die folgende Auswertungsreihenfolge verwendet

    1. foo1
    2. foo2
    3. baz1
    4. baz2

    [Bug #15928]

  • Das Find-Muster ist nicht mehr experimentell. [Feature #18585]

  • Methoden, die einen Restparameter (wie *args) akzeptieren und Schlüsselwortargumente über foo(*args) delegieren möchten, müssen nun mit ruby2_keywords markiert werden (falls dies nicht bereits der Fall ist). Mit anderen Worten, alle Methoden, die Schlüsselwortargumente über *args delegieren möchten, müssen nun mit ruby2_keywords markiert werden, ohne Ausnahme. Dies erleichtert den Übergang zu anderen Delegationsmethoden, sobald eine Bibliothek Ruby 3+ erfordern kann. Zuvor wurde das ruby2_keywords Flag beibehalten, wenn die empfangende Methode *args verwendete, aber dies war ein Fehler und eine Inkonsistenz. Eine gute Technik, um potenziell fehlende ruby2_keywords zu 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 von puts nil, caller, nil dort. Überprüfen Sie dann, ob jede Methode/jeder Block in der Aufrufkette, der Schlüsselwörter delegieren muss, korrekt mit ruby2_keywords markiert 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 ./configure mit --enable-yjit aus.
    • Bitte wenden Sie sich an das YJIT-Team, wenn Sie auf Probleme stoßen.
  • 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-size zugewiesen 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-size erreicht.
    • RubyVM::YJIT.runtime_stats gibt zusätzlich zu den vorhandenen Schlüsseln inline_code_size und outlined_code_size nun auch Code-GC-Metriken zurück: code_gc_count, live_page_count, freed_page_count und freed_code_size.
  • 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-stats aus, um Statistiken zu berechnen (verursacht einen gewissen Laufzeit-Overhead).
  • 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 mjit neu 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-calls in --mjit-call-threshold.
  • Änderung des Standardwerts von --mjit-max-cache von 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 pub Paketmanager 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.
  • 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
  • Module
  • Proc
    • Proc#dup gibt eine Instanz einer Unterklasse zurück. [Bug #17545]
    • Proc#parameters akzeptiert nun das Lambda-Schlüsselwort. [Feature #15357]
  • Refinement
  • RubyVM::AbstractSyntaxTree
    • Option error_tolerant für parse, parse_file und of hinzugefügt. [[Feature #19013]]
  • Set
    • Set ist nun als eingebaute Klasse verfügbar, ohne require "set". [Feature #16989] Sie wird derzeit über die Set Konstante oder einen Aufruf von Enumerable#to_set automatisch geladen.
  • 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: true bei Struct.new [Feature #16806]

Kompatibilitätsprobleme

Hinweis: Ausgenommen sind Feature-Fehlerbehebungen.

Entfernte Konstanten

Die folgenden veralteten Konstanten wurden entfernt.

Entfernte Methoden

Die folgenden veralteten Methoden wurden entfernt.

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-dev auf Ubuntu/Debian-Plattformen installieren. Der Paketname ist je nach Plattform unterschiedlich.

    • Die gebündelte libffi-Quelle wurde ebenfalls aus fiddle entfernt.

  • 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.5
    

    Und Sie können fiddle mit libffi-3.4.4 wie folgt bauen

      $ ./configure --with-libffi-source-dir=/path/to/libffi-3.4.4
    

    [Feature #18571]

C-API-Aktualisierungen

Aktualisierte C-APIs

Die folgenden APIs wurden aktualisiert.

  • PRNG-Update rb_random_interface_t wurde aktualisiert und versioniert. Erweiterungsbibliotheken, die diese Schnittstelle verwenden und für ältere Versionen erstellt wurden. Außerdem muss die Funktion init_int32 definiert 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

Weitere Neuigkeiten...