Ruby 3.2.0 Preview 3 veröffentlicht

Gepostet von naruse am 11. Nov 2022

Wir freuen uns, die Veröffentlichung von Ruby 3.2.0-preview3 bekannt zu geben. Ruby 3.2 bringt viele neue Funktionen und Leistungsverbesserungen.

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ärprogramms in Webbrowsern, serverlosen Edge-Umgebungen und anderen WebAssembly/WASI-Einbettungen. Derzeit besteht dieser Port die grundlegenden und Bootstrap-Test-Suiten, 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 seit langem nicht nur für das Web, sondern auch für allgemeine Anwendungen gefragt.

WASI (The WebAssembly System Interface) wurde für solche Anwendungsfälle entwickelt. Obwohl solche Anwendungen mit Betriebssystemen kommunizieren müssen, läuft WebAssembly in einer virtuellen Maschine ohne Systemoberfläche. WASI standardisiert dies.

WebAssembly/WASI-Unterstützung in Ruby beabsichtigt, diese Projekte zu nutzen. Sie ermöglicht es Ruby-Entwicklern, Anwendungen zu schreiben, die auf einer solchen vielversprechenden Plattform laufen.

Anwendungsfall

Diese Unterstützung ermutigt Entwickler, CRuby in der WebAssembly-Umgebung zu nutzen. Ein Anwendungsbeispiel dafür ist die CRuby-Unterstützung des TryRuby-Playgrounds. Jetzt können Sie original CRuby in Ihrem Webbrowser ausprobieren.

Technische Punkte

Das heutige WASI und WebAssembly selbst haben einige fehlende Funktionen zur Implementierung von Fiber, Exception und GC, da sie sich noch weiterentwickeln und auch aus Sicherheitsgründen. Daher schließt CRuby diese Lücke durch die Verwendung von Asyncify, einer binären Transformationstechnik zur Steuerung der Ausführung im Userland.

Darüber hinaus haben wir ein VFS auf Basis von WASI erstellt, damit wir Ruby-Apps einfach in eine einzige .wasm-Datei packen können. Das erleichtert die Verteilung von Ruby-Apps.

Regexp-Verbesserungen gegen ReDoS

Es ist bekannt, dass Regexp-Abgleich unerwartet lange dauern kann. Wenn Ihr Code versucht, einen möglicherweise ineffizienten Regexp gegen eine nicht vertrauenswürdige Eingabe abzugleichen, kann ein Angreifer dies für eine effiziente Denial-of-Service-Attacke (sogenannter Regular Expression DoS oder ReDoS) ausnutzen.

Wir haben zwei Verbesserungen eingeführt, die ReDoS erheblich abmildern.

Verbesserter Regexp-Abgleichalgorithmus

Seit Ruby 3.2 wurde der Abgleichalgorithmus von Regexp durch die Verwendung von Memoization-Techniken erheblich verbessert.

# This matching takes 10 sec. in Ruby 3.1, and does 0.003 sec. in Ruby 3.2

/^a*b?a*$/ =~ "a" * 50000 + "x"

Der verbesserte Abgleichalgorithmus ermöglicht es, die meisten Regexp-Abgleiche (etwa 90 % in unseren Experimenten) in linearer Zeit abzuschließen.

(Für Preview-Benutzer: Diese Optimierung kann für jeden Abgleich Arbeitsspeicher proportional zur Eingabelänge verbrauchen. Wir erwarten keine praktischen Probleme, da diese Speicherzuweisung normalerweise verzögert wird und ein normaler Regexp-Abgleich höchstens das 10-fache der Arbeitsspeichergröße der Eingabelänge verbraucht. Wenn Ihnen bei der Abgleichung von Regexps in einer realen Anwendung der Arbeitsspeicher 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ückreferenzen oder Look-around) enthalten, oder mit einer riesigen festen Anzahl von Wiederholungen. Als Fallback-Maßnahme wurde auch ein Timeout-Feature für Regexp-Abgleiche 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 Timeout-Einstellungen für einige spezielle Regexps verwenden möchten, können Sie 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

Keine Bündelung von Drittanbieterquellen mehr

  • Wir bündeln keine Drittanbieterquellen mehr wie libyaml, libffi.

    • Die libyaml-Quelltexte wurden aus psych entfernt. Möglicherweise müssen Sie libyaml-dev auf Ubuntu/Debian-Plattformen installieren. Der Paketname ist auf jeder Plattform unterschiedlich.

    • Die gebündelten libffi-Quelltexte wurden ebenfalls aus fiddle entfernt.

Sprache

  • Anonyme Rest- und Keyword-Rest-Argumente 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 nicht mehr automatisch gesplittet. [Bug #18633]

    proc{|a, **k| a}.call([1, 2])
    # Ruby 3.1 and before
    # => 1
    # Ruby 3.2 and after
    # => [1, 2]
    
  • Die Auswertungsreihenfolge der Konstantenbelegung für explizit auf Objekten gesetzte Konstanten wurde mit der Auswertungsreihenfolge der einzelnen Attributbelegung konsistent gemacht. Mit diesem Code

      foo::BAR = baz
    

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

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

    Die folgende Auswertungsreihenfolge wird nun 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) annehmen und Schlüsselwortargumente über foo(*args) delegieren möchten, müssen jetzt mit ruby2_keywords gekennzeichnet sein (falls noch nicht geschehen). Mit anderen Worten, alle Methoden, die Schlüsselwortargumente über *args delegieren möchten, müssen nun ausnahmslos mit ruby2_keywords gekennzeichnet sein. Dies erleichtert die Umstellung auf andere Delegationsmethoden, sobald eine Bibliothek Ruby 3+ erfordern kann. Zuvor wurde das Flag ruby2_keywords beibehalten, wenn die empfangende Methode *args annahm, dies war jedoch ein Fehler und eine Inkonsistenz. Eine gute Technik, um möglicherweise fehlendes ruby2_keywords zu finden, ist, die Testsuite auszuführen, bei Fehlern die letzte Methode zu finden, die Schlüsselwortargumente empfangen muss, dort puts nil, caller, nil aufzurufen und jede Methode/jeden Block in der Aufrufkette, der Schlüsselwörter delegieren muss, korrekt als ruby2_keywords gekennzeichnet zu überprüfen. [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

  • Unterstützung für arm64 / aarch64 auf UNIX-Plattformen.
  • Das Erstellen von YJIT erfordert Rust 1.58.1+. [Feature #18481]

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 die Standardprozedur 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
    • Hinzufügen der Option error_tolerant für parse, parse_file und of. [Feature #19013]
  • Set
    • Set ist jetzt als integrierte Klasse verfügbar, ohne dass require "set" erforderlich ist. [Feature #16989] Es wird derzeit über die Konstante Set oder einen Aufruf von Enumerable#to_set automatisch geladen.
  • String
    • String#byteindex und String#byterindex wurden hinzugefügt. [Feature #13110]
    • Unicode auf Version 14.0.0 und Emoji auf Version 14.0 aktualisiert. [Feature #18037] (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

  • Psych bündelt keine libyaml-Quelltexte mehr. Benutzer müssen die libyaml-Bibliothek selbst über das Paketverwaltungssystem installieren. [Feature #18571]

C-API-Aktualisierungen

Aktualisierte C-APIs

Die folgenden APIs wurden aktualisiert.

  • PRNG-Update rb_random_interface_t aktualisiert und versioniert. Erweiterungsbibliotheken, die diese Schnittstelle verwenden und für ältere Versionen erstellt wurden. Auch die Funktion init_int32 muss definiert werden.

Entfernte C-APIs

Die folgenden veralteten APIs wurden entfernt.

  • Variable rb_cData.
  • „Taintedness“- und „Trustedness“-Funktionen. [Feature #16131]

Aktualisierungen der Standardbibliotheken

  • SyntaxSuggest

    • Die Funktion syntax_suggest, früher dead_end, wurde in Ruby integriert. [Feature #18159]
  • ErrorHighlight

    • Jetzt werden Argumente von TypeError und ArgumentError hervorgehoben.
test.rb:2:in `+': nil can't be coerced into Integer (TypeError)

sum = ary[0] + ary[1]
               ^^^^^^
  • Die folgenden Standard-Gems werden aktualisiert.
    • RubyGems 3.4.0.dev
    • bigdecimal 3.1.2
    • bundler 2.4.0.dev
    • cgi 0.3.2
    • date 3.2.3
    • error_highlight 0.4.0
    • etc 1.4.0
    • io-console 0.5.11
    • io-nonblock 0.1.1
    • io-wait 0.3.0.pre
    • ipaddr 1.2.4
    • json 2.6.2
    • logger 1.5.1
    • net-http 0.2.2
    • net-protocol 0.1.3
    • ostruct 0.5.5
    • psych 5.0.0.dev
    • reline 0.3.1
    • securerandom 0.2.0
    • set 1.0.3
    • stringio 3.0.3
    • syntax_suggest 0.0.1
    • timeout 0.3.0
  • Die folgenden gebündelten Gems werden aktualisiert.
    • minitest 5.16.3
    • net-imap 0.2.3
    • rbs 2.6.0
    • typeprof 0.21.3
    • debug 1.6.2
  • Die folgenden Standard-Gems sind nun gebündelte Gems.

Weitere Details finden Sie in NEWS oder den Commit-Logs.

Mit diesen Änderungen wurden seit Ruby 3.1.0 2719 Dateien geändert, 191269 Einfügungen(+), 120315 Löschungen(-)!

Herunterladen

  • https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-preview3.tar.gz

    SIZE: 20086542
    SHA1: dafca8116d36ceaa32482ab38359768de8c3ae5e
    SHA256: c041d1488e62730d3a10dbe7cf7a3b3e4268dc867ec20ec991e7d16146640487
    SHA512: 860634d95e4b9c48f18d38146dfbdc3c389666d45454248a4ccdfc3a5d3cd0c71c73533aabf359558117de9add1472af228d8eaec989c9336b1a3a6f03f1ae88
    
  • https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-preview3.tar.xz

    SIZE: 14799804
    SHA1: c94e2add05502cb5c39afffc995b7c8f000f7df0
    SHA256: d3f5619de544240d92a5d03aa289e71bd1103379622c523a0e80ed029a74b3bb
    SHA512: c1864e2e07c3711eaa17d0f85dfbcc6e0682b077782bb1c155315af45139ae66dc4567c73682d326975b0f472111eb0a70f949811cb54bed0b3a816ed6ac34df
    
  • https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-preview3.zip

    SIZE: 24426893
    SHA1: 346c051c4be7ab8d0b551fd2ff8169785697db62
    SHA256: cf49aa70e7ebd8abebffd5e49cd3bd92e5b9f3782d587cc7ed88c98dd5f17069
    SHA512: 4f22b5ea91be17ef5f68cf0acb1e3a226dcc549ad71cc9b40e623220087c4065ca9bea942710f668e5c94ca0323da8d2ccd565f95a9085c1a0e38e9c0543b22f
    

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