Wednesday, February 06, 2008

Erlang: инструменты

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

Вообще, некоторая проблема с Эрлангом состоит в том, что его разработчики очень не любят писать статьи для начинающих, рисовать туториалы с красивыми скриншотами. Документации по некоторым модулям вообще минимум, по другим — в основном user reference, иногда маленький юзер гайд. Поэтому сначала кажется что разработчик вынужден жить исключительно  наедине с консолью интерпретатора — однако это не так!

IDE

В качестве IDE можно использовать ErlyBird — IDE для Эрланга на платформе NetBeans, соответственно получаем от нее все соответствующие плюшки, выглядит очень красиво:

Screenshot-ErlyBird 070930

Есть еще проект ErlIDE на базе Eclipse, но про него ничего сказать не могу — не пробовал.

Ортодоксальные товарищи также, конечно, могут заюзать vim, emacs или Far под виндой (простенькими hrc файлами для colorer могу поделиться).

Интерпретатор

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

Полезные функции интерпретатора:

- скомпилировать и загрузить модуль

> c(boo.erl).
  {ok}

 

- установить текущую директорию

> file:set_cwd(Dir).

 

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

Можно это сделать с помощью того же интерпретатора:

> erl -noshell -run <module> <function> [Params]

(Модуль предварительно надо скомпилировать в байт-код, из интерпретатора или с помощью компилятора erlc).

После окончания работы функции интерпретатор останется висеть, чтобы он закрывался автоматически, можно добавить флаг "- s init stop" (тут за подсказку спасибо анонимному комментатору  предыдущего поста).

Либо, для большего удобства, предусмотрен вариант запуска программы как скрипта — с помощью утилиты escript. Ей в качестве единственного аргумента передается имя скрипта, а сам он должен экспортировать функцию main(ArgList):

-module(test).
-export([main/1]).

main(Args) ->
    io:format("Hello world~n").
> escript test.erl
test.erl:4: Warning: variable 'Args' is unused
Hello world

 

Отладчик

Кроме этого есть вполне функциональный отладчик с GUI. Если мы хотим поотлаживать наш модуль foo:
- компилируем его и загружаем его с отладочной информацией

1> c(foo, [debug_info]). 
{ok, foo}

 

- Вызываем монитор эрланговских процессов

2> im(). 
<0.181.0>

Screenshot-Monitor

- загружаем модуль в отладчик

3> ii(foo). 
{module, foo}

 

- ставим брейкпоинт на загрузку модуля

4> iaa([init]). 
true

Screenshot-Attach Process _0.31.0_

Отладчик, естественно, умеет работать по сети, отслеживать сообщения, приходящие процессам, и много всего другого.

Остальное

Если приложение использует эрланговскую распределенную БД mnesia, то нередко нужен удобный способ заглянуть что лежит в табличках. Для этого есть table viewer, который загрузить можно функцией

> tv:start().

Screenshot-tv2

Dialyzer — утилита для статического анализа модулей. Иногда позволяет найти интересные ошибки без запуска программы. Запускается так:

> dialyzer:gui(). 
Хотя с некоторых пор dialyzer идет как отдельное приложение в пакете с Erlang.

Screenshot-Dialyzer v1.7.0 @ lrrr-desktop

Интерфейс всех инструментов, конечно, весьма неказист, но интуитивно понятен, и их вполне хватает для полноценного процесса разработки.

6 comments:

semka said...

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

Я таки остановился на erlang-mode для emacs'а. Совершенно шедевральная штука, если попилить напильником.

mibori said...

А как дела с FFI у Эрланга обстоят?

Сергей Кищенко said...

ErlIDE в принципе терпим, но абсолютно не стабилен. Я бы также мог порекомендовать Scite - очень удобен.
Спасибо за статью, весьма полезна!

lrrr said...

И сам я, кажется, перейду таки окончательно с erlybird на емакс (хотя у меня она не падала ни разу).


mibori> Оно есть, в нескольких вариантах -- но я им не пользовался, ничего сказать не могу. Наиболее полезно тут выглядят биндинги к окемлу, которые потихоньку пишет Ulf Wiger, один из основных разработчиков эрланга (но еще не дописал).

Alex Ott said...

В емаксе можно использовать не только erlang-mode, но и пакет distel, который позволяет проводить отладку и т.п. Автор этого пакета ведет блог в котором пишет про эрланг, а также иногда и про distel

kurilka said...

Про FFI - http://www.wagerlabs.com/blog/2008/02/erlang-ffi---in.html
к примеру.
А ульф - главный за пресловутым AXD301, Эрланг начинали Джо, потом Майк и Роберт подтянулись, может позже и Ульф участвовал, но как спец он неимоверно силён.