Effetto collaterale (informatica)

In informatica si dice che una funzione produce un effetto collaterale (in inglese side effect) quando modifica un valore o uno stato al di fuori del proprio ambito locale. Per esempio, una funzione ha un effetto collaterale quando modifica una variabile globale o statica, quando modifica uno dei suoi argomenti[1], quando scrive dati su di un display o su di un file o quando invoca altre funzioni con effetti collaterali.

Descrizione[modifica | modifica wikitesto]

Gli effetti collaterali presenti in un programma spesso rendono difficile la comprensione del suo flusso di esecuzione e se non gestiti bene possono portare facilmente a bug difficili da scovare.

La programmazione imperativa utilizza gli effetti collaterali come uno strumento, cioè i programmi si servono di essi per svolgere i propri compiti (si pensi ad esempio alla funzione printf del linguaggio C); nella programmazione funzionale, invece, si tende a minimizzare gli effetti collaterali: questo rende più facile la dimostrazione della correttezza di un programma, più difficile che vi siano bug nascosti e più semplice il debugging ma tutto ciò al costo di una maggiore complessità per svolgere le operazioni di input/output (si pensi al meccanismo delle monadi del linguaggio Haskell).

Nel design delle CPU le istruzioni con effetti collaterali sono quelle istruzioni che modificano i valori interni della CPU senza dichiararlo esplicitamente; per esempio, l'istruzione ADD a volte modifica delle variabili di condizione (carry, zero, overflow, ecc). Questo può generare problemi quando si progetta una CPU con pipeline e con istruzioni con effetti collaterali; per evitare questi problemi è possibile limitare il set di istruzioni a sole istruzioni senza effetti collaterali o, nel caso peggiore, aggiungere ulteriore circuiteria per rilevare gli effetti collaterali e bloccare la pipeline nel caso in cui l'istruzione successiva dipende dai valori modificati.

Trasparenza referenziale[modifica | modifica wikitesto]

Lo stesso argomento in dettaglio: Trasparenza referenziale.

L'assenza di effetti collaterali è una condizione necessaria ma non sufficiente per la trasparenza referenziale. Trasparenza referenziale significa che un'espressione (per esempio una chiamata a funzione) può essere sostituita con il suo valore, cioè che termini uguali possono essere sostituiti con termini uguali senza modificare il risultato della computazione. Per esempio, possiamo modificare l'espressione

    z = f(sqrt(2), sqrt(2)); 

calcolando una sola volta la radice quadrata di 2 (sqrt(2)) e sostituendo il risultato ai due parametri

    s = sqrt(2);     z = f(s, s); 

eliminando così l'ulteriore valutazione della funzione radice quadrata. Per ottenere la trasparenza referenziale l'espressione oltre a non avere effetti collaterali deve essere puramente funzionale (cioè deve restituire sempre lo stesso output dati gli stessi input).

Note[modifica | modifica wikitesto]

  1. ^ Una funzione può ricevere un argomento per valore o per riferimento. Se la funzione modifica un argomento passato per valore, cambierà solo la copia locale del valore e ciò non influenzerà l'ambiente esterno. Lo stesso succede se l'argomento è passato per riferimento e si modifica il riferimento stesso, non il dato a cui punta. Nel caso in cui invece si modifica un dato puntato dal riferimento, si influenza l'ambiente esterno alla funzione ed avviene un cosiddetto effetto collaterale.

Voci correlate[modifica | modifica wikitesto]

Collegamenti esterni[modifica | modifica wikitesto]

  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica