summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2023-12-25 01:42:07 -0800
committerTakashi Kokubun <takashikkbn@gmail.com>2023-12-25 01:42:09 -0800
commit04bf27368d81b34a3364e6b942cfc5300aa14ffd (patch)
tree4639856f11b1f73ab6a78ebe3cc18cc317ceaf22
parenta164a34110940456a223959b0b17465ff796283c (diff)
Update NEWS.md for 3.4.0 [ci skip]
Basically bb2c3601381d8ecb033e48825f3d0c2a387dddf2 but for 3.4.0.
-rw-r--r--NEWS.md513
1 files changed, 8 insertions, 505 deletions
diff --git a/NEWS.md b/NEWS.md
index 364786d754..8c9c27b9f3 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,529 +1,32 @@
-# NEWS for Ruby 3.3.0
+# NEWS for Ruby 3.4.0
This document is a list of user-visible feature changes
-since the **3.2.0** release, except for bug fixes.
+since the **3.3.0** release, except for bug fixes.
Note that each entry is kept to a minimum, see links for details.
-## Command line options
-
-* A new `performance` warning category was introduced.
- They are not displayed by default even in verbose mode.
- Turn them on with `-W:performance` or `Warning[:performance] = true`. [[Feature #19538]]
-
-* A new `RUBY_CRASH_REPORT` environment variable was introduced to allow
- redirecting Ruby crash reports to a file or sub command. See the `BUG REPORT ENVIRONMENT`
- section of the ruby manpage for further details. [[Feature #19790]]
+## Language changes
## Core classes updates
Note: We're only listing outstanding class updates.
-* Array
-
- * Array#pack now raises ArgumentError for unknown directives. [[Bug #19150]]
-
-* Dir
-
- * Dir.for_fd added for returning a Dir object for the directory specified
- by the provided directory file descriptor. [[Feature #19347]]
- * Dir.fchdir added for changing the directory to the directory specified
- by the provided directory file descriptor. [[Feature #19347]]
- * Dir#chdir added for changing the directory to the directory specified by
- the provided `Dir` object. [[Feature #19347]]
-
-* Encoding
-
- * `Encoding#replicate` has been removed, it was already deprecated. [[Feature #18949]]
-
-* Fiber
-
- * Introduce Fiber#kill. [[Bug #595]]
-
- ```ruby
- fiber = Fiber.new do
- while true
- puts "Yielding..."
- Fiber.yield
- end
- ensure
- puts "Exiting..."
- end
-
- fiber.resume
- # Yielding...
- fiber.kill
- # Exiting...
- ```
-
-* MatchData
-
- * MatchData#named_captures now accepts optional `symbolize_names`
- keyword. [[Feature #19591]]
-
-* Module
-
- * Module#set_temporary_name added for setting a temporary name for a
- module. [[Feature #19521]]
-
-* ObjectSpace::WeakKeyMap
-
- * New core class to build collections with weak references.
- The class use equality semantic to lookup keys like a regular hash,
- but it doesn't hold strong references on the keys. [[Feature #18498]]
-
-* ObjectSpace::WeakMap
-
- * ObjectSpace::WeakMap#delete was added to eagerly clear weak map
- entries. [[Feature #19561]]
-
-* Proc
- * Now Proc#dup and Proc#clone call `#initialize_dup` and `#initialize_clone`
- hooks respectively. [[Feature #19362]]
-
-* Process
-
- * New Process.warmup method that notify the Ruby virtual machine that the boot sequence is finished,
- and that now is a good time to optimize the application. This is useful
- for long-running applications. The actual optimizations performed are entirely
- implementation-specific and may change in the future without notice. [[Feature #18885]]
-
-* Process::Status
-
- * Process::Status#& and Process::Status#>> are deprecated. [[Bug #19868]]
-
-* Range
-
- * Range#reverse_each can now process beginless ranges with an Integer endpoint. [[Feature #18515]]
- * Range#reverse_each now raises TypeError for endless ranges. [[Feature #18551]]
- * Range#overlap? added for checking if two ranges overlap. [[Feature #19839]]
-
-* Refinement
-
- * Add Refinement#target as an alternative of Refinement#refined_class.
- Refinement#refined_class is deprecated and will be removed in Ruby
- 3.4. [[Feature #19714]]
-
-* Regexp
-
- * The cache-based optimization now supports lookarounds and atomic groupings. That is, match
- for Regexp containing these extensions can now also be performed in linear time to the length
- of the input string. However, these cannot contain captures and cannot be nested. [[Feature #19725]]
-
-* String
-
- * String#unpack now raises ArgumentError for unknown directives. [[Bug #19150]]
- * String#bytesplice now accepts new arguments index/length or range of the
- source string to be copied. [[Feature #19314]]
-
-* Thread::Queue
-
- * Thread::Queue#freeze now raises TypeError. [[Bug #17146]]
-
-* Thread::SizedQueue
-
- * Thread::SizedQueue#freeze now raises TypeError. [[Bug #17146]]
-
-* Time
-
- * Time.new with a string argument became stricter. [[Bug #19293]]
-
- ```ruby
- Time.new('2023-12-20')
- # no time information (ArgumentError)
- ```
-
-* TracePoint
-
- * TracePoint supports `rescue` event. When the raised exception was rescued,
- the TracePoint will fire the hook. `rescue` event only supports Ruby-level
- `rescue`. [[Feature #19572]]
-
## Stdlib updates
-* RubyGems and Bundler warn if users do `require` the following gems without adding them to Gemfile or gemspec.
- This is because they will become the bundled gems in the future version of Ruby. This warning is suppressed
- if you use bootsnap gem. We recommend to run your application with `DISABLE_BOOTSNAP=1` environmental variable
- at least once. This is limitation of this version.
- [[Feature #19351]] [[Feature #19776]] [[Feature #19843]]
- * abbrev
- * base64
- * bigdecimal
- * csv
- * drb
- * getoptlong
- * mutex_m
- * nkf
- * observer
- * racc
- * resolv-replace
- * rinda
- * syslog
-
-* Socket#recv and Socket#recv_nonblock returns `nil` instead of an empty string on closed
- connections. Socket#recvmsg and Socket#recvmsg_nonblock returns `nil` instead of an empty packet on closed
- connections. [[Bug #19012]]
-
-* Name resolution such as Socket.getaddrinfo, Socket.getnameinfo, Addrinfo.getaddrinfo, etc.
- can now be interrupted. [[Feature #19965]]
-
-* Random::Formatter#alphanumeric is extended to accept optional `chars`
- keyword argument. [[Feature #18183]]
-
-The following default gem is added.
-
-* prism 0.19.0
-
-The following default gems are updated.
-
-* 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
-
-The following bundled gem is promoted from default gems.
+* The following default gems are updated.
-* racc 1.7.3
+* The following bundled gems are updated.
-The following bundled gems are updated.
+See GitHub releases like [GitHub Releases of Logger](https://github.com/ruby/logger/releases) or changelog for details of the default gems or bundled gems.
-* 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
-
-See GitHub releases like [Logger](https://github.com/ruby/logger/releases) or
-changelog for details of the default gems or bundled gems.
-
-### Prism
-
-* Introduced [the Prism parser](https://github.com/ruby/prism) as a default gem
- * Prism is a portable, error tolerant, and maintainable recursive descent parser for the Ruby language
-* Prism is production ready and actively maintained, you can use it in place of Ripper
- * There is [extensive documentation](https://ruby.github.io/prism/) on how to use Prism
- * Prism is both a C library that will be used internally by CRuby and a Ruby gem that can be used by any tooling which needs to parse Ruby code
- * Notable methods in the Prism API are:
- * `Prism.parse(source)` which returns the AST as part of a parse result object
- * `Prism.parse_comments(source)` which returns the comments
- * `Prism.parse_success?(source)` which returns true if there are no errors
-* You can make pull requests or issues directly on [the Prism repository](https://github.com/ruby/prism) if you are interested in contributing
-* You can now use `ruby --parser=prism` or `RUBYOPT="--parser=prism"` to experiment with the Prism compiler. Please note that this flag is for debugging only.
+## Supported platforms
## Compatibility issues
-* Subprocess creation/forking via the following file open methods is deprecated. [[Feature #19630]]
- * Kernel#open
- * URI.open
- * IO.binread
- * IO.foreach
- * IO.readlines
- * IO.read
- * IO.write
-
-* When given a non-lambda, non-literal block, Kernel#lambda with now raises
- ArgumentError instead of returning it unmodified. These usages have been
- issuing warnings under the `Warning[:deprecated]` category since Ruby 3.0.0.
- [[Feature #19777]]
-
-* The `RUBY_GC_HEAP_INIT_SLOTS` environment variable has been deprecated and
- removed. Environment variables `RUBY_GC_HEAP_%d_INIT_SLOTS` should be
- used instead. [[Feature #19785]]
-
-* `it` calls without arguments in a block with no ordinary parameters are
- deprecated. `it` will be a reference to the first block parameter in Ruby 3.4.
- [[Feature #18980]]
-
-* Error message for NoMethodError have changed to not use the target object's `#inspect`
- for efficiency, and says "instance of ClassName" instead. [[Feature #18285]]
-
- ```ruby
- ([1] * 100).nonexisting
- # undefined method `nonexisting' for an instance of Array (NoMethodError)
- ```
-
-* Now anonymous parameters forwarding is disallowed inside a block
- that uses anonymous parameters. [[Feature #19370]]
-
## Stdlib compatibility issues
-* `racc` is promoted to bundled gems.
- * You need to add `racc` to your `Gemfile` if you use `racc` under bundler environment.
-* `ext/readline` is retired
- * We have `reline` that is pure Ruby implementation compatible with `ext/readline` API.
- We rely on `reline` in the future. If you need to use `ext/readline`, you can install
- `ext/readline` via rubygems.org with `gem install readline-ext`.
- * We no longer need to install libraries like `libreadline` or `libedit`.
-
## C API updates
-* `rb_postponed_job` updates
- * New APIs and deprecated APIs (see comments for details)
- * added: `rb_postponed_job_preregister()`
- * added: `rb_postponed_job_trigger()`
- * deprecated: `rb_postponed_job_register()` (and semantic change. see below)
- * deprecated: `rb_postponed_job_register_one()`
- * The postponed job APIs have been changed to address some rare crashes.
- To solve the issue, we introduced new two APIs and deprecated current APIs.
- The semantics of these functions have also changed slightly; `rb_postponed_job_register`
- now behaves like the `once` variant in that multiple calls with the same
- `func` might be coalesced into a single execution of the `func`
- [[Feature #20057]]
-
-* Some updates for internal thread event hook APIs
- * `rb_internal_thread_event_data_t` with a target Ruby thread (VALUE)
- and callback functions (`rb_internal_thread_event_callback`) receive it.
- https://github.com/ruby/ruby/pull/8885
- * The following functions are introduced to manipulate Ruby thread local data
- from internal thread event hook APIs (they are introduced since Ruby 3.2).
- https://github.com/ruby/ruby/pull/8936
- * `rb_internal_thread_specific_key_create()`
- * `rb_internal_thread_specific_get()`
- * `rb_internal_thread_specific_set()`
-
-* `rb_profile_thread_frames()` is introduced to get a frames from
- a specific thread.
- [[Feature #10602]]
-
-* `rb_data_define()` is introduced to define `Data`. [[Feature #19757]]
-
-* `rb_ext_resolve_symbol()` is introduced to search a function from
- extension libraries. [[Feature #20005]]
-
-* IO related updates:
- * The details of `rb_io_t` will be hidden and deprecated attributes
- are added for each members. [[Feature #19057]]
- * `rb_io_path(VALUE io)` is introduced to get a path of `io`.
- * `rb_io_closed_p(VALUE io)` to get opening or closing of `io`.
- * `rb_io_mode(VALUE io)` to get the mode of `io`.
- * `rb_io_open_descriptor()` is introduced to make an IO object from a file
- descriptor.
-
## Implementation improvements
-### Parser
-
-* Replace Bison with [Lrama LALR parser generator](https://github.com/ruby/lrama).
- No need to install Bison to build Ruby from source code anymore.
- We will no longer suffer bison compatibility issues and we can use new features by just implementing it to Lrama. [[Feature #19637]]
- * See [The future vision of Ruby Parser](https://rubykaigi.org/2023/presentations/spikeolaf.html) for detail.
- * Lrama internal parser is a LR parser generated by Racc for maintainability.
- * Parameterizing Rules `(?, *, +)` are supported, it will be used in Ruby parse.y.
-
-### GC / Memory management
-
-* Major performance improvements over Ruby 3.2
- * Young objects referenced by old objects are no longer immediately
- promoted to the old generation. This significantly reduces the frequency of
- major GC collections. [[Feature #19678]]
- * A new `REMEMBERED_WB_UNPROTECTED_OBJECTS_LIMIT_RATIO` tuning variable was
- introduced to control the number of unprotected objects cause a major GC
- collection to trigger. The default is set to `0.01` (1%). This significantly
- reduces the frequency of major GC collection. [[Feature #19571]]
- * Write Barriers were implemented for many core types that were missing them,
- notably `Time`, `Enumerator`, `MatchData`, `Method`, `File::Stat`, `BigDecimal`
- and several others. This significantly reduces minor GC collection time and major
- GC collection frequency.
- * Most core classes are now using Variable Width Allocation, notably `Hash`, `Time`,
- `Thread::Backtrace`, `Thread::Backtrace::Location`, `File::Stat`, `Method`.
- This makes these classes faster to allocate and free, use less memory and reduce
- heap fragmentation.
-* `defined?(@ivar)` is optimized with Object Shapes.
-
-### YJIT
-
-* Major performance improvements over Ruby 3.2
- * Support for splat and rest arguments has been improved.
- * Registers are allocated for stack operations of the virtual machine.
- * More calls with optional arguments are compiled. Exception handlers are also compiled.
- * Unsupported call types and megamorphic call sites no longer exit to the interpreter.
- * Basic methods like Rails `#blank?` and
- [specialized `#present?`](https://github.com/rails/rails/pull/49909) are inlined.
- * `Integer#*`, `Integer#!=`, `String#!=`, `String#getbyte`,
- `Kernel#block_given?`, `Kernel#is_a?`, `Kernel#instance_of?`, and `Module#===`
- are specially optimized.
- * Compilation speed is now slightly faster than Ruby 3.2.
- * Now more than 3x faster than the interpreter on Optcarrot!
-* Significantly improved memory usage over Ruby 3.2
- * Metadata for compiled code uses a lot less memory.
- * `--yjit-call-threshold` is automatically raised from 30 to 120
- when the application has more than 40,000 ISEQs.
- * `--yjit-cold-threshold` is added to skip compiling cold ISEQs.
- * More compact code is generated on Arm64.
-* Code GC is now disabled by default
- * `--yjit-exec-mem-size` is treated as a hard limit where compilation of new code stops.
- * No sudden drops in performance due to code GC.
- Better copy-on-write behavior on servers reforking with
- [Pitchfork](https://github.com/shopify/pitchfork).
- * You can still enable code GC if desired with `--yjit-code-gc`
-* Add `RubyVM::YJIT.enable` that can enable YJIT at run-time
- * You can start YJIT without modifying command-line arguments or environment variables.
- Rails 7.2 will [enable YJIT by default](https://github.com/rails/rails/pull/49947)
- using this method.
- * This can also be used to enable YJIT only once your application is
- done booting. `--yjit-disable` can be used if you want to use other
- YJIT options while disabling YJIT at boot.
-* More YJIT stats are available by default
- * `yjit_alloc_size` and several more metadata-related stats are now available by default.
- * `ratio_in_yjit` stat produced by `--yjit-stats` is now available in release builds,
- a special stats or dev build is no longer required to access most stats.
-* Add more profiling capabilities
- * `--yjit-perf` is added to facilitate profiling with Linux perf.
- * `--yjit-trace-exits` now supports sampling with `--yjit-trace-exits-sample-rate=N`
-* More thorough testing and multiple bug fixes
-* `--yjit-stats=quiet` is added to avoid printing stats on exit.
-
-### MJIT
-
-* MJIT is removed.
- * `--disable-jit-support` is removed. Consider using `--disable-yjit --disable-rjit` instead.
-
-### RJIT
-
-* Introduced a pure-Ruby JIT compiler RJIT.
- * RJIT supports only x86\_64 architecture on Unix platforms.
- * Unlike MJIT, it doesn't require a C compiler at runtime.
-* RJIT exists only for experimental purposes.
- * You should keep using YJIT in production.
-
-### M:N Thread scheduler
-
-* M:N Thread scheduler is introduced. [[Feature #19842]]
- * Background: Ruby 1.8 and before, M:1 thread scheduler (M Ruby threads
- with 1 native thread. Called as User level threads or Green threads)
- is used. Ruby 1.9 and later, 1:1 thread scheduler (1 Ruby thread with
- 1 native thread). M:1 threads takes lower resources compare with 1:1
- threads because it needs only 1 native threads. However it is difficult
- to support context switching for all of blocking operation so 1:1
- threads are employed from Ruby 1.9. M:N thread scheduler uses N native
- threads for M Ruby threads (N is small number in general). It doesn't
- need same number of native threads as Ruby threads (similar to the M:1
- thread scheduler). Also our M:N threads supports blocking operations
- well same as 1:1 threads. See the ticket for more details.
- Our M:N thread scheduler refers on the goroutine scheduler in the
- Go language.
- * In a ractor, only 1 thread can run in a same time because of
- implementation. Therefore, applications that use only one Ractor
- (most applications) M:N thread scheduler works as M:1 thread scheduler
- with further extension from Ruby 1.8.
- * M:N thread scheduler can introduce incompatibility for C-extensions,
- so it is disabled by default on the main Ractors.
- `RUBY_MN_THREADS=1` environment variable will enable it.
- On non-main Ractors, M:N thread scheduler is enabled (and can not
- disable it now).
- * `N` (the number of native threads) can be specified with `RUBY_MAX_CPU`
- environment variable. The default is 8.
- Note that more than `N` native threads are used to support many kind of
- blocking operations.
-
-[Bug #595]: https://bugs.ruby-lang.org/issues/595
-[Feature #10602]: https://bugs.ruby-lang.org/issues/10602
-[Bug #17146]: https://bugs.ruby-lang.org/issues/17146
-[Feature #18183]: https://bugs.ruby-lang.org/issues/18183
-[Feature #18285]: https://bugs.ruby-lang.org/issues/18285
-[Feature #18498]: https://bugs.ruby-lang.org/issues/18498
-[Feature #18515]: https://bugs.ruby-lang.org/issues/18515
-[Feature #18551]: https://bugs.ruby-lang.org/issues/18551
-[Feature #18885]: https://bugs.ruby-lang.org/issues/18885
-[Feature #18949]: https://bugs.ruby-lang.org/issues/18949
-[Feature #18980]: https://bugs.ruby-lang.org/issues/18980
-[Bug #19012]: https://bugs.ruby-lang.org/issues/19012
-[Feature #19057]: https://bugs.ruby-lang.org/issues/19057
-[Bug #19150]: https://bugs.ruby-lang.org/issues/19150
-[Bug #19293]: https://bugs.ruby-lang.org/issues/19293
-[Feature #19314]: https://bugs.ruby-lang.org/issues/19314
-[Feature #19347]: https://bugs.ruby-lang.org/issues/19347
-[Feature #19351]: https://bugs.ruby-lang.org/issues/19351
-[Feature #19362]: https://bugs.ruby-lang.org/issues/19362
-[Feature #19370]: https://bugs.ruby-lang.org/issues/19370
-[Feature #19521]: https://bugs.ruby-lang.org/issues/19521
-[Feature #19538]: https://bugs.ruby-lang.org/issues/19538
-[Feature #19561]: https://bugs.ruby-lang.org/issues/19561
-[Feature #19571]: https://bugs.ruby-lang.org/issues/19571
-[Feature #19572]: https://bugs.ruby-lang.org/issues/19572
-[Feature #19591]: https://bugs.ruby-lang.org/issues/19591
-[Feature #19630]: https://bugs.ruby-lang.org/issues/19630
-[Feature #19637]: https://bugs.ruby-lang.org/issues/19637
-[Feature #19678]: https://bugs.ruby-lang.org/issues/19678
-[Feature #19714]: https://bugs.ruby-lang.org/issues/19714
-[Feature #19725]: https://bugs.ruby-lang.org/issues/19725
-[Feature #19757]: https://bugs.ruby-lang.org/issues/19757
-[Feature #19776]: https://bugs.ruby-lang.org/issues/19776
-[Feature #19777]: https://bugs.ruby-lang.org/issues/19777
-[Feature #19785]: https://bugs.ruby-lang.org/issues/19785
-[Feature #19790]: https://bugs.ruby-lang.org/issues/19790
-[Feature #19839]: https://bugs.ruby-lang.org/issues/19839
-[Feature #19842]: https://bugs.ruby-lang.org/issues/19842
-[Feature #19843]: https://bugs.ruby-lang.org/issues/19843
-[Bug #19868]: https://bugs.ruby-lang.org/issues/19868
-[Feature #19965]: https://bugs.ruby-lang.org/issues/19965
-[Feature #20005]: https://bugs.ruby-lang.org/issues/20005
-[Feature #20057]: https://bugs.ruby-lang.org/issues/20057
+## JIT