6 Punkte von GN⁺ 2025-12-26 | 1 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

1 Kommentare

 
GN⁺ 2025-12-26
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

    • Ich bin ein ziemlich Hardcore-Rubyist, und ruby-lsp ist wirklich hervorragend. Aber ich würde nicht sagen, dass RBS gerade zum Standard wird. Tatsächlich ist die Akzeptanz sehr gering. rbs-inline ist eher auf dem Niveau eines persönlichen Projekts und es gibt wenig Aktivität. Dass der Entwickler versucht, es direkt in RBS zu integrieren, begrüße ich allerdings. Ich persönlich glaube nicht, dass sich ein kommentarbasiertes Typsystem breit durchsetzen wird
    • Ruby ist einfach Python unterlegen. Es gibt ein fast identisches System, das schneller ist und eine größere Community hat, also gibt es keinen besonderen Grund, Ruby zu verwenden
  • 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 cool

    • Irgendwann wäre es schön, wenn jeder Ractor in seiner eigenen ruby::box laufen würde und jede Box ihren GC unabhängig ausführen könnte. Dann wäre echte parallele Ausführung wie bei BEAM möglich. Die p99-Latenz würde wohl auch sinken. Natürlich entstünden beim Teilen von Objekten Kopierkosten, aber für die meisten Apps dürften die gering sein
    • Ich habe if condition1 && condition2 schon seit Langem über mehrere Zeilen geschrieben, und es hat problemlos funktioniert. Ich weiß nicht, was an der neuen Syntax anders sein soll
  • Ich 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

    • Was du erwähnst, sind alles Bibliotheken des Python-Ökosystems und keine Vorteile der Sprache selbst. Viele Entwickler wechseln eher wegen der Bibliotheken zu Python als wegen der Sprache. Dadurch wird Python in viele Richtungen gezogen, und es entsteht zunehmend das Problem, dass die Sprachphilosophie verwässert. Bei Ruby hingegen versammeln sich Menschen, die die Sprache selbst mögen, sodass ihr Wesen gut bewahrt bleibt
    • Ich bin dieses Jahr ebenfalls von Ruby zu Kotlin gewechselt. Das fehlende statische Typing hat bei mir ein zu großes Unsicherheitsgefühl ausgelöst. Kotlin bietet auch gute Performance, und etwas höherer Speicherverbrauch ist heute kein großes Problem mehr. Ich mag Ruby immer noch, nutze es aber nur noch für einfache Skripte
    • Python hat eine deutlich bessere IDE-Unterstützung, und allein deshalb hat sich der Wechsel gelohnt. Rubys übermäßige Dynamik entspricht nicht meinem Geschmack
    • Ich wollte Langchain ausprobieren, aber es verändert sich so schnell, dass die Dokumentation überhaupt nicht hinterherkommt. Wenn man sucht, findet man nur haufenweise Beiträge wie „Warum ist die Langchain-Dokumentation so chaotisch?“. Deshalb bin ich zu Haystack gewechselt und damit viel zufriedener
    • Ich mag pandas, numpy und pytorch ebenfalls, aber ich baue trotzdem gerne Full-Stack-Web-Apps mit Rails. Deshalb liebe ich pyCall wirklich
  • 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

    • Ich habe die Elixir- und Erlang-Kurse von Pragmatic Studio gemacht, und die Qualität war sehr hoch. Dort gibt es auch Ruby- und Rails-Kurse
      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

    • Klingt interessant, könntest du vielleicht ein Beispiel zeigen?
  • 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

    • Relative Pfade in Stack Traces wären wirklich toll
  • 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

    • Meiner Meinung nach ist Programmieren unter Windows selbstverschuldetes Leid. Wenn es keine Microsoft-Sprache ist, sind Linux oder macOS deutlich besser
    • Rubys Developer Experience (DX) bleibt hinter den Erwartungen zurück, und unter Windows ist es besonders schlimm. Zum Glück gab es Ankündigungen, dass man dieses Problem erkannt hat und verbessern will
    • Hast du WSL2 ausprobiert?