Ruby 4.0.0
(ruby-lang.org)- 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.xzund.zipangeboten
Ruby Box
- Ruby Box ist eine experimentelle Funktion, die Isolation von Definitionen bereitstellt
- Wird durch Setzen der Umgebungsvariable
RUBY_BOX=1aktiviert; die Klasse istRuby::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
- Wird durch Setzen der Umgebungsvariable
- 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
--zjitaktiviert - Unterstützt größere Kompilierungseinheiten auf Basis von SSA IR und besitzt eine Struktur, die externe Beiträge fördert
- Erfordert Rust 1.85.0 oder höher und wird mit der Option
- 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_proclassen 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
*nilruft nicht längernil.to_aauf (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#rfindundArray#findhinzugefügt für effizientere Suche - Binding: Ausschluss nummerierter Parameter und Hinzufügung von Methoden zu
implicit_parameters - Enumerator: Keyword-Argument
size:zuproducehinzugefügt - ErrorHighlight: Bei
ArgumentErrorwerden 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#birthtimeunter Linux - IO:
Float::INFINITYals Timeout erlaubt, pipe-basierte Prozesserzeugung entfernt - Kernel:
#inspectkann angepasst werden, pipe-Erzeugung inKernel#openentfernt - Math:
log1p,expm1hinzugefügt - Pathname: Vom Default-Gem zur Core-Klasse befördert
- Proc: Ausgabeformat anonymer Parameter vereinheitlicht
- Ractor: Kommunikationsstruktur auf Basis von
Ractor::Port,Ractor.yieldusw. entfernt - Set: Zur Core-Klasse befördert,
inspect-Format vereinfacht - Socket: Argument
open_timeouthinzugefü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,fiddleusw. - 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.0usw. - Aktualisierte gebündelte Gems:
minitest 6.0.0,rake 13.3.1,rbs 3.10.0,debug 1.11.1usw. - 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_outgoingentferntObjectSpace._id2refveraltetProcess::Status#&,#>>entfernt- Ausgabe interner Frames (Backtrace) vereinfacht
- Im Backtrace von
ArgumentErrorwird jetzt der Name der Empfängerklasse/des Empfängermoduls angezeigt
Kompatibilität der Standardbibliothek
- CGI-Bibliothek entfernt, nur
cgi/escapebleibt erhalten - Durch die Beförderung von
Setzur Core-Klasse erfordertSortedSetdie Installation eines separaten Gems - Automatisches Setzen des Headers
Content-TypeinNet::HTTPentfernt
Updates der C API
rb_thread_fd_closedeaktiviert; Verwendung vonrb_io_closeempfohlenrb_thread_call_with_gvlfunktioniert unabhängig davon, ob GVL vorhanden ist- C API für Set hinzugefügt (
rb_set_new,rb_set_add,rb_set_deleteusw.)
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,hashund 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
--zjitoderRubyVM::ZJIT.enable - YJIT: Statistikoptionen geändert,
mem_size:undcall_threshold:hinzugefügt - RJIT:
--rjitentfernt, 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
1 Kommentare
Hacker-News-Kommentare
Alles Gute zum Geburtstag, Ruby!
Oft heißt es, die Leute seien gegangen, weil Ruby kein Typing habe, aber inzwischen etabliert sich RBS als Standard. Sorbet unterstützt es ebenfalls, und es gibt nun auch eine Inline-Notation, mit der man Typen direkt neben den Code schreiben kann.
Auch die Aussage „Ruby hat schwaches LSP“ ist inzwischen überholt. ruby-lsp ist zum Standard geworden und unterstützt auch „go to definition“. Dank der Plugin-Architektur können mehrere Tools denselben AST wiederverwenden.
Auch die Parallelität hat sich dank Ractor stark verbessert, und wenn jetzt nur noch der GC etwas weiter verfeinert wird, dürfte es die reine Experimentierphase vollständig hinter sich lassen.
Es gibt auch neue Features wie ZJIT oder Box, aber für den produktiven Einsatz werden sie noch nicht empfohlen. Trotzdem wird es stetig besser.
Ich finde es auch gut, dass sich die Syntax nicht abrupt verändert
Zu Weihnachten muss es immer eine neue Ruby-Version geben.
Diesmal finde ich ruby::box interessant. Es ermöglicht, Feature-Rollouts über zwei Versionen gleichzeitig laufen zu lassen.
Und dass man jetzt
if condition1 && condition2über mehrere Zeilen schreiben kann, ist auch ziemlich coolif condition1 && condition2schon seit Langem über mehrere Zeilen geschrieben, und es hat problemlos funktioniert. Ich weiß nicht, was an der neuen Syntax anders sein sollIch freue mich über Ruby 4.0, aber 2025 bin ich komplett zu Python gewechselt.
Claude Code hat mein Ruby-Projekt zu 100 % automatisch nach Python konvertiert, und seitdem gibt es für mich keinen Grund mehr, Ruby zu nutzen.
Ich habe Ruby über zehn Jahre geliebt und sogar Bücher darüber geschrieben, aber jetzt hat Python dank Ökosystemen wie fastapi, pytorch, langchain und streamlit gewonnen. Trotzdem halte ich Rubys Syntax immer noch für die schönste
Zu Weihnachten darf eine neue Ruby-Version natürlich nicht fehlen. Danke an Matz und das Team
Gibt es aktuelle Materialien, die man jemandem empfehlen kann, der 2025~26 Ruby lernen möchte? Neben der offiziellen Dokumentation würden mich gute Bücher interessieren
Pragmatic Studio Ruby on Rails Kurs
Ruby ist wirklich eine erstaunliche Sprache. Kürzlich habe ich eine Schicht über Rails gebaut, die aus nur einer Markdown-Datei eine API erzeugt, und in Python wäre dasselbe viel komplizierter gewesen. In JavaScript wäre es noch schlimmer gewesen. Rubys Metaprogrammierungsfähigkeiten sind wirklich einzigartig
Ich freue mich, dass die internen Stack Traces aufgeräumt wurden. Irgendwann wäre Unterstützung für relative Pfade schön. Und es ist auch gut, dass Set endlich ordentlich behandelt wird
Ich arbeite jetzt in einem Unternehmen, das Ruby nicht nutzt, aber ich liebe Ruby immer noch sehr. Danke für dieses Release, und ich hoffe, dass ich wieder eine Gelegenheit bekomme, damit zu arbeiten
Ich habe früher gehört, dass die Funktion Ruby::Box (Namespace) zu einem erheblichen Performance-Einbruch führt. Ich frage mich, ob das diesmal verbessert wurde
Ich würde gern wissen, ob sich das Tooling verbessert hat. Ich habe LSP unter Windows bisher noch nie richtig zum Laufen bekommen