Loading AI tools
effetto indesiderato Da Wikipedia, l'enciclopedia libera
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.
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.
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).
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.