Функція або вираз мають побічний ефект, якщо, на додаток до повернення значення, вони змінюють якийсь стан програми або проводять видиму взаємодію з викликальною функцією або зовнішнім світом. Наприклад, функція може змінювати глобальну або статичну змінну, змінювати один зі своїх аргументів, спричиняти виняткову ситуацію, виводити дані на пристрій виведення або у файл, читати дані або викликати інші функції з побічними ефектами. За наявності побічних ефектів, поведінка програми залежить від історії; тобто порядок обчислень має значення. Розуміння програми з побічними ефектами вимагає знання про контекст та історію; навіть при наявності цих знань важко добрати перебіг програми, а також зневадити її.
Побічні ефекти — найзвичніший спосіб взаємодії з зовнішнім світом (людьми, файловою системою, іншими комп'ютерами в мережі). Ступінь використання побічних ефектів залежить від парадигми програмування. Імперативне програмування відоме частим використанням побічних ефектів. У функціональному програмуванні побічні ефекти використовують зрідка. Функціональні мови такі як Standard ML або Scheme не забороняють побічні ефекти, але зазвичай програмісти уникають їх. Функціональна мова Haskell обмежує побічні ефекти через статичну систему типізації; вона використовує концепцію монад.
Розробники на мові асемблера мають зважати на приховані побічні ефекти — інструкції, які змінюють частину стану процесора без зазначення цього в своїх назвах. Класичний приклад прихованого побічного ефекту — арифметична інструкція, яка явно змінює регістр (явний ефект (англ. overt effect)) і неявно змінює коди умов (прихований побічний ефект). Наприклад, прапорці, що вказують на те, що в результаті отримано нуль або переповнення. Один з недоліків набору інструкцій з багатьма побічними ефектами полягає в можливості впливу на одну частинку стану, наприклад коди умов, тоді коли вимога оновлювати ці стани послідовно може стати вузьким місцем швидкодії. Проблема постає особливо гостро на процесорах розроблених з конвеєром команд (з 1990) або з позачерговим виконанням. Такі процесори можуть потребувати додаткову схему для перевірки на побічні ефекти і зупиняти конвеєр, якщо наступна інструкція залежить від наслідків цих ефектів.
Прозорість посилань
Відсутність побічних ефектів є необхідною, але не достатньою умовою для прозорості посилань. Прозорість посилань значить, що вираз (такий як виклик функції) може бути заміненим на його значення; для цього необхідно, щоб вираз не тільки не мав побічних ефектів, але й був чистим (завжди повертав той самий результат для одних вхідних даних).
Часові побічні ефекти
На побічні ефекти, пов'язані з часом необхідним для виконання дії, зазвичай не зважають, коли йдеться про побічні ефекти або прозорість посилань. В більшості програм бажано замінювати довгі дії на коротші, наприклад, (60 / 3 * 2)
на 40
. Іноді, коли йдеться про синхронізацію або тестування, зумисне вставляються такі коди, що мають часовий побічний ефект, наприклад, Sleep(5000)
або for(i=0; i < 10000; i++){}
. Ці інструкції не змінюють стан окрім потреби очікування до їх завершення.
Ідемпотентність
Функція без побічних ефектів f завжди ідемпотентна (в розумінні послідовних викликів f; f, але не композиції функцій f ∘ f).
Примітки
- «Research Topics in Functional Programming» ed. D. Turner, Addison-Wesley, 1990, pp 17–42. Retrieved from: Hughes, John, Why Functional Programming Matters (PDF)
- Collberg, CSc 520 Principles of Programming Languages, Department of Computer Science, University of Arizona
- Matthias Felleisen. How To Design Programs. MIT Press.
- Haskell 98 Library Report: Input/Output.
- Imperative Functional Programming, Simon Peyton Jones and Phil Wadler, Conference Record of the 20th Annual ACM Symposium on Principles of Programming Languages, pages 71–84, 1993
Джерела
Ця стаття потребує додаткових для поліпшення її . |
Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
U Vikipediyi ye statti pro inshi znachennya cogo termina Pobichnij efekt Funkciya abo viraz mayut pobichnij efekt yaksho na dodatok do povernennya znachennya voni zminyuyut yakijs stan programi abo provodyat vidimu vzayemodiyu z viklikalnoyu funkciyeyu abo zovnishnim svitom Napriklad funkciya mozhe zminyuvati globalnu abo statichnu zminnu zminyuvati odin zi svoyih argumentiv sprichinyati vinyatkovu situaciyu vivoditi dani na pristrij vivedennya abo u fajl chitati dani abo viklikati inshi funkciyi z pobichnimi efektami Za nayavnosti pobichnih efektiv povedinka programi zalezhit vid istoriyi tobto poryadok obchislen maye znachennya Rozuminnya programi z pobichnimi efektami vimagaye znannya pro kontekst ta istoriyu navit pri nayavnosti cih znan vazhko dobrati perebig programi a takozh znevaditi yiyi Pobichni efekti najzvichnishij sposib vzayemodiyi z zovnishnim svitom lyudmi fajlovoyu sistemoyu inshimi komp yuterami v merezhi Stupin vikoristannya pobichnih efektiv zalezhit vid paradigmi programuvannya Imperativne programuvannya vidome chastim vikoristannyam pobichnih efektiv U funkcionalnomu programuvanni pobichni efekti vikoristovuyut zridka Funkcionalni movi taki yak Standard ML abo Scheme ne zaboronyayut pobichni efekti ale zazvichaj programisti unikayut yih Funkcionalna mova Haskell obmezhuye pobichni efekti cherez statichnu sistemu tipizaciyi vona vikoristovuye koncepciyu monad Rozrobniki na movi asemblera mayut zvazhati na prihovani pobichni efekti instrukciyi yaki zminyuyut chastinu stanu procesora bez zaznachennya cogo v svoyih nazvah Klasichnij priklad prihovanogo pobichnogo efektu arifmetichna instrukciya yaka yavno zminyuye registr yavnij efekt angl overt effect i neyavno zminyuye kodi umov prihovanij pobichnij efekt Napriklad praporci sho vkazuyut na te sho v rezultati otrimano nul abo perepovnennya Odin z nedolikiv naboru instrukcij z bagatma pobichnimi efektami polyagaye v mozhlivosti vplivu na odnu chastinku stanu napriklad kodi umov todi koli vimoga onovlyuvati ci stani poslidovno mozhe stati vuzkim miscem shvidkodiyi Problema postaye osoblivo gostro na procesorah rozroblenih z konveyerom komand z 1990 abo z pozachergovim vikonannyam Taki procesori mozhut potrebuvati dodatkovu shemu dlya perevirki na pobichni efekti i zupinyati konveyer yaksho nastupna instrukciya zalezhit vid naslidkiv cih efektiv Prozorist posilanDokladnishe Prozorist posilan informatika Vidsutnist pobichnih efektiv ye neobhidnoyu ale ne dostatnoyu umovoyu dlya prozorosti posilan Prozorist posilan znachit sho viraz takij yak viklik funkciyi mozhe buti zaminenim na jogo znachennya dlya cogo neobhidno shob viraz ne tilki ne mav pobichnih efektiv ale j buv chistim zavzhdi povertav toj samij rezultat dlya odnih vhidnih danih Chasovi pobichni efektiNa pobichni efekti pov yazani z chasom neobhidnim dlya vikonannya diyi zazvichaj ne zvazhayut koli jdetsya pro pobichni efekti abo prozorist posilan V bilshosti program bazhano zaminyuvati dovgi diyi na korotshi napriklad 60 3 2 na 40 Inodi koli jdetsya pro sinhronizaciyu abo testuvannya zumisne vstavlyayutsya taki kodi sho mayut chasovij pobichnij efekt napriklad Sleep 5000 abo for i 0 i lt 10000 i Ci instrukciyi ne zminyuyut stan okrim potrebi ochikuvannya do yih zavershennya IdempotentnistFunkciya bez pobichnih efektiv f zavzhdi idempotentna v rozuminni poslidovnih viklikiv f f ale ne kompoziciyi funkcij f f Primitki Research Topics in Functional Programming ed D Turner Addison Wesley 1990 pp 17 42 Retrieved from Hughes John Why Functional Programming Matters PDF Collberg CSc 520 Principles of Programming Languages Department of Computer Science University of Arizona Matthias Felleisen How To Design Programs MIT Press Haskell 98 Library Report Input Output Imperative Functional Programming Simon Peyton Jones and Phil Wadler Conference Record of the 20th Annual ACM Symposium on Principles of Programming Languages pages 71 84 1993DzherelaCya stattya potrebuye dodatkovih posilan na dzherela dlya polipshennya yiyi perevirnosti Bud laska dopomozhit udoskonaliti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Zvernitsya na storinku obgovorennya za poyasnennyami ta dopomozhit vipraviti nedoliki Material bez dzherel mozhe buti piddano sumnivu ta vilucheno Ce nezavershena stattya pro programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi