Ruby 3.3.0 veröffentlicht

Gepostet von naruse am 25. Dez 2023

Wir freuen uns, die Veröffentlichung von Ruby 3.3.0 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.

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), das die AST als Teil eines Parse-Ergebnisobjekts zurückgibt
      • Prism.parse_comments(source), die die Kommentare zurückgibt
      • Prism.parse_success?(source), das true zurückgibt, wenn keine Fehler vorhanden sind
  • Sie können Pull-Requests oder Issues direkt im Prism-Repository erstellen, wenn Sie am Beitrag interessiert sind
  • Sie können jetzt ruby --parser=prism oder RUBYOPT="--parser=prism" verwenden, um mit dem Prism-Compiler zu experimentieren. Bitte beachten Sie, dass dieses Flag nur zum Debuggen dient.

Verwenden Sie Lrama anstelle von Bison

YJIT

  • Wesentliche Leistungsverbesserungen gegenüber Ruby 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. Ausnahmebehandlungsroutinen werden ebenfalls kompiliert.
    • Nicht unterstützte Aufruftypen und megamorphe Aufrufstellen verlassen den Interpreter nicht mehr.
    • Grundlegende Methoden wie Rails #blank? und spezialisierte #present? werden inline eingebunden.
    • Integer#*, Integer#!=, String#!=, String#getbyte, Kernel#block_given?, Kernel#is_a?, Kernel#instance_of? und Module#=== werden speziell optimiert.
    • Die Kompilierungsgeschwindigkeit ist jetzt etwas schneller als bei Ruby 3.2.
    • Jetzt mehr als 3-mal schneller als der Interpreter bei Optcarrot!
  • Erheblich verbesserter Speicherverbrauch gegenüber Ruby 3.2
    • Metadaten für kompilierten Code verbrauchen deutlich weniger Speicher.
    • --yjit-call-threshold wird automatisch von 30 auf 120 erhöht, wenn die Anwendung mehr als 40.000 ISEQs hat.
    • --yjit-cold-threshold wird hinzugefügt, um das Kompilieren von kalten ISEQs zu überspringen.
    • Kompakterer Code wird auf Arm64 generiert.
  • Code GC ist jetzt standardmäßig deaktiviert
    • --yjit-exec-mem-size wird als harte Grenze behandelt, an der die Kompilierung neuer Codes stoppt.
    • Keine plötzlichen Leistungseinbrüche aufgrund von Code GC. Bessere Copy-on-Write-Verhaltensweise auf Servern, die mit Pitchfork neu gestartet werden.
    • Sie können Code GC immer noch bei Bedarf mit --yjit-code-gc aktivieren
  • Fügt RubyVM::YJIT.enable hinzu, womit YJIT zur Laufzeit aktiviert werden kann
    • Sie können YJIT starten, ohne Kommandozeilenargumente oder Umgebungsvariablen zu ändern. Rails 7.2 wird YJIT auf diese Weise standardmäßig aktivieren.
    • 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.
  • Mehr YJIT-Statistiken sind standardmäßig verfügbar
    • yjit_alloc_size und mehrere weitere Metadaten-bezogene Statistiken sind jetzt standardmäßig verfügbar.
    • 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.
  • Mehr Profiling-Fähigkeiten hinzugefügt
    • Es wird --yjit-perf hinzugefügt, um das Profiling mit Linux perf zu erleichtern.
    • --yjit-trace-exits unterstützt jetzt Sampling mit --yjit-trace-exits-sample-rate=N
  • Umfassendere Tests und mehrere Fehlerbehebungen

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.

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-Haupt-Ractoren immer aktiviert.
    • Die Umgebungsvariable RUBY_MAX_CPU=n legt die maximale Anzahl von N (maximale Anzahl nativer Threads) fest. Der Standardwert ist 8.
      • Da nur ein Ruby-Thread pro Ractor gleichzeitig laufen kann, wird die Anzahl der nativen Threads verwendet, die das kleinere der in RUBY_MAX_CPU angegebenen Anzahl und der Anzahl der laufenden Raktoren ist. Einzel-Ractor-Anwendungen (die meisten Anwendungen) verwenden also nur 1 nativen Thread.
      • Zur Unterstützung blockierender Operationen können mehr als N native Threads verwendet werden.

Leistungsverbesserungen

  • defined?(@ivar) wird mit Objektformen optimiert.
  • Namensauflösung wie Socket.getaddrinfo kann jetzt unterbrochen werden (in Umgebungen, in denen pthreads verfügbar sind). [Feature #19965]
  • Mehrere Leistungsverbesserungen für den Garbage Collector
    • Junge Objekte, auf die von alten Objekten verwiesen wird, werden nicht mehr sofort in die alte Generation verschoben. 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 fehlende Kern-Typen implementiert, insbesondere Time, Enumerator, MatchData, Method, File::Stat, BigDecimal und einige andere. Dies reduziert die Laufzeit von Minor GC-Sammlungen und die Häufigkeit von Major GC-Sammlungen erheblich.
    • Die meisten Kernklassen verwenden jetzt Variable Width Allocation, insbesondere Hash, Time, Thread::Backtrace, Thread::Backtrace::Location, File::Stat, Method. Dies macht die Allokation und Freigabe dieser Klassen schneller, reduziert den Speicherverbrauch und die Heap-Fragmentierung.
    • Unterstützung für schwache Referenzen 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.

Für detailliertere Updates siehe Unveiling the big leap in Ruby 3.3’s IRB.

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]

  • Regexp::new akzeptiert jetzt nur noch bis zu 2 Argumente statt 3. Dies war in Ruby 3.2 veraltet. [Bug #18797]

Entfernte Umgebungsvariablen

Die folgenden veralteten Methoden wurden 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.

Aktualisierungen der Standardbibliothek

RubyGems und Bundler warnen, wenn Benutzer die folgenden Gems requiren, ohne sie zu Gemfile oder gemspec hinzuzufügen. Dies liegt daran, dass sie in zukünftigen Ruby-Versionen zu gebündelten Gems werden.

Diese Warnung wird unterdrückt, wenn Sie die bootsnap-Gem verwenden. Wir empfehlen, Ihre Anwendung mindestens einmal mit der Umgebungsvariable DISABLE_BOOTSNAP=1 auszuführen. Dies ist eine Einschränkung dieser Version.

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

Die folgenden Standard-Gems werden aktualisiert.

  • RubyGems 3.5.3
  • abbrev 0.1.2
  • base64 0.2.0
  • benchmark 0.3.0
  • bigdecimal 3.1.5
  • bundler 2.5.3
  • cgi 0.4.1
  • csv 3.2.8
  • date 3.3.4
  • delegate 0.3.1
  • drb 2.2.0
  • english 0.8.0
  • erb 4.0.3
  • error_highlight 0.6.0
  • etc 1.4.3
  • fcntl 1.1.0
  • fiddle 1.1.2
  • fileutils 1.7.2
  • find 0.2.0
  • getoptlong 0.2.1
  • io-console 0.7.1
  • io-nonblock 0.3.0
  • io-wait 0.3.1
  • ipaddr 1.2.6
  • irb 1.11.0
  • json 2.7.1
  • 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.1
  • open3 0.2.1
  • 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.2
  • rdoc 6.6.2
  • readline 0.0.4
  • reline 0.4.1
  • resolv 0.3.0
  • rinda 0.2.0
  • securerandom 0.3.1
  • set 1.1.0
  • shellwords 0.2.0
  • singleton 0.2.0
  • stringio 3.1.0
  • strscan 3.0.7
  • syntax_suggest 2.0.0
  • syslog 0.1.2
  • tempfile 0.2.1
  • 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-ftp 0.3.3
  • net-imap 0.4.9
  • net-smtp 0.4.0
  • rbs 3.4.0
  • typeprof 0.21.9
  • debug 1.9.1

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 5532 Dateien geändert, 326851 Einfügungen(+), 185793 Löschungen(-) seit Ruby 3.2.0!

Frohe Weihnachten, schöne Feiertage und viel Spaß beim Programmieren mit Ruby 3.3!

Herunterladen

  • https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0.tar.gz

    SIZE: 22065999
    SHA1: 1a7e56851bf29bda1183aca99b3b323c58e0187b
    SHA256: 96518814d9832bece92a85415a819d4893b307db5921ae1f0f751a9a89a56b7d
    SHA512: 26074009b501fc793d71a74e419f34a6033c9353433919ca74ba2d24a3de432dbb11fd92c2bc285f0e4d951a6d6c74bf5b69a2ab36200c8c26e871746d6e0fc6
    
  • https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0.tar.xz

    SIZE: 16345456
    SHA1: c8f68e1b0a114b90460a0b44165a3b2f540fa5b6
    SHA256: 676b65a36e637e90f982b57b059189b3276b9045034dcd186a7e9078847b975b
    SHA512: 7959c5753bfa0bfc4d6d74060869aabbe9815c1c97930659da11b917ee0803ddbbd80e869e00c48b8694b4ba48709c3b6493fd045568e36e902616c35ababf01
    
  • https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0.zip

    SIZE: 26935108
    SHA1: a433eef1d7f96daeaf3b4cb842d0ed2dd82e7dc1
    SHA256: 0e6563f679dd3694732eb3addf9de681c67b584602ac574376b60e7a509d2cd8
    SHA512: a94a85937a14b217c1f4b90d24185289ed4aee79239c4f3eecf8034d3fd34e65ee8d66869473857ed153067188adc9b70c0471e4ebe842c9f98ef60c34090450
    

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