Встречайте очередную мажорную версию Erlang/OTP!
Erlang/OTP — программный каркас (фреймворк), содержащий набор библиотек и шаблонов проектирования для построения масштабируемых распределённых приложений на языке программирования Erlang.
Новые возможности языка:
- Появилась возможность отправлять процессам приоритетные сообщения (см. EEP 76).
- Улучшение под названием «zip генераторы» позволяет запускать несколько списковых генераторов (comprehensions) параллельно:
[A+B || A <- [1,2,3] && B <- [4,5,6]]
сформирует список:[5,7,9]
. - Списковые генераторы теперь могут быть строгими и при несовпадении шаблона кидать исключение, вместо игнорирования аргумента:
1> [X ||{ok, X} <- [{ok, 1}, error, {ok, 3}]].
[1,3]
2> [X ||{ok, X} <:- [{ok, 1}, error, {ok, 3}]].
** exception error: no match of right hand side value error
- Теперь для чисел с плавающей точкой можно использовать любое основание (см. EEP 75).
Улучшения компилятора и JIT:
- Ранее размер атома был ограничен 255 байтами, это означало, что атом с идентификатором состоящим только из эмодзи, мог быть не длинее 63 символов. Теперь длина идентификатора ограничена 255 символами, а не байтами.
- Компилятор может подсказать как поправить некоторые типы ошибок. Например, при попытке использовать неопределённую переменную
A
, при определённойA0
, может быть напечатано сообщение:'A' is unbound, did you mean 'A0'?
. - Опция
warn_deprecated_catch
включает предупреждения при использовании устаревших выражений catch в формеcatch Expr
вместо современногоtry
…catch
…end
. - Некоторые встроенные функции с побочными эффектами (например,
binary_to_atom/1
) оптимизируются в блокахtry
…catch
таким же образом, как guard BIF’ы, что повышает производительность. - Анализ псевдонимов компилятором стал быстрее и менее консервативным, позволяя применять оптимизации записей и бинарных структур в большем количестве случаев.
- Для некоторых аргументов оптимизирована работа
maps:put/3
.
Изменения в ERTS:
- Добавлена функция
trace:system/3
. Она обладает интерфейсом, аналогичнымerlang:system_monitor/2
, но дополнительно поддерживает трассировку сессий. - Функция
os:set_signal/2
теперь поддерживает установку обработчиков сигналовSIGWINCH
,SIGCONT
иSIGINFO
. - Две новые встроенные функции (
erlang:processes_iterator/0
иerlang:process_next/1
) позволяют эффективно обходить таблицу процессов, улучшая масштабируемость по сравнению с функциейerlang:processes/0
.
Интерфейс командной строки и терминал:
- Режим запуска
erl -noshell
обновлен двумя подрежимами:raw
иcooked
. Подрежимcooked
соответствует старому поведению, а режимraw
может испльзоваться для обхода поддержки редактирования строк в терминале. В режимеraw
нажатия считываются по мере их поступления, без ожидания нажатия «Enter». Кроме того, режимraw
отключает отображение введенных символов на экране; - Терминальная оболочка теперь выводит подсказку о способе прерывания долго выполняющихся команд, если команда выполняется дольше пяти секунд.
STDLIB:
- В модуле binary появилась функция
join(Binaries, Separator)
позволяющая объединять список двочиных строк. - По умолчанию наборы (sets), создаваемые модулем sets, теперь представляются в виде ассоциативных таблиц (maps).
- Модуль регулярных выражений re перешел на использование библиотеки PCRE2 взамен устаревшей PCRE.
- Появился модуль zstd, поддерживающий сжатие в формате Zstandard.
Dialyzer:
- Реализованы EEP 69: номинальные типы.
SSL:
- Если ваша программа использует протокол TLS 1.3, то переход на версию Erlang/OTP 28 обеспечит ускорение от 15% до 25%.
Интеграция с редактором Emacs:
- Команда indent-region в редакторе Emacs теперь лучше обрабатывает многострочные строки.
Подробнее обо всех изменениях и возможных проблемах совместимости смотрите в ссылке под новостью или файле README.