Ruby 3.3.0 offiziell veröffentlicht

Ruby 3.3.0 ist jetzt offiziell veröffentlicht . Die neue Version fügt einen neuen Parser namens Prism hinzu, verwendet Lrama als Parser-Generator, fügt einen neuen reinen Ruby-JIT-Compiler namens RJIT und viele Leistungsverbesserungen, insbesondere YJIT, hinzu.

Die spezifischen Aktualisierungen lauten wie folgt:

Prisma

  • Führen Sie  den Prism-Parser als Standard-Gem ein
    • Prism ist ein portabler, fehlertoleranter und wartbarer rekursiver Abstiegsparser für die Ruby-Sprache
  • Prism ist produktionsbereit und wird aktiv gewartet. Benutzer können es anstelle von Ripper verwenden
    • Eine ausführliche Einführung finden Sie in der Dokumentation von Prism .
    • Prism ist sowohl eine C-Bibliothek, die intern von CRuby verwendet wird, als auch ein Ruby-Gem, das von jedem Tool verwendet werden kann, das Ruby-Code analysieren muss
    • Bemerkenswerte Methoden in der Prism-API sind:
      • Prism.parse(source)Geben Sie den AST als Teil des analysierten Ergebnisobjekts zurück
      • Prism.parse_comments(source)Kommentare zurückgeben
      • Prism.parse_success?(source)Gibt true zurück, wenn keine Fehler vorliegen
  • Sie können jetzt den Prism-Compiler verwenden ruby --parser=prismoder RUBYOPT="--parser=prism"ausprobieren. Es ist zu beachten, dass dieses Flag nur zum Debuggen verwendet wird.

Verwenden Sie Lrama anstelle von Bison

YJIT

  • Wesentliche Leistungsverbesserungen gegenüber Ruby 3.2
    • Die Unterstützung für Splat- und Rest-Parameter wurde verbessert.
    • Für die Stapeloperationen der virtuellen Maschine werden Register zugewiesen.
    • Kompilieren Sie weitere Aufrufe mit optionalen Parametern. Ausnahmehandler werden ebenfalls kompiliert.
    • Nicht unterstützte Anruftypen und polymorphe Anrufsites werden nicht mehr an den Interpreter weitergeleitet.
    • Grundlegende Methoden wie Rails #blank?und spezialisierte Methoden #present?sind alle inline.
    • Für Integer#*, Integer#!=, String#!=, String#getbyteKernel#block_given?, Kernel#is_a?und wurden spezielle Optimierungen vorgenommen Kernel#instance_of?.Module#===
    • Die Kompilierungsgeschwindigkeit ist jetzt etwas schneller als bei Ruby 3.2.
    • Jetzt über dreimal schneller als der Interpreter auf Optcarrot
  • Deutlich verbesserte Speichernutzung im Vergleich zu Ruby 3.2
    • Metadaten für kompilierten Code beanspruchen weniger Speicher.
    • Wenn der ISEQ der Anwendung 40.000 überschreitet, --yjit-call-thresholdwird er automatisch von 30 auf 120 erhöht.
    • Hinzugefügt --yjit-cold-threshold, um das Kompilieren von kaltem ISEQ zu überspringen.
    • Generieren Sie kompakteren Code auf Arm64.
  • Code GC ist jetzt standardmäßig deaktiviert
    • --yjit-exec-mem-sizeWird als harte Grenze betrachtet, bei der die Kompilierung neuen Codes stoppt.
    • Durch Code GC kommt es nicht zu plötzlichen Leistungseinbußen.  Besseres Copy-on-Write-Verhalten auf Servern, die mit Pitchfork neu geforkt wurden.
    • Bei Bedarf können Sie weiterhin --yjit-code-gcCode-GC mit aktivieren
  • Hinzugefügt RubyVM::YJIT.enable, um YJIT zur Laufzeit zu aktivieren
    • Es ist nicht erforderlich, Befehlszeilenparameter oder Umgebungsvariablen zu ändern, um YJIT zu starten. Rails 7.2 aktiviert YJIT standardmäßig mit dieser Methode  .
    • Dies kann auch verwendet werden, um YJIT erst zu aktivieren, nachdem die Anwendung vollständig gestartet wurde. Dies kann verwendet werden, wenn Sie YJIT beim Start deaktivieren möchten, während Sie andere YJIT-Optionen verwenden --yjit-disable.
  • Bietet standardmäßig mehr YJIT-Statistiken
    • yjit_alloc_sizeund mehr metadatenbezogene Statistiken werden jetzt standardmäßig bereitgestellt .
    • --yjit-statsDie generierte Statistik ratio_in_yjitist jetzt in Distributionen verfügbar, sodass für den Zugriff auf die meisten Statistiken keine spezielle Statistik- oder Entwicklungsversion mehr erforderlich ist.
  • Fügen Sie weitere Profilierungsfunktionen hinzu
    • Hinzugefügt --yjit-perf, um die Analyse mit Linux perf zu erleichtern.
    • --yjit-trace-exitsUnterstützt jetzt --yjit-trace-exits-sample-rate=NSampling mit
  • Umfassendere Tests und mehrere Fehlerbehebungen

RJIT

  • Der reine Ruby-JIT-Compiler RJIT wurde eingeführt und ersetzte MJIT.
    • 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.
    • Es wird empfohlen, dass Benutzer YJIT weiterhin in Produktionsumgebungen verwenden.
  • Wenn Sie daran interessiert sind, JIT für Ruby zu entwickeln, schauen Sie sich die  RubyKaigi Day 3-Demo von k0kubun an .

M:N-Thread-Scheduler

  • Einführung des M:N-Thread-Schedulers. [Funktion#19842]
    • M Ruby-Threads werden von N nativen Threads (Betriebssystem-Threads) verwaltet, wodurch die Thread-Erstellungs- und Verwaltungskosten reduziert werden.
    • Dadurch kann die C-Erweiterungskompatibilität beeinträchtigt werden, sodass der M:N-Thread-Scheduler auf dem Haupt-Ractor standardmäßig deaktiviert ist.
      • RUBY_MN_THREADS=1Die Umgebungsvariable ermöglicht M:N-Threading auf dem Haupt-Ractor.
      • M:N-Threads sind auf nicht primären Ractors immer aktiviert.
    • RUBY_MAX_CPU=nDie Umgebungsvariable wird verwendet, um Nden Maximalwert für (maximale Anzahl lokaler Threads) festzulegen. Der Standardwert ist 8.
      • Da jeder Ractor jeweils nur einen Ruby-Thread ausführen kann, ist die Anzahl der verwendeten lokalen Threads RUBY_MAX_CPUkleiner als die in angegebene Anzahl der Threads oder die Anzahl der ausgeführten Ractors. Daher verwendet eine einzelne Ractor-Anwendung (die meisten Anwendungen) nur einen lokalen Thread.
      • Um Blockierungsvorgänge zu unterstützen, Nkann mehr als ein lokaler Thread verwendet werden.

Weitere Details finden Sie in der offiziellen Ankündigung .

Guess you like

Origin www.oschina.net/news/272610/ruby-3-3-0-released