02.02.2023

Erlang/OTP 25

Доступен 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’е будет осуществляться автоматическое тестирование, что позволит раньше обнаруживать ошибки привносимые предлагаемыми доработками.

Развёрнуто про наиболее интересные изменения можно прочитать здесь.

>>> Подробности

Источник.