6 Punkte von GN⁺ 2025-12-26 | Noch keine Kommentare. | Auf WhatsApp teilen
  • Ruby 4.0.0 wurde veröffentlicht und führt die neue Ruby Box sowie ZJIT ein; außerdem enthält die Version zahlreiche Leistungs- und Sprachverbesserungen
  • Ruby Box ist eine experimentelle Funktion, mit der sich Klassen, Module, globale Variablen sowie Definitionen nativer/Ruby-Bibliotheken isoliert ausführen lassen
  • ZJIT ist ein JIT-Compiler der nächsten Generation auf Rust-Basis, der strukturell besser erweiterbar ist als YJIT und externe Beiträge erleichtert
  • Das parallele Ausführungsmodell Ractor wurde bei Stabilität und Performance verbessert und soll künftig den experimentellen Status verlieren
  • Updates für Kernklassen, Standardbibliothek, C API, GC und JIT stärken insgesamt Performance und Skalierbarkeit des Ruby-Ökosystems

Überblick über Ruby 4.0

  • Ruby 4.0.0 ist ein großes Update mit Schwerpunkt auf Ruby Box und ZJIT
  • Enthält Verbesserungen in vielen Bereichen wie parallele Ausführung, Sprachsyntax, Standardbibliothek, GC und JIT
  • Der Download wird in den Formaten .tar.gz, .tar.xz und .zip angeboten

Ruby Box

  • Ruby Box ist eine experimentelle Funktion, die Isolation von Definitionen bereitstellt
    • Wird durch Setzen der Umgebungsvariable RUBY_BOX=1 aktiviert; die Klasse ist Ruby::Box
    • Innerhalb einer Box geladene Definitionen sind nach außen isoliert, sodass Monkey Patches, globale/Klassenvariablen, Klassen-/Moduldefinitionen und Bibliotheksänderungen keine anderen Boxen beeinflussen
  • Wichtige Anwendungsbeispiele
    • Isolierte Ausführung zwischen Testfällen
    • Paralleler Betrieb von Web-Apps für Blue-Green-Deployments
    • Parallele Ausführung zur Validierung von Dependency-Updates
    • Soll künftig als Basis-API für die Implementierung einer höherstufigen „Package API“ dienen

ZJIT

  • ZJIT ist ein neuer JIT-Compiler, entwickelt als nächste Generation von YJIT
    • Erfordert Rust 1.85.0 oder höher und wird mit der Option --zjit aktiviert
    • Unterstützt größere Kompilierungseinheiten auf Basis von SSA IR und besitzt eine Struktur, die externe Beiträge fördert
  • Derzeit schneller als der Interpreter, aber langsamer als YJIT
    • Der Einsatz in Produktion wird nicht empfohlen; für Ruby 4.1 sind Performance-Verbesserungen geplant

Ractor-Verbesserungen

  • Hinzufügung der Klasse Ractor::Port zur Lösung von Problemen beim Senden und Empfangen von Nachrichten
  • Mit Ractor.shareable_proc lassen sich Proc-Objekte einfacher zwischen Ractors teilen
  • Verbesserte interne Datenstrukturen reduzieren Contention beim globalen Lock und erhöhen die Parallelität
  • Der experimentelle Status von Ractor soll im nächsten Jahr aufgehoben werden

Sprachänderungen

  • *nil ruft nicht länger nil.to_a auf (gleiches Verhalten wie **nil)
  • Logische Operatoren (||, &&, and, or) unterstützen die Syntax für Zeilenfortsetzung (dot chaining)
  • Verbessert Lesbarkeit und Konsistenz des Codes

Updates der Kernklassen

  • Array: Array#rfind und Array#find hinzugefügt für effizientere Suche
  • Binding: Ausschluss nummerierter Parameter und Hinzufügung von Methoden zu implicit_parameters
  • Enumerator: Keyword-Argument size: zu produce hinzugefügt
  • ErrorHighlight: Bei ArgumentError werden Code-Snippets des Aufrufers und der Definition angezeigt
  • Fiber/Fiber::Scheduler: Ergänzungen wie raise(cause:), fiber_interrupt, yield
  • File: Unterstützung für File::Stat#birthtime unter Linux
  • IO: Float::INFINITY als Timeout erlaubt, pipe-basierte Prozesserzeugung entfernt
  • Kernel: #inspect kann angepasst werden, pipe-Erzeugung in Kernel#open entfernt
  • Math: log1p, expm1 hinzugefügt
  • Pathname: Vom Default-Gem zur Core-Klasse befördert
  • Proc: Ausgabeformat anonymer Parameter vereinheitlicht
  • Ractor: Kommunikationsstruktur auf Basis von Ractor::Port, Ractor.yield usw. entfernt
  • Set: Zur Core-Klasse befördert, inspect-Format vereinfacht
  • Socket: Argument open_timeout hinzugefügt, Timeout-Ausnahmen vereinheitlicht
  • String: Unicode 17.0.0 und Emoji 17.0 unterstützt, Methoden der strip-Familie erweitert
  • Thread: Unterstützung für das Argument raise(cause:)

Updates der Standardbibliothek (Stdlib)

  • Zu Default-Gems befördert: ostruct, pstore, benchmark, logger, rdoc, win32ole, irb, reline, fiddle usw.
  • Neues Default-Gem: win32-registry 0.1.2
  • Aktualisierte Default-Gems: RubyGems 4.0.3, bundler 4.0.3, openssl 4.0.0, json 2.18.0 usw.
  • Aktualisierte gebündelte Gems: minitest 6.0.0, rake 13.3.1, rbs 3.10.0, debug 1.11.1 usw.
  • RubyGems/Bundler 4 enthalten

Plattformunterstützung

  • Windows: Unterstützung für Versionen unter MSVC 14.0 eingestellt (Visual Studio 2015 oder neuer erforderlich)

Kompatibilitätsänderungen

  • Ractor.yield, Ractor#take, Ractor#close_incoming, Ractor#close_outgoing entfernt
  • ObjectSpace._id2ref veraltet
  • Process::Status#&, #>> entfernt
  • Ausgabe interner Frames (Backtrace) vereinfacht
  • Im Backtrace von ArgumentError wird jetzt der Name der Empfängerklasse/des Empfängermoduls angezeigt

Kompatibilität der Standardbibliothek

  • CGI-Bibliothek entfernt, nur cgi/escape bleibt erhalten
  • Durch die Beförderung von Set zur Core-Klasse erfordert SortedSet die Installation eines separaten Gems
  • Automatisches Setzen des Headers Content-Type in Net::HTTP entfernt

Updates der C API

  • rb_thread_fd_close deaktiviert; Verwendung von rb_io_close empfohlen
  • rb_thread_call_with_gvl funktioniert unabhängig davon, ob GVL vorhanden ist
  • C API für Set hinzugefügt (rb_set_new, rb_set_add, rb_set_delete usw.)

Implementierungs- und Performance-Verbesserungen

  • Schnellere Aufrufe von Class#new, besonders bei Verwendung von Keyword-Argumenten
  • Unabhängiges Wachstum von GC-Heap-Pools reduziert den Speicherverbrauch
  • Schnellere Bereinigung großer Objekte
  • Optimierungen bei der Berechnung von object_id, hash und beim Zugriff auf Instanzvariablen
  • Ractor-Performance verbessert
    • Lock-freie Hash-Struktur, geringere Cache-Contention, optimierte Objektallokation
    • Fehler bei Deadlocks, Encoding und GC behoben

JIT-bezogen

  • ZJIT: Methodenbasierter JIT, erfordert Rust 1.85.0 oder höher, aktivierbar mit --zjit oder RubyVM::ZJIT.enable
  • YJIT: Statistikoptionen geändert, mem_size: und call_threshold: hinzugefügt
  • RJIT: --rjit entfernt, in ein separates Repository verlagert

Umfang der Änderungen

  • Gegenüber Ruby 3.4.0 wurden 3.889 Dateien geändert, 230.769 Zeilen hinzugefügt und 297.003 Zeilen gelöscht
  • Ruby 4.0 ist ein Major Release, das Performance, Parallelität und sprachliche Konsistenz deutlich stärkt

Download

  • Verfügbar als ruby-4.0.0.tar.gz, ruby-4.0.0.tar.xz, ruby-4.0.0.zip
  • Für jede Datei sind die SHA1-, SHA256- und SHA512-Hashwerte angegeben

Einführung in Ruby

  • Ruby ist eine Open-Source-Sprache, die 1993 von Yukihiro Matsumoto (Matz) entwickelt wurde
  • Sie läuft auf vielen Plattformen und wird besonders im Bereich Webentwicklung weltweit eingesetzt

Noch keine Kommentare.

Noch keine Kommentare.