04.07.2022

Erlang/OTP 25-rc1

Доступен первый (из трёх) релиз-кандидат грядущей мажорной версии Erlang/OTP 25.

Цель релиза — получить обратную связь от пользователей. Разработчики приветствуют даже отзывы вида: «У меня всё работает». Подробнее о способах оставить отклик и получить файлы OTP 25-rc1 можно прочитать по ссылке под новостью.

ERTS и JIT

  • JIT теперь доступна и на 64-разрядных ARM процессорах.
  • JIT научилась осуществлять типозависимые оптимизации на основе информации из BEAM-файлов.
  • Улучшена поддержка JIT для внешних инструментов вроде perf и gdb, позволяющая показывать номера строк и оригинальный 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.

  • Переработаны сообщения об ошибках конструирования бинарных значений.

Модуль Crypto

  • Добавлена функция crypto:hash_equals/2 способная осуществить сравнение двух дайджестов за константное время.

Разное

  • Новое HOWTO для разработчиков описывает как собирать и тестировать Erlang/OTP-приложения в процессе исправления ошибок или добавления нового функционала.

  • Теперь для каждого нового Pull-запроса на Github’е будет осуществляться автоматическое тестирование, что позволит раньше обнаруживать ошибки привносимые предлагаемыми доработками.

Подробный список изменений можно посмотреть здесь.

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

Источник.