Programozási nyelv tisztasága

Tisztaság (a programozási nyelvhez képest) - a mellékhatások hiánya . Egy programozási nyelv akkor tiszta, ha az adott nyelv programjaiban szereplő összes függvény tiszta .

A tiszta programozási nyelveken írt programok könnyebben hibakereshetők , ellenőrizhetők , és könnyebben észlelhetők a teszteléssel nem észlelhető hibák . A tiszta programozási nyelvű programokat könnyebb átírni hibák nélkül. Ugyanakkor maga a programtervezés folyamata a tisztaság elvárása mellett bonyolultabb.

A tiszta funkcionális nyelvek másik fontos előnye a párhuzamosság . Mivel a számításokhoz minden függvény csak a saját paramétereit használja, a független függvények számítását tetszőleges sorrendben vagy párhuzamosan is meg lehet szervezni, ez nem befolyásolja a számítási eredményt. A párhuzamosság nem csak nyelvi fordítói szinten szervezhető meg, hanem hardverarchitektúra szintjén is. Vannak hasonló architektúrán alapuló kísérleti számítógépek, mint például a Lisp gép .

A tiszta funkcionális nyelveket néha "determinisztikusnak" nevezik abban az értelemben, hogy bármely függvény esetében minden hívás mindig ugyanazt a hatást fejti ki (a kötelező nyelveken ez általában nem igaz). Ugyanakkor az ilyen nyelveket „nem determinisztikusnak” nevezik abban az értelemben, hogy a tényleges programvégrehajtás sorrendje a nyelv konkrét megvalósításától függően nagymértékben változhat: az algoritmusok implicit módon párhuzamosíthatók, a köztes adatok kizárhatók a nyelvből. a konverziós lánc, az azonos típusok ábrázolása még ugyanazon a programon belül is változhat stb. (ez az imperatív nyelveknél egyszerűen lehetetlen). Egyszerűen fogalmazva, a tiszta nyelvek determinisztikusak a forráskód szintjén, és nem determinisztikusak a megvalósítás szintjén (az imperatív nyelvek fordítva).

I/O és tisztaság

A programozási nyelvek legkomolyabb alkalmazása, amelyben a mellékhatások folyamatosan jelen vannak a függvényekben, az input-output . Feltételezhető, hogy a felhasználó által bevitt adatok bármely művelete mellékhatással járó művelet, mivel nem lehet előre megmondani, hogy a felhasználó pontosan mit fog megadni a számítási folyamat során használt paraméterértékekként. Bár egyes kutatók és teoretikusok azt állítják, hogy az I/O nem tekinthető példának a mellékhatások jelenlétére, hiszen az I/O lényegében a program környezetének változása, de mindenesetre az I/O teszi a függvényeket. nem determinisztikus használata.

A tisztán funkcionális programozásban nincs hozzárendelési operátor, az objektumokat nem lehet megváltoztatni és megsemmisíteni, csak a meglévők felbontásával és szintézisével lehet újakat létrehozni. A bármely funkcionális nyelvi fordítóba beépített szemétgyűjtő gondoskodik a felesleges tárgyakról . Emiatt a tisztán funkcionális nyelvekben minden funkció mentes a mellékhatásoktól. Ez azonban nem akadályozza meg ezeket a nyelveket abban, hogy utánozzanak néhány hasznos kötelező funkciót, mint például a kivételkezelés és a változtatható (pusztító) tömbök . Erre speciális módszerek vannak.

A mellékhatásokkal járó funkciók jelenlétének néhány oka azonban nem távolítható el teljesen a funkcionális programozási nyelvekből, mivel ebben az esetben az ilyen nyelvek gyakorlati felhasználása túl korlátozott lenne. Először is ez kifejezetten az input-outputra vonatkozik. Nehéz elképzelni egy teljes értékű programozási nyelvet, ahol nincs lehetőség a felhasználótól interaktív módban történő adatbevitel végrehajtására, valamint az adatkiadás végrehajtására a felhasználó számára.

Monádok

Annak érdekében, hogy lehetővé tegyék az olyan technológiák használatát, mint az I/O a tisztaság tulajdonságainak romlása nélkül, számos funkcionális programozási nyelv, köztük a Haskell , egy speciális mechanizmust használ, amelyet „ monádnak ” neveznek. Úgy tűnik, hogy a monádok becsomagolják a szükséges imperatív tulajdonságokat, megakadályozva, hogy összekeveredjenek egy funkcionális nyelv tiszta szintaxisával. A monádok használata lehetővé tette mindazon szűk keresztmetszetek megvalósítását, amelyek szabályozták a mellékhatások jelenlétét a funkciókban.

Így például a Haskell nyelvű I/O biztosításához egy szabványos monád kerül megvalósításra IO, amelyen kívül semmilyen I/O műveletet nem lehet végrehajtani. A Haskell nyelvhez implementált összes többi szabványos monád ugyanazokkal a tulajdonságokkal rendelkezik.

Példák tiszta programozási nyelvekre