Прозорість посилань (інформатика): відмінності між версіями

[перевірена версія][перевірена версія]
Вилучено вміст Додано вміст
мНемає опису редагування
"Прозорий по посиланнях" -> "Прозорий за посиланнями" (виглядає, як автопереклад з російської), інші мовні правки, вікіфікація
Рядок 1:
{{Без джерел|дата=липень 2013}}'''Прозорість посилань''' і '''непрозорість посилань''' — це властивості частин [[Комп'ютерна програма|комп'ютерних програм]]. Кажуть, що [[Вираз (інформатика)|вираз]] прозорий поза посиланняхпосиланнями, якщо його можна замінити на його [[Величина (інформатика)|значення]] і це не вплине на поведінку програми (тобто ми отримаємо нову програму, що на ті саміж вхідні дані видає тітакі саміж вихідні). Протилежним терміном є непрозорість посилань.
 
В [[математика|математиці]] всі функції прозорі поза посиланняхпосиланнями, в програмуванні це не завжди так. Важливість прозорості посилань полягає в тому, що вони дозволяють програмісту та компілятору робити здогади про поведінку програми. Це може допомогти в доведенні правильності, спрощенні [[алгоритм]]у, допомагає при зміні коду без отримання нових помилок або [[оптимізація (інформатика)|оптимізації]] коду в сенсі [[мемоізація|мемоізації]], [[усунення загальнихспільних підвиразів]] або [[Паралельні обчислення|паралелізації]].
 
Прозорість посилань є одним з принципів [[функційне програмування|функційного програмування]];. тількиТільки прозорі поза посиланняхпосиланнями функції можуть бути мемоізовані (перетворені в тотожні функції, які використовують кешовані[[кеш]]овані результати). Деякі мови програмування{{які}} забезпечують засоби для гарантування прозорості посилань. Деякі ж вимагають дотримання прозорості посилань у всіх функціях.
 
Через те, що прозорість посилань вимагає однакового результату на однаковому вході в будь-який час, прозорий поза посиланняхпосиланнями вираз є детермінованим за визначенням.
 
== Приклади й контрприклади ==
Якщо в виразі задіяні лише [[чиста{{нп|Чиста функція|чисті]]||Pure function}} функції, тоді вираз буде прозорим поза посиланняхпосиланнями. Також, деякі нечисті функції можуть бути використані ву виразі, якщо їх значення не впливають на значення виразу та їх [[побічнийПобічний ефект (програмування)|побічні ефекти]] незначимі.
 
Візьмемо функцію, що не приймає параметрів і повертає дані, введені з [[Клавіатура|клавіатури]]. Припустимо, її виклик такий: <code>GetInput()</code>. Значення повернуте функцією <code>GetInput()</code> залежить від того, що користувачвводу друкуєкористувача, отже різні виклики <code>GetInput()</code> з однаковими параметрами (порожній список) можуть вертатиповертати різні значення. Звідси, <code>GetInput()</code> ані детермінована, ані прозора поза посиланняхпосиланнями.
 
Витонченіший приклад&nbsp;— функція, що використовує [[глобальна змінна|глобальну змінну]] (змінну з динамічною [[Область видимості (програмування)|областю видностівидимості]] або лексичне [[Замикання (програмування)|замикання]]), щоб полегшити собі обчислення результату. Через те, що ця змінна не передається як параметр, але може бути змінена, результатомрезультати послідовних викликів можуть різнитисьвідрізнятись, навіть якщо параметри тотожні. (В чистому функційному програмуванні використовується підхід єдиного присвоєння, тобто змінні після присвоєння їм значень стають незмінними об'єктами.)
 
Арифметичні операції прозорі поза посиланняхпосиланнями: <code>5*5</code> можна замінити на <code>25</code>. В дійсності, всі функції прозорі поза посиланняхпосиланнями в математичному сенсі: <code>sin(x)</code> прозора, бо вона завжди повертає те самеоднакове значення для певного <code>x</code>.
 
Присвоєння не прозоре. Наприклад, вираз на [[C (мова програмування)|C]] <code>x = x + 1</code> змінює значення надане <code>x</code>. Припустимо <code>x</code> початково має значення <code>10</code>, два послідовні обчислення виразу дають, відповідно, <code>11</code> і <code>12</code>. Звідси видно, що заміна <code>x = x + 1</code> на <code>11</code> або <code>12</code> надасть програмі іншого енсусенсу, отже вираз не прозорий поза посиланняхпосиланнями. Однак, виклик функції <code>int plusone(int x) {return x+1;}</code> ''є'' прозорим, бо вона явно не змінює x, отже не має побічних ефектів.
 
В більшості мов,{{яких}} вираз <code>print("Вітаю, світе!")</code> не прозорапрозорий, бо його заміна її на значення, що вона повертаєповертається, змінює поведінку програми, бо «Вітаю, світе!» не надрукується.
 
<code>today()</code> теж не прозора, бо видає різні значення кожного нового дня.
 
== Відмінність від [[Імперативне програмування|імперативного програмування]] ==
 
Якщо заміна виразу на його значення чиннадійсна тільки в певній точці виконання програми, тоді цей вираз не прозорий поза посиланняхпосиланнями. Визначення і впорядкування цих [[точка перебігу|точок перебігу]] ({{lang-en|sequence point}}) це теоретичні підвалини [[імперативне програмування|імперативного програмування]] і частина семантики імперативних мов програмування.
 
Однак, через можливість обчислення виразів прозорих поза посиланняхпосиланнями будь-коли, необов'язково визначати точки перебігу й взагалі будь-які гарантії послідовності виконання. Програмування виконане на такий штиблад називається чисто функційним програмуванням.
 
Однією з переваг написання коду з прозорими посиланнями є те, що розумному компілятору легше виконувати [[статичний розбіраналіз коду]] і використовувати кращі оптимізації. Наприклад, у випадку С присутнє погіршення швидкодії через додавання до тіла циклу дорогої, в сенсі виконання, функції, навіть якщо виклик функції можна винести за тіло циклу без зміни результату програми. Програміст змушений робити ручні правки, які можливо позначаться на зручночитностізручності читання коду. А якщо компілятор в змозі визначити, що виклик функції прозорий поза посиланняхпосиланнями, він може здійснити це перетворення автоматично.
 
Основним недоліком мов, що наполягають на прозорості посилань є те, що в них послідовність дій, яка природно може бути записана як покрокова послідовність в імперативному стилі, набуваютьнабуває незграбного й розлогого вигляду. Такі мови часто містять механізми, що дозволяють виконати такі задачі простіше, зберігши при цьому чистоту функційності мови, наприклад, [[DC-граматикаГраматика визначених тверджень|DC-граматики]] й [[Монади (програмування)|монади]].
 
У випадку прозорості посилань, немає різниці між посиланням на об'єкт і самим об'єктом. Інакше така різниця може бути легко введена й використана.
 
== Примітки ==
{{reflist}}
 
== Посилання ==
{{Без джерел|дата=липень 2013}}
 
{{ВП-портали|Програмування}}
 
[[Категорія:Функціональне програмування]]