Renhet för programmeringsspråk

Renhet (i förhållande till ett programmeringsspråk) - frånvaron av biverkningar . Ett programmeringsspråk är rent om alla funktioner i det språkets program är rena .

Program skrivna på rena programmeringsspråk är lättare att felsöka , verifiera och lättare att upptäcka fel som inte kunde upptäckas genom att testa . Program i ett rent programmeringsspråk är lättare att skriva om utan att införa fel. Samtidigt är själva processen att planera ett program med förväntan på renhet mer komplicerad.

En annan viktig fördel med rena funktionella språk är parallellism . Eftersom alla funktioner för beräkningar endast använder sina parametrar, är det möjligt att organisera beräkningen av oberoende funktioner i en godtycklig ordning eller parallellt, detta kommer inte att påverka beräkningsresultatet. Parallellism kan organiseras inte bara på språkkompilatornivå, utan också på hårdvaruarkitekturnivå. Det finns experimentella datorer baserade på liknande arkitekturer, som Lisp-maskinen .

Rena funktionella språk kallas ibland "deterministiska" i den meningen att för alla funktioner har varje anrop alltid samma effekt (i imperativa språk är detta i allmänhet inte sant). Samtidigt kallas sådana språk "icke-deterministiska" i den meningen att ordningen för faktisk programexekvering kan variera mycket beroende på den specifika implementeringen av språket: algoritmer kan implicit parallelliseras, mellanliggande data kan uteslutas från konverteringskedjan, representation av samma typer kan variera även inom samma program, etc. (detta är helt enkelt omöjligt för imperativa språk). Enkelt uttryckt är rena språk deterministiska på källkodsnivå och icke-deterministiska på implementeringsnivå (imperativspråk är vice versa).

I/O och renhet

Den mest allvarliga tillämpningen av programmeringsspråk, där biverkningar ständigt förekommer i funktioner, är input-output . Det kan antas att varje operation av datainmatning från användaren är en åtgärd med en bieffekt, eftersom det är omöjligt att säga i förväg exakt vad användaren kommer att ange som parametervärden som används i beräkningsprocessen. Även om vissa forskare och teoretiker hävdar att I/O inte kan betraktas som ett exempel på förekomsten av biverkningar, eftersom I/O i huvudsak är en förändring i programmets miljö, men i alla fall gör I/O funktionerna använder det icke-deterministiskt.

I ren funktionell programmering finns ingen tilldelningsoperatör, objekt kan inte ändras och förstöras, man kan bara skapa nya genom nedbrytning och syntes av befintliga. Den skräpsamlare som är inbyggd i alla funktionella språköversättare tar hand om onödiga föremål . På grund av detta, i rena funktionella språk, är alla funktioner fria från biverkningar. Detta hindrar dock inte dessa språk från att efterlikna några användbara imperativa funktioner, såsom undantagshantering och föränderliga (destruktivt) arrayer . Det finns speciella metoder för detta.

Vissa orsaker till förekomsten av funktioner med biverkningar kan dock inte helt tas bort från funktionella programmeringsspråk, eftersom sådana språk i det här fallet skulle vara för begränsade i praktisk användning. Först och främst gäller detta specifikt input-output. Det är svårt att föreställa sig ett fullfjädrat programmeringsspråk där det inte finns någon möjlighet att utföra datainmatning från användaren i ett interaktivt läge, samt att utföra datautmatning för användaren.

Monads

För att möjliggöra användningen av teknologier som I/O utan att försämra renhetsegenskapen, använder många funktionella programmeringsspråk, inklusive Haskell , en speciell mekanism som kallas " monad ". Monader tycks omsluta de nödvändiga imperativa egenskaperna, vilket hindrar dem från att blandas med den rena syntaxen hos ett funktionellt språk. Användningen av monader gjorde det möjligt att implementera alla de flaskhalsar som reglerade förekomsten av biverkningar i funktioner.

Så, till exempel, för att tillhandahålla I/O på Haskell-språket, implementeras en standardmonad IO, utanför vilken det är omöjligt att utföra någon I/O-operation. Alla andra standardmonader implementerade för Haskell-språket har samma egenskaper.

Exempel på rena programmeringsspråk