Výhody a nevýhody Reasonu
Jednou z nejznámějších aplikací, kde se Reason používá, je Messenger.com od Facebooku. Otázkou je proč? Jak známo, Facebook používá PHP a JavaScript. Co tedy Reason nabízí oproti těmto jazykům a oproti další spoustě jazyků, které používají hordy programátorů po celém světě? Proč vůbec vytvářet nový jazyk?
Oficiální stránka jazyka popisuje Reason jako ECMAScript 2030, ale bez historického balastu. To nezní špatně, viďte? Ve skutečnosti Reason není úplně nový jazyk – Facebook vzal poměrně starý a ozkoušený jazyk OCaml a vytvořil pro něj JavaScriptovou syntax. To znamená, že kořeny mnoha výhod a nevýhod Reasonu sahají k OCamlu.
Jaké jsou tedy výhody Reasonu oproti ostatním programovacím jazykům:
-
Silný typový systém se skvělou typovou inferencí. Silný typový systém pomáhá udržet přehled v programech a předcházet chybám. V poslední době si přínosu typové kontroly všimli i programátoři v tzv. dynamicky typovaných jazycích a v různých formách do nich začlenili podporu pro typy. Příkladem je Python s mypy nebo TypeScript. Jenže otypovat kód, který byl původně psán bez typového systému, není úloha úplně triviální, v důsledku čehož ani typové systémy mypy nebo TypeScriptu nejsou zrovna jednoduché. Typový systém Reasonu je silný, ale přesto jednodušší a předvídatelnější než typové systémy mypy a TypeScriptu.
Typová inference znamená, že kompilátor umí na mnoha místech odvodit typy sám bez pomoci programátora. Kód je tedy stále přehledný, jako bychom pracovali v tzv. dynamicky typovaném jazyce, ale zároveň máme výhody typů.
- Důraz na neměnnost. Reason má dobrou podporu pro funkcionální programování a neměnné datové struktury. V mnoha situacích oboje vede ke srozumitelnějšímu kódu. Nicméně, pokud je to vhodné, mutaci lze použít a lze porušit referenční transparentnost (a na rozdíl od
unsafePerformIO
z Haskellu je to z pohledu typového systému zcela bezpečné). - Kompilace do JavaScriptu. Reason lze přeložit do JavaScriptu a spouštět ve webovém prohlížeči. Díky optimalizacím, které kompilátor Reasonu provádí, je výsledný JavaScript často menší a rychlejší než JavaScript ručně psaný.
- Oficiální podpora Reactu. Při návrhu jazyka byl kladen velký důraz na podporu Reactu a JSX. Možná proto, že hlavním autorem Reasonu je Jordan Walke, autor Reactu. Už nyní se ReasonReact snaží vynucovat styl programování, který bude v nové generaci Reactu, zvané React Fiber, nevyhnutelný.
- Rychlá kompilace. Na rozdíl od jiných jazyků se silným typovým systémem, třeba od Scaly nebo Haskellu, je kompilátor Reasonu velmi rychlý.
- Pokročilé vlastnosti. Jednou z nich jsou polymorfní varianty, velmi užitečná konstrukce, jenž udělá kód čitelnějším a modulárnějším, ale kterou populární jazyky bohužel nemají.
- Kompilace do nativního kódu bez nutnosti instalace virtuálního stroje. Na rozdíl od C#, F#, Kotlinu a Scaly má Reason nativní backend produkční kvality. Programy v Reasonu lze tedy přeložit do nativního kódu a uživatelé programů si pro jejich spouštění nemusí instalovat CLR nebo JVM.
- Nízké latence GC. Nativní runtime Reasonu (ale i OCamlu) disponuje garbage collectorem, jenž má velmi nízké latence. Viz Golang’s Real-time GC in Theory and Practice.
To je hezké, určitě se ptáte, jaké má Reason nedostatky? Hlavním nedostatkem je malé množství knihoven. Při kompilaci do JavaScriptu lze sice použít knihovny JavaScriptu, ale jejich použití nebývá úplně přímočaré, pokud zrovna neexistuje dobrý wrapper, jako je tomu u Reactu. Dalším minusem je nepodpora paralelního programování.
Kdy je vhodné Reason používat?
V současné době je Reason svělý pro psaní aplikací, které běží ve webovém prohlížeči. Zejména, pokud jsou postavené na Reactu. Proč?
- Oproti JavaScriptu má silný typový systém,
- oproti TypeScriptu je jednodušší a předvídatelnější,
- oproti Scale se ScalaJS je jednodušší a kód díky JSX vypadá lépe,
- oproti F# s Fable je mnohem robustnější a mnohem méně zabugovaný,
- oproti Elmu, Haskellu a jiným čistě funkcionálním jazykům, Reason podporuje mutaci, což v některých situacích značně zpřehlední kód,
- oproti Kotlinu má pár pokročilých vlastností, jako například již zmíněné polymorfní varianty, které jsou zatraceně užitečné, a lepší typovou inferenci.
Nicméně i tak je Kotlin z mého pohledu velmi silný soupeř, který stojí za zvážení zejména díky možnosti sdílet kód backendu a frontendu a své jednoduchosti.
Vyzkoušejme Reason a ReasonReact
Nyní si ukážeme, jak Reason zprovoznit lokálně. Je třeba mít nainstalované Node.js. Reason pak nainstalujeme následujícím příkazem
npm install -g bs-platform
bs
ve názvu bs-platform
značí BuckleScript, což je kompilátor Reasonu a OCamlu do JavaScriptu.
Novou aplikaci vytvoříme příkazem
bsb -init nase-prvni-aplikace-v-reasonu -theme react
bsb
je BuckleScript build system. Výše uvedený příkaz vytvoří adresář nase-prvni-aplikace-v-reasonu
s kostrou Reactové aplikace. Aby se aplikace sestavila je třeba spustit
cd nase-prvni-aplikace-v-reasonu && npm install && npm start
npm install
stáhne závislosti naší aplikace a npm start
spustí překladač Reasonu do JavaScriptu, překladač bude sledovat zdrojové soubory a provádět jejich překlad při každé změně.
Díky tomuto příkazu vzniknou ze zdrojových souborů src/index.re
a src/page.re
JavaScriptové soubory src/index.bs.js
a src/page.bs.js
.
V novém terminálu je třeba spustit
npm run webpack
Tento příkaz vytváří z mnoha JavaScriptových souborů jeden JavaScriptový soubor build/index.js
– opět kdykoliv se nějaký vstupní soubor změní, bude výstupní soubor přegenerován.
Nyní můžeme otevřít stránku src/index.html
ve webovém prohlížeči.
Editor
Doporučuji zprovoznit plugin pro Reason ve Visual Studio Code. Plugin využívá další příkazy. Instrukce, jak je nainstalovat, jsou na stránce Reason ➡ Global Installation ➡ Through Npm/Yarn.
Například pro Linux se to provede příkazem
npm install -g https://github.com/reasonml/reason-cli/archive/3.0.4-bin-linux.tar.gz
Doporučuji si ověřit, že se příkaz nezměnil a verze 3.0.4 je aktuální.
Teď stačí nainstalovat plugin vscode-reasonml
do Visual Studia Code a otevřít celý adresář nase-prvni-aplikace-v-reasonu
.
Závěr
Představili jsme si jazyk Reason a několik důvodů, proč ho používat. V dalších dílech tohoto seriálu uvidíme, více důvodů, proč používat Reason. Například pattern matching nebo strukturální systém modulů. V příštím díle začneme skutečně programovat, seznámíme se se základy Reasonu a ReasonReactu a vysvětlíme si kód v src/page.re
.