Che cosa significa esattamente effetti collaterali "semanticamente osservabili"?


11

Ho una domanda sulle funzioni pure. Secondo la pagina di Wikipedia uno dei requisiti per una funzione pura è:

La valutazione del risultato non provoca alcun effetto collaterale o output osservabile semanticamente, come la mutazione di oggetti mutabili o l'output a dispositivi I / O.

Cosa significa veramente questo. O meglio, come posso fare un effetto collaterale che non è semanticamente osservabile?


2
Non dovresti dare troppo peso alle cose ondulate a mano che una volta puoi trovare su Wikipedia.
Andrej Bauer,

1
@AndrejBauer Huh? Cosa c'è di mosso a proposito di questo? Non a livello di ricerca, forse (non mi dispiace se questo è migrato a Informatica ) - sebbene data la tua reazione, forse no.
Gilles 'SO- smetti di essere malvagio' il

Penso che semplicemente non mi piace la frase "osservabile semanticamente".
Andrej Bauer,

1
In altre parole: qual è la differenza tra "osservabile semanticamente" e "osservabile"? "Semanticamente" è solo una parola d'ordine che non ha senso qui.
Andrej Bauer,

"semantico" sembra avere un significato speciale in vari settori della teoria della programmazione, probabilmente importato dalla linguistica / filosofia dove risale a decenni alias "sintassi vs semantica" .... forse questa è un'altra domanda proprio lì ....
vzn

Risposte:


11

Una semantica di un programma è un modello del suo comportamento che, come qualsiasi modello scientifico, ignora aspetti che non si desidera studiare.

Un modello estremamente dettagliato dell'esecuzione di un programma modellerebbe il comportamento fisico del computer che lo esegue, inclusi i tempi di esecuzione, il consumo di energia, le radiazioni elettromagnetiche, ecc. Tali aspetti sono molto raramente presi in considerazione perché sono molto raramente rilevanti. Tuttavia a volte contano: un utile modello di pilota automatico di un aereo deve includere informazioni di autonomia, un utile modello di sicurezza di una carta di credito deve includere le radiazioni elettromagnetiche, ...

Nella semantica tipica, gli effetti collaterali come i tempi e il consumo di energia vengono ignorati. Anche se in un'impostazione banale in cui si digita un'espressione al prompt dell'interprete Haskell, la stampa del risultato è un effetto collaterale (se si tenta di stampare un oggetto infinito, è importante). Se l'interprete di Haskell esaurisce la memoria, questo è anche un effetto collaterale osservabile in un modello "reale", ma non in un modello idealizzato di Haskell che consente effettivamente calcoli illimitati.

Un effetto collaterale osservabile è quello modellato nella semantica. Nei modelli tipici di linguaggi di programmazione, il consumo di memoria non è modellato, quindi un calcolo che richiede 1 TB di spazio di archiviazione può essere puro, anche se se si tenta di eseguirlo sul PC fallirebbe notevolmente.

Un altro tipo di effetto collaterale non osservabile è quello interno alla funzione. Questo è, penso, ciò a cui la maggior parte dei semantici penserebbe quando parla di effetti collaterali non osservabili. Prendi in considerazione un calcolo che utilizza internamente i dati mutabili, ma non li condivide con nessun'altra parte del programma. Ad esempio, una funzione di ordinamento di elenchi che crea un array con gli stessi elementi dell'elenco, ordina l'array in posizione e restituisce un elenco contenente gli elementi come array nel loro ordine finale: un modello semantico di sottoespressioni di questa funzione mostra lato effetti (modifiche dell'array), ma la funzione stessa non ha effetti collaterali esterni, quindi è pura.

Per un esempio più sottile, considera una funzione che scrive alcuni dati in un file temporaneo e ripulisce dopo se stesso. In una semantica in cui c'è sempre abbastanza spazio per file temporanei e programmi che non condividono file temporanei, la funzione non ha effetti collaterali; il file temporaneo funge da memoria aggiuntiva utilizzata dalla funzione. In una semantica che tiene conto delle condizioni complete del filesystem, la funzione ha un effetto collaterale - potrebbe fallire a causa di circostanze esterne. In una semantica che consente l'arresto anomalo della macchina, la funzione ha un effetto collaterale: se si verifica un arresto anomalo durante l'esecuzione della funzione, è possibile che il file temporaneo venga lasciato indietro. In una semantica che consente ai programmi eseguiti contemporaneamente di vedere e forse modificare il file temporaneo, la funzione ha un effetto collaterale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.