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ückgibt
      • Prism.dump(source), was den serialisierten AST als String zurückgibt
      • Prism.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

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.enable hinzu, 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-disable kann 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-size wird 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-gc aktivieren
  • 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-perf hinzugefü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=1 aktiviert M:N-Threads im Haupt-Ractor.
      • M:N-Threads sind auf Nicht-Main-Raktoren aktiviert.
    • Die Umgebungsvariable RUBY_MAX_CPU=n legt die maximale Anzahl von N (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_CPU angegebene 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 N native Threads verwendet werden.

Weitere bemerkenswerte neue Funktionen

Sprache

Leistungsverbesserungen

  • defined?(@ivar) wird mit Objektformen optimiert.
  • Namensauflösung wie z.B. Socket.getaddrinfo kann 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_RATIO wurde eingeführt, um die Anzahl der ungeschützten Objekte zu steuern, die eine Major GC-Sammlung auslösen. Der Standardwert ist 0.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, BigDecimal und 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 wie pry-byebug bietet (Doku).
  • Pager-Unterstützung für die Befehle ls, show_source und show_cmds.
  • Genauere und hilfreichere Informationen, die von den Befehlen ls und show_source bereitgestellt 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. it wird 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_SLOTS ist veraltet und hat keine Funktion mehr. Bitte verwenden Sie stattdessen die Umgebungsvariablen RUBY_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 der ext/readline API kompatibel ist. Wir setzen zukünftig auf reline. Wenn Sie ext/readline verwenden müssen, können Sie ext/readline über rubygems.org mit gem install readline-ext installieren.
  • Wir müssen keine Bibliotheken wie libreadline oder libedit mehr 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

Weitere Neuigkeiten...