Семантика програми - це модель її поведінки, яка, як і будь-яка наукова модель, ігнорує аспекти, які ви не хочете вивчати.
Надзвичайно детальна модель виконання програми зможе моделювати фізичну поведінку комп’ютера, який її виконує, включаючи час виконання, енергоспоживання, електромагнітне випромінювання тощо. Такі аспекти враховуються дуже рідко, оскільки вони дуже рідкісні. Тим не менш, вони мають значення іноді: корисна модель автопілота літака повинна містити інформацію про час виконання, корисна модель безпеки кредитної картки повинна включати електромагнітне випромінювання, ...
У типовій семантиці такі побічні ефекти, як терміни та енергоспоживання, ігноруються. Навіть якщо в мирській обстановці, де ви вводите вираз у запиті інтерпретатора Haskell, друк результату є побічним ефектом (якщо ви намагаєтеся роздрукувати нескінченний об'єкт, це має значення). Якщо у інтерпретатора Haskell не вистачає пам’яті, це також є помітним побічним ефектом в моделі «реального світу», але не в ідеалізованій моделі Haskell, яка ефективно дозволяє безмежні обчислення.
Спостережуваний побічний ефект є тим , що моделюється в семантиці. У типових моделях мов програмування споживання пам’яті не моделюється, тому обчислення, що вимагають 1 ТБ пам’яті, можуть бути чистими, навіть якщо ви спробуєте запустити його на вашому ПК, воно, очевидно, не вийшло.
Інший різновид непомітного побічного ефекту - той, який є внутрішнім у функції. Я думаю, це те, про що б подумала більшість семантиків, коли говорили про неспостережувані побічні ефекти. Розглянемо обчислення, яке використовує внутрішні дані, що змінюються, але не надає цим мутаційним даним жодну іншу частину програми. Наприклад, функція сортування списку, яка створює масив з тими ж елементами, що і список, сортує масив на місці та повертає список, що містить елементи, як масив у їх остаточному порядку: семантична модель підвиразів цієї функції демонструє сторону ефекти (модифікації масиву), але сама функція не має зовнішнього побічного ефекту, тому вона чиста.
Для більш тонкого прикладу розглянемо функцію, яка записує деякі дані у тимчасовий файл і очищає після себе. У семантиці, де завжди є достатньо місця для тимчасових файлів, а програми не діляться тимчасовими файлами, функція не має побічного ефекту; тимчасовий файл виконує функцію додаткової пам'яті, яка використовується функцією. У семантиці, яка враховує повні умови файлової системи, функція має побічний ефект - вона може вийти з ладу через зовнішні обставини. У семантиці, яка дозволяє машині вийти з ладу, функція має побічний ефект: якщо під час виконання функції відбувається збій, тимчасовий файл може залишитися позаду. У семантиці, яка дозволяє одночасно виконуваним програмам бачити і, можливо, змінювати тимчасовий файл, функція має побічний ефект.