Posted by naruse on 6 Dec 2022
We’re happy to announce the discharge of Ruby 3.2.0-rc1. Ruby 3.2 provides many options and efficiency enhancements.
WASI primarily based WebAssembly help
That is an preliminary port of WASI primarily based WebAssembly help. This allows a CRuby binary to be out there on a Net browser, a Serverless Edge setting, or other forms of WebAssembly/WASI embedders. At present this port passes primary and bootstrap check suites not utilizing the Thread API.
Background
WebAssembly (Wasm) was initially launched to run applications safely and quick in internet browsers. However its goal – operating applications effectively with safety on varied setting – is lengthy wished not just for internet 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 methods, WebAssembly runs on a digital machine which didn’t have a system interface. WASI standardizes it.
WebAssembly/WASI help in Ruby intends to leverage these initiatives. It permits Ruby builders to put in writing functions which run on such promised platforms.
Use case
This help encourages builders to make the most of CRuby in a WebAssembly setting. An instance use case is TryRuby playground’s CRuby help. Now you may strive unique CRuby in your internet browser.
Technical factors
Immediately’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 by utilizing Asyncify, which is a binary transformation approach to manage execution in userland.
As well as, we constructed a VFS on high of WASI in order that we are able to simply pack Ruby apps right into a single .wasm file. This makes distribution of Ruby apps a bit simpler.
Associated hyperlinks
Regexp enhancements towards ReDoS
It’s recognized that Regexp matching could take unexpectedly lengthy. In case your code makes an attempt to match a probably inefficient Regexp towards an untrusted enter, an attacker could exploit it for environment friendly Denial of Service (so-called Common expression DoS, or ReDoS).
We’ve got launched two enhancements that considerably mitigate ReDoS.
Improved Regexp matching algorithm
Since Ruby 3.2, Regexp’s matching algorithm has been vastly improved by utilizing 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.
(For preview customers: this optimization could eat reminiscence proportional to the enter size for every match. We count on no sensible issues to come up as a result of this reminiscence allocation is normally delayed, and a traditional Regexp match ought to eat at most 10 occasions as a lot reminiscence because the enter size. For those who 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 form of common expressions, equivalent 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 function for Regexp matches can be launched.
Regexp.timeout = 1.0
/^a*b?a*()1$/ =~ "a" * 50000 + "x"
#=> Regexp::TimeoutError is raised in a single second
Notice that Regexp.timeout
is a world configuration. If you wish to use completely different timeout settings for some particular Regexps, chances are you’ll wish 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 function of
syntax_suggest
(previouslydead_end
) is built-in into Ruby. This helps you discover the place of errors equivalent to lacking or superfluousfinish
s, to get you again in your means quicker, equivalent to within the following instance:Unmatched `finish', lacking key phrase (`do', `def`, `if`, and so forth.) ? 1 class Canine > 2 defbark > 4 finish 5 finish
ErrorHighlight
- Now it factors on the related argument(s) for TypeError and ArgumentError
check.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 methodology parameters.
[Feature #18351]def foo(*) bar(*) finish def baz(**) quux(**) finish
-
A proc that accepts a single positional argument and key phrases will
now not autosplat. [Bug #18633]proc a.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 express
objects has been made in step 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 now 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. It will 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 methodology took*args
, however this was a bug and an
inconsistency. A great approach to search out doubtlessly lackingruby2_keywords
is to run the check suite, discover the final methodology which should
obtain key phrase arguments for every place the place the check suite fails, and useplaces nil, caller, nil
there. Then verify that every
methodology/block on the decision chain which should delegate key phrases is appropriately marked
withruby2_keywords
. [Bug #18625] [Bug #16466]def goal(**kw) finish # By accident 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
YJIT
- YJIT now helps each x86-64 and arm64/aarch64 CPUs on Linux, MacOS, BSD and different UNIX platforms.
- This launch brings help for Mac M1/M2, AWS Graviton and Raspberry Pi 4 ARM64 processors.
- Constructing YJIT requires Rust 1.58.0+. [Feature #18481]
- With a purpose to be sure that CRuby is constructed with YJIT, please set up rustc >= 1.58.0 and
run./configure
with--enable-yjit
. - Please attain out to the YJIT workforce must you run into any points.
- With a purpose to be sure that CRuby is constructed with YJIT, please set up rustc >= 1.58.0 and
- Bodily reminiscence for JIT code is lazily allotted. Not like 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
is not going to 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
currentinline_code_size
andoutlined_code_size
keys:
code_gc_count
,live_page_count
,freed_page_count
, andfreed_code_size
.
- RubyVM::YJIT.runtime_stats returns Code GC metrics along with
- A lot of the statistics produced by RubyVM::YJIT.runtime_stats at the moment are out there in launch builds.
- Merely run ruby with
--yjit-stats
to compute stats (incurs some run-time overhead).
- Merely run ruby with
- YJIT is now optimized to benefit from object shapes. [Feature #18776]
- Benefit from finer-grained fixed invalidation to invalidate much less code when defining new constants. [Feature #18589]
MJIT
- The MJIT compiler is re-implemented in Ruby as a regular library
mjit
. - MJIT compiler is executed underneath a forked Ruby course of as an alternative of
doing it in a local thread known as MJIT employee. [[Feature #18968]]- Consequently, Microsoft Visible Studio (MSWIN) is now not supported.
- MinGW is now not supported. [[Feature #18824]]
- Rename
--mjit-min-calls
to--mjit-call-threshold
. - Change default
--mjit-max-cache
again from 10000 to 100.
PubGrab
-
Bundler 2.4 now makes use of PubGrab resolver as an alternative of Molinillo.
- PubGrab is the following era fixing algorithm utilized by
pub
bundle supervisor for the Dart programming language. - You could get completely different decision outcome after this modification. Please report such circumstances to RubyGems/Bundler points
- PubGrab is the following era fixing algorithm utilized by
-
RubyGems nonetheless makes use of Molinillo resolver in Ruby 3.2. We plan to interchange it with PubGrab sooner or later.
Different notable modifications since 3.1
- 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]
- Hash#shift now all the time returns nil if the hash is
- MatchData
- Module
- Proc
- Refinement
- RubyVM::AbstractSyntaxTree
- Add
error_tolerant
choice forparse
,parse_file
andof
. [[Feature #19013]]
- Add
- Set
- Set is now out there as a builtin class with out the necessity for
require "set"
. [Feature #16989]
It’s at the moment autoloaded through theSet
fixed or a name toEnumerable#to_set
.
- Set is now out there as a builtin class with out the necessity for
- String
- String#byteindex and String#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
- A Struct class can be initialized with key phrase arguments
with outkeyword_init: true
onStruct.new
[Feature #16806]
- A Struct class can be initialized with key phrase arguments
Compatibility points
Notice: Excluding function bug fixes.
Eliminated constants
The next deprecated constants are eliminated.
Eliminated strategies
The next deprecated strategies are eliminated.
Stdlib compatibility points
Not bundle third get together sources
-
We now 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 platfrom. The bundle identify is completely different for every platform. -
Bundled libffi supply can be faraway from
fiddle
-
-
Psych and fiddle supported static builds with particular variations of libyaml and libffi sources. You possibly can construct psych with libyaml-0.2.5 like this:
$ ./configure --with-libyaml-source-dir=/path/to/libyaml-0.2.5
And you’ll 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
- The next default gems are up to date.
- RubyGems 3.4.0.dev
- benchmark 0.2.1
- bigdecimal 3.1.3
- bundler 2.4.0.dev
- cgi 0.3.6
- date 3.3.0
- delegate 0.3.0
- did_you_mean 1.6.2
- digest 3.1.1
- drb 2.1.1
- erb 4.0.2
- error_highlight 0.5.1
- and so forth 1.4.1
- fcntl 1.0.2
- fiddle 1.1.1
- fileutils 1.7.0
- forwardable 1.3.3
- getoptlong 0.2.0
- io-console 0.5.11
- io-nonblock 0.2.0
- io-wait 0.3.0.pre
- ipaddr 1.2.5
- irb 1.5.1
- json 2.6.2
- logger 1.5.2
- mutex_m 0.1.2
- net-http 0.3.1
- net-protocol 0.2.0
- nkf 0.1.2
- open-uri 0.3.0
- openssl 3.1.0.pre
- optparse 0.3.0
- ostruct 0.5.5
- pathname 0.2.1
- pp 0.4.0
- pstore 0.1.2
- psych 5.0.0
- racc 1.6.1
- rdoc 6.5.0
- reline 0.3.1
- resolv 0.2.2
- securerandom 0.2.1
- set 1.0.3
- stringio 3.0.3
- syntax_suggest 1.0.1
- timeout 0.3.1
- tmpdir 0.1.3
- tsort 0.1.1
- un 0.2.1
- uri 0.12.0
- win32ole 1.8.9
- zlib 3.0.0
- The next bundled gems are up to date.
- minitest 5.16.3
- power_assert 2.0.2
- test-unit 3.5.5
- net-ftp 0.2.0
- net-imap 0.3.1
- net-pop 0.1.2
- net-smtp 0.3.3
- rbs 2.8.1
- typeprof 0.21.3
- debug 1.7.0
See NEWS
or commit logs
for extra particulars.
With these modifications, 2846 recordsdata modified, 203950 insertions(+), 127153 deletions(-)
since Ruby 3.1.0!
Obtain
-
https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-rc1.tar.gz
SIZE: 20253652 SHA1: 9b45af61ef1ae3c21ab88d7c9e30b80060116ac3 SHA256: 3bb9760c1ac1b66416aaa4899809f6ccd010e57038eaaeca19a383fd56275dac SHA512: 798157d785ebae94cb128d3c134fa35e0e90c654972e531cb6562823042f3fb68a270226f7b1cf0c42572ef2b1488a1a3e44f88389ad2a6f9ca4b280a2a8e759
-
https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-rc1.tar.xz
SIZE: 14934012 SHA1: 5576e304786d466410f27a345dc1cb66f2c773f6 SHA256: 0d45b3af14e84337882a2021235a091ae5dcfc0baaf31dccc479b71d96dd07bc SHA512: d38fcb1e09eb9984f3b2347e65ae7406129c2578d068a25d33b5b4f021ec3b567a9abe56c2acbec6d07a3c2b4bc7b485dbd330cbfbb3a96350f60a2bb94d016e
-
https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-rc1.zip
SIZE: 24473024 SHA1: 8fdc85363ce61e0b8f04da36e709d49028d04a75 SHA256: 7ff32473be108534548e401aaa9092c37a27f73323ea4091c33901c714c87ee5 SHA512: 07adf6a9c89fdcf420e7b131f40f2b1f4aca036aa6f28539ade26ca552f84a75e0698f77a8b774d2ea52b8c756c4982ef319bda5afa786c081a31dd9873c5ef7
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 all around the world particularly for internet improvement.