În informatică , se spune că o funcție este efect secundar (traducere cuvânt cu cuvânt din efect secundar englezesc , al cărui sens este mai aproape de un efect secundar ) dacă modifică o stare în afara mediului său local, adică are o interacțiune observabilă cu lumea exterioară în afară de returnarea unei valori. De exemplu, funcții care modifică o variabilă locală statică, o variabilă nelocală sau un argument mutabil transmis prin referință, funcții care efectuează operații I / O sau funcții care apelează alte funcții de efect secundar. Adesea, aceste efecte complică lizibilitatea comportamentului programului și / sau interferează cu reutilizarea funcțiilor și procedurilor. Un limbaj ca Haskell le restricționează în mod deliberat în componente numite monade .
Mai frecvent, un efect secundar apare de cele mai multe ori atunci când o modificare a unui program coerent (valori și stări luate în conformitate cu specificațiile) are ca rezultat valori sau comportamente neprevăzute, din cauza nerespectării domeniului, set de definiții variabile sau contract de funcții.
Programarea imperativă permite utilizarea de efecte de margine în operarea programelor sale, sau chiar în mod deliberat utilizează ( de exemplu , declarația COMMONîn FORTRAN ), permițând compilatorul să ia în considerare (cuvinte cheie volatileîn C ).
Specificația de limbă Fortran a interzis unei funcții să-și modifice parametrii de apel și majoritatea compilatorilor s-au ocupat de aceasta.
Programarea funcțională caută în loc să reducă la minimum și , adesea , izolate pentru ea în structurile furnizate de un motiv pentru care : a monade .
În proiectarea procesoarelor, instrucțiunile pot modifica starea internă a procesorului fără a o declara în mod explicit. Astfel, o instrucțiune de adăugare poate modifica sau nu variabilele de condiție (carry, zero, overflow etc.). Acest lucru pune o problemă de proiectare dacă procesorul are o conductă de instrucțiuni. Astfel, 360/91 al IBM, echipat cu patru unități aritmetice și logice care funcționează simultan, a raportat uneori o INTERRUPȚIE IMPRECISĂ (deviere localizată prost) „în vecinătatea” unei anumite adrese, fără a putea specifica mai multe care.
Aceste pericole pot fi evitate prin limitarea setului de instrucțiuni la instrucțiuni fără efecte secundare. În cel mai rău caz, circuitele suplimentare detectează efectele marginilor și invalidează conducta dacă următoarea instrucțiune din aceasta depinde de valorile atribuite. Prin urmare, calculul este pur și simplu puțin întârziat.
Prin extensie, spunem despre un operator că are un efect secundar atunci când modifică valoarea unuia dintre operanzii săi.
Valoarea rezultată din operație poate fi utilizată (stocată într-o variabilă sau transmisă ca parametru al unei funcții, de exemplu), dar acești operatori sunt adesea utilizați numai pentru efectul lor secundar. Expresia, care cuprinde o operație al cărei rezultat este ignorat, devine apoi o instrucțiune.
Exemple în C ++:
++x; // ++ incrémente x c = b += a; // le résultat de += est stocké dans c mais celui de = est ignoréOperatorul de atribuire =este adesea utilizat în mod greșit în locul operatorului de egalitate ==. Efectul său secundar este de a modifica sale 1 st Operand prin atribuirea acesteia valoarea sa de 2 - lea operand. Rezultatul său este valoarea care a fost atribuită.
if (x = 0) { // x est modifiée et devient 0 std::cout << "nul"; // "nul" n'est jamais affichée car x = 0 renvoie toujours 0 }A nu avea un efect secundar este o condiție necesară, dar nu suficientă, pentru transparența referențială . Transparența referențială înseamnă că o expresie (cum ar fi un apel de funcție) poate fi înlocuită de valoarea sa, fără a afecta comportamentul programului. Prin urmare, expresia trebuie să fie pură , adică să aibă aceeași valoare pentru aceleași intrări și evaluarea ei nu trebuie să aibă efecte secundare. O funcție fără efecte secundare poate returna valori diferite în funcție de istoricul său sau de mediul său extern, de exemplu, dacă ieșirea sa depinde de valoarea unei variabile statice locale sau respectiv a unei variabile nelocale.
Acest program tipărește la ieșirea standard:
0 1Efectul secundar al funcției feste modificarea valorii variabilei globale x.