<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);" class="elementToProof ContentPasted0">
<div data-pjax="true" data-test-selector="body-content" data-view-component="true" class="markdown-body my-3">
<p class="ContentPasted1">Erlang/OTP 26.0-rc1 is the first release candidate of three before the OTP 26.0 release.</p>
<p class="ContentPasted1">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.<br class="ContentPasted1">
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" class="ContentPasted1">https://github.com/erlang/otp/issues</a> or by posting to
<a href="https://erlangforums.com/" rel="nofollow" class="ContentPasted1">Erlangforums</a>.</p>
<p class="ContentPasted1">All artifacts for the release can be downloaded from the
<a href="https://github.com/erlang/otp/releases/tag/OTP-26.0-rc1" class="ContentPasted1">
Erlang/OTP Github</a> release and you can view the new documentation at <a href="https://erlang.org/documentation/doc-14.0-rc1/doc/" rel="nofollow" class="ContentPasted1">
https://erlang.org/documentation/doc-14.0-rc1/doc/</a>. You can also install the latest release using
<a href="https://github.com/kerl/kerl" class="ContentPasted1">kerl</a> like this: kerl build 26.0-rc1 26.0-rc1.</p>
<p class="ContentPasted1"><br>
</p>
<p class="ContentPasted1">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.</p>
<p class="ContentPasted1">Many thanks to all contributors!</p>
<p class="ContentPasted1">Below are some highlights of the release:</p>
<h1 class="ContentPasted1">Highlights</h1>
<h2 class="ContentPasted1">The Shell</h2>
<p class="ContentPasted1">There are a lot of new features and improvements in the Erlang shell:</p>
<ul>
<li class="ContentPasted1">auto-complete of variables, record names, record fields names, map keys, function parameter types and filenames.</li><li class="ContentPasted1">Open external editor in the shell to edit<br class="ContentPasted1">
the current expression.</li><li class="ContentPasted1">defining records (with types), functions, specs and types in the shell.</li></ul>
<h2 class="ContentPasted1">New terminal</h2>
<ul>
<li class="ContentPasted1">The TTY/terminal subsystem has been rewritten.<br class="ContentPasted1">
Windows users will notice that <code class="ContentPasted1">erl.exe</code> has the same<br class="ContentPasted1">
functionality as a normal Unix shell and that <code class="ContentPasted1">werl.exe</code> is just a<br class="ContentPasted1">
symlink to <code class="ContentPasted1">erl.exe</code>. This makes the Windows Erlang terminal<br class="ContentPasted1">
experience identical to that of Unix.</li></ul>
<h2 class="ContentPasted1">Compiler and JIT optimizations:</h2>
<ul>
<li>
<p class="ContentPasted1">Creation and matching of binaries with segments of fixed sizes have been optimized.</p>
</li><li>
<p class="ContentPasted1">Creation and matching of UTF-8 segments have been optimized.</p>
</li><li>
<p class="ContentPasted1">Appending to binaries has been optimized.</p>
</li><li>
<p class="ContentPasted1">The compiler and JIT now generate better code for creation of small maps where all keys<br class="ContentPasted1">
are literals known at compile time.</p>
</li><li>
<p class="ContentPasted1">Thanks to the optimizations above the performance of the
<code class="ContentPasted1">base64</code> module has been<br class="ContentPasted1">
significantly improved. For example, on an x86_64 system with the JIT both encode and<br class="ContentPasted1">
decode are almost three times faster than in Erlang/OTP 25.</p>
</li></ul>
<h2 class="ContentPasted1">Maps</h2>
<ul>
<li>
<p class="ContentPasted1">Map comprehensions as suggested in <a href="https://www.erlang.org/eeps/eep-0058" rel="nofollow" class="ContentPasted1">
EEP 58</a> has now been<br class="ContentPasted1">
implemented.</p>
</li><li>
<p class="ContentPasted1">Some map operations have been optimized by changing the<br class="ContentPasted1">
internal sort order of atom keys. This changes the<br class="ContentPasted1">
(undocumented) order of how atom keys in small maps are<br class="ContentPasted1">
printed and returned by <code class="ContentPasted1">maps:to_list/1</code> and <code class="ContentPasted1">
maps:next/1</code>.<br class="ContentPasted1">
The new order is unpredictable and may change between<br class="ContentPasted1">
different invocations of the Erlang VM.</p>
</li><li>
<p class="ContentPasted1">Introducing the new function <code class="ContentPasted1">
maps:iterator/2</code> for creating an interator<br class="ContentPasted1">
that return the map elements in a deterministic order.<br class="ContentPasted1">
There are also new modifiers <code class="ContentPasted1">k</code> and <code class="ContentPasted1">
K</code> for the format<br class="ContentPasted1">
string in <code class="ContentPasted1">io:format()</code> to support printing map elements<br class="ContentPasted1">
ordered.</p>
</li></ul>
<h2 class="ContentPasted1">Dialyzer</h2>
<ul>
<li class="ContentPasted1">Dialyzer has a new incremental mode that be invoked by<br class="ContentPasted1">
giving the <code class="ContentPasted1">--incremental</code> option when running Dialyzer.<br class="ContentPasted1">
This new incremental mode is likely to become the<br class="ContentPasted1">
default in a future release.</li></ul>
<h2 class="ContentPasted1">Misc ERTS, Stdlib, Kernel, Compiler</h2>
<ul>
<li>
<p class="ContentPasted1">Multi <a href="https://www.erlang.org/doc/apps/erts/time_correction.html#time-warp-modes" rel="nofollow" class="ContentPasted1">
time warp mode</a> is now enabled by default.<br class="ContentPasted1">
This assumes that all code executing on the system is<br class="ContentPasted1">
<a href="https://www.erlang.org/doc/apps/erts/time_correction.html#time-warp-safe-code" rel="nofollow" class="ContentPasted1">time warp safe</a>.</p>
</li><li>
<p class="ContentPasted1">Support for UTF-8 atoms and strings in the NIF<br class="ContentPasted1">
interface including new functions <code class="ContentPasted1">enif_make_new_atom</code>,<br class="ContentPasted1">
<code class="ContentPasted1">enif_make_new_atom_len</code> and <code class="ContentPasted1">
enif_get_string_length</code>.</p>
</li><li>
<p class="ContentPasted1">The BIFs <code class="ContentPasted1">min/2</code> and <code class="ContentPasted1">
max/2</code> are now allowed to be used in<br class="ContentPasted1">
guards and match specs.</p>
</li><li>
<p class="ContentPasted1">Improved the selective receive optimization, which can<br class="ContentPasted1">
now be enabled for references returned from other<br class="ContentPasted1">
functions. This greatly improves the performance of<br class="ContentPasted1">
<code class="ContentPasted1">gen_server:send_request/3</code>, <code class="ContentPasted1">
gen_server:wait_response/2</code>,<br class="ContentPasted1">
and similar functions.</p>
</li><li>
<p class="ContentPasted1">New trace feature <code class="ContentPasted1">call_memory</code>. Similar to
<code class="ContentPasted1">call_time</code><br class="ContentPasted1">
tracing, but instead of measure accumulated time in<br class="ContentPasted1">
traced functions it measures accumulated heap space<br class="ContentPasted1">
consumed by traced functions. It can be used to compare<br class="ContentPasted1">
how much different functions are contributing to<br class="ContentPasted1">
garbage collection being triggered.</p>
</li><li>
<p class="ContentPasted1">It is no longer necessary to enable a feature in the<br class="ContentPasted1">
runtime system in order to load modules that are using<br class="ContentPasted1">
it. It is sufficient to enable the feature in the<br class="ContentPasted1">
compiler when compiling it.</p>
</li><li>
<p class="ContentPasted1"><code class="ContentPasted1">inet:setopts/2</code> has got 3 new options:
<code class="ContentPasted1">reuseport</code>, <code class="ContentPasted1">reuseport_lb</code> and
<code class="ContentPasted1">exclusiveaddruse</code>.</p>
</li><li>
<p class="ContentPasted1">Fix so that <code class="ContentPasted1">-fno-omit-frame-pointer</code> is applied to all<br class="ContentPasted1">
of the Erlang VM when using the JIT so that tools, such<br class="ContentPasted1">
as <code class="ContentPasted1">perf</code>, can crawl the process stacks.</p>
</li><li>
<p class="ContentPasted1">In the <code class="ContentPasted1">lists</code> module, the zip family of functions now takes<br class="ContentPasted1">
options to allow handling lists of different lengths.</p>
</li><li>
<p class="ContentPasted1">Added the <code class="ContentPasted1">zip:zip_get_crc32/2</code> function to retrieve the<br class="ContentPasted1">
<code class="ContentPasted1">CRC32</code> checksum from an opened ZIP archive.<br class="ContentPasted1">
<code class="ContentPasted1">gen_server</code> optimized by caching callback functions</p>
</li><li>
<p class="ContentPasted1">The modules Erlang DNS resolver <code class="ContentPasted1">
inet_res</code> and helper<br class="ContentPasted1">
modules have been updated for RFC6891; to handle OPT RR<br class="ContentPasted1">
with DNSSEC OK (DO) bit.</p>
</li><li>
<p class="ContentPasted1">Introduced <code class="ContentPasted1">application:get_supervisor/1</code>.</p>
</li><li>
<p class="ContentPasted1">Cache OTP boot code paths, to limit how many folders<br class="ContentPasted1">
that are being accessed during a module lookup. Can be<br class="ContentPasted1">
disabled with <code class="ContentPasted1">-cache_boot_path false</code>.</p>
</li></ul>
<h2 class="ContentPasted1">SSL</h2>
<ul>
<li>
<p class="ContentPasted1">Support for Kernel TLS (kTLS), has been added to the<br class="ContentPasted1">
SSL application, for TLS distribution (<code class="ContentPasted1">-proto_dist</code><br class="ContentPasted1">
<code class="ContentPasted1">inet_tls</code>), the SSL option <code class="ContentPasted1">
{ktls, true}</code>.</p>
</li><li>
<p class="ContentPasted1">Improved error checking and handling of ssl options.</p>
</li><li>
<p class="ContentPasted1">Mitigate memory usage from large certificate chains by<br class="ContentPasted1">
lowering the maximum handshake size. This should not<br class="ContentPasted1">
effect the common cases, if needed it can be configured<br class="ContentPasted1">
to a higher value.</p>
</li><li>
<p class="ContentPasted1">For security reasons the <code class="ContentPasted1">SHA1</code> and
<code class="ContentPasted1">DSA</code><br class="ContentPasted1">
algorithms are no longer among the default values.</p>
</li><li>
<p class="ContentPasted1">Add encoding and decoding of <code class="ContentPasted1">
use_srtp</code> hello extension<br class="ContentPasted1">
to facilitate for <code class="ContentPasted1">DTLS</code> users to implement <code class="ContentPasted1">
SRTP</code><br class="ContentPasted1">
functionality.</p>
</li></ul>
</div>
<br>
</div>
</body>
</html>