Ohjelmointikielen puhtaus

Puhtaus (ohjelmointikielen suhteen) - sivuvaikutusten puuttuminen . Ohjelmointikieli on puhdas, jos kaikki kyseisen kielen ohjelmien toiminnot ovat puhtaita .

Puhtailla ohjelmointikielillä kirjoitettujen ohjelmien virheenkorjaus , varmentaminen ja virheet, joita ei voitu havaita testaamalla , on helpompi havaita . Puhtaalla ohjelmointikielellä olevat ohjelmat on helpompi kirjoittaa uudelleen ilman virheitä. Samaan aikaan ohjelman suunnitteluprosessi puhtautta odotettaessa on monimutkaisempi.

Toinen puhtaiden funktionaalisten kielten tärkeä etu on rinnakkaisuus . Koska kaikki laskutoimitukset käyttävät vain parametrejaan, on mahdollista järjestää itsenäisten funktioiden laskenta mielivaltaisessa järjestyksessä tai rinnakkain, tämä ei vaikuta laskentatulokseen. Rinnakkaisuus voidaan järjestää paitsi kielen kääntäjätasolla, myös laitteistoarkkitehtuurin tasolla. On olemassa kokeellisia tietokoneita, jotka perustuvat samanlaisiin arkkitehtuureihin, kuten Lisp-kone .

Puhtaita toiminnallisia kieliä kutsutaan joskus "deterministisiksi" siinä mielessä, että jokaisella toiminnolla jokaisella kutsulla on aina sama vaikutus (pakollisissa kielissä tämä ei yleensä pidä paikkaansa). Samanaikaisesti tällaisia ​​kieliä kutsutaan "ei-deterministisiksi" siinä mielessä, että varsinaisen ohjelman suoritusjärjestys voi vaihdella suuresti riippuen kielen erityisestä toteutuksesta: algoritmit voidaan rinnastaa implisiittisesti, välitiedot voidaan jättää pois. muunnosketju, samojen tyyppien esitystapa voi vaihdella jopa saman ohjelman sisällä jne. (tämä on yksinkertaisesti mahdotonta pakollisilla kielillä). Yksinkertaisesti sanottuna puhtaat kielet ovat deterministisiä lähdekooditasolla ja ei-deterministisiä toteutustasolla (pakolliset kielet ovat päinvastoin).

I/O ja puhtaus

Ohjelmointikielten vakavin sovellus, jossa sivuvaikutuksia esiintyy jatkuvasti funktioissa, on input-output . Voidaan olettaa, että mikä tahansa käyttäjän syöttämän tiedon operaatio on sivuvaikutteinen toimenpide, koska on mahdotonta sanoa etukäteen, mitä käyttäjä tarkalleen syöttää laskentaprosessissa käytetyiksi parametriarvoiksi. Vaikka jotkut tutkijat ja teoreetikot väittävät, että I/O:ta ei voida pitää esimerkkinä sivuvaikutusten esiintymisestä, koska I/O on pohjimmiltaan muutos ohjelman ympäristössä, mutta joka tapauksessa I/O tekee funktiot. käyttämällä sitä epädeterministisesti.

Puhtaassa toiminnallisessa ohjelmoinnissa ei ole osoitusoperaattoria, objekteja ei voi muuttaa ja tuhota, uusia voidaan luoda vain hajottamalla ja syntetisoimalla olemassa olevia. Mihin tahansa toimivaan kielenkääntäjään sisäänrakennettu roskakori huolehtii tarpeettomista esineistä . Tästä johtuen puhtailla toiminnallisilla kielillä kaikki toiminnot ovat vapaita sivuvaikutuksista. Tämä ei kuitenkaan estä näitä kieliä matkimasta joitain hyödyllisiä pakottavia ominaisuuksia, kuten poikkeusten käsittelyä ja muuttuvia (tuhoittavia) taulukoita . Tätä varten on olemassa erityisiä menetelmiä.

Joitakin syitä sivuvaikutteisten toimintojen esiintymiseen ei kuitenkaan voida täysin poistaa toiminnallisista ohjelmointikielistä, koska tässä tapauksessa tällaiset kielet olisivat liian rajoitettuja käytännön käytössä. Ensinnäkin tämä pätee erityisesti tuloon ja ulostuloon. On vaikea kuvitella täysimittaista ohjelmointikieltä, jossa ei ole mahdollisuutta suorittaa tietojen syöttämistä käyttäjältä interaktiivisessa tilassa, samoin kuin suorittaa tietojen ulostuloa käyttäjälle.

Monadit

Jotta I/O:n kaltaisten teknologioiden käyttö ilman puhtauden ominaisuutta heikkenettäisiin, monet toiminnalliset ohjelmointikielet, mukaan lukien Haskell , käyttävät erityistä mekanismia, jota kutsutaan " monadiksi ". Monadit näyttävät käärivän tarvittavat pakottavat ominaisuudet, estäen niitä sekoittumasta toiminnallisen kielen puhtaaseen syntaksiin. Monadien käyttö mahdollisti kaikkien ne pullonkaulat, jotka säätelivät sivuvaikutusten esiintymistä toiminnoissa.

Joten esimerkiksi I/O:n tarjoamiseksi Haskell-kielellä toteutetaan standardimonadi IO, jonka ulkopuolella on mahdotonta suorittaa mitään I/O-toimintoa. Kaikilla muilla Haskell-kielelle toteutetuilla vakiomonadeilla on samat ominaisuudet.

Esimerkkejä puhtaista ohjelmointikielistä