Що саме означає «семантично помітний» побічний ефект?


11

У мене питання щодо чистих функцій. За даними сторінки Вікіпедії, одним із реквізитів для чистої функції є:

Оцінка результату не спричиняє жодних семантично помітних побічних ефектів або результатів, таких як мутація змінних об'єктів або вихід на пристрої вводу / виводу.

Тепер, що це насправді означає. А точніше, як я можу зробити побічний ефект, який не спостерігається семантично?


2
Не слід наносити занадто велику вагу ручним хвилястим речам, які колись можна знайти у Вікіпедії.
Андрій Бауер

1
@AndrejBauer Так? Що в цьому хвилеподібно? Можливо, не на рівні досліджень (я не заперечую, якщо це буде перенесено на інформатику ) - хоча, враховуючи вашу реакцію, можливо, ні.
Жил "ТАК - перестань бути злим"

Я думаю, що мені просто не подобається фраза "семантично спостерігається".
Андрій Бауер

1
Дозвольте сказати по-іншому: у чому різниця між "семантично спостережуваним" та "спостережуваним"? "Семантично" - це лише модна мова, яка тут не має сенсу.
Андрій Бауер

"Семантичний", схоже, має якийсь особливий сенс у різних областях теорії програмування, можливо, імпортованих з лінгвістики / філософії, де він сягає десятиліттями aka "синтаксис проти семантики" .... можливо, це ще одне питання тут ....
vzn

Відповіді:


11

Семантика програми - це модель її поведінки, яка, як і будь-яка наукова модель, ігнорує аспекти, які ви не хочете вивчати.

Надзвичайно детальна модель виконання програми зможе моделювати фізичну поведінку комп’ютера, який її виконує, включаючи час виконання, енергоспоживання, електромагнітне випромінювання тощо. Такі аспекти враховуються дуже рідко, оскільки вони дуже рідкісні. Тим не менш, вони мають значення іноді: корисна модель автопілота літака повинна містити інформацію про час виконання, корисна модель безпеки кредитної картки повинна включати електромагнітне випромінювання, ...

У типовій семантиці такі побічні ефекти, як терміни та енергоспоживання, ігноруються. Навіть якщо в мирській обстановці, де ви вводите вираз у запиті інтерпретатора Haskell, друк результату є побічним ефектом (якщо ви намагаєтеся роздрукувати нескінченний об'єкт, це має значення). Якщо у інтерпретатора Haskell не вистачає пам’яті, це також є помітним побічним ефектом в моделі «реального світу», але не в ідеалізованій моделі Haskell, яка ефективно дозволяє безмежні обчислення.

Спостережуваний побічний ефект є тим , що моделюється в семантиці. У типових моделях мов програмування споживання пам’яті не моделюється, тому обчислення, що вимагають 1 ТБ пам’яті, можуть бути чистими, навіть якщо ви спробуєте запустити його на вашому ПК, воно, очевидно, не вийшло.

Інший різновид непомітного побічного ефекту - той, який є внутрішнім у функції. Я думаю, це те, про що б подумала більшість семантиків, коли говорили про неспостережувані побічні ефекти. Розглянемо обчислення, яке використовує внутрішні дані, що змінюються, але не надає цим мутаційним даним жодну іншу частину програми. Наприклад, функція сортування списку, яка створює масив з тими ж елементами, що і список, сортує масив на місці та повертає список, що містить елементи, як масив у їх остаточному порядку: семантична модель підвиразів цієї функції демонструє сторону ефекти (модифікації масиву), але сама функція не має зовнішнього побічного ефекту, тому вона чиста.

Для більш тонкого прикладу розглянемо функцію, яка записує деякі дані у тимчасовий файл і очищає після себе. У семантиці, де завжди є достатньо місця для тимчасових файлів, а програми не діляться тимчасовими файлами, функція не має побічного ефекту; тимчасовий файл виконує функцію додаткової пам'яті, яка використовується функцією. У семантиці, яка враховує повні умови файлової системи, функція має побічний ефект - вона може вийти з ладу через зовнішні обставини. У семантиці, яка дозволяє машині вийти з ладу, функція має побічний ефект: якщо під час виконання функції відбувається збій, тимчасовий файл може залишитися позаду. У семантиці, яка дозволяє одночасно виконуваним програмам бачити і, можливо, змінювати тимчасовий файл, функція має побічний ефект.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.