среда, 30 июня 2010 г.

Знакомство с erlang.

Что такое erlang? Erlang - это функциональный язык программирования. Вводных статей в интернете полно, как на русском, так и на практически любом другом языке. Можно почитать на википедии, на хабре, на оффсайте. На оффсайте можно скачать виртуальную машину и утилиты для компиляции, редактирование, работы и т.д. Язык кроссплатформенный, так что можно работать в любой системе. Кое-кто называет его "убийцей java".

Язык был разработан и поддерживается компанией Ericsson. Название с одной стороны относится к Датскому математику Agner Krarup Erlang, а с другой стороны к аббревиатуре Ericsson (Ericsson  language).

Отличительной особенностью языка явлется "легковесность" потоков и независимость их друг от друга, благодаря чему можно создавать приложения с большим количеством потоков. Так же существует множество отличий от привычных мне C++, java, C# и т.д. Во-первых, в Ерланге нет объектов в привычном понимании этого слова, зато есть клиент-серверная архитектура, которая позволяет хранить какие-то данные между операциями. Во-вторых, каждая переменная используется всего один раз. Т.е. раз присвоив переменной значение: MyVar=1, больше MyVar менять нельзя. В-третьих, в этом языке нет циклов. Совсем нет циклов. Все циклические операции выполняются при помощи рекурсии. Рекурсия может быть бесконечной, "переполнения стека" она не вызовет. Основными сущностями языка являются "кортежи" и "списки", работа с которыми осуществляется на уровне синтаксиса. Можно много описывать этот любопытный язык, но я рекомендую пройтись по вышеприведенным ссылкам.  Так же на RSDN есть статья, с которой начинал я.

Зачем же мне нужен этот язык? Может показаться, что он слабоприменим. Однако на Ерланге написан мощнейший XMPP-сервер - "ejabberd". Который затыкает за пояс Wildfire, написанный на Java и даже "Jabberd 2", "Jabberd 1.4", написанные на C/C++. Так же существует веб-сервер Yaws, которому apache в разы уступил при нагрузочных тестах. Чат-система Facebook так же построена на erlang (точнее, на ejabberd). Ну и плюс ко всему прочему, мне это просто надо по работе :)

Напоследок хочу показать алгоритм вычисления факториала:

% Это комментарий.  

-module(fact). % Объявление модуля
-export([fac/1]). % Экпортируемая функция

fac(0) -> 1; % Если пытаемся получить факториал нуля, возвращаем 1
fac(N) -> N * fac(N-1). % Рекурсивно считаем факториал, когда N дойдет до 0, вызовется       %функция выше