7.6.21

Seznamte se: Erlang

(Tento post není o filmu. Naopak je o programování a tudíž zcela nezajímavý pro velkou část z vás.)

Programoval jsem v životě ve všemožných jazycích, od assembleru až po Haskell. Pokud také programujete, rád bych se vám dnes stručně zmínil o jazyku Erlang, který mi mezi těmi desítkami jiných jazyků dodnes připadá výjimečný. Víc jsem v něm programoval někdy před 10 lety, pak jsem na mnoho let přestal, teď jsem se k němu z pracovních důvodů na chvíli vrátil a pořád mě udivuje a připadá mi výjimečný, neřku-li unikátní.

Nejprve by se asi hodilo pár stručných informací, které by vás měly zaujmout a nalákat, abyste četli dál. Takže:

  • Erlang byl vyvinut už někdy v 80. letech, původně jako jazyk speciálně pro programování telefonních ústředen. Tzn. asynchronních aplikací, které se nesmějí zhroutit a nesmějí být každou chvíli "shazovány a restartovány".
  • Existují aplikace napsané v Erlangu, které běží non-stop několik desetiletí, přičemž se v průběhu těch desetiletí ani jednou nerestartovaly a nezhroutily. Byly ale v průběhu těch let upravovány a změnil se hardware, na kterém běžely
  • Erlang je jediný programovací jazyk (který znám), ve kterém je programování procesů a jejich vzájemná komunikace zábava. Ve většině ostatních jazyků (které znám) je to noční můra.
  • Erlang je navržen tak, aby se v něm nedalo programovat prasácky. To znamená, že když chcete rychle vytvořit nějaký krátký skript, jde to v Erlangu o dost obtížněji, než v jiných jazycích. (Zatímco vás v jiných jazycích obtěžují středníky, v Erlangu vás obtěžují středníky, čárky i tečky.) Ale jakmile ten krátký skript začne přerůstat v něco komplexnějšího, s překvapením zjistíte, že v Erlangu je to přerůstání snadno zvladatelné, ne-li zábavné (na rozdíl od ostatnícn jazyků).
Takže to bylo pár odvážných tvrzení do začátku, abych vás nalákal, a teď už podrobněji.


Každá trochu rozsáhlejší Erlang aplikace pozůstává z procesů, které jsou zcela, totálně izolované. Nesdílejí spolu žádná data. Neexistuje nic jako "globální proměnné". Procesy mezi sebou mohou komunikovat jen tím způsobem, že proces A pošle zprávu procesu B. Každý proces má svůj "inbox", ze kterého si může vybírat příchozí zprávy. Pokud chce proces B odpovědět procesu A na jeho zprávu, musíte si implementovat mechanismus, který to udělá (ale implementujete si ho velmi snadno, většinou dvěma řádky programu). Pokud v procesu dojde k chybě, proces ukázněně "chcípne", všechno po sobě spořádaně "uklidí", vyšle případně ostatním procesům zprávu, že chcípl a ostatní procesy se podle toho zařídí: Chcíplý proces restartují, chcípnou taky, nebo něco jiného.
Procesy Erlangu nemají nic společného s procesy operačního systému. Vznikají a zanikají velmi rychle a s minimálními softwarovými a hardwarovými požadavky. Není nic výjimečného na tom, že v jedné aplikaci v jednom okamžiku běží tisíce nebo desetitisíce Erlang procesů. Různé procesy mohou být prováděny různými jádry procesoru nebo dokonce různými počítači, propojenými skrze Internet. Pro programátora je toto všechno zcela transparentní a může mu to být víceméně jedno (jen musí počítat s tím, že zpráva odeslaná jinému procesu teoreticky nemusí být nikdy doručena).

Erlang má jen pár základních typů: Číslo, atom, tuple (česky "uspořádaná n-tice", LOL), listy (viz Lisp / Scheme) a nově i mapy (key / value). Erlang nemá typ "boolean" (jeho funkci zastávají atomy 'true' a 'false') ani "string" (jeho funkci zastává list ASCII / Unicode integerů). Erlang je funkcionální programovací jazyk, takže funkce jsou jeho základním typem a dá se s nimi dělat všechno to, co můžete dělat s čísly (a víc). Takže je zcela normální, že například jinému procesu pošlete funkci, která se má provést s daty toho procesu a poslat vám zpět výsledek.

Pokud do proměnné v Erlangu přiřadíte nějakou hodnotu, nemůžete tam později přiřadit nic jiného. Pokud napíšete:

A = 0,
A = A + 1,

...dojde k chybě na druhém řádku, protože nula se nerovná jedné. Znak "rovná se" funguje v Erlangu jinak než je v programovacích jazycích obvyklé, a více se to podobá tomu, jak funguje v algebře. Například po provedení tohoto programu:

MujList = [ahoj, lidi, jak, se, vede],
[Prvni, Druhy | Zbytek] = MujList,

....bude v proměnné Prvni atom ' ahoj', v proměnné Druhy atom 'lidi' a v proměnné 'Zbytek' bude list [jak, se, vede]. (Proměnné v Erlangu začínají vždy velkým písmenem, takže je snadno odlišíte od atomů.) Pokud by před provedením těchto řádků proměnná Prvni existovala a bylo něco jiného než 'ahoj', druhý řádek vyhodí chybu, protože nic jiného než atom 'ahoj' se nemůže rovnat atomu 'ahoj'.

Tomuto se říká "pattern matching" a dají se s tím v Erlangu dělat mnohem složitější věci. Jedním řádkem pak můžete "vytáhnout" ze složitější struktury jen ty hodnoty, které vás zajímají, nebo naopak složit množství jednodušších hodnot do složitější struktury. Nebo velmi snadno porovnat, jestli nějaká data odpovídají nějakému patternu, a na základě toho něco udělat nebo neudělat.

Erlang nemá cykly v obvyklém smyslu slova. To, k čemu se v jiných jazycích používají cykly, se v Erlangu dělá rekurzí nebo pomocí listů / map. Je již takovým evergreenem, že se nějaký nováček někde na Internetu zeptá "Jak se v Erlangu udělá normální cyklus?" a mazáci se ho začnou vyptávat, co přesně chce udělat, aby mu následně vysvětlili, že v Erlangu k tomu cyklus nepotřebuje. Například takto jednoduše nadefinujeme funkci filter(Fun, MujList), která vytvoří nový list, obsahující pouze ty položky listu MujList, pro které vrátí funkce Fun hodnotu 'true':

filter(Fun, MujList) -> [X || X <- MujList, Fun(X)].

A to je opět jen nejjednodušší příklad. Můžete napsat jednořádkovou funkci, která provede megasložitou transformaci nějakých dat do úplně jiných dat. Erlang se vyznačuje mimo jiné tím, že se v něm hrozně složité věci dají zapsat extrémně krátkým kusem kódu.

Některé výše zmíněné věci vám mohou připadat jako omezující, ale skutečnost je taková, že vám tyto featury pomáhají psát lepší kód a snáze odhalovat chyby. Pokud zjistíte, že na řádku R je v proměnné X nějaká divná hodnota, která způsobuje chybu, existuje jen jedno místo v programu, na kterém tam ta hodnota musela být přiřazena (protože se hodnoty proměnných nemohou měnit). Pokud program neobsahuje syntaktické chyby ani varování, je pravděpodobné, že bude na první pokus fungovat. Pokud vám překladač nahlásí "Nadefinovali jste proměnnou X, ale nic s ní následně neděláte", pravděpodobně to znamená, že máte v programu chybu.

Obecně platí, že pokud začne váš Erlang program vypadat nepřehledně, měli byste přidat další proces nebo více procesů. Potřebujete něco jako globální proměnné? Nechte jeden proces, aby se o ně staral, a ostatní si mu budou říkat o jejich hodnoty (pomocí vašeho vlastního, velmi jednoduše definovatelného API). Programujete webserver? Spusťte nový proces pro každé nové příchozí připojení. Pokud v rámci připojení tohoto klienta dojde k nějaké chybě, proces se zhroutí, zmizí a nemusíte se o něj dál starat (pokud nechcete). Potřebujete posílat zprávy mezi procesy nějakým složitějším způsobem (např. jednu zprávu pro více procesů)? Posílejte všechno svému "dispečerskému procesu", který se postará o přeposílání dále. Potřebujete, aby vícero vašich procesů zapisovalo na disk, případně i více procesů do stejného souboru? Vyhraďte si jeden proces pouze na zapisování souborů na disk a ostatní procesy mu budou posílat své požadavky. Dokonce jste motivováni ke konvertování klasických algoritmů do jejich multi-procesových verzí, protože těchto více procesů pak bude zcela automaticky prováděno různými jádry procesoru a získáte tak třeba i mnohonásobné zrychlení.

A konečně, Erlang umožňuje bezproblémové volání jiných existujících programů nebo skriptů a zpracovávání jejich vstupů i výstupů současně, bez nebezpečí, že se nějaký stream zasekne a tím zasekne celou vaši aplikaci. Což je opět něco, co je v jiných programovacích jazycích ryzí peklo.

Erlang obsahuje mnoho robustních a dokonale dokumentovaných knihoven, které slouží například ke složité správě procesů, jejich automatickému restartování, kaskádovému šíření chyb a tak dále. Ale začátečníkovi bych spíše doporučil napsat si takové knihovny sám a přitom se něčemu přiučit. Nebo se podívat na zdrojáky těch existujících knihoven, protože jsou z 99 procent napsány v Erlangu.

A co se týče těch "aplikací, běžících několik desetiletí non-stop": Erlang umožňuje změnit zdrojový kód procesu za běhu programu a pokud to vede k chybě, automaticky provést návrat k původnímu kódu (ano, každý kus kódu může existovat současně ve "staré" a "nové" verzi).


Před pár lety se objevil jazyk Elixir, který z Erlangu vychází, funguje na stejném virtuálním stroji a dle mého osobního názoru se snaží Erlang překroutit tak, aby se v něm snadněji daly dělat prasárny, což (opět dle mého osobního názoru) popírá některé základní "čisté" principy Erlangu. Ale to už je na vás.

Pokud se chcete naučit základy Erlangu zajímavou a docela vtipnou formou, doporučuji "Learn you some Erlang for great good" (zdarma online).

P.S: V rámci zjednodušení jsou v tomto článku některá tvrzení, která nejsou úplně exaktně pravdivá. Ale je to pro vaše dobro.

48 komentářů:

  1. Tento Fuka není o dokumentu z Japonska.

    Par postrehu:

    ... z pracovnich duvodu... - ale no tak Frantisku. Slovo prace v souvislosti s tvou osobu je oxymoron.

    Programoval jsem... - co konkretne, kdyz pomineme nejake ty reverzne obslehnute hry na ZX Spectrum?

    - Co te vlastne, Frantisku, vede k psani techto sahodlouhych clanku na tvuj filmovy blog o skladani hudby a programovani, kdyz vlastne ani jedno neumis?

    Ptam se pro kamaradku.

    OdpovědětVymazat
    Odpovědi
    1. Má kamarádka kozi a mohli bychom je vidět?
      Ptám se pro Diskutera

      Vymazat
    2. Frantisek pracoval obvyklym sposobom, teda zobral existujuci skript, cize niekoho ineho pracu, a upravil premene. Detialy kamaratke vysvetlim osobne a nafotime aj tie kozi pre Diskutera.

      Vymazat
    3. Byl Franta někdy v Erlangen? Ptám se pro Německo.

      Vymazat
    4. Stačí, že byl za naše peníze v Japonsku. Následky pociťujeme dodnes. Peníze nejsou a buržuj Fuka kyne.

      Vymazat
    5. Fuka kyne, nebo Fukakyne? Toť otázka..

      Vymazat

  2. "V rámci zjednodušení jsou v tomto článku některá tvrzení, která nejsou úplně exaktně pravdivá. Ale je to pro vaše dobro"

    Toto by mělo být na konci každého článku (nejen o Erlangu).

    OdpovědětVymazat
    Odpovědi
    1. Prostě jinými slovy: byl jsem příliš líný to napsat pořádně, tak k tomu dám disclaimer a až bude mít někdo kecy, že je tam něco blbě, můžu mu napsat, looool, to je schválně, ty nulo, hehehe...

      Vymazat
    2. Snad se Frantisek po intenzivnim mesicnim studiu absolutnich zakladu tohoto jazyka neciti byt expertem natolik, aby mel opet ambice na psani nejake knizky.

      Vymazat
  3. A nestačilo by prostě napsat: filmové recenze už psát nebudu, protože jsem příliš sexy / renesanční osobnost?

    OdpovědětVymazat
  4. Odpovědi
    1. Čožéé? Čožéé Romáán? Ďalšia radosť vo mne! clickbait xixi.

      Vymazat
    2. Smarja vy jste dva? Ja myslel, ze Chlebec a Líška jsou jedna a ta sama osoba. To jsem nevedel, ze Franta na Amaterech nasel az tolik kamaradu.

      Vymazat
    3. "Já myslel, já myslel". Tak mysli ešte raz a poriadne, anonymný!

      Vymazat
  5. Z popisu to zni tak, ze bych si s tim mohl hrat i ja.

    OdpovědětVymazat
  6. Františku, nevím čemu říkáš "pracovní důvody", ale už šest let máš závazek dokončit film. A ne, nejsi James Cameron, takže svět nečeká tiše s otevřenou pusou jaké to bude epické dílo, když to tak dlouho trvá. A protože jsi došel k poznání, že z natočeného materiálu žádný film sestříhat nedokážeš, je logickým závěrem, že se právě snažíš naprogramovat jednoduchý skript v Erlangu, který pomocí stovek konkurenčních procesů film sám sestříhá v nějakém open source linuxovém editoru přes velmi jednoduše definovatelné API.

    OdpovědětVymazat
    Odpovědi
    1. Skoda, ze Frantisek neposkytl clanek o sesti letech strihani a nenadhodil nejake vychytavky ve strihacim programu, prechody mezi zabery, ktere ted frci... Cim to asi bude?

      Mimochodem Premiere a mozna jeste Final Cut, nic jineho nema smysl. Ale bohuzel to stoji par tisic rocne no, takze nic pro Frantiska, i kdyz je to absolutni pohoda v tom strihat. Frantisek radeji bude strihat film pomoci zadavani jednicek a nul do linuxove prikazove radky.

      Vymazat
    2. Mm-hmm, ale uvedomuješ si, že Erlangsaplikationen bežia non-stop několik >>desetiletí<<, přičemž se v průběhu těch desetiletí ani jednou nerestartujou??

      Vymazat
  7. Když to Franto srovnám s tímhle tvým starým článkem z roku 2006

    https://blog.lupa.cz/fflog/programovaci-jazyk-pro-dnesni-den-erlang/

    Tak jsi za těch cca 15 let moc s Erlangem nepokročil.

    OdpovědětVymazat
    Odpovědi
    1. Fuka proste vytazil maximum uz na prvy krat, lebo je to genius.

      Vymazat
    2. Franta přece našel v lednici prázdnou plechovku, takže už trpí zapomětlivostí. Oba ty jeho články jsou v podstatě stejné a protože má Erlang rád, tak o něm bude psát i nadále - každých pár měsíců to samé.

      Vymazat
    3. V cem Frantisek pokrocil je spis otazka, ktera by nevygenerovala dlouhy seznam.

      Vymazat
  8. Franto, můžeš začít psát o Erlangu další nedokončenou knihu.

    OdpovědětVymazat
  9. a nejaka negativa erlangu? mi se ted libi GO se svymi kanaly.

    OdpovědětVymazat
    Odpovědi
    1. No, oproti GO je konkurence/paralelizace v Erlangu na vyšší úrovni abstrakce.
      Dynamické typování, to se dá brát jako negativum.


      Vymazat
    2. Erlang má nástroje pro (statickou) analýzu kódu, kterým se dají podstrčit definice označující co má mít kde v kterou chvíli jaký typ hodnoty.

      Vymazat
  10. Každý, kdo tvrdí, že pozná rozdíl mezi Erlangem a Pascalem, je u mě snob a možná i kokot.

    OdpovědětVymazat
  11. Ten čávo v inštruktážnom videu má všetky znaky pedofila: knír, typické bríle, je "mňam"...

    OdpovědětVymazat
  12. Někdy by mě zajímalo, proč tady vy samozvaní kritici vlastně chodíte, čtěte a následně komentujete když vás to vlastně nezajímá.
    Za mně zajímavý článek o jazyku, který jsem minul, přestože se v IT pohybuji.

    OdpovědětVymazat
    Odpovědi
    1. proč tady vy chodíte? asi nějáká chyba v kódu, ne? Zřejmě Brnoleng.

      Vymazat
    2. Já myslím, že řada lidí sem chodí v naději, že se v článku nebo komentářích dozví alespoň nějaké indicie ohledně stavu připravovaného dokumentu. Protože blog k tomu určený tak nefunguje.

      Vymazat
    3. Fukove zastarale clanky na urovni amaterskeho povrchneho zoznamenenia sa so subjektom niekto cita?

      Vymazat
    4. Tak třeba já sem chodím, protože mě baví sledovat v reálném čase probíhající příběh o tom, jak se z Fuky stal přesně ten politováníhodný podivín, kterým se dřív na internetu tak rád vysmíval. A vědí to všichni kromě Fuky samotného, kterému nestačí naznačit. Ale možná se to dozví podobným způsobem, jako se dozvěděl o tom, že se s ním rozešel Zuzik.

      Vymazat
  13. Nevím jak ostatní, ale já bych si od Františka, jakožto člověka multi-oborově mimořádně nadaného, rád přečetl něco o stříhání filmu. Rád bych do tého problematiky pronikl hlouběji, ale nemám moc zkušeností a chtělo by to nějaké tipy do začátku. František to po šesti letech práce už musí mít v malíčku a jeho zkušenosti z tvorby celovečerního filmu by nám úplným začátečníkům mohly ledacos usnadnit.

    OdpovědětVymazat
    Odpovědi
    1. Tohle se neví, ale Franta ještě ani stříhat nezačal. Filmy stáhl z kamery, pak řešil asi rok důmyslné zálohování do cloudu bez zbytečného utrácení. Potom si chtěl rozkreslit storyboard, ale zjistil že neumí kreslit. Tak požádal Pupena, ale dopadlo to ještě hůř. Celý rozmrzelý se rozhodl, že to zkusí bez storyboardu a začal shánět vhodný stříhací software. Zatím bez úspěchu. Vůbec ho to nebaví a tajně doufá, že se ty zdrojáky a zálohy do cloudu nějak poserou, aby to celé mohl - bohužel - zrušit. Magnetky vracet nemusíte.

      Vymazat
  14. A dá se to ještě nazvat proměnná, když se hodnota nemůže proměnit? :-D

    OdpovědětVymazat
    Odpovědi
    1. No ona se exaktně vzato může změnit - když zavoláš tutéž funkci znovu (i rekurzivně), proměnné mohou dostat jiné hodnoty.

      Vymazat
  15. Tenhle článek mě dovedl k programu Wings3D, který je napsaný v Erlangu. Tváří se to jako docela příjemný 3D editor, ve kterém se mi podařilo upravit STL soubor, aniž bych musel číst návod. Blender nedávám, ten toho umí asi víc, ale ztrácím se v něm.

    OdpovědětVymazat
  16. Jedna věc je, jestli je programování v tomto jazyce zábava, a druhá, jestli je dostatečně rychlý, efektivní, nakolik dobře se v něm hledají a opravují chyby, rozděluje program do modulů atd. Většina programátorů totiž neprogramuje pro zábavu, ale pro zákazníky - a ti požadují rychlý, spolehlivý, nepadající a co nejméně prostředků zabírající program, je jim jedno, v jakém jazyce je napsán a kolik má zdroják řádků.

    OdpovědětVymazat
    Odpovědi
    1. Přesně, tohle jsou jenom takové hračičky. To podstatné, jak se ty programy v reálu používají, chybí. To ale František nikdy řešit nemusel...

      Vymazat
  17. Zni to zajimave - jak to funguje na "webu/cloudu" - da se to nejak deploynout jako webapp do azure/google nebo podporuje to nekdo treba jako "lambda" nebo tak? Nebo je to spis na to domaci nebo proprietary bastleni s vlastni infrastrukturou?

    Existuji do toho knihovny (a neco jako maven/gradle na dependencies)? Da se treba pullnout nejaky json parser nebo je to vsechno spis copy & paste z jinych projektu?

    Tohle neni hate, ptam se uplne vazne... (libi se mi architektura vznikajich/zanikajich procesu a bus mezi nima)

    OdpovědětVymazat
    Odpovědi
    1. 3 roky jsem v Erlangu programoval pro pomerne velkou ceskou firmu. V Erlangu jsou taky napsany siroce pouzivany MQTT broker VerneMQ.

      Rozhodne neni jen na domaci bastleni :)

      Pro rychle prakticke uziti bych se podival na knihovnu Cowboy nebo Yaws - to jsou implementace webovych serveru (rekneme takovy flask pro erlang)

      Vymazat
  18. Sorry, ale ne sorry - Elixir je mnohem dál, co se DX týče. Někomu nemusí vyhovovat ruby-like syntax, ale pro mě jako pokročilého programátora, je prostě čitelnější, zachovává koncept procesů, dodává skvělej tooling (mix) a dnes už i širší komunitu a luxusní nadstavbu v podobě Phoenixu.

    Takže ne. Erlang je super, ale jeho čas už je pryč.

    OdpovědětVymazat
  19. Co se týče těch funkcionálních prvků, to je v poslední době v módě a umí to řada jazyků. Třeba tomu [Prvni, Druhy | Zbytek] se říká v javascriptu destructuring assignment, na immutabilitu je řada knihoven, třeba immutable.js, map/reduce/filter atd. umí taky https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

    OdpovědětVymazat

Komentáře jsou moderovány kombinací umělé a lidské inteligence. Mohou být zveřejněny až po několika hodinách a ty zveřejněné mohou později zmizet. Pokud pošlete stejný (nebo podobný) komentář několikrát, výrazně se tím snižuje pravděpodobnost, že bude někdy publikován.