LINUX.ORG.RU

Erlang/OTP 25-rc1

 ,


0

1

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

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

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

★★★★★

Проверено: hobbit ()
Последнее исправление: maxcom (всего исправлений: 3)

В оригинале больше изменений. Я пропустил то чего не понимаю во избежание гениталий на гусеничном ходу.

perl5_guy ★★★★★
() автор топика

Один из тех ЯП, встречая упоминание о которых, я всякий раз жалею, что не осилил.

hobbit ★★★★★
()

Hello Mike.

anonymous
()
Ответ на: комментарий от anonymous

Согласен с Михаилом. Синтаксически язык простой, но нужно знать гору всяких вещей чтоб исполнить что-то серьёзное и сделать это качественно.

perl5_guy ★★★★★
() автор топика
Ответ на: комментарий от anonymous

erlang он ну очень специфический. Как к примеру sql - можно сделать очень сложные вещи (написать всю бизнес логику), но для этого нужен опыт.

anonymous
()
Ответ на: комментарий от anonymous

Имаксе?

Это универсальная текстовая среда. Других просто не существует ;)

Слава ТНБ, людям иногда достаточно одного неудачного опыта, чтобы больше не повторять подобных ошибок. Потому и не существует «других».

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

Мог бы выйти занятный оффтопик, но мне право неловко так открыто попирать значимость Erlang’а.

anonymous
()
Ответ на: комментарий от EXL

WeChat - более 1.2 млрд. клиентов на январь 2022. Ну и ватсапчик конечно.

anonymous
()

Реализована конструкция maybe … end

мдааа. лучше бы определяемые юзером операторы запилили. встраивать в синтаксис монаду maybe такая себе идея.

anonymous
()
Ответ на: комментарий от EXL

Вот RabbitMQ, например. Даже в фейсбучный чатик имеет erlang в бекенде. В телекоме много кто использует. А да,

How do you support 450 million users with only 32 engineers? For WhatsApp, the answer was Erlang.

Достаточно?

gns ★★★★★
()

Подождем релиза. И да, куда-то емаксовый Distel продевали. Или есть что-то более модное?

gns ★★★★★
()
Ответ на: комментарий от hobbit

Он познаваемее Хаскеля, как мне кажется. :) Хотя, вопрос «как на этом языке сделать вот это?», все равно сложен.

gns ★★★★★
()

Реализована конструкция maybe ... end из EPP-49. Она позволяет упростить код который раньше приходилось писать с множеством глубоко вложенных условий.

А в Elixir благодаря наличию в языке макросов добавить подобную конструкцию получилось ещё давным-давно и без модификации языка.

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

Хотя with/1 реализована как специальная форма, так что тут я не прав. Но можно в теории сделать и через макрос.

theNamelessOne ★★★★★
()
Ответ на: комментарий от anonymous

Из OTP на первое время хватит 3 вещей:

  • приложения;
  • супервизоры;
  • генсерверы.

Уже с этим набором можно начинать с нуля писать код.

theNamelessOne ★★★★★
()
Ответ на: комментарий от hobbit

Хаскель или пролог тыкал? Если да, то эрланг учится за неделю.

buddhist ★★★★★
()
Ответ на: комментарий от leave

Просто он учил эрланг 2 дня, а нужно было неделю

anonymous
()
Ответ на: комментарий от Sin2x

О языке оно говорит то, что когда эрлангисты хвалятся, что можно макаку-кодера после недельного курса сажать писать код, и этот код будет работать — они говорят правду. Этот код будет работать. Пока не перестанет. И, в результате, последствия придётся разгребать кому-нибудь другому через несколько лет, убив на это хрен знает сколько времени.

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

Надо было прочитать красные буковки где про ошибку сопоставления с образцом писал beam, а не показывать свою некомпетентность в жж

anonymous
()

На какой планете живут люди, пишущие на ерланге ?

kto_tama ★★★★★
()
Ответ на: комментарий от theNamelessOne

Что-то не верится, что dialyzer такого бы не поймал.

Не знаю. Как я там писал в комментах, dialyzer по моему опыту ловит далеко не всё, и даёт false positives.

Miguel ★★★★★
()
Ответ на: комментарий от Miguel
Starting Dialyzer
[
  check_plt: false,
  init_plt: '/dev/shm/lor/_build/dev/dialyxir_erlang-24.0_elixir-1.13.0_deps-dev.plt',
  files: ['/dev/shm/lor/_build/dev/lib/lor/ebin/Elixir.Lor.Application.beam',
   '/dev/shm/lor/_build/dev/lib/lor/ebin/Elixir.Lor.beam'],
  warnings: [:unknown]
]
Total errors: 1, Skipped: 0, Unnecessary Skips: 0
done in 0m0.98s
lib/lor.ex:8:callback_type_mismatch
Type mismatch for @callback handle_cast/2 in GenServer behaviour.

Expected type:

  {:noreply, _}
  | {:noreply, _, :hibernate | :infinity | non_neg_integer() | {:continue, _}}
  | {:stop, _, _}


Actual type:
{:ok, []}

________________________________________________________________________________
done (warnings were emitted)
Halting VM with exit status 2

Раньше я был молодой и глупый, думал что люди необоснованно критикуют Perl.

perl5_guy ★★★★★
() автор топика
Ответ на: комментарий от perl5_guy

Там в комментах люди гоняли диалайзер, вроде, иногда работает, иногда — нет. Я оттуда ушёл лет семь назад, и с тех пор с Эрлангом не работаю.

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

Вот пример на Elixir, но суть будет та же:

defmodule TestServer do
  use GenServer

  @impl GenServer
  def init(_init_arg), do: {:ok, []}

  @impl GenServer
  def handle_cast(:msg, state), do: {:ok, state}
end
$ mix dialyzer
[...]
lib/test_server.ex:8:callback_type_mismatch
Type mismatch for @callback handle_cast/2 in GenServer behaviour.

Expected type:

  {:noreply, _}
  | {:noreply, _, :hibernate | :infinity | non_neg_integer() | {:continue, _}}
  | {:stop, _, _}


Actual type:
{:ok, _}

________________________________________________________________________________
done (warnings were emitted)
Halting VM with exit status 2

dialyzer по моему опыту ловит далеко не всё, и даёт false positives.

Dialyzer имеет свои ограничения, но я не вижу повода от него отказываться только потому, что он отлавливает процентов 70 ошибок типов вместо 100%.

theNamelessOne ★★★★★
()
Ответ на: комментарий от Miguel

Допускаю что в 2016 году могло быть так, но сейчас на календаре 2022 и диалаизер не пропускает подобное дерьмо. Да и без диалайзера там бы все логи были засраны ошибками - бери да чини.

perl5_guy ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.