Каждому из нас знакома проблема, когда пароль параноидально-настроенного юзверя никак не хочет поддаваться брутфорсу. И каждого, наверняка, посещала мысль, что было бы здорово замутить под это дело распределенные вычисления. Но тут мало иметь свой ботнет – необходим соответствующий инструментарий. Увы, большей частью он заточен под всякую научную пургу. Но что тебе мешает написать прогу для распределенного брута? Для этого есть прекрасный инструмент - язык Erlang!

Зачем мне новый язык?

Вопрос не в бровь, а в глаз. Действительно, зачем изучать новый язык программирования, если настоящему cool хакеру, кроме Assembler/C, для счастья ничего не надо? А тут раз – и еще один язык! Все верно — любую задачу можно решить с помощью одного лишь ассемблера. Только трудозатраты при этом будут такие, что почти любой проект превращается в хронический долгострой. С другой стороны, новые высокоуровневые языки программирования, вроде C# или Java, позволяют очень быстро писать программный код и хранят в своем арсенале много полезных фишек, делающих жизнь кодера более шоколадной. Только вот системщик, пишущий драйвер или модуль ядра на одном из таких языков, получит вынос мозга в dev/null. Надеюсь, ты понял, к чему я веду — для каждого типа задач есть свои наиболее эффективные инструменты.

Взять ту же проблему брутфорса. Его скорость напрямую зависит от количества задействованных вычислительных ресурсов. Хакеры, серьезно замороченные на этом деле, по-разному выкручиваются из ситуации. Одни усиленно курят доки по нецелевому использованию графических процессоров. Другие создают сеть из компьютеров (легально, или плодят ботов) и вешают на нее распределенные вычисления. На этом я предлагаю остановиться подробнее. Вопрос, который неизбежно встает перед всеми, кто решил испытать себя в распределенных вычислениях: «как оно работает?». В качестве ответа серьезные кодерские конторы предлагают специальный софт, позволяющий развернуть систему распределенных вычислений.

Но у всякого универсального решения найдется масса недостатков, основной из которых — избыточность. Большинство заложенных в систему возможностей остаются незадействованными. А это значит, мы имеем дело с непродуктивным использованием вычислительных мощностей, которых у нас и так в обрез! Выход? Он прост, — написать свою систему распределенных вычислений, заточенную под себя любимого. Но тогда придется ломать голову над новым вопросом — какой инструмент выбрать для разработки? Возможностями какого языка воспользоваться? Вот тут-то я настоятельно рекомендую тебе обратить внимание на язык Erlang.

Для начала — немного истории. Erlang был создан в небезызвестной компании Ericsson. Ха, ты уже догадался, что означает название Erlang? «Конечно, это Ericsson Language!» Только не прав ты, гринго. Эрланг — это имя крайне умного мужика, в честь которого и назвали единицу измерения телекоммуникационного трафика (Судя по имени, он настоящий викинг, - Прим. ред.).

Erlang относится к функциональным языкам программирования. Если у тебя на почве тупой программы университетского обучения выработалось стойкое отвращение к лямбда-выражениям, будь осторожен и потребляй Erlang очень дозировано во избежание соматических (да простит меня редактор за упомянутый всуе медицинский термин) осложнений. Синтаксис языка похож на Prolog. И это не случайно — именно к Prolog уходят его корни.

Теперь собственно о том, чем так хорош Erlang. В наш смутный век андронных коллайдеров (пишу эту фразу на тот случай, если ты сейчас читаешь журнал, сидя в vault 13, полируя энергоброню и коротая времени до входа на поверхность в поисках водяного фильтра) бал правит концепция объектно-ориентированного программирования. Ее идею можно выразить тремя словами: весь мир — объекты. Концепция, лежащая в основе Erlang, утверждает, что – ничего подобного, весь мир это процессы! И, черт побери, они правды — какая польза от объектов, если они не будут иметь методов, через которые взаимодействуют друг с другом и окружающей средой? Соответственно, программа, написанная на этом языке, представляет собой совокупность процессов, взаимодействующих через обмен сообщениями. Что? Тебе послышалось слово «надежность»? Нет, брат, не послышалось и твое пораженное хентаем подсознание верно тебе нашептывает: «память, память, разделяемая память». Почему деревья растут, а программы падают? Потому что практически все языки программирования используют концепцию разделяемой памяти. Отсюда — все проблемы: кто-то прочитал то, что не должен был читать, кто-то перезаписал то, что не должен был перезаписывать. В Erlang подобная ситуация невозможна в принципе, потому что вместо того, чтобы устраивать из системной памяти коммунальную квартиру, в Erlang, как уже было сказано, используется обмен сообщениями между процессами. Однако, основная фишка не в этом, а в том, что процессы прекрасно масштабируются и распараллеливаются (и при этом – с минимальными накладными расходами). Поэтому Erlang можно, не кривя бровью, назвать инструментом номер один для создания систем распределенных вычислений.

А как тут все устроено?

Прежде чем перейти к практике, давай наведем порядок в голове и уясним важные моменты. Во-первых, Erlang является кросс-платформенным языком. Технически это реализовано так же, как и в Жабе — программа транслируется в байт-код, исполняемый виртуальной машиной. Поскольку Erlang относится к функциональным языкам, забудь о такой глупости, как операция присваивания. Ее просто нет!

Чтобы передать информацию от одного процесса к другому, как я уже упоминал, используются сообщения. У каждого процесса есть свой почтовый ящик, из которого он извлекает поступившие сообщения. И здесь снова проявляется крутизна Erlang, так как процесс вовсе не обязан читать все сообщения из своего почтового ящика. Возможно использование фильтров, на основании которых будет осуществляться избирательная выборка сообщений.

Следующая фишка: с Erlang тебе не придется заботиться об отлове всех исключительных ситуаций и написании для них обработчиков. Да-да, занудная парочка try-catch осталась за бортом. А теперь попробуй догадаться, за счет чего это стало осуществимо: или программы, написанные на Erlang, сверхнадежны и никогда не падают, даже будучи написанными быдло-кодерами, или в Erlang встроена мощная система обработки ошибок? Какой бы вариант ты ни выбрал, он будет неправильным. Согласно философии Erlang, если процесс упал, – туда ему и дорога. Исповедуется здоровый и прагматичный пофигизм. Более того, процесс, в котором возникли проблемы, делает все возможное, чтобы система отправила его к праотцам. Он даже называется «процесс-камикадзе» (Кстати, большую часть времени автор статьи работает программером в Японии и в совершенстве владеет техникой сепукку и древним искусством связывания женщин, так что можешь написать ему на эту тему, – Прим. ред.).

Ты скажешь: а как же другие процессы, они же будут пытаться взаимодействовать с упавшим «товарищем»! Нет — если процесс падает, родительский процесс получает соответствующее уведомление и, немного погоревав, продолжает жить дальше.

Дальше! Процессы в Erlang изолированы друг от друга. А значит, при распараллеливании задачи можно забыть про кошмарные мьютексы, семафоры, взаимные блокировки. Это же просто праздник какой-то!

И наконец, пара слов о том, как с помощью Erlang создаются распределенные системы. Работающий экземпляр виртуальной машины называется узлом (Node). Каждый узел знает о существовании других узлов на этой же машине и может с ними взаимодействовать. С тем же успехом узел может взаимодействовать и с узлами, существующими на других машинах, достаточно скормить ему адрес удаленной системы.

Где же мне его взять?

Если ты дочитал до этого абзаца, значит, тема поднятия собственной системы распределенных вычислений тебя заинтересовала. Дай догадаюсь, что тебя сейчас интересует больше всего? Наверняка, вопросы – где достать Erlang и сколько лавандосов за него попросят. Начну со второго. Возрадуйся — Erlang бесплатен, да будет благословен RMS!

В доступный для загрузки с сайта erlang.org дистрибутив входят: компилятор языка, среда исполнения с поддержкой эмуляции многопроцессорных систем, документация, а также набор библиотек и инструментов OTP. Среди последних следует отметить Mnesia – написанную полностью на Erlang распределенную СУБД с поддержкой репликации данных и возможностью динамического изменения их схемы и обновления своего кода без приостановки работы. Mnesia использует Erlang в качестве управляющего языка и делает работу с распределенными данными полностью прозрачной для приложений – они работают абсолютно одинаково как с локальными данными, так и размещенными на удаленном узле.

Если же ты прогуляешься до официального сайта Erlang, то сможешь найти там как исходники языка (и собрать их под свою *Nix систему), так и готовый инсталлятор под Windows. Кроме того, Erlang входит в репозитарии многих Linux-дистрибутивов и может быть установлен буквально одним кликом мыши через какую-нибудь попсовую систему вроде Synaptic. Адептам командной строки тоже не придется себя утруждать нечеловеческими усилиями: все, что требуется — это ввести в терминал строку apt-get install erlang.

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

./confogure
make
sudo make install

После инсталляции неплохо было бы проверить, все ли у нас получилось. Для этого набирай в терминале команду erl. Ты должен увидеть баннер Erlang — что-то вроде:

$ erl
Erlang (BEAM) emulator version 5.5.1 [source] [async-threads:0] [hipe]
Eshell V5.5.1 (abort with ^G)

С последующим приглашением для ввода команды и номером строки.

Мне бы это... IDE какую-нибудь

А чего так? Консоль же наш дом родной, IDE — путь для слабаков. На самом деле, глупо отказываться от благ цивилизации. Поэтому напоследок кратко рассмотрим существующие средства разработки приложений на Erlang.

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

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

Чтобы подружить Emacs и Erlang, понадобится пакет erlang-mode. Не парься, он по умолчанию входит в инсталляционный пакет. Если ты уже устанавливал моды на Emacs, то ниже для тебя не будет ничего нового. Если же ты новичок в этом деле, то вот тебе очень краткая инструкция:

// Указываем путь к erlang-mode и загружаем
erlang-start
(add-to-list 'load-path ".....")
(require 'erlang-start)
// типы файлов, для которых будет активирована мод
(add-to-list 'auto-mode-alist '("\\.erl?$"
. erlang-mode))
(add-to-list 'auto-mode-alist '("\\.hrl?$"
. erlang-mode))
// пути к erlang окружению
(setq erlang-root-dir "/opt/local/lib/erlang")
(add-to-list 'exec-path "/opt/local/lib/erlang/bin")
(setq erlang-man-root-dir "/opt/local/lib/
erlang/man")

Если Emacs тебя пугает, есть другие, менее экстремальные решения. Например, ErliBird — среда Erlang-разработки, в основе которой лежит платформа NetBeans. А кто у NetBeans числится в заклятых конкурентах? Правильно — Eclipse. И если существует сборка NetBeans для Erlang разработки, то можно не сомневаться, что аналогичный инструмент найдется и у Eclipse. И действительно, ErlIDE — плагин для Eclipse, позволяющий использовать Erlang-программистам эту великолепную IDE.

Весь кайф обламывает один нюанс. Дело в том, что ErliBird и ErlIDE – еще настолько сырые продукты, что годятся только для экспериментов. Для справки скажу, что возможности Emacs с запасом перекрывают все самые мыслимые и немыслимые запросы. Так что, лучше потратить пару дней на обуздание этого скакуна, чем заниматься нетрадиционным сексом с другими IDE.

Ну и как мне этим пользоваться?

Осваивать новый язык по традиции будем с вывода строки «Hello, World!» и простых арифметических операций:

1> "hello, world!".
"hello, world!"
2> 1 + 2.
3
3> (2 * 3) + 4.
10

Надеюсь, ты обратил внимание на такую фишку, как точка в конце каждого выражения. Все остальное весьма традиционно. Но не торопись с выводами. У многих, кто впервые увидел код, написанный на этом языке, единственная реакция на увиденное — «сумасшедший, нечеловеческий синтаксис!». Однако для настоящего хакера это не станет преградой. Да, синтаксис, мягко говоря, странен. Но к нему быстро привыкаешь.

Введи следующий код:

1> X = 50.
50
2> Y = (X + 10) * 2.
120

Пока ничего интересного за исключением того, что все переменные у нас в верхнем регистре, — это не случайность, а одно из требований языка. Давай присвоим переменной X новое значение: 3> X = 10. Упс, интерпретатор выдает ошибку! В чем дело? Готовься к выносу мозга. Во-первых, X – это совсем не то, что мы подразумеваем под переменной в других языках программирования. Во-вторых, знак равенства в случае с Erlang не является оператором присваивания. Теперь по пунктам. Переменные в Erlang являются переменными одноразового присваивания. Если переменной еще не присваивалось никакого значения, она считается открытой. Закрытая переменная — та, которой уже однажды было присвоено значение и, следовательно, поменять его на другое уже нельзя. При таком раскладе знак равенства представляет собой всего лишь оператор приведения — сначала у нас было нечто неопределенное, а потом – это конкретное число. И поменять мы его не можем точно так же, как Маша с пятого этажа вдруг не обернется Петей из другого подъезда. Можешь считать это теплым приветом от функционального программирования.

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

В Erlang еще есть такое понятие, как атом. Атом — это именованная константа. В отличие от переменной, название атома может быть написано строчными буквами.
Следующий важный элемент языка — кортежи (Tuples). Кортеж — это набор значений ограниченной длины. Кортеж ограничивается фигурными скобками, а элементы кортежа отделяются друг от друга запятыми. Кортежи могут быть вложенными друг в друга. Вот примеры кортежей:

1> {ok, 9}.
{ok,9}
2> {true, {127, 0, 0, 1}}.
{true,{127,0,0,1}}
3> {box, {width, 10}, {height, 35}}.

Если кортеж не ограничивать по длине, то это уже будет список. Списки в отличие от кортежей заключаются в квадратные скобки. Еще список можно разделить на две части — заголовок (head) и хвост (tail). Одно от другого отделяется с помощью вертикальной черты. Для чего это нужно, ты увидишь, когда мы будем писать свою распределенную систему для брутфорса.

1> [one, two, three].
[one,two,three]
2> [1, 2|[3, 4, 5]].
[1,2,3,4,5]
3> [{key1, value1}, {key2, value2}].
[{key1,value1},{key2,value2}]

Чтобы твои мозги не превратились в дареную котлету, прочие особенности языка оставим за рамками статьи. Ищи врезку со ссылками, по которым можно найти подробнейшую документацию, да еще и с примерами. А мы тем временем перейдем к не менее важному вопросу — создание полноценных программ.

Как запустить?

Для начала о том, как выйти из Erlang-интерпретатора. Для этого нужно набрать команду halt(). И не забудь про точку в конце строки! Ну, а теперь отвечаю на вопрос, вынесенный в заголовок раздела. Во-первых, не мешало бы научиться писать полноценные листинги и скармливать их среде Erlang целиком, вместо нудного секса с построчным прогоном через интерпретатор. Для создания программного кода можно использовать любой текстовый редактор, не сохраняющий элементы форматирования. Файл должен иметь расширение (.erl). Логическая структура Erlang-программы представляет собой набор модулей. Модули оформляются в виде отдельных файлов. Первым делом мы должны объявить начало модуля и заодно сообщить его название. Для этого используется конструкция

-module(название).

Кстати, название модуля должно совпадать с именем файла. Если потребуется обратиться к модулю из другого файла, достаточно указать его имя и – через двоеточие — имя функции, которую нужно вызвать. В круглых скобках после имени функции, как обычно, передаем необходимые аргументы:

mymod:test(8).

В случае если внутри модуля требуется объявить функцию, доступную извне, используется конструкция:

-export([имя_функции/количество_аргументов]).

После того, как файл с модулем создан, его можно скомпилировать в байт-код простой командой

c(имя_модуля).

К сожалению, наша приятная беседа за чашечкой текилы не может продолжаться вечно. Но я надеюсь, что Erlang тебя заинтересовал как минимум настолько, чтобы начать знакомиться с той документацией по языку, что есть в Сети. Ну а мы с тобой встретимся через месяц и поближе познакомимся с инструментами организации распределенных вычислений. А чтобы употребить новые знания с пользой — напишем систему для распределенного брутфорса. Так что, пускай твоя подруга меняет пароль на своем почтовом ящике.

Некоторые проекты, написанные на Erlang

  • Yaws – очень шустрый и очень надежный, да еще и нетребовательный к ресурсам веб-сервер (yaws.hyber.org).
  • Чатовский движок в крупнейшей социальной сети Facebook.
  • Сервер для Jabber-сетей Ejabberd (www.ejabberd.im).
  • - И, наконец, самый известный проект — распределенная база данных SimpleDB, на которой работает интернет-гигант Amazon.

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

История Erlang

Родина языка — лаборатория Ericsson Computer Science Laboratory (CSLab). По большому счету, все началось с потребности немного усовершенствовать язык Prolog, добавив в него поддержку параллелизма. В 1990 году язык обзавелся собственным синтаксисом (который, впрочем, так и остался похожим на синтаксис Prolog). Тогда же была разработана и виртуальная машина Erlang. А в 1998-м, через восемь лет после своего выхода в большое плавание, язык Erlang с набором библиотек был опубликован под открытой лицензией.

INFO

Erlang — мощное оружие, и его использование — на твоей совести. Мы за мирный атом!

WWW

Николай Байбородин ( This email address is being protected from spambots. You need JavaScript enabled to view it. )

Вверх