Минатава година ми текна да учам Erlang. Иако прилично стар јазик, Erlang станува прилично популарен во последно време поради неговите специфични можности. Програмскиот јазик (и виртуелната машина) се направени во лабораториите на Ericsson некаде во 1986.

Се работи за функционален јазик, со динамички но стриктен систем на типови, од другите general purpose јазици се разликува најмногу по инхерентната подршка за конкуретност (concurency, истовременост), т.е. голема скалабилност со помош на неговите light-weight процеси (без проблеми може да креира милиони процеси на обично PC). Ова посебно е актуелно денес кога хардверот се повеќе скалира со зголемување на бројот на процесори, а не со зголемување на нивната поединечна брзина, што е предизик за традиционалните јазици и нивното решение за скалабилност (threads).

Па, со таа цел, почнав да правам irc bot кој освен за учење, ќе помогне и во одржување на irc каналот #lugola. Историјата и развојот може да се види/следи во Git репозиторијумот. Првичната идеја беше секој commit да биде доволно јасен за да може директно да се следи и да го презентира новото знаење кое сум го добил, но со тек на време бројот на commit-и нарасна па сега ќе направам еден крупен осврт. За самиот Erlang препорачувам да се почне со online книгата „Learn You Some Erlang for Great Good!“.


Првата главна точка беше успешно воспоставување на TCP конекција. Примерот покажува отварање на TCP конекцијата, праќање податоци преку неа и на крај затварање на конекцијата (серверот може да се симулира со nc -l -p 5678).


Втора точка беше веќе успешна конекција кон IRC сервер. Овој пример покажува креирање на нов Erlang процес со spawn, отварање TCP конекција до IRC серверот, праќање на информациите за идентитетот (NICK и USER) и потоа приклучување (JOIN) на посакуваните канали. На крајот се влегува во main_loop функцијата која рекурзивно се повикува самата себе, се додека TCP конекцијата не се затвори или пак процесот не добие некоја неочекувана порака. Примерот може да се старта со:
damjan$ erl
1> c(main).
2> Pid = main:start(["irc.freenode.net", 6667, "erlbot_test", ["#lugola"]]).
3> Pid ! {self(), send_data, "PRIVMSG #lugola :the first irc message ever\r\n"}.
Од овој пример може да се види употребата на receive операцијата со која Erlang процесот чека да прими некоја порака, па потоа споредување со шаблони (pattern matching). Праќањето на пораки се прави со операторот ! како што може да се види погоре „Pid ! порака“. Всушност, ова е основната парадигма на програмирање во Erlang, комуникација меѓу разни процеси преку пораки (таканаречен Actor model).

Понатаму програмот станува покомплициран, но и посериозен. Полека почнува да добива корисни можности, како имплементација на CTCP-VERSION и CTCP-PING irc командите (commit). Програмот веќе се протега низ неколку фајлови.

За време на НСНД во Загреб, додека правам презентација на Erlang и на проектов, заедно со луѓето таму ја имплементираме првата подршка за plugin-и.

Набрзо потоа сфаќам дека сме измислиле топла вода, и дека самиот Erlang (т.е. неговиот OTP framework) веќе нуди таква имлементација. Го преработувам кодот да го користи gen_event framework-от во Erlang.

Потоа следат имплементација на разни plugin-и (rock-papper-scissors и сл.) и средувања на core делот.

Како повеќе навлегувам во Erlang, се повеќе почнувам да ги користам принципте на неговиот OTP (Open Telecom Platform). OTP се разни рутини и билиотеки кои овозможуваат креирање високо робусни и скалабилни програми. Една од работите кои ги овозможува OTP е промена на кодот на програмот додека се извршува без да има прекин во работата. Тоа е и една од карактеристиките на Erlang/OTP по која се издвојува од другите јазици.

Последната верзија веќе има подршка за конфигурациски фајл, јадрото целосно е преработено како OTP модули (gen_server, gen_event), остатокот како plugin-и. Останува уште да се имплементира supervisor дрво кое ќе се грижи bot-от постојано да остане online. И конечниот резултат, некоја верзија 1.0 би била комплетна Erlang/OTP апликација.

Во меѓувреме, ги поканувам сите кои сакат да се играат со Erlang или irc bot-ов, да пробаат да напишат некој plugin. CTCP-PLUGIN-от е прилично едноставен и може да се земе како шаблон. Plugin-ите се реактивни, за секоја порака добиена од серверот, се известуваат сите plugin-и, кои одлучуваат дали ќе ја игнорираат пораката или ќе направат нешто со неа.

Референци: Интересни проекти напишани во Erlang:

Објавено: пет, 01 јан 19:59:13 CET 2010
[æ]