<div dir="ltr"><div class="gmail-markdown-body gmail-my-3"><h1>OTP 25.0-rc1</h1>
<p>Erlang/OTP 25.0-rc1 is the first release candidate of three before the OTP 25.0 release.</p>
<p>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>
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 <a href="https://erlangforums.com" rel="nofollow">Erlangforums</a> or the mailing list <a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a>.</p>
<p>All artifacts for the release can be downloaded from the <a href="https://github.com/erlang/otp/releases/tag/OTP-25.0-rc1">Erlang/OTP Github</a> release and you can view the new documentation at <a href="https://erlang.org/documentation/doc-13.0-rc1/doc/" rel="nofollow">https://erlang.org/documentation/doc-13.0-rc1/doc/</a>. You can also install the latest release using <a href="https://github.com/kerl/kerl">kerl</a> like this: <code>kerl build 25.0-rc1 25.0-rc1</code>.</p>
<p>Erlang/OTP 25 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>Many thanks to all contributors!</p>
<p>Below are some highlights of the release:</p>
<h2>Highlights</h2>
<h3>erts & jit</h3>
<ul><li>The JIT now works for 64-bit ARM processors.</li><li>The JIT now does type-based optimizations based on type<br>
information in the BEAM files.</li><li>Improved the JIT's support for external tools like <code>perf</code><br>
and <code>gdb</code>, allowing them to show line numbers and even<br>
the original Erlang source code when that can be found.</li></ul>
<h3>erts, stdlib, kernel</h3>
<ul><li>
<p>Users can now configure ETS tables with the<br>
<code>{write_concurrency, auto}</code> option. This option forces<br>
tables to automatically change the number of locks that<br>
are used at run-time depending on how much concurrency<br>
is detected. The <code>{decentralized_counters, true}</code> option<br>
is enabled by default when <code>{write_concurrency, auto}</code> is<br>
active.</p>
<p>Benchmark results comparing this option with the other<br>
ETS optimization options are available here:<br>
<a href="https://erlang.org/bench/ets_bench_result_lock_config.html" rel="nofollow">benchmarks</a>.</p>
</li><li>
<p>To enable more optimizations, BEAM files compiled with<br>
OTP 21 and earlier cannot be loaded in OTP 25.</p>
</li><li>
<p>The signal queue of a process with<br>
the process flag <code>message_queue_data=off_heap</code> has been optimized to<br>
allow parallel reception of signals from multiple processes.<br>
This can improve performance when many processes are sending in parallel to<br>
one process. <a href="https://erlang.org/bench/sigq_bench_result.html" rel="nofollow">See benchmark</a>.</p>
</li><li>
<p>The Erlang installation directory is now relocatable on<br>
the file system given that the paths in the<br>
installation's RELEASES file are paths that are<br>
relative to the installations root directory.</p>
</li><li>
<p>A new option called <code>short</code> has been added to the<br>
functions <code>erlang:float_to_list/2</code> and<br>
<code>erlang:float_to_binary/2</code>. This option creates the<br>
shortest correctly rounded string representation of the<br>
given float that can be converted back to the same<br>
float again.</p>
</li><li>
<p>Introduction of <code>quote/1</code> and <code>unquote/1</code> functions in<br>
the <code>uri_string</code> module - a replacement for the deprecated functions <code>http_uri:encode</code><br>
and <code>http_uri:decode</code>.</p>
</li><li>
<p>The new module <code>peer</code> supersedes the <code>slave</code> module. The<br>
<code>slave</code> module is now deprecated and will be removed in OTP 27.</p>
</li><li>
<p><code>global</code> will now by default prevent<br>
overlapping partitions due to network issues. This is done by<br>
actively disconnecting from nodes that reports that<br>
they have lost connections to other nodes. This will<br>
cause fully connected partitions to form instead of<br>
leaving the network in a state with overlapping<br>
partitions.</p>
<p>It is possible to turn off the new behavior by setting the<br>
the <code>kernel</code> configuration parameter <code>prevent_overlapping_partitions</code> to <code>false</code>.<br>
Doing this will retain the same behavior as in OTP 24 and earlier.</p>
</li><li>
<p>The <code>format_status/2</code> callback for <code>gen_server</code>, <code>gen_statem</code><br>
and <code>gen_event</code> has been deprecated in favor of the new<br>
<code>format_status/1</code> callback.</p>
<p>The new callback adds the possibility to limit and<br>
change many more things than the just the state.</p>
</li><li>
<p>The <code>timer</code> module has been modernized and made more<br>
efficient, which makes the timer server less<br>
susceptible to being overloaded. The <code>timer:sleep/1</code><br>
function now accepts an arbitrarily large integer.</p>
</li></ul>
<h3>Compiler</h3>
<ul><li>
<p>The <code>maybe ... end</code> construction as proposed in <a href="https://www.erlang.org/eeps/eep-0049" rel="nofollow"><code>EEP-49</code></a><br>
has been implemented. It can simplify complex code<br>
where otherwise deeply nested cases would have to be<br>
used.</p>
<p>To enable <code>maybe</code>, give the option <code>{enable,maybe_expr}</code> to<br>
the compiler. The exact option to use will change in a coming release candidate and then it will also be possible to<br>
use from inside the module being compiled.</p>
</li><li>
<p>When a record matching or record update fails, a<br>
<code>{badrecord, ExpectedRecordTag}</code> exception used to be<br>
raised. In this release, the exception has been changed<br>
to <code>{badrecord, ActualValue}</code>, where <code>ActualValue</code> is the<br>
value that was found instead of the expected record.</p>
</li><li>
<p>Add compile attribute <code>-nifs()</code> to empower compiler and loader with<br>
information about which functions may be overridden as NIFs by <code>erlang:load_nif/2</code>.</p>
</li><li>
<p>Improved and more detailed error messages when binary construction with the<br>
binary syntax fails.<br>
This applies both for error messages in the shell and for<br>
<code>erl_error:format_exception/3,4</code>.</p>
</li></ul>
<h3>Crypto</h3>
<ul><li>Add <code>crypto:hash_equals/2</code> which is a constant time comparision of hashvalues.</li></ul>
<h3>Dialyzer</h3>
<ul><li>Optimize operations in the <code>erl_types</code> module. Parallelize the Dialyzer pass remote.</li><li>Added the <code>missing_return</code> and <code>extra_return</code> options to<br>
raise warnings when specifications differ from inferred<br>
types. These are similar to, but not quite as verbose<br>
as overspecs and underspecs.</li><li>Dialyzer now better understands the types for <code>min/2</code>,<br>
<code>max/2</code>, and <code>erlang:raise/3</code>. Because of that, Dialyzer<br>
can potentially generate new warnings. In particular,<br>
functions that use <code>erlang:raise/3</code> could now need a spec<br>
with a <code>no_return()</code> return type to avoid an unwanted<br>
warning.</li></ul>
<h3>Misc</h3>
<ul><li>A new <a href="https://github.com/erlang/otp/blob/master/HOWTO/DEVELOPMENT.md">DEVELOPMENT HOWTO guide</a> has been added that<br>
describes how to build and test Erlang/OTP when fixing<br>
bugs or developing new functionality.</li><li>Testing has been<br>
added to the Github actions run for each opened PR so<br>
that more bugs are caught earlier when bug fixes and<br>
new features are proposed.</li></ul>
<p>For more details about new features and potential incompatibilities see</p>
<ul><li><a href="https://erlang.org/download/otp_src_25.0-rc1.readme" rel="nofollow">https://erlang.org/download/otp_src_25.0-rc1.readme</a></li></ul></div></div>