La semántica de un programa es un modelo de su comportamiento que, como cualquier modelo científico, ignora aspectos que no desea estudiar.
Un modelo extremadamente detallado de la ejecución de un programa modelaría el comportamiento físico de la computadora que lo ejecuta, incluido el tiempo de ejecución, el consumo de energía, la radiación electromagnética, etc. Estos aspectos rara vez se tienen en cuenta porque rara vez son relevantes. Sin embargo, a veces son importantes: un modelo útil de piloto automático de avión debe incluir información de tiempo de ejecución, un modelo útil de seguridad de una tarjeta de crédito debe incluir radiación electromagnética, ...
En la semántica típica, se ignoran los efectos secundarios como el tiempo y el consumo de energía. Incluso si en un entorno mundano donde escribe una expresión en el intérprete de intérprete de Haskell, la impresión del resultado es un efecto secundario (si intenta imprimir un objeto infinito, es importante). Si el intérprete de Haskell se queda sin memoria, esto también es un efecto secundario observable en un modelo del "mundo real", pero no en un modelo idealizado de Haskell que permita efectivamente cálculos ilimitados.
Un efecto secundario observable es uno que se modela en la semántica. En los modelos típicos de lenguajes de programación, el consumo de memoria no está modelado, por lo que un cómputo que requiere 1TB de almacenamiento puede ser puro, incluso si intenta ejecutarlo en su PC, fallaría notablemente.
Otro tipo de efecto secundario no observable es uno que es interno de la función. Esto es, creo, lo que la mayoría de los semánticos pensarían al hablar de efectos secundarios no observables. Considere un cálculo que utiliza datos mutables internamente, pero que no comparte estos datos mutables con ninguna otra parte del programa. Por ejemplo, una función de clasificación de listas que construye una matriz con los mismos elementos que la lista, ordena la matriz en su lugar y devuelve una lista que contiene los elementos como la matriz en su orden final: un modelo semántico de subexpresiones de esta función exhibe lado efectos (modificaciones de la matriz), pero la función en sí no tiene efectos secundarios externos, por lo que es pura.
Para un ejemplo más sutil, considere una función que escribe algunos datos en un archivo temporal y se limpia después de sí mismo. En una semántica donde siempre hay suficiente espacio para archivos temporales y los programas no comparten archivos temporales, la función no tiene efectos secundarios; El archivo temporal actúa como memoria adicional utilizada por la función. En una semántica que tiene en cuenta las condiciones completas del sistema de archivos, la función tiene un efecto secundario: puede fallar debido a circunstancias externas. En una semántica que permite que la máquina se bloquee, la función tiene un efecto secundario: si se produce un bloqueo durante la ejecución de la función, el archivo temporal puede quedar atrás. En una semántica que permite a los programas ejecutados simultáneamente ver y quizás modificar el archivo temporal, la función tiene un efecto secundario.