<html dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body style="text-align:left; direction:ltr;">
<div>Erlang/OTP 26.0-rc3 is the third and final release candidate before the OTP 26.0 release. </div>
<div>This release candidate fixes some bugs found in the first two release candidates.</div>
<div><br>
</div>
<div>The intention with this release is to get feedback from our users. All feedback is welcome, even if it is only to say that it works for you.</div>
<div>We encourage users to try it out and give us feedback either by creating an issue here
<a href="https://github.com/erlang/otp/issues">https://github.com/erlang/otp/issues</a> or by posting to [Erlangforums](<a href="https://erlangforums.com/">https://erlangforums.com/</a>).</div>
<div><br>
</div>
<div>All artifacts for the release can be downloaded from the [Erlang/OTP Github](<a href="https://github.com/erlang/otp/releases/tag/OTP-26.0-rc3">https://github.com/erlang/otp/releases/tag/OTP-26.0-rc3</a>) release and you can view the new documentation at
<a href="https://erlang.org/documentation/doc-14.0-rc3/doc/">https://erlang.org/documentation/doc-14.0-rc3/doc/</a>. You can also install the latest release using [kerl](<a href="https://github.com/kerl/kerl">https://github.com/kerl/kerl</a>) like this: kerl
 build 26.0-rc3 26.0-rc3.</div>
<div><br>
</div>
<div>Erlang/OTP 26 is a new major release with new features, improvements as well as a few incompatibilities. Some of the new features are highlighted below.</div>
<div><br>
</div>
<div>Many thanks to all contributors!</div>
<div><br>
</div>
<div>Below are some highlights of the release:</div>
<div><br>
</div>
<div># Highlights RC2</div>
<div><br>
</div>
<div>## Parsetools</div>
<div><br>
</div>
<div>- `Leex` has been extended with optional column number support.</div>
<div><br>
</div>
<div>## Stdlib</div>
<div><br>
</div>
<div>- The family of enumeration functions in module `lists` has been extended with</div>
<div>    `enumerate/3` that allows a step value to be supplied.</div>
<div>- Update Unicode to version 15.0.0.</div>
<div>- `proc_lib:start*/*` has become synchronous when the</div>
<div>    started process fails. This requires that a failing</div>
<div>    process use a new function `proc_lib:init_fail/2,3`, or</div>
<div>    exits, to indicate failure. All OTP behaviours have</div>
<div>    been fixed to do this.</div>
<div><br>
</div>
<div>## Dialyzer</div>
<div><br>
</div>
<div>- Added the new built-in type `dynamic()` introduced in [EEP 61](<a href="https://www.erlang.org/eeps/eep-0061">https://www.erlang.org/eeps/eep-0061</a>), [PR introducing EEP 61](<a href="https://github.com/erlang/eep/pull/44">https://github.com/erlang/eep/pull/44</a>)
 improving support for gradual type checkers.</div>
<div><br>
</div>
<div>## SSL</div>
<div><br>
</div>
<div>- Change the client default `verify` option to `verify_peer`.</div>
<div>    *Note* that this makes it mandatory to also supply trusted CA certificates or explicitly set</div>
<div>    `verify` to `verify_none`. This also applies when using the so called</div>
<div>    anonymous test cipher suites defined in TLS versions pre TLS-1.3.</div>
<div><br>
</div>
<div><br>
</div>
<div># Highlights RC1</div>
<div><br>
</div>
<div>## The Shell</div>
<div>There are a lot of new features and improvements in the Erlang shell:</div>
<div>- auto-complete of variables, record names, record fields names, map keys, function parameter types and filenames.</div>
<div>- Open external editor in the shell to edit</div>
<div>  the current expression.</div>
<div>- defining records (with types), functions, specs and types in the shell.</div>
<div><br>
</div>
<div>## New terminal</div>
<div>- The TTY/terminal subsystem has been rewritten.</div>
<div>  Windows users will notice that `erl.exe` has the same</div>
<div>  functionality as a normal Unix shell and that `werl.exe` is just a </div>
<div>  symlink to `erl.exe`. This makes the Windows Erlang terminal</div>
<div>  experience identical to that of Unix.</div>
<div><br>
</div>
<div>## Compiler and JIT optimizations:</div>
<div><br>
</div>
<div>- Creation and matching of binaries with segments of fixed sizes have been optimized.</div>
<div><br>
</div>
<div>- Creation and matching of UTF-8 segments have been optimized.</div>
<div><br>
</div>
<div>- Appending to binaries has been optimized.</div>
<div><br>
</div>
<div>- The compiler and JIT now generate better code for creation of small maps where all keys </div>
<div>  are literals known at compile time.</div>
<div><br>
</div>
<div>- Thanks to the optimizations above the performance of the `base64` module has been</div>
<div>  significantly improved. For example, on an x86_64 system with the JIT both encode and </div>
<div>  decode are almost three times faster than in Erlang/OTP 25.</div>
<div><br>
</div>
<div>## Maps</div>
<div>- Map comprehensions as suggested in [EEP 58](<a href="https://www.erlang.org/eeps/eep-0058">https://www.erlang.org/eeps/eep-0058</a>) has now been</div>
<div>implemented.</div>
<div><br>
</div>
<div>- Some map operations have been optimized by changing the</div>
<div>  internal sort order of atom keys. This changes the</div>
<div>  (undocumented) order of how atom keys in small maps are</div>
<div>  printed and returned by `maps:to_list/1` and `maps:next/1`.</div>
<div>  The new order is unpredictable and may change between</div>
<div>  different invocations of the Erlang VM.</div>
<div><br>
</div>
<div>- Introducing the new function `maps:iterator/2` for creating an interator</div>
<div>  that return the map elements in a deterministic order.</div>
<div>  There are also new modifiers `k` and `K` for the format</div>
<div>  string in `io:format()` to support printing map elements</div>
<div>  ordered.</div>
<div><br>
</div>
<div>## Dialyzer</div>
<div><br>
</div>
<div>- Dialyzer has a new incremental mode that be invoked by</div>
<div>  giving the `--incremental` option when running Dialyzer.</div>
<div>  This new incremental mode is likely to become the</div>
<div>  default in a future release.</div>
<div><br>
</div>
<div>## Misc ERTS, Stdlib, Kernel, Compiler</div>
<div>- Multi [time warp mode](<a href="https://www.erlang.org/doc/apps/erts/time_correction.html#time-warp-modes">https://www.erlang.org/doc/apps/erts/time_correction.html#time-warp-modes</a>) is now enabled by default.</div>
<div>  This assumes that all code executing on the system is </div>
<div>  [time warp safe](<a href="https://www.erlang.org/doc/apps/erts/time_correction.html#time-warp-safe-code">https://www.erlang.org/doc/apps/erts/time_correction.html#time-warp-safe-code</a>).</div>
<div><br>
</div>
<div>- Support for UTF-8 atoms and strings in the NIF</div>
<div>  interface including new functions `enif_make_new_atom`,</div>
<div>  `enif_make_new_atom_len` and `enif_get_string_length`.</div>
<div><br>
</div>
<div>- The BIFs `min/2` and `max/2` are now allowed to be used in</div>
<div>  guards and match specs.</div>
<div><br>
</div>
<div>- Improved the selective receive optimization, which can</div>
<div>  now be enabled for references returned from other</div>
<div>  functions. This greatly improves the performance of</div>
<div>  `gen_server:send_request/3`, `gen_server:wait_response/2`,</div>
<div>  and similar functions.</div>
<div><br>
</div>
<div>- New trace feature `call_memory`. Similar to `call_time`</div>
<div>  tracing, but instead of measure accumulated time in</div>
<div>  traced functions it measures accumulated heap space</div>
<div>  consumed by traced functions. It can be used to compare</div>
<div>  how much different functions are contributing to</div>
<div>  garbage collection being triggered.</div>
<div><br>
</div>
<div>- It is no longer necessary to enable a feature in the</div>
<div>  runtime system in order to load modules that are using</div>
<div>  it. It is sufficient to enable the feature in the</div>
<div>  compiler when compiling it.</div>
<div><br>
</div>
<div>- `inet:setopts/2` has got 3 new options: `reuseport`, `reuseport_lb` and `exclusiveaddruse`.</div>
<div><br>
</div>
<div>- Fix so that `-fno-omit-frame-pointer` is applied to all</div>
<div>  of the Erlang VM when using the JIT so that tools, such</div>
<div>  as `perf`, can crawl the process stacks.</div>
<div><br>
</div>
<div>- In the `lists` module, the zip family of functions now takes</div>
<div>options to allow handling lists of different lengths.</div>
<div><br>
</div>
<div>- Added the `zip:zip_get_crc32/2` function to retrieve the</div>
<div>  `CRC32` checksum from an opened ZIP archive.</div>
<div>`gen_server` optimized by caching callback functions</div>
<div><br>
</div>
<div>- The modules Erlang DNS resolver `inet_res` and helper</div>
<div>modules have been updated for RFC6891; to handle OPT RR</div>
<div>with DNSSEC OK (DO) bit.</div>
<div><br>
</div>
<div>- Introduced `application:get_supervisor/1`.</div>
<div><br>
</div>
<div>- Cache OTP boot code paths, to limit how many folders</div>
<div>that are being accessed during a module lookup. Can be</div>
<div>disabled with `-cache_boot_path false`. </div>
<div><br>
</div>
<div>## SSL</div>
<div><br>
</div>
<div>- Support for Kernel TLS (kTLS), has been added to the</div>
<div>SSL application, for TLS distribution (`-proto_dist`</div>
<div>`inet_tls`), the SSL option `{ktls, true}`. </div>
<div>- Improved error checking and handling of ssl options.</div>
<div>- Mitigate memory usage from large certificate chains by</div>
<div>  lowering the maximum handshake size. This should not</div>
<div>  effect the common cases, if needed it can be configured</div>
<div>  to a higher value.</div>
<div><br>
</div>
<div>- For security reasons the `SHA1` and `DSA`</div>
<div>  algorithms are no longer among the default values.</div>
<div><br>
</div>
<div>- Add encoding and decoding of `use_srtp` hello extension</div>
<div>  to facilitate for `DTLS` users to implement `SRTP`</div>
<div>  functionality.</div>
<div><br>
</div>
<div>For more details about new features and potential incompatibilities see the [readme](<a href="https://erlang.org/download/otp_src_26.0-rc3.readme">https://erlang.org/download/otp_src_26.0-rc3.readme</a>)</div>
<div></div>
</body>
</html>