Posted by naruse on 25 Dec 2022
We’re happy to announce the discharge of Ruby 3.2.0. Ruby 3.2 provides many options and efficiency enhancements.
WASI primarily based WebAssembly assist
That is an preliminary port of WASI primarily based WebAssembly assist. This permits a CRuby binary to be accessible on a Net browser, a Serverless Edge atmosphere, or different kinds of WebAssembly/WASI embedders. At present this port passes fundamental and bootstrap take a look at suites not utilizing the Thread API.
Background
WebAssembly (Wasm) was initially launched to run packages safely and quick in net browsers. However its goal – operating packages effectively with safety on varied atmosphere – is lengthy wished not just for net but in addition by common functions.
WASI (The WebAssembly System Interface) is designed for such use circumstances. Although such functions want to speak with working techniques, WebAssembly runs on a digital machine which didn’t have a system interface. WASI standardizes it.
WebAssembly/WASI assist in Ruby intends to leverage these tasks. It allows Ruby builders to put in writing functions which run on such promised platforms.
Use case
This assist encourages builders to make the most of CRuby in a WebAssembly atmosphere. An instance use case is TryRuby playground’s CRuby assist. Now you’ll be able to attempt authentic CRuby in your net browser.
Technical factors
In the present day’s WASI and WebAssembly itself is lacking some options to implement Fiber, exception, and GC as a result of it’s nonetheless evolving, and in addition for safety causes. So CRuby fills the hole through the use of Asyncify, which is a binary transformation approach to regulate execution in userland.
As well as, we constructed a VFS on prime of WASI in order that we will simply pack Ruby apps right into a single .wasm file. This makes distribution of Ruby apps a bit simpler.
Associated hyperlinks
Manufacturing-ready YJIT
- YJIT is not experimental
- Has been examined on manufacturing workloads for over a 12 months and confirmed to be fairly secure.
- YJIT now helps each x86-64 and arm64/aarch64 CPUs on Linux, MacOS, BSD and different UNIX platforms.
- This launch brings assist for Apple M1/M2, AWS Graviton, Raspberry Pi 4 and extra.
- Constructing YJIT now requires Rust 1.58.0+. [Feature #18481]
- With a purpose to be certain that CRuby is constructed with YJIT, please set up
rustc
>= 1.58.0
earlier than operating the./configure
script. - Please attain out to the YJIT workforce must you run into any points.
- With a purpose to be certain that CRuby is constructed with YJIT, please set up
- The YJIT 3.2 launch is quicker than 3.1, and has about 1/3 as a lot reminiscence overhead.
- General YJIT is 41% sooner (geometric imply) than the Ruby interpreter on yjit-bench.
- Bodily reminiscence for JIT code is lazily allotted. In contrast to Ruby 3.1,
the RSS of a Ruby course of is minimized as a result of digital reminiscence pages
allotted by--yjit-exec-mem-size
won’t be mapped to bodily
reminiscence pages till really utilized by JIT code. - Introduce Code GC that frees all code pages when the reminiscence consumption
by JIT code reaches--yjit-exec-mem-size
. RubyVM::YJIT.runtime_stats
returns Code GC metrics along with
presentinline_code_size
andoutlined_code_size
keys:
code_gc_count
,live_page_count
,freed_page_count
, andfreed_code_size
.
- Many of the statistics produced by
RubyVM::YJIT.runtime_stats
at the moment are accessible in launch builds.- Merely run ruby with
--yjit-stats
to compute and dump stats (incurs some run-time overhead).
- Merely run ruby with
- YJIT is now optimized to benefit from object shapes. [Feature #18776]
- Reap the benefits of finer-grained fixed invalidation to invalidate much less code when defining new constants. [Feature #18589]
- The default
--yjit-exec-mem-size
is modified to 64 (MiB). - The default
--yjit-call-threshold
is modified to 30.
Regexp enhancements in opposition to ReDoS
It’s identified that Regexp matching could take unexpectedly lengthy. In case your code makes an attempt to match a presumably inefficient Regexp in opposition to an untrusted enter, an attacker could exploit it for environment friendly Denial of Service (so-called Common expression DoS, or ReDoS).
We’ve launched two enhancements that considerably mitigate ReDoS.
Improved Regexp matching algorithm
Since Ruby 3.2, Regexp’s matching algorithm has been enormously improved through the use of a memoization approach.
# This match takes 10 sec. in Ruby 3.1, and 0.003 sec. in Ruby 3.2
/^a*b?a*$/ =~ "a" * 50000 + "x"
The improved matching algorithm permits most Regexp matching (about 90% in our experiments) to be accomplished in linear time.
This optimization could eat reminiscence proportional to the enter size for every match. We anticipate no sensible issues to come up as a result of this reminiscence allocation is often delayed, and a standard Regexp match ought to eat at most 10 occasions as a lot reminiscence because the enter size. In case you run out of reminiscence when matching Regexps in a real-world software, please report it.
The unique proposal is https://bugs.ruby-lang.org/points/19104
Regexp timeout
The optimization above can’t be utilized to some type of common expressions, akin to these together with superior options (e.g., back-references or look-around), or with an enormous fastened variety of repetitions. As a fallback measure, a timeout characteristic for Regexp matches can also be launched.
Regexp.timeout = 1.0
/^a*b?a*()1$/ =~ "a" * 50000 + "x"
#=> Regexp::TimeoutError is raised in a single second
Word that Regexp.timeout
is a world configuration. If you wish to use totally different timeout settings for some particular Regexps, it’s possible you’ll need to use the timeout
key phrase for Regexp.new
.
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" # by no means interrupted
The unique proposal is https://bugs.ruby-lang.org/points/17837.
Different Notable New Options
SyntaxSuggest
-
The characteristic of
syntax_suggest
(previouslydead_end
) is built-in into Ruby. This helps you discover the place of errors akin to lacking or superfluousfinish
s, to get you again in your manner sooner, akin to within the following instance:Unmatched `finish', lacking key phrase (`do', `def`, `if`, and so on.) ? 1 class Canine > 2 defbark > 3 finish 4 finish
ErrorHighlight
- Now it factors on the related argument(s) for TypeError and ArgumentError
take a look at.rb:2:in `+': nil cannot be coerced into Integer (TypeError)
sum = ary[0] + ary[1]
^^^^^^
Language
-
Nameless relaxation and key phrase relaxation arguments can now be handed as
arguments, as an alternative of simply utilized in technique parameters.
[Feature #18351]def foo(*) bar(*) finish def baz(**) quux(**) finish
-
A proc that accepts a single positional argument and key phrases will
not autosplat. [Bug #18633]proca, **okay.name([1, 2]) # Ruby 3.1 and earlier than # => 1 # Ruby 3.2 and after # => [1, 2]
-
Fixed project analysis order for constants set on specific
objects has been made in keeping with single attribute project
analysis order. With this code:foo
is now known as earlier thanbaz
. Equally, for a number of assignments
to constants, left-to-right analysis order is used. With this
code:foo1::BAR1, foo2::BAR2 = baz1, baz2
The next analysis order is now used:
foo1
foo2
baz1
baz2
-
The discover sample is not experimental.
[Feature #18585] -
Strategies taking a relaxation parameter (like
*args
) and wishing to delegate key phrase
arguments by way offoo(*args)
should now be marked withruby2_keywords
(if not already the case). In different phrases, all strategies wishing to delegate
key phrase arguments by way of*args
should now be marked withruby2_keywords
,
with no exception. This may make it simpler to transition to different methods of
delegation as soon as a library can require Ruby 3+. Beforehand, theruby2_keywords
flag was stored if the receiving technique took*args
, however this was a bug and an
inconsistency. approach to seek out doubtlessly lackingruby2_keywords
is to run the take a look at suite, discover the final technique which should
obtain key phrase arguments for every place the place the take a look at suite fails, and useplaces nil, caller, nil
there. Then verify that every
technique/block on the decision chain which should delegate key phrases is appropriately marked
withruby2_keywords
. [Bug #18625] [Bug #16466]def goal(**kw) finish # By chance labored with out ruby2_keywords in Ruby 2.7-3.1, ruby2_keywords # wanted in 3.2+. Identical to (*args, **kwargs) or (...) could be wanted on # each #foo and #bar when migrating away from ruby2_keywords. ruby2_keywords def bar(*args) goal(*args) finish ruby2_keywords def foo(*args) bar(*args) finish foo(okay: 1)
Efficiency enhancements
MJIT
- The MJIT compiler is re-implemented in Ruby as
ruby_vm/mjit/compiler
. - MJIT compiler is executed below a forked course of as an alternative of
doing it in a local thread known as MJIT employee. [Feature #18968]- Consequently, Microsoft Visible Studio (MSWIN) is not supported.
- MinGW is not supported. [Feature #18824]
- Rename
--mjit-min-calls
to--mjit-call-threshold
. - Change default
--mjit-max-cache
again from 10000 to 100.
PubGrub
-
Bundler 2.4 now makes use of PubGrub resolver as an alternative of Molinillo.
- PubGrub is the subsequent era fixing algorithm utilized by
pub
bundle supervisor for the Dart programming language. - You could get totally different decision consequence after this alteration. Please report such circumstances to RubyGems/Bundler points
- PubGrub is the subsequent era fixing algorithm utilized by
-
RubyGems nonetheless makes use of Molinillo resolver in Ruby 3.2. We plan to exchange it with PubGrub sooner or later.
Different notable modifications since 3.1
- Knowledge
-
New core class to symbolize easy immutable worth object. The category is
just like Struct and partially shares an implementation, however has extra
lean and strict API. [Feature #16122]Measure = Knowledge.outline(:quantity, :unit) distance = Measure.new(100, 'km') #=> #<knowledge Measure quantity=100, unit="km"> weight = Measure.new(quantity: 50, unit: 'kg') #=> #<knowledge Measure quantity=50, unit="kg"> weight.with(quantity: 40) #=> #<knowledge Measure quantity=40, unit="kg"> weight.quantity #=> 50 weight.quantity = 40 #=> NoMethodError: undefined technique `quantity="
-
- Hash
Hash#shift
now all the time returns nil if the hash is
empty, as an alternative of returning the default worth or
calling the default proc. [Bug #16908]
- MatchData
- Module
- Proc
- Refinement
- RubyVM::AbstractSyntaxTree
- Set
- Set is now accessible as a builtin class with out the necessity for
require "set"
. [Feature #16989]
It’s at present autoloaded by way of theSet
fixed or a name toEnumerable#to_set
.
- Set is now accessible as a builtin class with out the necessity for
- String
String#byteindex
andString#byterindex
have been added. [Feature #13110]- Replace Unicode to Model 15.0.0 and Emoji Model 15.0. [Feature #18639]
(additionally applies to Regexp) String#bytesplice
has been added. [Feature #18598]
- Struct
Compatibility points
Word: Excluding characteristic bug fixes.
Eliminated constants
The next deprecated constants are eliminated.
Eliminated strategies
The next deprecated strategies are eliminated.
Stdlib compatibility points
Now not bundle third get together sources
-
We not bundle third get together sources like
libyaml
,libffi
.-
libyaml supply has been faraway from psych. You could want to put in
libyaml-dev
with Ubuntu/Debian platform. The bundle title is totally different for every platform. -
Bundled libffi supply can also be faraway from
fiddle
-
-
Psych and fiddle supported static builds with particular variations of libyaml and libffi sources. You may construct psych with libyaml-0.2.5 like this:
$ ./configure --with-libyaml-source-dir=/path/to/libyaml-0.2.5
And you may construct fiddle with libffi-3.4.4 like this:
$ ./configure --with-libffi-source-dir=/path/to/libffi-3.4.4
C API updates
Up to date C APIs
The next APIs are up to date.
- PRNG replace
rb_random_interface_t
up to date and versioned.
Extension libraries which use this interface and constructed for older variations.
Additionallyinit_int32
perform must be outlined.
Eliminated C APIs
The next deprecated APIs are eliminated.
rb_cData
variable.- “taintedness” and “trustedness” capabilities. [Feature #16131]
Customary library updates
-
Bundler
-
RubyGems
-
ERB
ERB::Util.html_escape
is made sooner thanCGI.escapeHTML
.- It not allocates a String object when no character must be escaped.
- It skips calling
#to_s
technique when an argument is already a String. ERB::Escape.html_escape
is added as an alias toERB::Util.html_escape
,
which has not been monkey-patched by Rails.
-
IRB
- debug.gem integration instructions have been added:
debug
,break
,catch
,
subsequent
,delete
,step
,proceed
,end
,backtrace
,information
- Extra Pry-like instructions and options have been added.
edit
andshow_cmds
(like Pry’sassist
) are added.ls
takes-g
or-G
choice to filter out outputs.show_source
is aliased from$
and accepts unquoted inputs.whereami
is aliased from@
.
- debug.gem integration instructions have been added:
-
The next default gems are up to date.
- 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
- and so on 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
-
The next bundled gems are up to date.
- 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
See GitHub releases like GitHub Releases of logger or changelog for particulars of the default gems or bundled gems.
See NEWS
or commit logs
for extra particulars.
With these modifications, 3048 information modified, 218253 insertions(+), 131067 deletions(-)
since Ruby 3.1.0!
Merry Christmas, Glad Holidays, and revel in programming with Ruby 3.2!
Obtain
-
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
What’s Ruby
Ruby was first developed by Matz (Yukihiro Matsumoto) in 1993,
and is now developed as Open Supply. It runs on a number of platforms
and is used everywhere in the world particularly for net improvement.