Erlang/OTP 28.0

Встречайте очередную мажорную версию 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:
SSL:
- Если ваша программа использует протокол TLS 1.3, то переход на версию Erlang/OTP 28 обеспечит ускорение от 15% до 25%.
Интеграция с редактором Emacs:
- Команда indent-region в редакторе Emacs теперь лучше обрабатывает многострочные строки.
Подробнее обо всех изменениях и возможных проблемах совместимости смотрите в ссылке под новостью или файле README.
>>> Запись в блоге: «Erlang/OTP 28 Highlights»
