Hlavní navigace

Programovací jazyk pro dnešní den: Erlang

27. 9. 2006 18:07 (aktualizováno) František Fuka

Protože jsem se nedávno s kýmsi bavil o jazyku Erlang (v souvislosti s tím, že je v něm napsaný údajně nejvýkonnější existující webserver Yaws), pár dní jsem se tímto jazykem zabýval, protože jsem na to při „našem prvním setkání“ neměl příliš času.

Erlang původně vyvinula firma Ericsson pro ovládání telefonních ústředen, a to před více než 15 lety. Dnes je Erlang spravován open source komunitou a je pochopitelně k dispozici zdarma pro všechny myslitelné platformy. Pár základních informací je v tomto roztomilém starém videu, které upozorňuje na některé z hlavních přednosti Erlangu:

  • Erlang je od základu navržený tak, aby mohl být extrémně robustní a aby se části vaší aplikace mohly hroutit, updatovat a restartovat nezávisle na sobě, bez nutnosti zastavit celou aplikaci.
  • Erlang je od základu navržený tak, aby se v něm jednoduše komunikovalo mezi mnoha běžícími procesy.

Na oficiálních stránkách je k Erlangu podrobná dokumentace, kterou není problém přečíst a pochopit (samotné jádro jazyka je poměrně jednoduché, všechno ostatní je v knihovnách a ty jsou napsány převážně v Erlangu, takže je můžete studovat). Základní problém, bránící většímu rozšíření Erlangu, je ale podle mě v tom, že i když pochopíte syntaxi a princip jazyka, nepochopíte, k čemu vám to všechno může být dobré a bude vám to připadat jako šílenost.

K „bizarním“ vlastnostem tohoto funkcionálního jazyka patří například:

  • Pokud jednou přiřadíte proměnné nějakou hodnotu, už ji nemůžete změnit (vlastně to tedy není proměnná).
  • V Erlangu neexistují cykly nebo skoky, vše se dělá pomocí rekurze.
  • Erlang nezná hodnoty typu „string“. Můžete v programu napsat výraz „abcd“, ale je to přesně totéž, jako kdybyste napsali [97,98,99,100]. Je to prostě jen List složený z čísel. Ovšem ta čísla mohou být jakákoliv, tudíž můžete například bez problémů pracovat s Unicodem.
  • Hodně zábavy si užijete s „Pattern matching“ a operacemi s Listy (viz Caml, Haskell a spol.)

Na pointu těchto zdánlivě zvláštních pravidel přijdete až po nějaké době aktivního používání jazyka. Většina těchto omezení je totiž v jazyce proto, aby vás nutila programovat jistým způsobem, který je náročnější na přemýšlení, ale jehož výsledkem je přehlednější, robustnější a 5× až 10× kratší kód než ve většině ostatních jazyků!

Erlang je nejideálnější pro programování systémů pracujících v reálném čase, tady např. serverů nejrůznějšího druhu. U erlangových aplikací není výjimkou, že v nich běží současně stovky a tisíce procesů (což nejsou „procesy“ v klasickém smyslu toho slova, ale jednoduché erlangovské „miniprocesy“) a celá aplikace se vlastně skládá ze stovek a tisíců miniaturních serverů a klientů! Dovolte příklad:

Dejme tomu, že potřebujete mít nějakou globální datovou strukturu, ke které musí mít přístup různé rutiny vaší aplikace. V tradičnějších jazycích by se přístup k těmto datům řešil pomocí zámků, semaforů apod. V Erlangu je nejelegantnějším řešením vytvořit server, který se bude starat pouze o tuto strukturu (jiný proces se k ní nemůže nijak dostat) a jemuž budou ostatní části programu zasílat dotazy jako „Jaké telefonní číslo má Josef Novák?“, „Změn telefonní číslo Josefa Nováka na 609 696969“ nebo „Vymaž všechny Nováky“. Na rozdíl od ostatních jazyků tuto meziprocesovou komunikaci v Erlangu vytvoříte naprosto triviálně (systém se automaticky stará o buffering, timeouty a podobné věci) a dokonce není nejmenším problémem, aby různé procesy běžely na různých fyzických počítačích (na principu jejich programování se tím nic nemění)!

Erlang má vlastní interaktivní shell, který pro nováčka vypadá dost strašidelně, ale jeho síla je v tom, že si ho snadno přizpůsobíte a vytvoříte si vlastní vývojové prostředí. Já jsem si například během prvního dne experimentování napsal vlastního démona, který při mém programování sleduje erlangovské zdrojáky v daném adresáři, automaticky pozná pokud se některý z nich změní a v takovém případě daný modul odstraní z běžícího systému, nahradí nově zkompilovanou verzí (pokud v ní nejsou chyby) a restartuje moji aplikaci (aniž bych musel opouštět textový editor, ve kterém pracuji). To vše je naprogramováno v pár řádcích a vůbec to nepůsobí dojmem nějaké „prasárny“ (jak by to působilo v jiných jazycích, které podobné věci také umí).

Pokud vás tenhle krátký úvod zaujal, v Erlangu je napsán například Jabber server eJabberd a 3D modelovací program Wings3D, přičemž zdrojový kód obou je překvapivě krátký a přehledný a v obou případech ho můžete volně studovat, protože jde o open source aplikace.

Sdílet