Tag Archives: Clojure

O smyslu a významu funkcionálního programováni dnes a pro dny příští

Četl jsem, že každý student se na informatické fakultě svého výběru dříve či později setká s funkcionálním programováním, ať už studuje Fakultu informatiky na Masarykové univerzitě nebo třeba Fakultě informačních technologií VUTbr, kde si tedy funkcionální programování, neboli funkcko, šetří až pro magistry.

Většina studentů odchází funkcionálním programováním relativně nepoznamenána, čest výjimkám. To vyvozuji jak z četby on-line diskusí, tak z pohledu na praxi, tak z vlastního pocitu. Chce se mi rýpnout, že ta poznamenaná menšina studentů odchází na VUT, což ale jistě není pravda. Za sebe říkám, že některé naprosto zásadní myšlenky funkcionálního programování jsem pochopil až dlouho za půlí semestru a půlsemestrálním testem (“každá funkce v Haskellu se z jistého pohledu vždy aplikuje na právě jeden argument”), přes tato svá zaváhání však relativně prospívám a pokud si na závěrečné písemce povedu jako doposud, měl bych se ctí prolézt ;-)

Pozn: dostal jsem Áčko

Co bychom si tedy měli z funkcionálního programování, řekněme z toho vyučovaného na Fakultě informatiky MU odnést? Když pominu vedlejší věci, třeba že právě na přednášce z funkcka jsme byli poprve uvedení do probému asymptotické složitosti algoritmu, že nám byli představeny některé jednoduché datové struktury a že na cvičení jsme byli poprve nuceni pracovat s počítači na Fedoře, zbývá jádro předmětu – funkcionální programování a Haskell, jako konktétní zhmotnění příslušných myšlenek. Co nám tyhle dvě věci přinesly?

Procvičníme si rekurzi, to jest když funkce volá sama sebe. Haskell nemá klasické cykly. To, pokud nevíte, vychází z celého funkcionálního paradigmatu, ve kterém jsme se rozhodli nemít informaci o stavu. V počítaném cyklu nutně potřebujeme počítadlo, které bude měnit svůj stav – počet dosud provedených cyklu či tak. Protože jsme se rozhodli být bezstavoví, počítaný cyklus je mimo a místo něj musíme chytře použít rekurzi. Cyklus nepočítaný, nějaký ten while či tak, ten se dá nahradit (rekurzí, nebo nějak úplně jinak) relativné přímočaře.

Jsme nuceni používat jiný přístup k řešení problémů: Generátory seznamů, lambdu, funkce vyšších řádů (funkce, která vrací funkci.) Pod vlivem funkcka jsem minulý týden v Pythonu spáchal svoji první lambdu a napsal si variaci na Haskellovskou funkci group :P

V Haskellu nebylo naprogramováno mnoho vzrušujících věcí. Seznamy Haskellového software bývají krátké a položky na nich lehce obskurní: verzovací systém Darcs, okenní manažer xmonad, několik málo her, generátor jmen pro počítače (něco originálnějšího, než “Počítač v kuchyni” a “Tereza-PC”)

Návrat do budoucnosti

Sequence, selection, iteration

Pokud přeskočíte hudební vložku (týpek bubnuje) a kosmologickou vložku (týpek popisuje vznik sluneční soustavy; oboje dohromady trvá prvních 5 minut), uslyšíte poměrně zajímavou přednášku, která zazněla na Rails Conf v roce 2010.

Osnova:

  1. hudební vložka a kosmologická vložka
  2. současné počítače jsou 10^²⁵× lepší, než to, s čím přednášející kdysi začínal. (týpek vynásobil dohromady spoustu dílčích zlepšeni)
  3. stručná historie imperativních programovacích jazyků, jazykové rodiny – ALGOLová a Lispová
  4. současné přestupy k programování jsou ~padesát let staré, dokonce i principy internetu byly formulovány už v roce 1962
  5. od té doby se vyvíjel jen hardware, který se zlepšíl 10^²⁵× , teorie za tím vším stagnuje a nový software jsou vlastně jen variace na to, co tu už bylo
  6. zajímavé odhady, třeba že v každém okamžiku je v datových kabelech v pohybu 50 gramů elektronů. V pohybu je udržuje výkon 50×10⁶ koňských sil. ;-)
  7. současné programovací přístupy neumí efektivně využít vícejádrové procesory, těžko se pro ně programuje a výsledek je extrémně obtížné udržovat a skoro nemožné udržitelně modifikovat
  8. exponenciálnímu zrychlování HW je konec, místo toho se vyrábí vícejádrové procesory
  9. ve víceprocesorovém systému je problém udržovat stav a tím se všechno komplikuje. Funkcionální jazyky jsou bezstavové. Rozumné funkcionální jazyky se nesnaží být fundamentálně bezstavové a proměnné podporují. Dokonce automaticky řeší synchronizaci.
  10. V poslední době se vynořují nové funkcionální jazyky, např F# od Microsoftu a mnohé další
  11. Průběžně během přednášky: tři knížky, které si prostě nemůžete nepřečíst

Youtube: http://youtu.be/mslMLp5bQD0 Podcast (mp3): http://itc.conversationsnetwork.org/shows/…

Tackling the Awkward Squad

Awkward Squad, to je důvod, proč podle mého názoru přímo Haskell tím jazykem budoucnosti nikdy nebude. Awkward Squad, to je v Haskellu vstup a výstup, výjimky, vícevláknový běh programu a volání vzdálených procedur. Všechny tyhle věci, které, dovolím si tvrdit, tvoří jádro moderního programování, Haskell sice má, dokonce jsou velmi mocné, jsou pojaty velice elegantně a konzistentně (alespoň to tvrdí haskellisti), problém je, jak sami Haskellisti uznávají, že výsledek je tak trochu »awkward«. Prostě to není hezké. Četl jsem názor jednoho programátora, který tvrdil, že vždycky když v Haskellu musí programovat vstupně/výstupní operaci, má pocit, že jazyk se mu snaží vnutit představu, že je něco špatně, že tím narušuje čistotu programu. To ho samozřejmě velice frustruje. Věc se odráží i v terminologii, funkce, které zajišťují rozhraní mezi programem a světem se v Haskellu nazývají impure. Co je to za jazyk, který v zájmu ideologické čistoty komplikuje vytváření užitečných programu? Odpověď je jasná, takový jazyk je  jazyk akademický.

Scala, F# × Clojure

F# je reinkarnace Ocaml, v kompatibilním módu je s Ocaml kompatibilní, v nekompatibilním módu není a podporuje nějaká rozšíření. Program se překládá pro .Net.

Programy ve Scale se překládají pro JVM.

Clojure je nezávislá iniciativa jednoho člověka, nezávislá na jakékoli firmě (jako Ruby, Python, PHP,…), překládá se pro Javu, tedy JVM, alternativně existuje port pro .Net, tedy CLR.

Jak si můžete všimnout, tyhle jazyky jsou úzce navázány na již existující a široce používané »ekosystémy«. Znamená to, že ve svém programu můžete bez problémů používat knihovny, které existují pro tu danou platformu, na které je jazyk vystavěn.

Doslov

Zdá se mi, že funkcionální programování má budoucnost.

Jak je možno dovodit porovnáním výše napsaného a diskuse pod tímto článkem, nechal jsem se v první části tohoto blogu značně inspirovat názory více či méně anonymních diskutérů. Děkuji autorovi článku za rozpoutání podnětné debaty.