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
modificaGli 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
modificaL'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- ^ 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
modificaCollegamenti esterni
modifica- (EN) Denis Howe, side-effect, in Free On-line Dictionary of Computing. Disponibile con licenza GFDL