Čistota programovacího jazyka

Čistota (ve vztahu k programovacímu jazyku) - absence vedlejších účinků . Programovací jazyk je čistý, pokud jsou všechny funkce v programech tohoto jazyka čisté .

Programy napsané v čistě programovacích jazycích se snadněji ladí , ověřují a snáze odhalují chyby, které nebylo možné odhalit testováním . Programy v čistém programovacím jazyce se snadněji přepisují bez zavádění chyb. Samotný proces plánování programu s očekáváním čistoty je přitom složitější.

Další důležitou výhodou čistě funkcionálních jazyků je paralelismus . Protože všechny funkce pro výpočty používají pouze své parametry, je možné organizovat výpočet nezávislých funkcí v libovolném pořadí nebo paralelně, což neovlivní výsledek výpočtu. Paralelnost může být organizována nejen na úrovni jazykového kompilátoru, ale také na úrovni hardwarové architektury. Existují experimentální počítače založené na podobných architekturách, jako je stroj Lisp .

Čistě funkcionální jazyky se někdy nazývají „deterministické“ v tom smyslu, že pro jakoukoli funkci má každé volání vždy stejný účinek (v imperativních jazycích to obecně neplatí). Zároveň se takové jazyky nazývají „nedeterministické“ v tom smyslu, že pořadí skutečného provádění programu se může značně lišit v závislosti na konkrétní implementaci jazyka: algoritmy mohou být implicitně paralelizovány, mezilehlá data mohou být vyloučena z převodní řetězec, reprezentace stejných typů se mohou lišit i v rámci stejného programu atd. (to je u imperativních jazyků prostě nemožné). Jednoduše řečeno, čisté jazyky jsou deterministické na úrovni zdrojového kódu a nedeterministické na úrovni implementace (imperativní jazyky jsou naopak).

I/O a čistota

Nejzávažnější aplikací programovacích jazyků, ve které jsou ve funkcích neustále přítomny vedlejší efekty, je vstup-výstup . Lze předpokládat, že jakákoli operace vstupu dat od uživatele je akcí s vedlejším efektem, protože není možné předem říci, co přesně uživatel zadá jako hodnoty parametrů použité ve výpočetním procesu. Někteří výzkumníci a teoretici sice tvrdí, že I/O nelze považovat za příklad přítomnosti vedlejších efektů, protože I/O je v podstatě změna prostředí programu, ale v každém případě I/O dělá funkce jeho použití je nedeterministické.

V čistém funkcionálním programování neexistuje operátor přiřazení, objekty nelze měnit a ničit, lze pouze vytvářet nové rozkladem a syntézou stávajících. O nepotřebné předměty se postará garbage collector zabudovaný do jakéhokoli funkčního překladače jazyků . Z tohoto důvodu jsou v čistě funkcionálních jazycích všechny funkce bez vedlejších účinků. To však těmto jazykům nebrání v napodobování některých užitečných imperativních funkcí, jako je zpracování výjimek a měnitelná (destruktivně) pole . Existují na to speciální metody.

Některé důvody pro přítomnost funkcí s vedlejšími účinky však nelze zcela odstranit z funkčních programovacích jazyků, protože v tomto případě by takové jazyky byly v praktickém použití příliš omezené. Především to platí konkrétně pro vstup-výstup. Je těžké si představit plnohodnotný programovací jazyk, kde neexistuje možnost provádět vkládání dat od uživatele v interaktivním režimu, stejně jako provádět výstup dat pro uživatele.

Monády

Aby bylo možné používat technologie jako I/O bez degradace vlastnosti čistoty, mnoho funkcionálních programovacích jazyků, včetně Haskellu , používá speciální mechanismus zvaný „ monáda “. Zdá se, že monády obalují nezbytné imperativní vlastnosti a brání tomu, aby byly smíchány s čistou syntaxí funkčního jazyka. Použití monád umožnilo implementovat všechna ta úzká místa, která regulovala přítomnost vedlejších účinků ve funkcích.

Takže například pro poskytování I/O v jazyce Haskell je implementována standardní monáda IO, mimo kterou není možné provádět žádnou I/O operaci. Všechny ostatní standardní monády implementované pro jazyk Haskell mají stejné vlastnosti.

Příklady čistých programovacích jazyků