Search
Write a publication
Pull to refresh

Comments 26

Есть желание серьезней взяться за этот язык. Статья очень кстати. Спасибо.
Отличная статья. В данный момент учу Haskell, но чувствую, что в реальной жизни более практичная ему альтернатива — это Erlang.
UFO landed and left these words here
Безусловно, я не склонен считать, что Haskell подходит для распределённых вычислений. Я, скорее, имел в виду то, что Erlang — достаточно универсальный язык ФП, с одной стороны предполагает чистоту, с другой — не обязывает к ней.
UFO landed and left these words here
Сама функциональность языка предпологает значительную часть кода в чистых функциях. Впрочем, не буду с вами спорить, вам виднее, наверное.
А можно узнать по поводу
Все сервера обязаны быть реализованы с использованием хвостовой рекурсии, дабы избежать переполнения памяти.

Почему проиходит переполнение памяти?
Стек накапливается. При хвостовой рекурсии сборщик мусора его выпиливает, при обычной рекурсии — нет.
В пункте 5.9 в первом случае применяется не хвостовая рекурсия. При каждом входе в loop() в стек вызовов добавляется адрес возврата (для того чтобы при завершении выполнить io:format). Т.к, теоретически, сервер должен выполняться длительное время, то стек может переполниться. При использовании хвостовой рекурсии такого не происходит.
На самом деле, это все уже устаревшая информация.

Вот здесь написано больше о «мифах о производительности эрланга». В том числе,
«2.3 Myth: Tail-recursive functions are MUCH faster than recursive functions»

"""
According to the myth, recursive functions leave references to dead terms on the stack and the garbage collector will have to copy all those dead terms, while tail-recursive functions immediately discard those terms.

That used to be true before R7B. In R7B, the compiler started to generate code that overwrites references to terms that will never be used with an empty list, so that the garbage collector would not keep dead values any longer than necessary.
"""
Речь не о скорости выполнения, а о потребляемой памяти.
Вот набросал простой код для теста (у меня Erlang 15B01). Он съедает всю доступную память, т.к. не используется хвостовая рекурсия:
-module(test).
-export([loop/0]).
loop() ->
  receive
    stop -> true;
    _ -> loop()
  end,
  io:format("test").

Тест вызывался так:
Pid = spawn(fun test:loop/0).
lists:foreach(fun(_) -> Pid ! test end,lists:seq(1,100000000)).

без io:format все отлично работает.
Франческо писал о том, что миф в том, что хвостовая рекурсия ВСЕГДА быстрее обычной. И далее он раскрыл мысль, что в конкретной ситуации трудно угадать, какой тип рекурсии будет оптимизирован лучше, и если встречается узкое место — то лучше проверить оба варианта.
Ничего страшного. Всегда приятно поболтать про Erlang :)
Добрый день.
Вопрос не совсем по теме:
Что вы используете для написания кода на Erlang?

А за статью — спасибо.
В данный момент использую Emacs с большим количеством плагинов. Благодаря ему, получилось много чего автоматизировать в процессе разработки. Я еще я пробовал ErlIDE (eclipse) и sublime text 2, но они не удовлетворяют моим потребностям.
UFO landed and left these words here
Emacs. Поддержка Erlang там самая продвинутая. Накрайняк можно Erlide (Eclipse). Вроде говорят vim тоже можно использовать, не знаю.
За статью спасибо! Тема Эрланга очень интересна, но вот комментарии (раздел: 8.6 Комментируйте каждую функцию) стоит оформлять несколько иначе:

%% @doc Here goes description of my cool function
%% @param Param1 - description of param1 etc.
%% @end


Если делать так, то потом можно сгенерировать документацию к коду, что очень удобно.
В EDoc отсутствует тэг @param. Для параметров можно указать типы с помощью тэга @spec, или, еще лучше, прямо в коде с помощью -spec(). Такая спецификация может быть использована как EDoc, так и другими тулзами (Dialyzer, TypEr).
В EDoc отсутствует тэг @param. Для параметров можно указать типы с помощью тэга @spec, или, еще лучше, прямо в коде с помощью -spec(). Такая спецификация может быть использована как EDoc, так и другими тулзами (Dialyzer, TypEr).
8.9 Заголовок файла, история версий

В каждом файле должна быть история версий, в которой показано кто сделал какие изменения и с какой целью.

Это можно убрать. Имхо пережиток прошлого, когда не было систем контроля версий. Самые «популярные» для правок файлы превратятся в кашу из комментов
Sign up to leave a comment.

Articles