Vlákno názorů k článku Erlang: trochu jiný přístup k programování od Michal Dorner - Ahoj, len 2 male upresnenia, inak dobry clanok: 1)...

  • Článek je starý, nové názory již nelze přidávat.
  • 21. 7. 2014 10:55

    Michal Dorner (neregistrovaný)

    Ahoj, len 2 male upresnenia, inak dobry clanok:

    1) "Data při volání funkce nebo zasílánízprávy jinému procesu se obsahy proměnných nekopírují" - V skutocnosti sa pri posielani sprav inemu procesu (s vynimkou large binaries) obsah premennych kopiruje. Procesy maju oddelenu spravu pamati a vdaka tomu sa pri spusteni garbage collectora nemusi stopnut cela Erlang VM ale len dany proces.

    2) "tail rekurzi, kdy je rekurzivní volání sebe sama jako poslední instrukce před opuštěním funkce" - Tail call Optimization (TCO) je len specialny pripad Last Call Optimisation (LCO). Erlang ma LCO, cize tato optimalizacia funguje pri volani lubovolnej funkcie, ak je to posledna insturkcia (nie len sama seba).

    Programoval som distribuovany MapReduce framework ako diplomovku tento rok, tak to mam celkom cerstvo v pamati :)

  • 22. 7. 2014 12:20

    code.equals.poetry

    Skvely (a u TCO obvykly) kdyz opravujici nevi co rika.

    LCO jsem dodnes neslysel, ale jestli se rekne LAST CALL nebo TAIL CALL je IMO uplne jedno.

    Dulezity rozdil je mezi:

    Tail Recursion Optimization: to znamena volani sebe sami, da se prevest na smycku)

    [obecnou] Tail Call Optimization: v pripade ze volani je posledni vec ktera se v dane vetvi provadi, je CALL optimizovany na JUMP (return je ponechany nektere z nasledujicich funkci, ta adresa porad sedi na zasobniku)

  • 22. 7. 2014 16:25

    Michal Dorner (neregistrovaný)

    zdroj: http://learnyousomeerlang.com/recursion

    Note: tail recursion as seen here is not making the memory grow because when the virtual machine sees a function calling itself in a tail position (the last expression to be evaluated in a function), it eliminates the current stack frame. This is called tail-call optimisation (TCO) and it is a special case of a more general optimisation named Last Call Optimisation (LCO).

    LCO is done whenever the last expression to be evaluated in a function body is another function call. When that happens, as with TCO, the Erlang VM avoids storing the stack frame. As such tail recursion is also possible between multiple functions. As an example, the chain of functions a() -> b(). b() -> c(). c() -> a(). will effectively create an infinite loop that won't go out of memory as LCO avoids overflowing the stack. This principle, combined with our use of accumulators is what makes tail recursion useful.

    Je pravda ze termin LCO sa moc nepouziva. Ci sa to oznacuje TCO/LCO alebo TCO/[vseobecny] TCO je fakt jedno, hlavne nech sa chape co sa tym mysli.
    Ak sa nemyli aj autor tej knihy a ja ho spravne chapem, tak Erlang skutocne vyhadzuje stack aj pri vseobecnej TCO.

    A tu poznamku o tom ako je skvele ked opravujuci nevie co hovori si si mohol odpustit.

  • 22. 7. 2014 17:14

    code.equals.poetry

    Zadny TCO vs vseobecny TCO neni

    TCO je vseobecna optimalizace, jejiz jeden pripad je tail rekurze (ten tail call vola tu samou funkci [ve ktery zrovna je]).

    Citovane rika, ze erlang dela plnou plny Tail Call Optimization (Elimination), ne jen Tail Recursion Elimination.

    http://c2.com/cgi/wiki?TailRecursion
    http://c2.com/cgi/wiki?TailCallOptimization

    Last Call Optimization je, vypada to, skoro nepouzivany vyraz pro TCO / TCE, takze mezi nimi neni rozdil.

    Proc dotycny misto "tail rekurze & tail callu" pouziva "tail call a last call" netusim, ale jak rikam, to ze v tom ti kteri to vysvetluji delaji bordell je naprosto bezne, i v knize o Scale v tom autor nadelal brajgl.