Ruby 3.2.0 veröffentlicht

Gepostet von naruse am 25. Dez 2022

Wir freuen uns, die Veröffentlichung von Ruby 3.2.0 bekannt zu geben. Ruby 3.2 bietet viele neue Funktionen und Leistungsverbesserungen.

WASI-basierte WebAssembly-Unterstützung

Dies ist ein erster Port der WASI-basierten WebAssembly-Unterstützung. Dies ermöglicht die Verfügbarkeit eines CRuby-Binärprogramms in einem Webbrowser, einer Serverless Edge-Umgebung oder anderen Arten von WebAssembly/WASI-Embeddern. Derzeit besteht dieser Port die grundlegenden und Bootstrapping-Testsuiten, die die Thread-API nicht verwenden.

Hintergrund

WebAssembly (Wasm) wurde ursprünglich eingeführt, um Programme sicher und schnell in Webbrowsern auszuführen. Sein Ziel – Programme effizient und sicher in verschiedenen Umgebungen auszuführen – wird jedoch seit langem nicht nur für das Web, sondern auch für allgemeine Anwendungen gewünscht.

WASI (The WebAssembly System Interface) wurde für solche Anwendungsfälle entwickelt. Obwohl solche Anwendungen mit Betriebssystemen kommunizieren müssen, läuft WebAssembly in einer virtuellen Maschine ohne Systemoberfläche. WASI standardisiert dies.

Die WebAssembly/WASI-Unterstützung in Ruby zielt darauf ab, diese Projekte zu nutzen. Sie ermöglicht Ruby-Entwicklern, Anwendungen zu schreiben, die auf diesen vielversprechenden Plattformen laufen.

Anwendungsfall

Diese Unterstützung ermutigt Entwickler, CRuby in einer WebAssembly-Umgebung zu nutzen. Ein Beispiel für einen Anwendungsfall ist die CRuby-Unterstützung der TryRuby Playground. Jetzt können Sie originales CRuby in Ihrem Webbrowser ausprobieren.

Technische Punkte

Das heutige WASI und WebAssembly selbst verfügen über einige fehlende Funktionen zur Implementierung von Fiber, Ausnahmen und GC aus Sicherheitsgründen und weil sie sich noch in der Entwicklung befinden. Daher schließt CRuby die Lücke mithilfe von Asyncify, einer Binärtransformationstechnik zur Steuerung der Ausführung im Userland.

Darüber hinaus haben wir ein VFS auf Basis von WASI erstellt, damit wir Ruby-Apps einfach in eine einzige .wasm-Datei packen können. Das erleichtert die Verteilung von Ruby-Apps.

Produktionsbereites YJIT

  • YJIT ist nicht mehr experimentell
    • Wurde über ein Jahr lang in Produktionsumgebungen getestet und hat sich als sehr stabil erwiesen.
  • YJIT unterstützt jetzt sowohl x86-64- als auch arm64/aarch64-CPUs unter Linux, MacOS, BSD und anderen UNIX-Plattformen.
    • Diese Version bringt Unterstützung für Apple M1/M2, AWS Graviton, Raspberry Pi 4 und mehr.
  • Das Bauen von YJIT erfordert jetzt Rust 1.58.0+. [Feature #18481]
    • Um sicherzustellen, dass CRuby mit YJIT kompiliert wird, installieren Sie bitte rustc >= 1.58.0, bevor Sie das Skript ./configure ausführen.
    • Bitte wenden Sie sich an das YJIT-Team, falls Sie auf Probleme stoßen.
  • Die YJIT 3.2-Version ist schneller als 3.1 und hat etwa ein Drittel weniger Speicher-Overhead.
    • Insgesamt ist YJIT 41% schneller (geometrischer Mittelwert) als der Ruby-Interpreter auf yjit-bench.
    • Physischer Speicher für JIT-Code wird verzögert zugewiesen. Im Gegensatz zu Ruby 3.1 wird der RSS eines Ruby-Prozesses minimiert, da virtuelle Speicherseiten, die von --yjit-exec-mem-size zugewiesen werden, erst dann physischen Speicherseiten zugeordnet werden, wenn sie tatsächlich von JIT-Code genutzt werden.
    • Einführung von Code GC, das alle Code-Seiten freigibt, wenn der Speicherverbrauch durch JIT-Code --yjit-exec-mem-size erreicht.
    • RubyVM::YJIT.runtime_stats gibt neben den vorhandenen Schlüsseln inline_code_size und outlined_code_size auch Code-GC-Metriken zurück: code_gc_count, live_page_count, freed_page_count und freed_code_size.
  • Die meisten Statistiken, die von RubyVM::YJIT.runtime_stats erzeugt werden, sind jetzt in Release-Builds verfügbar.
    • Führen Sie einfach Ruby mit --yjit-stats aus, um Statistiken zu berechnen und auszugeben (verursacht etwas Laufzeit-Overhead).
  • YJIT ist jetzt für die Nutzung von Objektschemata optimiert. [Feature #18776]
  • Nutzt feinere konstante Invalidation, um weniger Code zu invalidieren, wenn neue Konstanten definiert werden. [Feature #18589]
  • Der Standardwert für --yjit-exec-mem-size wurde auf 64 (MiB) geändert.
  • Der Standardwert für --yjit-call-threshold wurde auf 30 geändert.

Regexp-Verbesserungen gegen ReDoS

Es ist bekannt, dass Regexp-Abgleiche unerwartet lange dauern können. Wenn Ihr Code versucht, ein möglicherweise ineffizientes Regexp mit einem nicht vertrauenswürdigen Eingabe abzugleichen, kann ein Angreifer dies für eine effiziente Denial of Service (sogenannter Regular Expression DoS oder ReDoS) ausnutzen.

Wir haben zwei Verbesserungen eingeführt, die ReDoS erheblich abmildern.

Verbesserter Regexp-Abgleichalgorithmus

Seit Ruby 3.2 wurde der Abgleichalgorithmus von Regexp durch die Verwendung einer Memoisationstechnik erheblich verbessert.

# This match takes 10 sec. in Ruby 3.1, and 0.003 sec. in Ruby 3.2

/^a*b?a*$/ =~ "a" * 50000 + "x"

Der verbesserte Abgleichalgorithmus ermöglicht, dass die meisten Regexp-Abgleiche (etwa 90 % in unseren Experimenten) in linearer Zeit abgeschlossen werden.

Diese Optimierung kann für jeden Abgleich Speicher proportional zur Eingabelänge verbrauchen. Wir erwarten keine praktischen Probleme, da diese Speicherzuweisung normalerweise verzögert wird und ein normaler Regexp-Abgleich höchstens das 10-fache des Speichers der Eingabelänge verbrauchen sollte. Wenn Ihnen in einer realen Anwendung der Speicher beim Abgleichen von Regexps ausgeht, melden Sie dies bitte.

Der ursprüngliche Vorschlag ist https://bugs.ruby-lang.org/issues/19104

Regexp-Timeout

Die obige Optimierung kann nicht auf einige Arten von regulären Ausdrücken angewendet werden, z. B. solche, die erweiterte Funktionen (z. B. Backreferences oder Lookarounds) enthalten, oder mit einer riesigen festen Anzahl von Wiederholungen. Als Rückfallmaßnahme wurde auch eine Timeout-Funktion für Regexp-Abgleiche eingeführt.

Regexp.timeout = 1.0

/^a*b?a*()\1$/ =~ "a" * 50000 + "x"
#=> Regexp::TimeoutError is raised in one second

Beachten Sie, dass Regexp.timeout eine globale Konfiguration ist. Wenn Sie für einige spezielle Regexps andere Timeout-Einstellungen verwenden möchten, möchten Sie möglicherweise das Schlüsselwort timeout für Regexp.new verwenden.

Regexp.timeout = 1.0

# This regexp has no timeout
long_time_re = Regexp.new('^a*b?a*()\1$', timeout: Float::INFINITY)

long_time_re =~ "a" * 50000 + "x" # never interrupted

Der ursprüngliche Vorschlag ist https://bugs.ruby-lang.org/issues/17837.

Weitere bemerkenswerte neue Funktionen

SyntaxSuggest

  • Die Funktion syntax_suggest (früher dead_end) wurde in Ruby integriert. Dies hilft Ihnen, die Position von Fehlern wie fehlenden oder überflüssigen ends zu finden, um Sie schneller wieder auf den richtigen Weg zu bringen, wie im folgenden Beispiel

    Unmatched `end', missing keyword (`do', `def`, `if`, etc.) ?
    
      1  class Dog
    > 2    defbark
    > 3    end
      4  end
    

    [Feature #18159]

ErrorHighlight

  • Zeigt nun auf die relevanten Argumente für TypeError und ArgumentError
test.rb:2:in `+': nil can't be coerced into Integer (TypeError)

sum = ary[0] + ary[1]
               ^^^^^^

Sprache

  • Anonyme Rest- und Keyword-Rest-Argumente können nun als Argumente übergeben werden, nicht nur in Methodenparametern verwendet werden. [Feature #18351]

      def foo(*)
        bar(*)
      end
      def baz(**)
        quux(**)
      end
    
  • Ein Proc, das ein einzelnes positionsbezogenes Argument und Schlüsselwörter akzeptiert, wird nicht mehr automatisch gesplittet. [Bug #18633]

    proc{|a, **k| a}.call([1, 2])
    # Ruby 3.1 and before
    # => 1
    # Ruby 3.2 and after
    # => [1, 2]
    
  • Die Auswertungsreihenfolge der Konstantenbelegung für explizit auf Objekten gesetzte Konstanten wurde mit der Auswertungsreihenfolge der einzelnen Attributbelegung konsistent gemacht. Mit diesem Code

      foo::BAR = baz
    

    foo wird nun vor baz aufgerufen. Ebenso wird für Mehrfachzuweisungen an Konstanten die Auswertungsreihenfolge von links nach rechts verwendet. Mit diesem Code

        foo1::BAR1, foo2::BAR2 = baz1, baz2
    

    Die folgende Auswertungsreihenfolge wird nun verwendet

    1. foo1
    2. foo2
    3. baz1
    4. baz2

    [Bug #15928]

  • Das Find-Muster ist nicht mehr experimentell. [Feature #18585]

  • Methoden, die einen Restparameter (wie *args) annehmen und Schlüsselwortargumente über foo(*args) delegieren möchten, müssen nun mit ruby2_keywords markiert sein (sofern nicht bereits geschehen). Mit anderen Worten, alle Methoden, die Schlüsselwortargumente über *args delegieren möchten, müssen nun ausnahmslos mit ruby2_keywords markiert sein. Dies erleichtert die Umstellung auf andere Delegationsmethoden, sobald eine Bibliothek Ruby 3+ erfordern kann. Zuvor wurde das Flag ruby2_keywords beibehalten, wenn die empfangende Methode *args verwendete, dies war jedoch ein Fehler und eine Inkonsistenz. Eine gute Technik, um potenziell fehlende ruby2_keywords zu finden, ist die Ausführung der Testsuite, das Auffinden der letzten Methode, die Schlüsselwortargumente für jeden Ort empfangen muss, an dem die Testsuite fehlschlägt, und die Verwendung von puts nil, caller, nil dort. Überprüfen Sie dann, ob jede Methode/jeder Block in der Aufrufkette, der Schlüsselwörter delegieren muss, korrekt mit ruby2_keywords markiert ist. [Bug #18625] [Bug #16466]

      def target(**kw)
      end
    
      # Accidentally worked without ruby2_keywords in Ruby 2.7-3.1, ruby2_keywords
      # needed in 3.2+. Just like (*args, **kwargs) or (...) would be needed on
      # both #foo and #bar when migrating away from ruby2_keywords.
      ruby2_keywords def bar(*args)
        target(*args)
      end
    
      ruby2_keywords def foo(*args)
        bar(*args)
      end
    
      foo(k: 1)
    

Leistungsverbesserungen

MJIT

  • Der MJIT-Compiler wird in Ruby als ruby_vm/mjit/compiler neu implementiert.
  • Der MJIT-Compiler wird in einem geforkten Prozess ausgeführt, anstatt in einem nativen Thread namens MJIT-Worker. [Feature #18968]
    • Daher wird Microsoft Visual Studio (MSWIN) nicht mehr unterstützt.
  • MinGW wird nicht mehr unterstützt. [Feature #18824]
  • Umbenennung von --mjit-min-calls in --mjit-call-threshold.
  • Änderung des Standardwerts für --mjit-max-cache von 10000 auf 100.

PubGrub

  • Bundler 2.4 verwendet nun den PubGrub-Resolver anstelle von Molinillo.

    • PubGrub ist der Lösungsalgorithmus der nächsten Generation, der vom pub-Paketmanager für die Dart-Programmiersprache verwendet wird.
    • Nach dieser Änderung erhalten Sie möglicherweise ein anderes Auflösungsergebnis. Bitte melden Sie solche Fälle an die RubyGems/Bundler Issues.
  • RubyGems verwendet in Ruby 3.2 weiterhin den Molinillo-Resolver. Wir planen, ihn zukünftig durch PubGrub zu ersetzen.

Weitere bemerkenswerte Änderungen seit 3.1

  • Data
    • Neue Kernklasse zur Darstellung einfacher, unveränderlicher Wertobjekte. Die Klasse ähnelt Struct und teilt sich teilweise eine Implementierung, hat aber eine schlankere und strengere API. [Feature #16122]

        Measure = Data.define(:amount, :unit)
        distance = Measure.new(100, 'km')            #=> #<data Measure amount=100, unit="km">
        weight = Measure.new(amount: 50, unit: 'kg') #=> #<data Measure amount=50, unit="kg">
        weight.with(amount: 40)                      #=> #<data Measure amount=40, unit="kg">
        weight.amount                                #=> 50
        weight.amount = 40                           #=> NoMethodError: undefined method `amount='
      
  • Hash
    • Hash#shift gibt nun immer nil zurück, wenn der Hash leer ist, anstatt den Standardwert zurückzugeben oder die Default-Prozedur aufzurufen. [Bug #16908]
  • MatchData
  • Module
  • Proc
    • Proc#dup gibt eine Instanz einer Unterklasse zurück. [Bug #17545]
    • Proc#parameters akzeptiert nun das Lambda-Schlüsselwort. [Feature #15357]
  • Refinement
  • RubyVM::AbstractSyntaxTree
    • Option error_tolerant für parse, parse_file und of hinzugefügt. [Feature #19013] Mit dieser Option
      1. SyntaxError wird unterdrückt
      2. AST wird für ungültige Eingabe zurückgegeben
      3. end wird ergänzt, wenn ein Parser das Ende der Eingabe erreicht, aber end nicht ausreicht
      4. end wird basierend auf der Einrückung als Schlüsselwort behandelt
        # Without error_tolerant option
        root = RubyVM::AbstractSyntaxTree.parse(<<~RUBY)
        def m
          a = 10
          if
        end
        RUBY
        # => <internal:ast>:33:in `parse': syntax error, unexpected `end' (SyntaxError)
      
        # With error_tolerant option
        root = RubyVM::AbstractSyntaxTree.parse(<<~RUBY, error_tolerant: true)
        def m
          a = 10
          if
        end
        RUBY
        p root # => #<RubyVM::AbstractSyntaxTree::Node:SCOPE@1:0-4:3>
      
        # `end` is treated as keyword based on indent
        root = RubyVM::AbstractSyntaxTree.parse(<<~RUBY, error_tolerant: true)
        module Z
          class Foo
            foo.
          end
      
          def bar
          end
        end
        RUBY
        p root.children[-1].children[-1].children[-1].children[-2..-1]
        # => [#<RubyVM::AbstractSyntaxTree::Node:CLASS@2:2-4:5>, #<RubyVM::AbstractSyntaxTree::Node:DEFN@6:2-7:5>]
      
    • Option keep_tokens für parse, parse_file und of hinzugefügt. [Feature #19070]

        root = RubyVM::AbstractSyntaxTree.parse("x = 1 + 2", keep_tokens: true)
        root.tokens # => [[0, :tIDENTIFIER, "x", [1, 0, 1, 1]], [1, :tSP, " ", [1, 1, 1, 2]], ...]
        root.tokens.map{_1[2]}.join # => "x = 1 + 2"
      
  • Set
    • Set ist jetzt als integrierte Klasse verfügbar, ohne dass require "set" erforderlich ist. [Feature #16989] Es wird derzeit über die Konstante Set oder einen Aufruf von Enumerable#to_set automatisch geladen.
  • String
    • String#byteindex und String#byterindex wurden hinzugefügt. [Feature #13110]
    • Unicode auf Version 15.0.0 und Emoji Version 15.0 aktualisiert. [Feature #18639] (gilt auch für Regexp)
    • String#bytesplice wurde hinzugefügt. [Feature #18598]
  • Struct
    • Eine Struct-Klasse kann auch mit Schlüsselwortargumenten initialisiert werden, ohne keyword_init: true bei Struct.new. [Feature #16806]

        Post = Struct.new(:id, :name)
        Post.new(1, "hello") #=> #<struct Post id=1, name="hello">
        # From Ruby 3.2, the following code also works without keyword_init: true.
        Post.new(id: 1, name: "hello") #=> #<struct Post id=1, name="hello">
      

Kompatibilitätsprobleme

Hinweis: Ausgenommen sind Feature-Fehlerbehebungen.

Entfernte Konstanten

Die folgenden veralteten Konstanten wurden entfernt.

Entfernte Methoden

Die folgenden veralteten Methoden wurden entfernt.

Stdlib-Kompatibilitätsprobleme

Keine Bündelung von Drittanbieterquellen mehr

  • Wir bündeln keine Drittanbieterquellen mehr wie libyaml, libffi.

    • Die libyaml-Quelle wurde aus psych entfernt. Möglicherweise müssen Sie libyaml-dev auf Ubuntu/Debian-Plattformen installieren. Der Paketname ist für jede Plattform unterschiedlich.

    • Die gebündelte libffi-Quelle wurde ebenfalls aus fiddle entfernt.

  • Psych und fiddle unterstützten statische Builds mit spezifischen Versionen von libyaml- und libffi-Quellen. Sie können psych mit libyaml-0.2.5 wie folgt erstellen:

      $ ./configure --with-libyaml-source-dir=/path/to/libyaml-0.2.5
    

    Und Sie können fiddle mit libffi-3.4.4 wie folgt erstellen:

      $ ./configure --with-libffi-source-dir=/path/to/libffi-3.4.4
    

    [Feature #18571]

C-API-Aktualisierungen

Aktualisierte C-APIs

Die folgenden APIs wurden aktualisiert.

  • PRNG-Update
    • rb_random_interface_t wurde aktualisiert und versioniert. Erweiterungsbibliotheken, die diese Schnittstelle verwenden und für ältere Versionen erstellt wurden. Außerdem muss die Funktion init_int32 definiert werden.

Entfernte C-APIs

Die folgenden veralteten APIs wurden entfernt.

  • Variable rb_cData.
  • „Taintedness“- und „Trustedness“-Funktionen. [Feature #16131]

Aktualisierungen der Standardbibliothek

  • Bundler

    • Hinzufügen der Unterstützung für –ext=rust zum Bündeln von Gems für die Erstellung einfacher Gems mit Rust-Erweiterungen. [GH-rubygems-6149]
    • Schnelleres Klonen von Git-Repos. [GH-rubygems-4475]
  • RubyGems

    • Hinzufügen der mswin-Unterstützung für den Cargo-Builder. [GH-rubygems-6167]
  • ERB

    • ERB::Util.html_escape ist schneller als CGI.escapeHTML.
      • Es wird kein String-Objekt mehr zugewiesen, wenn keine Zeichen escaped werden müssen.
      • Der Aufruf von #to_s wird übersprungen, wenn ein Argument bereits ein String ist.
      • ERB::Escape.html_escape wurde als Alias für ERB::Util.html_escape hinzugefügt, das nicht von Rails monkey-patched wurde.
  • IRB

    • Befehle zur Integration von debug.gem wurden hinzugefügt: debug, break, catch, next, delete, step, continue, finish, backtrace, info
    • Es wurden weitere Pry-ähnliche Befehle und Funktionen hinzugefügt.
      • edit und show_cmds (wie Pry's help) wurden hinzugefügt.
      • ls nimmt die Option -g oder -G entgegen, um Ausgaben zu filtern.
      • show_source ist ein Alias von $ und akzeptiert unquotierte Eingaben.
      • whereami ist ein Alias von @.
  • Die folgenden Standard-Gems werden aktualisiert.

    • RubyGems 3.4.1
    • abbrev 0.1.1
    • benchmark 0.2.1
    • bigdecimal 3.1.3
    • bundler 2.4.1
    • cgi 0.3.6
    • csv 3.2.6
    • date 3.3.3
    • delegate 0.3.0
    • did_you_mean 1.6.3
    • digest 3.1.1
    • drb 2.1.1
    • english 0.7.2
    • erb 4.0.2
    • error_highlight 0.5.1
    • etc 1.4.2
    • fcntl 1.0.2
    • fiddle 1.1.1
    • fileutils 1.7.0
    • forwardable 1.3.3
    • getoptlong 0.2.0
    • io-console 0.6.0
    • io-nonblock 0.2.0
    • io-wait 0.3.0
    • ipaddr 1.2.5
    • irb 1.6.2
    • json 2.6.3
    • logger 1.5.3
    • mutex_m 0.1.2
    • net-http 0.3.2
    • net-protocol 0.2.1
    • nkf 0.1.2
    • open-uri 0.3.0
    • open3 0.1.2
    • openssl 3.1.0
    • optparse 0.3.1
    • ostruct 0.5.5
    • pathname 0.2.1
    • pp 0.4.0
    • pstore 0.1.2
    • psych 5.0.1
    • racc 1.6.2
    • rdoc 6.5.0
    • readline-ext 0.1.5
    • reline 0.3.2
    • resolv 0.2.2
    • resolv-replace 0.1.1
    • securerandom 0.2.2
    • set 1.0.3
    • stringio 3.0.4
    • strscan 3.0.5
    • syntax_suggest 1.0.2
    • syslog 0.1.1
    • tempfile 0.1.3
    • time 0.2.1
    • timeout 0.3.1
    • tmpdir 0.1.3
    • tsort 0.1.1
    • un 0.2.1
    • uri 0.12.0
    • weakref 0.1.2
    • win32ole 1.8.9
    • yaml 0.2.1
    • zlib 3.0.0
  • Die folgenden gebündelten Gems werden aktualisiert.

    • minitest 5.16.3
    • power_assert 2.0.3
    • test-unit 3.5.7
    • net-ftp 0.2.0
    • net-imap 0.3.3
    • net-pop 0.1.2
    • net-smtp 0.3.3
    • rbs 2.8.2
    • typeprof 0.21.3
    • debug 1.7.1

Siehe GitHub-Releases wie GitHub Releases von logger oder das Changelog für Details zu den Standard- oder gebündelten Gems.

Weitere Details finden Sie in NEWS oder in den Commit-Logs.

Mit diesen Änderungen wurden 3048 Dateien geändert, 218253 Einfügungen(+), 131067 Löschungen(-) seit Ruby 3.1.0!

Frohe Weihnachten, frohe Feiertage und viel Spaß beim Programmieren mit Ruby 3.2!

Herunterladen

  • https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0.tar.gz

    SIZE: 20440715
    SHA1: fb4ab2ceba8bf6a5b9bc7bf7cac945cc94f94c2b
    SHA256: daaa78e1360b2783f98deeceb677ad900f3a36c0ffa6e2b6b19090be77abc272
    SHA512: 94203051d20475b95a66660016721a0457d7ea57656a9f16cdd4264d8aa6c4cd8ea2fab659082611bfbd7b00ebbcf0391e883e2ebf384e4fab91869e0a877d35
    
  • https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0.tar.xz

    SIZE: 15058364
    SHA1: bcdae07183d66fd902cb7bf995545a472d2fefea
    SHA256: d2f4577306e6dd932259693233141e5c3ec13622c95b75996541b8d5b68b28b4
    SHA512: 733ecc6709470ee16916deeece9af1c76220ae95d17b2681116aff7f381d99bc3124b1b11b1c2336b2b29e468e91b90f158d5ae5fca810c6cf32a0b6234ae08e
    
  • https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0.zip

    SIZE: 24583271
    SHA1: 581ec7b9289c2a85abf4f41c93993ecaa5cf43a5
    SHA256: cca9ddbc958431ff77f61948cb67afa569f01f99c9389d2bbedfa92986c9ef09
    SHA512: b7d2753825cc0667e8bb391fc7ec59a53c3db5fa314e38eee74b6511890b585ac7515baa2ddac09e2c6b6c42b9221c82e040af5b39c73e980fbd3b1bc622c99d
    

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