- PVSM.RU - https://www.pvsm.ru -

Боевой арсенал Erlang разработчика

Доброе время суток, уважаемая аудитория хабра.

В данной публикации я хотел описать свой опыт перехода с корпоративного Java на Erlang.

Погружения в Erlang в первом приближении

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

После довольно продолжительного времени Java/Python разработки, я решил кардинально изменить сферу деятельность и открыл для себя Erlang.

После многопоточного хела Java, Erlang предложил более аккуратную и менее ресурсоемкую модель решения проблемы многопоточного программирования — модель акторов.

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

Хотя стоит заметить, что «настоящая» многопоточность была введена в Erlang относительно недавно, в 2006 году. После реализации SMP(Symmetrical Multi Processor) внутри Erlang VM.

Боевой арсенал Erlang разработчика
Данная реализация датирована 2008 годом, к сожалению я не нашел описания последней реализации, но скорее всего они ушли от разделяемой очереди на все планировщики.
Если в кратце, то поддержка SMP позволяет использовать от 1 до 1024 планировщиков процесса, которые работают внутри каждого потока. Планировщики вынимают Erlang процессы и IO задачи из общей очереди. В SMP все разделяемые структуры данных защищены блокировкам. Очередь задач является примером такой структуры. Данная реализация [1] была описана в 2008 году, и разработчики уже тогда планировали уйти от общей очереди задач к очередями на каждый планировщик.

Инструменты сборки и развертывания

При переходе с хорошо прикормленного Enterprise Java мира, где есть почти все, что нужно и под любыми лицензиями, стоит только об этом подумать, а оно уже лежит где-нибудь в открытом источнике. Я столкнулся с тем, что в мире Erlang отсутствует очень много необходимых инструментов, библиотек, интеграционных технологий, статей, мануалов.

К сожалению, в Erlang нет централизованного места хранения проектов и библиотек, поэтому github дефакто стал той самой площадкой, где публикуются Erlang проекты.

Предлагаю ознакомиться со списком того, без чего очень тяжело работать Erlang разработчику.

Начнем со средств автоматизации развертывания платформы и сборки проекта.

Kerl [2]

Без этого скрипта было бы очень сложно выполнять тестирования своих приложений на разных версиях Erlang. Позволяет собрать необходимый вам билд Erlang из исходников, добавляет его в глобальный список, позволяет установить собранный билд в необходимую директорию и после очень удобно переключаться между сборками.

Типичный пример использования

Получаем список возможных релизов:

$ kerl list releases

Getting the available releases from erlang.org…
R10B-0 R10B-2 R10B-3 R10B-4 R10B-5 R10B-6 R10B-7 R10B-8 R10B-9 R11B-0 R11B-1
R11B-2 R11B-3 R11B-4 R11B-5 R12B-0 R12B-1 R12B-2 R12B-3 R12B-4 R12B-5 R13A
R13B R13B01 R13B02 R13B03 R13B04 R14A R14B R14B01 R14B02
Run "./kerl update releases" to update this list from erlang.org

Собираем выбранный релиз как билд:

$ kerl build R14B02 r14b02

Downloading otp_src_R14B02.tar.gz to /home/evax/.kerl/archives
(curl progresses...)
Verifying archive checksum…
(curl progresses...)
Checksum verified (229fb8f193b09ac04a57a9d7794349b7)
Extracting source code
Building Erlang/OTP R14B02 (r14b02), please wait…
Erlang/OTP R14B02 has been successfully built

Устанавливаем собранный билд в дерикторию:

$kerl install r14b02 /path/to/install/dir/

Installing Erlang/OTP R14B02 (r14b02) in /path/to/install/dir…
You can activate this installation running the following command:
. /path/to/install/dir/activate
Later on, you can leave the installation typing:
kerl_deactivate

Узнаем список билдов установленных в системе:

$ kerl status

Available builds:
R14B02,r14b02
R14B02,r14b02_hipe
— Available installations:
r14b02 /path/to/install/dir
— Currently active installation:
The current active installation is:
/path/to/install/dir

Rebar


Данная утилита выполняет сборку, компиляцию, управления зависимостями также из систем контроля версий.
Существует несколько статей [3] по использованию rebar и довольно хорошая документация. [4]

Типичный пример использования

Я лишь пройдусь по основным командам:

Получить все зависимости описанные в конф файле

$ rebar get-deps

Обновить зависимости

$ rebar update-deps

Собрать проект

$ rebar compile

Генерировать релиз

$ rebar generate

Очистить артефакты сборки

$ rebar clean

Стоит отметить, что данный инструмент уже давно стал стандартом при работе с проектами на Erlang. Очень хотелось бы, чтобы Ericsson внес его в стандартный OTP.

Средства IDE или текстовые процессоры

Де-факто Emacs считается основным средством разработки на Erlang.
Для любителей Emacs существует огромное количество плагинов и расширений, позволяющих упростить и ускорить разработку, но данный подход подойдет не для всех.

После непродолжительных поисков были найдены некоторые плагины.

Eclipse

Боевой арсенал Erlang разработчика

Проект развивается и на данный момент удалось добиться (список не полный):

  • поддержка dialyzer
  • поддержка wrangler
  • поддержка etop
  • поддержка eunit
  • поддержка debugger(удаленный)

Так же есть довольно удобный рефакторинг и поиск.

IntelliJ IDEA и плагин Erlang за авторством Сергея Игнатова.

Боевой арсенал Erlang разработчика

  • навигация
  • автодополнение
  • поддержка rebar (!)
  • поддержка eunit
  • поддержка dialyzer
  • поддержка wrangler
  • поддержка debugger

А какие инструменты используете вы при разработке на Erlang?

Автор: HDDimon

Источник [5]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/68999

Ссылки в тексте:

[1] реализация : http://www.erlang.se/euc/08/euc_smp.pdf

[2] Kerl: https://github.com/yrashk/kerl

[3] статей: http://habrahabr.ru/post/112681/

[4] документация.: https://github.com/rebar/rebar/wiki

[5] Источник: http://habrahabr.ru/post/235719/