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

[неперевірена версія][перевірена версія]
Вилучено вміст Додано вміст
DixonDBot (обговорення | внесок)
м Додавання/виправлення дати для: Шаблон:Без джерел; косметичні зміни
Виправлені деякі друкарські помилки, та змінені деякі речення для більш зручного читання.
Рядок 1:
{{Без джерел|дата=липень 2013}}'''Прозорість посилань''' і '''непрозорість посилань''' — це властивості частин [[Комп'ютерна програма|комп'ютерних програм]]. Кажуть, що [[Вираз (інформатика)|вираз]] прозорий по посиланнях, якщо його можна замінити на його [[Величина (інформатика)|значення]] і це не вплине на поведінку програми (тобто ми отримаємо нову програмапрограму, що на ті самі вхідні дані видає ті самі вихідні). Протилежним терміном є непрозорість посилань.
 
В [[математика|математиці]] всі функції прозорі по посиланнях, в програмуванні це не завжди так. Важливість прозорості посилань полягає в тому, що вони дозволяють програмісту та компілятору робити здогати про поведінку програми. Це може допомогти в доведенні правильності, спрощені [[алгоритм]]у, допомагає при зміні коду без отримання нових помилок або [[оптимізація (інформатика)|оптимізації]] коду в сенсі [[мемоізація|мемоізації]], [[усунення загальних підвиразів]] або [[Паралельні обчислення|паралелізації]].
Рядок 14:
Витонченіший приклад — функція, що використовує [[глобальна змінна|глобальну змінну]] (змінну з динамічною областю видності або лексичне [[Замикання (програмування)|замикання]]), щоб полегшити собі обчислення результату. Через те, що ця змінна не передається як параметр, але може бути змінена, результатом послідовних викликів можуть різнитись, навіть якщо параметри тотожні. (В чистому функційному програмуванні використовується підхід єдиного присвоєння, тобто змінні після присвоєння їм значень стають незмінними об'єктами.)
 
Арифметичні операції прозріпрозорі по посиланнях: <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 отже не має побічних ефектів.
Рядок 28:
Однак, через можливість обчислення виразів прозорих по посиланнях будь-коли, необов'язково визначати точки перебігу й взагалі будь-які гарантії послідовності виконання. Програмування виконане на такий штиб називається чисто функційним програмуванням.
 
Однією з переваг написання коду з прозорими посиланнями є такате, що розумному компіляторкомпілятору легше виконуєвиконувати статичний розбір коду і уможливлюютьсявикористовувати кращі оптимізації компілятора. Наприклад, у випадку С присутнє погіршення швидкодії через додавання до тіла циклу дорогої, в сенсі виконання, функції, навіть якщо виклик функції можна винести за тіло циклу без зміни результату програми. Програміст змушений робити ручні правки, які можливо позначаться на зручночитності коду. А якщо компілятор в змозі визначити, що виклик функції прозорий по посиланнях, він може здійснити це перетворення автоматично.
 
Основним недоліком мов, що наполягають на прозорості посилань є те, що в них послідовність дій, яка природньо може бути записана як покрокова послідовність в імперативному стилі, набувають незграбного й розлогого вигляду. Такі мови часто містять механізми, що дозволяють виконати такі задачі простіше, зберігши при цьому чистоту функційності мови, наприклад, [[DC-граматика|DC-граматики]] й [[Монади (програмування)|монади]].
 
У випадку прозорості посилань, немає різниці між посиланням на об'єкт і самим об'єктом. Інакше така різниця може бути легко введена й використана.
 
[[Категорія:Функціональне програмування]]