Geschrieben von naruse am 25.12.2018
Übersetzt von Marvin Gülker
Wir freuen uns, die Veröffentlichung von Ruby 2.6.0 bekanntgeben zu können.
Diese Version enthält eine Reihe neuer Features und Performanzverbesserungen, darunter insbesondere:
- Ein neuer JIT-Compiler.
- Das Modul
RubyVM::AbstractSyntaxTree
.
JIT [Experimentell]
Ruby 2.6 führt erstmals einen JIT-Compiler (Just in Time Compiler) ein.
Der JIT-Compiler soll die allgemeine Performanz aller Ruby-Programme verbessern. Rubys JIT-Compiler arbeitet anders als herkömmliche JIT-Compiler für andere Programmiersprachen, denn er schreibt C-Code auf die Festplatte und startet dann einen gewöhnlichen C-Compiler-Prozess, um Maschinencode zu erzeugen. Siehe dazu auch: Die Funktionsweise von MJIT (von Wladimir Makarow).
Um den JIT-Compiler zu benutzen, geben Sie --jit
als Kommandozeilenoption
oder in der Umgebungsvariablen $RUBYOPT
an. Bei Angabe von
--jit-verbose=1
werden Informationen über die laufende
JIT-Kompilation ausgegeben. Weitere Optionen können ruby --help
oder
der Dokumentation
entnommen werden.
Für den Einsatz des JIT-Compilers ist es erforderlich, dass Ruby mithilfe von GCC, Clang oder Microsoft VC++ kompiliert worden ist. Darüber hinaus muss der verwendete Compiler zur Laufzeit auf dem System zur Verfügung stehen.
Mit Stand Ruby 2.6.0 haben wir eine 1,7-fache Verbesserung der Performanz gegenüber Ruby 2.5 bei einem CPU-intensiven, nicht-trivialen Belastungstest namens Optcarrot festgestellt. Allerdings ist der JIT-Compiler noch experimentell und speicherhungrige Anwendungen wie solche auf Rails-Basis können möglicherweise noch nicht von ihm profitieren. Weitere Informationen finden Sie im Artikel Ruby 2.6 JIT - Fortschritt und Zukunft.
Machen Sie sich bereit für eine neue Ära von Rubys Performanz.
RubyVM::AbstractSyntaxTree
[Experimentell]
Ruby 2.6 führt das Modul RubyVM::AbstractSyntaxTree
ein. Die
Kompatibilität dieses Moduls mit zukünftigen Versionen kann nicht
garantiert werden.
Dieses Modul verfügt über die Methoden parse
, die den als String
übergebenen Ruby-Code verarbeitet und eine Liste von Knoten des ASTs
(Abstract Syntax Tree) zurückgibt, und parse_file
, die die
übergebene Ruby-Quelldatei auf ähnliche Weise verarbeitet und
ebenfalls AST-Knoten zurückgibt.
Weiterhin wird die ebenfalls experimentelle Klasse RubyVM::AbstractSyntaxTree::Node
eingeführt. Mithilfe von Node
-Objekten können die Positionsinformationen und
Angaben über Kindknoten ermittelt werden.
Weitere nennenswerte neue Features
-
Neuer alias
#then
fürKernel#yield_self
. [Feature #14594] -
Konstantennamen können auch mit Großbuchstaben außerhalb des ASCII-Zeichensatzes beginnen. [Feature #13770]
-
Endlos-Range eingeführt. [Feature #12912]
Es wird ein Endlos-Range
(1..)
eingeführt, der über kein Ende verfügt. Typische Anwendungsfälle sehen wie folgt aus:ary[1..] # identisch zu ary[1..-1] ohne magische -1 (1..).each {|index| ... } # Endlosschleife ab Index 1 ary.zip(1..) {|elem, index| ... } # ary.each.with_index(1) { ... }
-
Enumerable#chain
undEnumerator#+
hinzugefügt. [Feature #15144] -
Operatoren
<<
und>>
für die Kombination von Funktionen zuProc
undMethod
hinzugefügt. [Feature #6284]f = proc{|x| x + 2} g = proc{|x| x * 3} (f << g).call(3) # -> 11; identical to f(g(3)) (f >> g).call(3) # -> 15; identical to g(f(3))
-
Binding#source_location
hinzugefügt. [Feature #14230]Diese Methode gibt ein 2-Element-Array mit den Bestandteilen
__FILE__
und__LINE__
zurück, die beschreiben, an welcher Stelle im Quelltext ein Binding definiert wurde. Dieselbe Information konnte bisher übereval("[__FILE__, __LINE__]", binding)
ermittelt werden, allerdings planen wir, dieses Verhalten so zu ändern, dassKernel#eval
den Definitionsort einesbinding
ignoriert [Bug #4352]. Nutzern wird deshalb empfohlen, auf diese neu eingeführte Methode umzusteigen. -
Option
:exception
zuKernel.#system
hinzugefügt. Diese Option führt dazu, dass #system stattfalse
zurückzugeben einen Fehler verursacht. [Feature #14386] -
Einmal-Modus (oneshot mode) zu
Coverage
hinzugefügt. [Feature#15022]- Anstelle von „wie oft wurde eine bestimmte Zeile ausgeführt“, prüft dieser Modus, „ob jede Zeile wenigstens einmal oder gar nicht ausgeführt wurde“. Der entsprechende Hook wird für jede Zeile höchstens einmal ausgeführt. Nach seinem Abschluss wird die entsprechende Flagge entfernt, d.h. das Programm läuft danach ohne geschwindigkeitsrelevante Einschränkungen.
- Schlüsselwortargument
:oneshot_lines
zu Coverage.start hinzugefügt. - Schlüsselwortargumente
:stop
und:clear
zu Coverage.result hinzugefügt. Wennclear
wahr ist, setzt es den Zähler auf Null zurück. Wenn:stop
wahr ist, wird die Abdeckungsmessung ausgeschaltet. Coverage.line_stub
hinzugefügt. Es handelt sich um eine einfache Hilfsfunktion, die eine kurze Zusammenfassung der Zeilenabdeckung des übergebenen Quellcodes erzeugt.
-
FileUtils#cp_lr
hinzugefügt. Diese Methode funktioniert wiecp_r
, verlinkt aber statt zu kopieren. [Feature #4189]
Performanzverbesserungen
-
Proc#call
durch die Entfernung der temporären Allozierung von$SAFE
beschleunigt. [Feature #14318]Mithilfe des
lc_fizzbuzz
-Belastungstests, der sehr häufigProc#call
benutzt, haben wir eine 1,4-fache Beschleunigung gemessen. [Bug #10212] -
block.call
beschleunigt, wennblock
als Block-Parameter übergeben wird. [Feature #14330]Zusammen mit den bereits in Ruby 2.5 diesbezüglich vorgenommenen Verbesserungen ist die Evaluation von Blöcken in Ruby 2.6 nun ausweislich eines Micro-Benchmarks 2,6-mal schneller.
-
Es wird ein flüchtiger Heap (transient heap, theap) eingeführt [Bug #14858] [Feature #14989].
Dabei handelt es sich um einen automatisch verwalteten Freispeicher für kurzlebige Objekte im Speicher, auf welche von bestimmten Klassen (Array, Hash, Object und Struct) verwiesen wird. Dies führt beispielsweise dazu, dass die Erstellung kleiner und kurzlebiger Hash-Objekte doppelt so schnell ist. Im RDoc-Belastungstest haben wir eine 6- bis 7-prozentige Performanzverbesserung festgestellt.
-
Diverse native Implementierungen (
arm32
,arm64
,ppc64le
,win32
,win64
,x86
,amd64
) von Coroutinen verbessern die Performanz des Kontextwechsels beiFiber
signifikant.Fiber.yield
undFiber#resume
sind auf einem 64-bit Linux-System etwa 5 mal so schnell wie bisher. Programme, die intensiven Gebrauch von Fibers machen, können insgesamt eine bis zu fünfprozentige Performanzverbesserung erwarten.
Sonstige bemerkenswerte Änderungen seit 2.5
-
$SAFE
ist ein prozess-globaler Zustand und kann wieder auf0
gesetzt werden. [Feature #14250] -
Die Übergabe von
safe_level
anERB.new
ist als veraltet markiert worden. Die Parametertrim_mode
undeoutvar
wurden in Schlüsselwortargumente geändert. [Feature #14256] -
Ruby unterstützt jetzt Unicode in Version 11. Es ist geplant, die Versionen 12 und 12.1 in zukünftigen TEENY-Veröffentlichungen von Ruby 2.6 zu unterstützen und damit Unterstützung für die neue japanische Ära einzuführen.
-
RubyGems 3.0.1 aufgenommen. Die Optionen
--ri
und--rdoc
wurden entfernt. Benutzen Sie stattdessen--document
und--no-document
. -
Bundler wird standardmäßig mitgeliefert.
-
else
ohnerescue
in Fehlerbehandlungsblöcken verursacht einen Syntaxfehler. [EXPERIMENTELL][Feature #14606]
Siehe die NEWS oder die Commit-Logs für weitere Details.
Mit diesen Änderungen wurden 6437 Dateien geändert, 231471 Einfügungen(+), 98498 Löschungen(-) seit Ruby 2.5.0!
Frohe Weihnachten, schöne Ferien und viel Spaß bei der Programmierung mit Ruby 2.6!
Download
-
https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0.tar.gz
SIZE: 16687800 bytes SHA1: c95f4e86e21390270dad3ebb94491fd42ee2ce69 SHA256: f3c35b924a11c88ff111f0956ded3cdc12c90c04b72b266ac61076d3697fc072 SHA512: 01f886b0c0782a06315c4a46414e9f2b66ee634ba4349c8e0697f511793ae3c56d2ad3cad6563f2b0fdcedf0ff3eba51b9afab907e7e1ac243475772f8688382
-
https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0.zip
SIZE: 20582054 bytes SHA1: a804e63d18da12107e1d101918a3d8f4c5462a27 SHA256: 8a4fb6ca58202495c9682cb88effd804398bd0ef023e3e36f001ca88d8b5855a SHA512: 16d66ec4a2c6a2e928d5b50e094a5efa481ac6e4d5ed77459d351ef19fe692aa59b68307e3e25229eec5f30ae2f9adae2663bafe9c9d44bfb45d3833d77839d4
-
https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0.tar.bz2
SIZE: 14585856 bytes SHA1: b8638eb806efbf7b6af87b24ccc6ad915f262318 SHA256: c89ca663ad9a6238f4b1ec4d04c7dff630560c6e6eca6d30857c4d394f01a599 SHA512: ca3daf9acf11d3db2900af21b66231bd1f025427a9d2212b35f6137ca03f77f57171ddfdb99022c8c8bcd730ff92a7a4af54e8a2a770a67d8e16c5807aa391f1
-
https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0.tar.xz
SIZE: 11918536 bytes SHA1: 9ddaeba3505d2855460c8c653159fc0ac8928c0f SHA256: acb00f04374899ba8ee74bbbcb9b35c5c6b1fd229f1876554ee76f0f1710ff5f SHA512: c56eaf85ef7b79deb34ee4590b143c07f4fc83eb79775290761aee5a7c63374659613538a41f25706ed6e19e49d5c67a1014c24d17f29948294c7abd0b0fcea8