Ruby 2.6.0 Released
Posted by naruse on 25 Dec 2018
We are pleased to announce the release of Ruby 2.6.0.
It introduces a number of new features and performance improvements, most notably:
- A new JIT compiler.
- The
RubyVM::AbstractSyntaxTreemodule.
JIT [Experimental]
Ruby 2.6 introduces an initial implementation of a JIT (Just-In-Time) compiler.
The JIT compiler aims to improve the performance of Ruby programs. Unlike traditional JIT compilers which operate in-process, Ruby’s JIT compiler writes out C code to disk and spawns a common C compiler to generate native code. For more details about it, see the MJIT organization by Vladimir Makarov.
In order to enable the JIT compiler, specify --jit on the command line or in the $RUBYOPT environment variable. Specifying --jit-verbose=1 will cause the JIT compiler to print additional information. Read the output of ruby --help or the documentation for other options.
The JIT compiler is supported when Ruby is built by GCC, Clang, or Microsoft VC++, which needs to be available at runtime.
As of Ruby 2.6.0, we have achieved 1.7x faster performance compared to Ruby 2.5 on a CPU-intensive, non-trivial benchmark called Optcarrot. However, it is still experimental and many other memory-intensive workloads like Rails applications might not benefit from it at the moment. For more details, see Ruby 2.6 JIT - Progress and Future.
Stay tuned for the new age of Ruby’s performance.
RubyVM::AbstractSyntaxTree [Experimental]
Ruby 2.6 introduces the RubyVM::AbstractSyntaxTree module. Future compatibility of this module is not guaranteed.
This module has a parse method, which parses the given string as Ruby code and returns the AST (Abstract Syntax Tree) nodes of the code. The parse_file method opens and parses the given file as Ruby code and returns AST nodes.
The RubyVM::AbstractSyntaxTree::Node class is also introduced. You can get source location and children nodes from Node objects. This feature is experimental.
Other Notable New Features
-
Add an alias of
Kernel#yield_selfnamed#then. [Feature #14594] -
Constant names may start with a non-ASCII capital letter. [Feature #13770]
-
Introduce endless ranges. [Feature #12912]
An endless range,
(1..), works as if it has no end. Here are some typical use cases:ary[1..] # identical to ary[1..-1] without magical -1 (1..).each {|index| ... } # enumerates values starting from index 1 ary.zip(1..) {|elem, index| ... } # ary.each.with_index(1) { ... } -
Add
Enumerable#chainandEnumerator#+. [Feature #15144] -
Add function composition operators
<<and>>toProcandMethod. [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)) -
Add
Binding#source_location. [Feature #14230]This method returns the source location of the binding, a 2-element array of
__FILE__and__LINE__. Technically speaking, this is identical toeval("[__FILE__, __LINE__]", binding). However, we are planning to change this behavior so thatKernel#evalignores binding’s source location [Bug #4352]. As such, it is recommended to useBinding#source_locationinstead ofKernel#eval. -
Add an
exception:option toKernel#systemwhich causes it to raise an exception on failure instead of returningfalse. [Feature #14386] -
Add a oneshot mode to
Coverage. [Feature#15022]- This mode checks “whether each line was executed at least once or not”, instead of “how many times each line was executed”. A hook for each line is fired only once, and once it is fired the hook flag will be removed, i.e., it runs with zero overhead.
- Add
oneshot_lines:keyword argument toCoverage.start. - Add
stop:andclear:keyword arguments toCoverage.result. Ifclearis true, it clears the counters to zero. Ifstopis true, it disables coverage measurement. Coverage.line_stubis a simple helper function that creates the “stub” of line coverage from a given source code.
-
Add
FileUtils#cp_lr. It works just likecp_rbut links instead of copies. [Feature #4189]
Performance improvements
-
Speed up
Proc#callby removing the temporary allocation for$SAFE. [Feature #14318]We have observed a 1.4x performance improvement in the
lc_fizzbuzzbenchmark that callsProc#callnumerous times. [Bug #10212] -
Speed up
block.callwhenblockis passed in as a block parameter. [Feature #14330]Combined with improvements around block handling introduced in Ruby 2.5, block evaluation now performs 2.6x faster in a micro-benchmark in Ruby 2.6. [Feature #14045]
-
Transient Heap (
theap) is introduced. [Bug #14858] [Feature #14989]theapis a managed heap for short-living memory objects which are pointed to by specific classes (Array,Hash,Object, andStruct). Making small and short-living Hash objects is 2x faster. With rdoc benchmark, we observed 6-7% performance improvement. -
Native implementations (
arm32,arm64,ppc64le,win32,win64,x86,amd64) of coroutines to improve context switching performance of Fiber significantly. [Feature #14739]Fiber.yieldandFiber#resumeis about 5x faster on 64-bit Linux. Fiber intensive programs can expect up to 5% improvement overall.
Other notable changes since 2.5
-
$SAFEis now a process global state and it can be set back to0. [Feature #14250] -
Passing
safe_leveltoERB.newis deprecated.trim_modeandeoutvararguments have been changed to keyword arguments. [Feature #14256] -
Unicode support is updated to version 11. We have plans to add support for Unicode version 12 and 12.1 in a future TEENY release of Ruby 2.6. This will include support for the new Japanese era.
-
Merge RubyGems 3.0.1. The
--riand--rdocoptions have been removed. Please use the--documentand--no-documentoptions instead. -
Bundler is now installed as a default gem.
-
In exception handling blocks,
elsewithoutrescuenow causes a syntax error. [EXPERIMENTAL][Feature #14606]
See NEWS or the commit logs for more details.
With those changes, 6437 files changed, 231471 insertions(+), 98498 deletions(-) since Ruby 2.5.0!
Merry Christmas, Happy Holidays, and enjoy programming with Ruby 2.6!
Known Problem
(This section was added at January 28, 2019.)
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
Recent News
A New Look for Ruby's Documentation
Following the ruby-lang.org redesign, we have more news to celebrate Ruby’s 30th anniversary: docs.ruby-lang.org has a completely new look with Aliki—RDoc’s new default theme.
Posted by Stan Lo on 23 Dec 2025
Redesign our Site Identity
We are excited to announce a comprehensive redesign of our site. The design for this update was created by Taeko Akatsuka.
Posted by Hiroshi SHIBATA on 22 Dec 2025
Ruby 4.0.0 preview3 Released
We are pleased to announce the release of Ruby 4.0.0-preview3. Ruby 4.0 introduces Ruby::Box and “ZJIT”, and adds many improvements.
Posted by naruse on 18 Dec 2025
Ruby 3.4.8 Released
Ruby 3.4.8 has been released.
Posted by k0kubun on 17 Dec 2025