Geschrieben von naruse am 25.12.2023
Übersetzt von Thomas Ritter
Wir freuen uns, die Veröffentlichung von Ruby 3.3.0 anzukündigen. Ruby 3.3 fügt einen neuen Parser namens Prism hinzu, verwendet Lrama als Parser-Generator, fügt einen neuen reinen Ruby JIT-Compiler namens RJIT hinzu und viele Leistungsverbesserungen, insbesondere YJIT.
Prism
- Einführung des Prism-Parser als Standard-Gem
- Prism ist ein portabler, fehlertoleranter und wartbarer rekursiver Abstiegsparser für die Ruby-Sprache
- Prism ist produktionsreif und wird aktiv gepflegt, Sie können es anstelle von Ripper verwenden
- Es gibt umfangreiche Dokumentation zur Nutzung von Prism
- Prism ist sowohl eine C-Bibliothek, die intern von CRuby verwendet wird, als auch ein Ruby-Gem, das von jedem Werkzeug verwendet werden kann, das Ruby-Code parsen muss
- Nennenswerte Methoden in der Prism-API sind:
Prism.parse(source)
, das den AST als Teil eines Parseergebnisobjekts zurückgibtPrism.parse_comments(source)
, das die Kommentare zurückgibtPrism.parse_success?(source)
, das true zurückgibt, wenn keine Fehler vorliegen
- Sie können Pull-Requests oder Issues direkt im Prism-Repository erstellen, wenn Sie an der Mitarbeit interessiert sind
- Sie können jetzt
ruby --parser=prism
oderRUBYOPT="--parser=prism"
verwenden, um mit dem Prism-Compiler zu experimentieren. Bitte beachten Sie, dass dieser Flag nur für das Debugging gedacht ist.
Verwendung von Lrama anstelle von Bison
- Ersetzen von Bison durch Lrama LALR-Parsergenerator [Feature #19637]
- Wenn Sie interessiert sind, sehen Sie sich bitte Die Zukunftsvision des Ruby-Parsers an
- Der interne Lrama-Parser wird durch einen LR-Parser von Racc ersetzt, um die Wartbarkeit sicherzustellen
- Parameterisierende Regeln
(?, *, +)
werden unterstützt, sie werden im Ruby parse.y verwendet
YJIT
- Große Leistungsverbesserungen gegenüber Ruby 3.2
- Die Unterstützung für Splat- und Rest-Argumente wurde verbessert.
- Register werden für Stack-Operationen der virtuellen Maschine zugewiesen.
- Mehr Aufrufe mit optionalen Argumenten werden kompiliert. Ausnahmebehandler werden ebenfalls kompiliert.
- Nicht unterstützte Aufruftypen und megamorphe Aufrufstellen werden nicht mehr an den Interpreter übergeben.
- Grundlegende Methoden wie Rails
#blank?
und spezialisiertes#present?
werden eingebettet (inlined). Integer#*
,Integer#!=
,String#!=
,String#getbyte
,Kernel#block_given?
,Kernel#is_a?
,Kernel#instance_of?
undModule#===
sind speziell optimiert.- Die Kompilierungsgeschwindigkeit ist jetzt etwas schneller als bei Ruby 3.2.
- Jetzt mehr als 3x schneller als der Interpreter auf Optcarrot!
- Deutlich verbesserte Speichernutzung gegenüber Ruby 3.2
- Metadaten für kompilierten Code verwenden viel weniger Speicher.
--yjit-call-threshold
wird automatisch von 30 auf 120 erhöht wenn die Anwendung mehr als 40.000 ISEQs hat.--yjit-cold-threshold
wird hinzugefügt, um das Kompilieren von kalten ISEQs zu überspringen.- Kompakterer Code wird auf Arm64 generiert.
- Code GC ist jetzt standardmäßig deaktiviert
--yjit-exec-mem-size
wird als hartes Limit behandelt, bei der die Kompilierung neuer Codes stoppt.- Keine plötzlichen Leistungseinbrüche aufgrund von Code GC. Besseres Copy-on-Write-Verhalten auf Servern mit Reforking mit Pitchfork.
- Sie können Code GC weiterhin mit
--yjit-code-gc
aktivieren, falls gewünscht
- Hinzufügen von
RubyVM::YJIT.enable
, das YJIT zur Laufzeit aktivieren kann- Sie können YJIT starten, ohne Kommandozeilenargumente oder Umgebungsvariablen zu ändern. Rails 7.2 wird YJIT standardmäßig aktivieren mit dieser Methode.
- Dies kann auch verwendet werden, um YJIT nur zu aktivieren, sobald Ihre Anwendung
hochgefahren ist.
--yjit-disable
kann verwendet werden, wenn Sie andere YJIT-Optionen verwenden möchten, während YJIT beim Booten deaktiviert ist.
- Mehr YJIT-Statistiken sind standardmäßig verfügbar
yjit_alloc_size
und mehrere weitere metadatenbezogene Statistiken sind jetzt standardmäßig verfügbar.- Die von
--yjit-stats
produzierteratio_in_yjit
-Statistik ist jetzt in Release-Builds verfügbar, ein spezieller Statistik- oder Dev-Build ist nicht mehr erforderlich, um die meisten Statistiken abzurufen.
- Hinzufügen weiterer Profiling-Fähigkeiten
--yjit-perf
wird hinzugefügt, um das Profiling mit Linux perf zu erleichtern.--yjit-trace-exits
unterstützt jetzt das Sampling mit--yjit-trace-exits-sample-rate=N
- Gründlicheres Testing und mehrere Bugfixes
RJIT
- Einführung eines reinen Ruby JIT-Compilers RJIT und Ersatz von MJIT.
- RJIT unterstützt nur die x86-64-Architektur auf Unix-Plattformen.
- Im Gegensatz zu MJIT wird zur Laufzeit kein C-Compiler benötigt.
- RJIT existiert nur zu experimentellen Zwecken.
- Sie sollten in der Produktion weiterhin YJIT verwenden.
- Wenn Sie an der Entwicklung von JIT für Ruby interessiert sind, schauen Sie sich bitte k0kubuns Präsentation am Tag 3 von RubyKaigi an.
M:N-Thread-Scheduler
- M:N-Thread-Scheduler wurde eingeführt. [Feature #19842]
- M Ruby-Threads werden von N nativen Threads (OS-Threads) verwaltet, sodass die Thread-Erstellungs- und Verwaltungskosten reduziert werden.
- Es kann die Kompatibilität mit C-Erweiterungen brechen, sodass der M:N-Thread-Scheduler standardmäßig auf dem Haupt-Ractor deaktiviert ist.
- Die Umgebungsvariable
RUBY_MN_THREADS=1
aktiviert M:N-Threads auf dem Haupt-Ractor. - M:N-Threads sind immer auf Nicht-Haupt-Ractors aktiviert.
- Die Umgebungsvariable
- Die Umgebungsvariable
RUBY_MAX_CPU=n
legt die maximale Anzahl vonN
(maximale Anzahl nativer Threads) fest. Der Standardwert ist 8.- Da nur ein Ruby-Thread pro Ractor gleichzeitig ausgeführt werden kann, wird die Anzahl der verwendeten nativen Threads verwendet, die kleiner ist als die in
RUBY_MAX_CPU
angegebene Anzahl und die Anzahl der laufenden Ractors. Einzelne Ractor-Anwendungen (die meisten Anwendungen) verwenden daher nur 1 nativen Thread. - Zur Unterstützung von blockierenden Operationen können mehr als
N
native Threads verwendet werden.
- Da nur ein Ruby-Thread pro Ractor gleichzeitig ausgeführt werden kann, wird die Anzahl der verwendeten nativen Threads verwendet, die kleiner ist als die in
Leistungsverbesserungen
defined?(@ivar)
ist mit Object Shapes optimiert.- Namensauflösungen wie
Socket.getaddrinfo
können jetzt unterbrochen werden (in Umgebungen, in denen pthreads verfügbar sind). [Feature #19965] - Mehrere Leistungsverbesserungen beim Garbage Collector
- Junge Objekte, die von alten Objekten referenziert werden, werden nicht mehr sofort in die alte Generation befördert. Dies reduziert die Häufigkeit von großen GC-Sammlungen erheblich. [Feature #19678]
- Eine neue Tuning-Variable
REMEMBERED_WB_UNPROTECTED_OBJECTS_LIMIT_RATIO
wurde eingeführt, um die Anzahl der ungeschützten Objekte zu steuern, die eine große GC- Sammlung auslösen. Der Standardwert ist auf0.01
(1%) festgelegt. Dies reduziert die Häufigkeit von großen GC-Sammlungen erheblich. [Feature #19571] - Write Barriers wurden für viele Kerntypen implementiert, die sie bisher vermisst haben,
insbesondere
Time
,Enumerator
,MatchData
,Method
,File::Stat
,BigDecimal
und mehrere andere. Dies reduziert die Zeit für kleine GC-Sammlungen und die Häufigkeit großer GC-Sammlungen erheblich. - Die meisten Kerntypen verwenden jetzt Variable Width Allocation, insbesondere
Hash
,Time
,Thread::Backtrace
,Thread::Backtrace::Location
,File::Stat
,Method
. Dadurch sind diese Klassen schneller zugeteilt und freigegeben, verwenden weniger Speicher und reduzieren die Heapfragmentierung. - Unterstützung für schwache Referenzen wurde dem Garbage Collector hinzugefügt. [Feature #19783]
Weitere bemerkenswerte Änderungen seit 3.2
IRB
IRB hat mehrere Verbesserungen erhalten, einschließlich, aber nicht beschränkt auf:
- Fortgeschrittene
irb:rdbg
-Integration, die ein äquivalentes Debugging-Erlebnis zupry-byebug
bietet (Dokumentation). - Pager-Unterstützung für die Befehle
ls
,show_source
undshow_cmds
. - Genauere und hilfreichere Informationen, die von den Befehlen
ls
undshow_source
bereitgestellt werden. - Experimentelle Autovervollständigung mit Typenanalyse (Dokumentation).
- Es ist jetzt möglich, die Schriftfarbe und den Schriftstil im Vervollständigungsdialog durch eine neu eingeführte Klasse Reline::Face zu ändern (Dokumentation)
Zusätzlich dazu hat IRB umfangreiche Refactorings durchlaufen und Dutzende von Bugfixes erhalten, um zukünftige Verbesserungen zu erleichtern.
Für detailliertere Updates lesen Sie bitte Die große Weiterentwicklung von Ruby 3.3’s IRB enthüllt.
Kompatibilitätsprobleme
Hinweis: Ausschließlich Bugfixes von Features.
it
-Aufrufe ohne Argumente in einem Block ohne gewöhnliche Parameter sind veraltet (deprecated).it
wird in Ruby 3.4 eine Referenz auf den ersten Blockparameter sein. [Feature #18980]
Entfernte Umgebungsvariablen
Die folgenden veralteten Methoden werden entfernt.
- Umgebungsvariable
RUBY_GC_HEAP_INIT_SLOTS
wurde veraltet (deprecated) und ist eine No-Op. Bitte verwenden Sie stattdessen die UmgebungsvariablenRUBY_GC_HEAP_{0,1,2,3,4}_INIT_SLOTS
. [Feature #19785]
Stdlib-Kompatibilitätsprobleme
ext/readline
wird eingestellt
- Wir haben
reline
, das eine reine Ruby-Implementierung kompatibel mit derext/readline
API ist. In Zukunft setzen wir aufreline
. Wenn Sieext/readline
verwenden müssen, können Sieext/readline
über rubygems.org mitgem install readline-ext
installieren. - Wir müssen keine Bibliotheken wie
libreadline
oderlibedit
mehr installieren.
Aktualisierungen der Standardbibliothek
RubyGems und Bundler warnen, wenn Benutzer die folgenden Gems mit require
laden ohne sie zum Gemfile oder gemspec hinzuzufügen. Dies liegt daran, dass sie in einer zukünftigen Version von Ruby zu mitinstallierten Gems werden.
Diese Warnung wird unterdrückt, wenn Sie das Bootsnap-Gem verwenden. Wir empfehlen, Ihre Anwendung mindestens einmal mit der Umgebungsvariable DISABLE_BOOTSNAP=1
auszuführen. Dies ist eine Einschränkung dieser Version.
Zielbibliotheken sind:
- abbrev
- base64
- bigdecimal
- csv
- drb
- getoptlong
- mutex_m
- nkf
- observer
- racc
- resolv-replace
- rinda
- syslog
Das folgende Standard-Gem wird hinzugefügt.
- prism 0.19.0
Die folgenden Standard-Gems werden aktualisiert.
- RubyGems 3.5.3
- abbrev 0.1.2
- base64 0.2.0
- benchmark 0.3.0
- bigdecimal 3.1.5
- bundler 2.5.3
- cgi 0.4.1
- csv 3.2.8
- date 3.3.4
- delegate 0.3.1
- drb 2.2.0
- english 0.8.0
- erb 4.0.3
- error_highlight 0.6.0
- etc 1.4.3
- fcntl 1.1.0
- fiddle 1.1.2
- fileutils 1.7.2
- find 0.2.0
- getoptlong 0.2.1
- io-console 0.7.1
- io-nonblock 0.3.0
- io-wait 0.3.1
- ipaddr 1.2.6
- irb 1.11.0
- json 2.7.1
- logger 1.6.0
- mutex_m 0.2.0
- net-http 0.4.0
- net-protocol 0.2.2
- nkf 0.1.3
- observer 0.1.2
- open-uri 0.4.1
- open3 0.2.1
- openssl 3.2.0
- optparse 0.4.0
- ostruct 0.6.0
- pathname 0.3.0
- pp 0.5.0
- prettyprint 0.2.0
- pstore 0.1.3
- psych 5.1.2
- rdoc 6.6.2
- readline 0.0.4
- reline 0.4.1
- resolv 0.3.0
- rinda 0.2.0
- securerandom 0.3.1
- set 1.1.0
- shellwords 0.2.0
- singleton 0.2.0
- stringio 3.1.0
- strscan 3.0.7
- syntax_suggest 2.0.0
- syslog 0.1.2
- tempfile 0.2.1
- time 0.3.0
- timeout 0.4.1
- tmpdir 0.2.0
- tsort 0.2.0
- un 0.3.0
- uri 0.13.0
- weakref 0.1.3
- win32ole 1.8.10
- yaml 0.3.0
- zlib 3.1.0
Das folgende mitinstallierten Gem wird von Standard-Gems gefördert.
- racc 1.7.3
Die folgenden mitinstallierten Gems werden aktualisiert.
- minitest 5.20.0
- rake 13.1.0
- test-unit 3.6.1
- rexml 3.2.6
- rss 0.3.0
- net-ftp 0.3.3
- net-imap 0.4.9
- net-smtp 0.4.0
- rbs 3.4.0
- typeprof 0.21.9
- debug 1.9.1
Weitere Informationen finden Sie in den GitHub-Releases wie Logger oder Änderungsprotokoll für Details zu den Standard-Gems oder mitinstallierten Gems.
Siehe NEWS oder Commit-Protokolle für weitere Details.
Mit diesen Änderungen haben sich 5532 Dateien geändert, 326851 Einfügungen(+), 185793 Löschungen(-) seit Ruby 3.2.0!
Frohe Weihnachten, schöne Feiertage und viel Spaß beim Programmieren mit Ruby 3.3!
Download
-
https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0.tar.gz
GRÖSSE: 22065999 SHA1: 1a7e56851bf29bda1183aca99b3b323c58e0187b SHA256: 96518814d9832bece92a85415a819d4893b307db5921ae1f0f751a9a89a56b7d SHA512: 26074009b501fc793d71a74e419f34a6033c9353433919ca74ba2d24a3de432dbb11fd92c2bc285f0e4d951a6d6c74bf5b69a2ab36200c8c26e871746d6e0fc6
-
https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0.tar.xz
GRÖSSE: 16345456 SHA1: c8f68e1b0a114b90460a0b44165a3b2f540fa5b6 SHA256: 676b65a36e637e90f982b57b059189b3276b9045034dcd186a7e9078847b975b SHA512: 7959c5753bfa0bfc4d6d74060869aabbe9815c1c97930659da11b917ee0803ddbbd80e869e00c48b8694b4ba48709c3b6493fd045568e36e902616c35ababf01
-
https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0.zip
GRÖSSE: 26935108 SHA1: a433eef1d7f96daeaf3b4cb842d0ed2dd82e7dc1 SHA256: 0e6563f679dd3694732eb3addf9de681c67b584602ac574376b60e7a509d2cd8 SHA512: a94a85937a14b217c1f4b90d24185289ed4aee79239c4f3eecf8034d3fd34e65ee8d66869473857ed153067188adc9b70c0471e4ebe842c9f98ef60c34090450
Was ist Ruby
Ruby wurde erstmals 1993 von Matz (Yukihiro Matsumoto) entwickelt und wird jetzt als Open Source entwickelt. Es läuft auf mehreren Plattformen und wird weltweit vor allem für die Webentwicklung verwendet.