Прозорість посилань і непрозорість посилань — це властивості частин комп'ютерних програм. Вираз називають прозорим за посиланнями, якщо його можна замінити на його і це не вплине на поведінку програми. Для цього потрібно аби вираз був чистим - його значення повинно бути однаковим для однакових аргументів і обчислення не повинно створювати побічних ефектів. Вираз який не є прозорим за посиланнями називають непрозорим за посиланнями.
В математиці всі функції прозорі за посиланнями, за визначенням математичної функції. Проте, в програмуванні це не завжди так, і часто для уникнення плутанити використовуються терміни процедура та метод. Ключовою характеристикою функційного програмування є те, що воно дозволяє лише прозорі за посиланням функції.
Важливість прозорості посилань полягає в тому, що вони дозволяють програмісту та компілятору робити здогади про поведінку програми. Це може допомогти в доведенні [en], спрощенні алгоритму, допомагає при зміні коду без отримання нових помилок або оптимізації коду за допомогою мемоізації, усунення спільних підвиразів, лінивого обчислення або паралелізації.
Історія
Поняття ймовірно походить з Principia Mathematica (1910–13) Альфреда Норта Вайтгеда та Бертрана Рассела. Його ввів у аналітичну філософію Віллард Ван Орман Квайн.
У сучасній інформатиці термін з'явився під час обговорення змінних у впливовій серії конспектів лекцій [en] [en] (1967). Конспект посилався на Word and Object Квайна в бібліографії.
Приклади й контрприклади
Якщо в виразі задіяні лише чисті функції, тоді вираз буде прозорим за посиланнями. Також, деякі нечисті функції можуть бути використані у виразі, якщо їх значення не впливають на значення виразу та їх побічні ефекти незначимі.
Візьмемо функцію, що не приймає параметрів і повертає дані, введені з клавіатури. Припустимо, її виклик такий: GetInput()
. Значення повернуте функцією GetInput()
залежить від вводу користувача, отже різні виклики GetInput()
з однаковими параметрами (порожній список) можуть повертати різні значення. Звідси, GetInput()
ані детермінована, ані прозора за посиланнями.
Витонченіший приклад — функція, що використовує глобальну змінну (змінну з динамічною областю видимості або лексичне замикання), щоб полегшити собі обчислення результату. Через те, що ця змінна не передається як параметр, але може бути змінена, результати послідовних викликів можуть відрізнятись, навіть якщо параметри тотожні. В чистому функційному програмуванні використовується підхід єдиного присвоєння, тобто змінні після присвоєння їм значень стають незмінними об'єктами.
Арифметичні операції прозорі за посиланнями: 5*5
можна замінити на 25
. В дійсності, всі функції прозорі за посиланнями в математичному сенсі: sin(x)
прозора, бо завжди повертає однакове значення для певного x
.
Присвоєння не прозоре. Наприклад, вираз на C x = x + 1
змінює значення надане x
. Припустимо x
початково має значення 10
, два послідовні обчислення виразу дають, відповідно, 11
і 12
. Звідси видно, що заміна x = x + 1
на 11
або 12
надасть програмі іншого сенсу, отже вираз не прозорий за посиланнями. Однак, виклик функції int plusone(int x) {return x+1;}
є прозорим, бо вона явно не змінює x, отже не має побічних ефектів.
В більшості мов[] вираз print("Вітаю, світе!")
не прозорий, бо його заміна на значення, що повертається, змінює поведінку програми, бо «Вітаю, світе!» не надрукується.
today()
теж не прозора, бо видає різні значення кожного нового дня.
Відмінність від імперативного програмування
Якщо заміна виразу на його значення дійсна тільки в певній точці виконання програми, тоді цей вираз не прозорий за посиланнями. Визначення і впорядкування цих точок перебігу (англ. sequence point) це теоретичні підвалини імперативного програмування і частина семантики імперативних мов програмування.
Однак через можливість обчислення виразів прозорих за посиланнями будь-коли, необов'язково визначати точки перебігу й взагалі будь-які гарантії послідовності виконання. Програмування виконане на такий лад називається чисто функційним програмуванням.
Однією з переваг написання коду з прозорими посиланнями є те, що розумному компілятору легше виконувати статичний аналіз коду і використовувати кращі оптимізації. Наприклад, у випадку С присутнє погіршення швидкодії через додавання до тіла циклу дорогої, в сенсі виконання, функції, навіть якщо виклик функції можна винести за тіло циклу без зміни результату програми. Програміст змушений робити ручні правки, які можливо позначаться на зручності читання коду. А якщо компілятор в змозі визначити, що виклик функції прозорий за посиланнями, він може здійснити це перетворення автоматично.
Основним недоліком мов, що наполягають на прозорості посилань є те, що в них послідовність дій, яка природно може бути записана як покрокова послідовність в імперативному стилі, набуває незграбного й розлогого вигляду. Такі мови часто містять механізми, що дозволяють виконати такі задачі простіше, зберігши при цьому чистоту функційності мови, наприклад, DC-граматики й монади.
У випадку прозорості посилань немає різниці між посиланням на об'єкт і самим об'єктом. Інакше така різниця може бути легко введена й використана.
Примітки
- John C. Mitchell (2002). Concepts in Programming Languages. Cambridge University Press. с. 78.
- Alfred North Whitehead; Bertrand Russell (1927). Principia Mathematica. Т. 1 (вид. 2nd). Cambridge University Press. На сторінці 665. Згідно з Квайном, термін походить звідти.
Посилання
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Prozorist posilan i neprozorist posilan ce vlastivosti chastin komp yuternih program Viraz nazivayut prozorim za posilannyami yaksho jogo mozhna zaminiti na jogo i ce ne vpline na povedinku programi Dlya cogo potribno abi viraz buv chistim jogo znachennya povinno buti odnakovim dlya odnakovih argumentiv i obchislennya ne povinno stvoryuvati pobichnih efektiv Viraz yakij ne ye prozorim za posilannyami nazivayut neprozorim za posilannyami V matematici vsi funkciyi prozori za posilannyami za viznachennyam matematichnoyi funkciyi Prote v programuvanni ce ne zavzhdi tak i chasto dlya uniknennya plutaniti vikoristovuyutsya termini procedura ta metod Klyuchovoyu harakteristikoyu funkcijnogo programuvannya ye te sho vono dozvolyaye lishe prozori za posilannyam funkciyi Vazhlivist prozorosti posilan polyagaye v tomu sho voni dozvolyayut programistu ta kompilyatoru robiti zdogadi pro povedinku programi Ce mozhe dopomogti v dovedenni en sproshenni algoritmu dopomagaye pri zmini kodu bez otrimannya novih pomilok abo optimizaciyi kodu za dopomogoyu memoizaciyi usunennya spilnih pidviraziv linivogo obchislennya abo paralelizaciyi IstoriyaPonyattya jmovirno pohodit z Principia Mathematica 1910 13 Alfreda Norta Vajtgeda ta Bertrana Rassela Jogo vviv u analitichnu filosofiyu Villard Van Orman Kvajn U suchasnij informatici termin z yavivsya pid chas obgovorennya zminnih u vplivovij seriyi konspektiv lekcij en en 1967 Konspekt posilavsya na Word and Object Kvajna v bibliografiyi Prikladi j kontrprikladiYaksho v virazi zadiyani lishe chisti funkciyi todi viraz bude prozorim za posilannyami Takozh deyaki nechisti funkciyi mozhut buti vikoristani u virazi yaksho yih znachennya ne vplivayut na znachennya virazu ta yih pobichni efekti neznachimi Vizmemo funkciyu sho ne prijmaye parametriv i povertaye dani vvedeni z klaviaturi Pripustimo yiyi viklik takij GetInput Znachennya povernute funkciyeyu GetInput zalezhit vid vvodu koristuvacha otzhe rizni vikliki GetInput z odnakovimi parametrami porozhnij spisok mozhut povertati rizni znachennya Zvidsi GetInput ani determinovana ani prozora za posilannyami Vitonchenishij priklad funkciya sho vikoristovuye globalnu zminnu zminnu z dinamichnoyu oblastyu vidimosti abo leksichne zamikannya shob polegshiti sobi obchislennya rezultatu Cherez te sho cya zminna ne peredayetsya yak parametr ale mozhe buti zminena rezultati poslidovnih viklikiv mozhut vidriznyatis navit yaksho parametri totozhni V chistomu funkcijnomu programuvanni vikoristovuyetsya pidhid yedinogo prisvoyennya tobto zminni pislya prisvoyennya yim znachen stayut nezminnimi ob yektami Arifmetichni operaciyi prozori za posilannyami 5 5 mozhna zaminiti na 25 V dijsnosti vsi funkciyi prozori za posilannyami v matematichnomu sensi sin x prozora bo zavzhdi povertaye odnakove znachennya dlya pevnogo x Prisvoyennya ne prozore Napriklad viraz na C x x 1 zminyuye znachennya nadane x Pripustimo x pochatkovo maye znachennya 10 dva poslidovni obchislennya virazu dayut vidpovidno 11 i 12 Zvidsi vidno sho zamina x x 1 na 11 abo 12 nadast programi inshogo sensu otzhe viraz ne prozorij za posilannyami Odnak viklik funkciyi int plusone int x return x 1 ye prozorim bo vona yavno ne zminyuye x otzhe ne maye pobichnih efektiv V bilshosti mov yakih viraz print Vitayu svite ne prozorij bo jogo zamina na znachennya sho povertayetsya zminyuye povedinku programi bo Vitayu svite ne nadrukuyetsya today tezh ne prozora bo vidaye rizni znachennya kozhnogo novogo dnya Vidminnist vid imperativnogo programuvannyaYaksho zamina virazu na jogo znachennya dijsna tilki v pevnij tochci vikonannya programi todi cej viraz ne prozorij za posilannyami Viznachennya i vporyadkuvannya cih tochok perebigu angl sequence point ce teoretichni pidvalini imperativnogo programuvannya i chastina semantiki imperativnih mov programuvannya Odnak cherez mozhlivist obchislennya viraziv prozorih za posilannyami bud koli neobov yazkovo viznachati tochki perebigu j vzagali bud yaki garantiyi poslidovnosti vikonannya Programuvannya vikonane na takij lad nazivayetsya chisto funkcijnim programuvannyam Odniyeyu z perevag napisannya kodu z prozorimi posilannyami ye te sho rozumnomu kompilyatoru legshe vikonuvati statichnij analiz kodu i vikoristovuvati krashi optimizaciyi Napriklad u vipadku S prisutnye pogirshennya shvidkodiyi cherez dodavannya do tila ciklu dorogoyi v sensi vikonannya funkciyi navit yaksho viklik funkciyi mozhna vinesti za tilo ciklu bez zmini rezultatu programi Programist zmushenij robiti ruchni pravki yaki mozhlivo poznachatsya na zruchnosti chitannya kodu A yaksho kompilyator v zmozi viznachiti sho viklik funkciyi prozorij za posilannyami vin mozhe zdijsniti ce peretvorennya avtomatichno Osnovnim nedolikom mov sho napolyagayut na prozorosti posilan ye te sho v nih poslidovnist dij yaka prirodno mozhe buti zapisana yak pokrokova poslidovnist v imperativnomu stili nabuvaye nezgrabnogo j rozlogogo viglyadu Taki movi chasto mistyat mehanizmi sho dozvolyayut vikonati taki zadachi prostishe zberigshi pri comu chistotu funkcijnosti movi napriklad DC gramatiki j monadi U vipadku prozorosti posilan nemaye riznici mizh posilannyam na ob yekt i samim ob yektom Inakshe taka riznicya mozhe buti legko vvedena j vikoristana PrimitkiJohn C Mitchell 2002 Concepts in Programming Languages Cambridge University Press s 78 Alfred North Whitehead Bertrand Russell 1927 Principia Mathematica T 1 vid 2nd Cambridge University Press Na storinci 665 Zgidno z Kvajnom termin pohodit zvidti Posilannyahttps stackoverflow com questions 210835 what is referential transparency 9859966 9859966