Доступен Erlang/OTP 25. Выпуск содержит новые функции, улучшения и доработки, нарушающие обратную совместимость.
Наиболее интересные изменения
stdlib
- Новая функция
filelib:ensure_path/1
позволяющая убедиться, что перечисленные в пути каталоги существуют; - Новые функции для модуля
lists
:uniq/1
иuniq/2
; - В модуль
rand
добавлен быстрый генератор псевдослучайных чисел. Подробнее можно прочитать в статье «Fast random integers».
Компилятор, kernel, stdlib, syntax_tools
- Появилась возможность включать экспериментальные нововведения как указано в EEP-60. Доработки активируются на этапе компиляции с помощью аргументов командной строки
erlc
или директив в файле с исходным кодом. Аналогичные параметры могут быть использованы со средой выполненияerl
. Примером может служить экспериментальная конструкцияmaybe
(EEP-49), доступная какmaybe_expr
.
erts и JIT
- JIT заработал на 64-битных ARM-процессорах;
- JIT поддерживает типозависимые оптимизации на основе информации из BEAM-файлов;
- Такие инструменты, как
perf
иgdb
, лучше поддерживают JIT, что позволяет показывать номера строк и даже оригинальный код Erlang.
erts, stdlib, kernel
- Доступна новая настройка для ETS-таблиц:
{write_concurrency, auto}
. Она включает для таблиц автоматическое регулирование числа блокировок в зависимости от текущего объёма конкурентности. Настройка{decentralized_counters, true}
включается автоматически, если{write_concurrency, auto}
активирована.
Результаты замеров производительности доступны здесь; - BEAM-файлы собранные под OTP 21 и раньше не совместимы с новой версией. Данное ограничение необходимо для возможности задействовать свежие оптимизации в полном объёме;
- Очередь сигналов процесса с флагом
message_queue_data=off_heap
оптимизирована для обеспечения параллельного приёма сообщений от множества процессов (см. замеры производительности); - Появилась возможность делать пути в файлах проекта относительными. Таким образом можно менять положение системного каталога Erlang без необходимости пересборки приложений;
- Для функций
:erlang:float_to_list/2
иerlang:float_to_binary/2
доступен параметрshort
. Он позволяет создать кратчайшее строковое представление числа, которое можно будет сконвертировать обратно в исходное; - В модуле
uri_string
доступны две новые функцииquote/1
иunqoute/1
. Они заменяют признанные нежелательнымиhttp_uri:encode
иhttp_uri:decode
; - Модуль
peer
заменил модульslave
, который признан нежелательным и будет удалён в OTP 27; - Функция обратного вызова
format_status/2
для модулейgen_server
,gen_statem
иgen_event
признана нежелательной в пользуformat_status/1
. Новая функция добавляет возможность ограничивать и изменять множества разных вещей, а не только состояние; - Модуль
timer
был улучшен и оптимизирован, что сделало сервер таймера более устойчивым к перегрузкам. Функцияtimer:sleep/1
теперь принимает любое большое целое.
Компилятор
- Реализована конструкция
maybe ... end
из EPP-49. Она позволяет упростить код, который раньше приходилось писать с множеством глубоко вложенных условий. Для включения нового функционала необходимо передать компилятору настройку{enable_feature, maybe_expr}
; - Исключение
{badrecord, ExpectedRecordTag}
выбрасываемое при неудачной попытке сопоставления записи (record
) с образцом или попытке её обновления, было заменено на{badrecord, ActualValue}
, гдеActualValue
– значение которое было передано вместо ожидаемого; - Доступен новый атрибут
-nifs()
, сигнализирующий компилятору и загрузчику какие функции могут быть переопределены с помощью NIF, функциейerlang:load_nif/2
; - Тексты ошибок создания битовых значений с помощью соответствующего синтаксиса (
<<...>>
) были улучшены и дополнены. Это касается как сообщений в оболочке так и выводаerl_error:format_status/3,4
; - Формат настроек для особенностей (англ. «features») стал более последовательным. Аргументы
erlc
иcompile(...)
теперь выглядят так:{feature, feature-name, enable | disable}
. Директива-feature(...)
имеет формат-feature(feature-name, enable | disable)
.
Модуль Crypto
- Добавлена функция
crypto:hash_equals/2
, способная осуществить сравнение двух дайджестов за константное время.
ssl
- Добавлена экспериментальная настройка
{certs_keys,[cert_key_conf()]}
, нужная для аутентификации клиента или сервера с помощью сертификатов и ключей.
public_key
- Добавлены функции для получения сертификатов операционной системы.
Диалайзер
- Различные оптимизации и новые предупреждения. Также появились новые настройки
missing_return
иextra_return
.
Разное
-
Новое HOWTO для разработчиков описывает как собирать и тестировать Erlang/OTP-приложения в процессе исправления ошибок или добавления нового функционала;
-
Теперь для каждого нового Pull-запроса на Github’е будет осуществляться автоматическое тестирование, что позволит раньше обнаруживать ошибки привносимые предлагаемыми доработками.
Развёрнуто про наиболее интересные изменения можно прочитать здесь.
>>> Подробности