Разработка ПОФункциональное программирование и немного об Erlang

Доброго времени суток.

В прошлый раз в комментариях к посту о EPmail несколько человек изьявило желание поближе познакомится с функциональным программированием и Erlang в частности.

Что же такое функциональное программирование? Наверное многие из вас ( я имею ввиду те кто связали свою жизнь с программированием) слышали о так звере как функциональное программирование (далее фп), но очень небольшое процент программистов знает что же это такое, а уж применяет данный подход на практике еще меньше. Программы написанные на привычных для нас языках программирования C/C++/java и т.д. опираются на изменение значения переменных, которые хранят какие-либо данные. Функциональный подход в программирование кардинально отличается от данной модели. Программы написанные на функциональных языках не имеют состояний. Да вы не ослышались. В чисто функциональных языках нет переменных! Казалось бы этот факт минус фп, и повлечет за собой большие неудобства. Скажу лично от себя, отсутствие переменных в языке неудобств практически никаких не вызывает, лишь сперва непревычно.

Основная сущность в фп как можно догадаться это функция. Весь процесс кодирования программы на функциональном языке состоит из написания функции и комбинирования их между собой. Подробнее о фп вы можете прочитать в специальных книгах. Одним постом все преимущества и недостатки естественно из-за обширности темы не написать. Здесь я приведу лишь несколько примеров.

Теперь, что касается языка Erlang. Erlang — функциональный язык программирования, с динамической типизацией. Чем же он хорош? Здесь я так же не буду проводить урок по синтаксису эрланга, кому будет интересно тот сможет выучить данный язык без каких либо трудностей. От себя скажу что язык действительно легкий. Изучая с нуля, можно писать многопоточные приложения уже на 1-2 неделе.

Как известно ни время ни технологии не стоят на месте. Ежедневно растут вычислительные мощности, но так же требуются еще больше. Настает эра многопоточных приложений. Естественно распараллелить некии части в своем приложении вы можете и на другом языке программирования, но врятли это будет так легко как на эрланге. Дело в том что параллелизация практически встроена на уровне языка в эрлaнге. В свое время я писал многопоточные приложения на Си, и отладка с многочиленными мьютексами, гонками и т.д. превращается в ад. В эрланге этого всего нет. В эрланге создать процесс который выполнит какую-либо функцию отдельно от основного процесса, так же просто как в C# создать список чисел.

Здесь я приведу простой пример. Задача состоит в том, что наша программа написанная на эрланге будет создавать 2 процесса которые будут работать параллельно и независимо друг от друга и которые будут посылать друг другу сообщения ping/pong.

-module(ping_pong).
-export([start/0, ping/2, pong/0]).

ping(0, Pong_PID) ->
    % Отправка процессу Pong_PID сообщения finished
    Pong_PID ! finished;
ping(N, Pong_PID) ->
    % Отправка процессу Pong_PID сообщения ping
    Pong_PID ! {ping, self()},
    receive
        pong ->
            io:format("Ping received pong~n", [])
    end,
    ping(N - 1, Pong_PID).
pong() ->
    receive
        % Pong_PID принял сообщение finished
        finished ->
            io:format("Pong finished~n", []);
        % Pong_PID принял сообщение ping
        {ping, Ping_PID} ->
            io:format("Pong received ping~n", []),
            Ping_PID ! pong,
            pong()
    end.
start() ->
    % Cоздание процесса для выполнения функции pong
    Pong_PID = spawn(ping_ping, pong, []),
    % Cоздание процесса для выполнения функции ping
    spawn(ping_ping, ping, [3, Pong_PID]).


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

Спасибо.
  • +10
  • sterh
  • 02 февраля 2011, 19:50

Комментарии (5)

  • avatar
  • ostin
  • 02 февраля 2011, 22:48
  • #
  • 0
Эм… как скомпилировать/запустить?
Компилировать в erlang-shell:

c(ping_pong).

Запускать:
ping_pong:start().
Да, нужно массы подтягивать, а то в свете скорого появления серии статей «Почему ФП провалилось» будет некому читать)
ЗЫ: Я ни в коем случае не против ФП, наоборот. Я считаю каждый программист должен освоить несколько парадигм программирования. Кроме ФП также стоить попробовать логическое программирование на примере Prolog'а.
  • avatar
  • th1nG
  • 06 февраля 2011, 06:18
  • #
  • 0
ничерта не понятно что к чему

я бы посоветовал автору топика начать серию статей (даже пусть небольших) из серии «ерланг для тупорогих».
по шагам: вы видите рабочий стол, открываете терминал, качаете пакет такойто, оно нам надо для тогото, затем открываем и проверяем — работает или нет, если нет то значит накосячили и гуглить или чинить так, если ок то создаем файл, в него суем текст, если изменить текст то мы увидим тото и тото итд.

карочи ДАЕШ ХЕЛО ВОЛД!
Запускать там это все не сложно. Читать код функций тоже. Сложно там перестроить голову и начать думать и алгоритмизировать в рамках другой парадигмы. Это невероятно сложно. Мне все время хочется костыль, который бы умел сохранять данные в переменную и изменять ее значение. без этого никак.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.