OTP 25.0-rc1
Erlang/OTP 25.0-rc1 is the first release candidate of three before the OTP 25.0 release.
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.
We encourage users to try it out and give us feedback either by creating an issue here Issues · erlang/otp · GitHub or by posting to Erlangforums or the mailing list erlang-questions@erlang.org.
All artifacts for the release can be downloaded from the Erlang/OTP Github release and you can view the new documentation at Erlang/OTP 25.0 Release Candidate 1. You can also install the latest release using kerl like this: kerl build 25.0-rc1 25.0-rc1.
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.
Many thanks to all contributors!
Below are some highlights of the release:
Highlights
erts & jit
- The JIT now works for 64-bit ARM processors.
- The JIT now does type-based optimizations based on type
information in the BEAM files. - Improved the JIT’s support for external tools like
perf
andgdb, allowing them to show line numbers and even
the original Erlang source code when that can be found.
erts, stdlib, kernel
- Users can now configure ETS tables with the
{write_concurrency, auto}option. This option forces
tables to automatically change the number of locks that
are used at run-time depending on how much concurrency
is detected. The{decentralized_counters, true}option
is enabled by default when{write_concurrency, auto}is
active.Benchmark results comparing this option with the other
ETS optimization options are available here:
benchmarks. - To enable more optimizations, BEAM files compiled with
OTP 21 and earlier cannot be loaded in OTP 25. - The signal queue of a process with
the process flagmessage_queue_data=off_heaphas been optimized to
allow parallel reception of signals from multiple processes.
This can improve performance when many processes are sending in parallel to
one process. See benchmark. - The Erlang installation directory is now relocatable on
the file system given that the paths in the
installation’s RELEASES file are paths that are
relative to the installations root directory. - A new option called
shorthas been added to the
functionserlang:float_to_list/2and
erlang:float_to_binary/2. This option creates the
shortest correctly rounded string representation of the
given float that can be converted back to the same
float again. - Introduction of
quote/1andunquote/1functions in
theuri_stringmodule - a replacement for the deprecated functionshttp_uri:encode
andhttp_uri:decode. - The new module
peersupersedes theslavemodule. The
slavemodule is now deprecated and will be removed in OTP 27. -
globalwill now by default prevent
overlapping partitions due to network issues. This is done by
actively disconnecting from nodes that reports that
they have lost connections to other nodes. This will
cause fully connected partitions to form instead of
leaving the network in a state with overlapping
partitions.It is possible to turn off the new behavior by setting the
thekernelconfiguration parameterprevent_overlapping_partitionstofalse.
Doing this will retain the same behavior as in OTP 24 and earlier. - The
format_status/2callback forgen_server,gen_statem
andgen_eventhas been deprecated in favor of the new
format_status/1callback.The new callback adds the possibility to limit and
change many more things than the just the state. - The
timermodule has been modernized and made more
efficient, which makes the timer server less
susceptible to being overloaded. Thetimer:sleep/1
function now accepts an arbitrarily large integer.
Compiler
- The
maybe ... endconstruction as proposed inEEP-49
has been implemented. It can simplify complex code
where otherwise deeply nested cases would have to be
used.To enablemaybe, give the option{enable_feature, maybe_expr}to
the compiler. The exact option to use will change in a coming release candidate and then it will also be possible to
use from inside the module being compiled. - When a record matching or record update fails, a
{badrecord, ExpectedRecordTag}exception used to be
raised. In this release, the exception has been changed
to{badrecord, ActualValue}, whereActualValueis the
value that was found instead of the expected record. - Add compile attribute
-nifs()to empower compiler and loader with
information about which functions may be overridden as NIFs byerlang:load_nif/2. - Improved and more detailed error messages when binary construction with the
binary syntax fails.
This applies both for error messages in the shell and for
erl_error:format_exception/3,4.
Crypto
- Add
crypto:hash_equals/2which is a constant time comparision of hashvalues.
Dialyzer
- Optimize operations in the
erl_typesmodule. Parallelize the Dialyzer pass remote. - Added the
missing_returnandextra_returnoptions to
raise warnings when specifications differ from inferred
types. These are similar to, but not quite as verbose
as overspecs and underspecs. - Dialyzer now better understands the types for
min/2,
max/2, anderlang:raise/3. Because of that, Dialyzer
can potentially generate new warnings. In particular,
functions that useerlang:raise/3could now need a spec
with ano_return()return type to avoid an unwanted
warning.
Misc
- A new DEVELOPMENT HOWTO guide has been added that
describes how to build and test Erlang/OTP when fixing
bugs or developing new functionality. - Testing has been
added to the Github actions run for each opened PR so
that more bugs are caught earlier when bug fixes and
new features are proposed.
For more details about new features and potential incompatibilities see