Ruby 3.3.0-preview3 veröffentlicht

Gepostet von naruse am 12. Nov 2023

Wir freuen uns, die Veröffentlichung von Ruby 3.3.0-preview3 bekannt zu geben. Ruby 3.3 fügt einen neuen Parser namens Prism hinzu, verwendet Lrama als Parsergenerator, fügt einen neuen reinen Ruby JIT-Compiler namens RJIT hinzu und 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), die die AST als Teil eines ParseResult zurückgibt
      • Prism.dump(source), die die serialisierte 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 verlassen den Interpreter nicht mehr mit megamorphen Objektformen.
    • 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!
  • Signifikant verbesserter Speicherverbrauch gegenüber 3.2
    • Metadaten für kompilierten Code verbrauchen deutlich weniger Speicher.
    • Generiert kompakteren Code auf ARM64
  • Die Kompilierungsgeschwindigkeit ist jetzt etwas schneller als 3.2.
  • Fügt RubyVM::YJIT.enable hinzu, womit YJIT zur Laufzeit aktiviert werden kann
    • Sie können YJIT starten, ohne Befehlszeilenargumente 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.
  • Option zum Deaktivieren von Code-GC und zur Behandlung von --yjit-exec-mem-size als harte Grenze
    • Kann besseres Copy-on-Write-Verhalten auf Servern mit Unicorn und Forking erzeugen
  • 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 in Nicht-Haupt-Raktoren 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 ausgeführt werden kann, wird die Anzahl der nativen Threads verwendet, die das Minimum der in RUBY_MAX_CPU angegebenen Zahl und der Anzahl der laufenden Raktoren ist. 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ösungen wie Socket.getaddrinfo können jetzt unterbrochen werden (in Umgebungen, in denen pthreads verfügbar sind). Feature #19965
    • Zu diesem Zweck wird jedes Mal ein pthread erstellt, wenn getaddrinfo oder getnameinfo aufgerufen wird. Dies verursacht einen gewissen Overhead bei der Namensauflösung (ungefähr 2,5x in unseren Experimenten). Wir erwarten nicht, dass der Overhead der Namensauflösung für die meisten Anwendungen ein Problem darstellt, aber wenn Sie solche Probleme beobachten oder unerwartete Auswirkungen sehen, die Ihrer Meinung nach auf diese Änderung zurückzuführen sind, melden Sie diese bitte.
  • Die Umgebungsvariable RUBY_GC_HEAP_REMEMBERED_WB_UNPROTECTED_OBJECTS_LIMIT_RATIO wurde hinzugefügt. Feature #19571
  • Kinder alter Objekte werden im Garbage Collector nicht mehr sofort in die alte Generation befördert. Feature #19678
  • Unterstützung für schwache Referenzen wurde dem 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.

Entfernte Konstanten

Die folgenden veralteten Konstanten wurden entfernt.

Entfernte Methoden

Die folgenden veralteten Methoden wurden entfernt.

Entfernte Umgebungsvariablen

Die folgenden veralteten Umgebungsvariablen wurden entfernt.

  • Die Umgebungsvariable RUBY_GC_HEAP_INIT_SLOTS wurde als veraltet markiert und ist eine No-Op. 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 5207 Dateien geändert, 284820 Einfügungen(+), 174773 Löschungen(-) seit Ruby 3.2.0!

Herunterladen

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

    SIZE: 21550473
    SHA1: 2811f191d66dffee0206771873bd990857ae4ed6
    SHA256: 0969141be92e67e0edb84a8fb354acc98f01bd78e602a23a0f136045c82f4809
    SHA512: 94db07a6958c09809b2e5b597fa55a121074e8bacb3bf588c83cf0d35b07a8b070172035a49d1abf0d8ee364a9ace824f34e677f7327ffe1acdbab0938ac49c4
    
  • https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0-preview3.tar.xz

    SIZE: 15970144
    SHA1: 496600612605f8ebeb955255e98bac73a4cbc045
    SHA256: f79afcf122dc7d04fe26cfa4436b9c488b21766fc54b0d2dfb2ba41cd0cdd355
    SHA512: d7ab0d703e7884efd31045933409cd68fac1d9941963537ccc8e309ca7c8bee8500a68182135acba22cbdbf4a8ae99f39bf7f0925273eb4fbc3728c0c1ba0c19
    
  • https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0-preview3.zip

    SIZE: 26618303
    SHA1: 6a13e08c7e484d42037c1e2c87c5d0e220f893a0
    SHA256: c35bf637a647c2f60148368ffb374db5c258570911794f46b6dfdb98ebfe95d9
    SHA512: c4ef2cdcdadeb85ad1d42aedc97f9f3d609b3b01eea2319451cf92c81bd31ae8129b7c91fc68571469dd888c01ea0f48f73234b965db17f6a87404ca382f7794
    

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