Ця стаття не містить . (травень 2016) |
Мова програмування використовує стратегії обчислення для того, щоб визначити, коли обчислювати аргумент(и) виклику функції (або операції, методу чи співвідношення) і які значення передавати до функції. Наприклад, виклик за значенням/виклик за посиланням визначають, що аргумент обчислюється до виконання тіла функції, і надає дві можливості для функції – отримати поточне значення аргументу та змінити його через вираз присвоєння. Поняття стратегії скорочення в лямбда обчисленнях є схожим, але має відмінності.
На практиці, багато сучасних мов програмування зійшлись на використанні стратегії виклику по значенню/виклику по посиланню для виклику функцій (C#, Java). Деякі мови, особливо нижчого рівня, такі як , поєднують декілька ідей передачі параметрів. Історично, виклик за значенням/виклик за посиланням бере свій початок в ALGOL 60, мові, створеній в пізніх 1950-х. Виклик по посиланню використовується в (PL/I) та деяких дистрибутивах Fortran. Виключно функціональні мови, такі як Haskell, а також не повністю функціональні мови, такі як R, використовують виклик за потребою.
Строгі обчислення
В строгих обчисленнях аргументи функції завжди обчислюються повністю перед викликом функції.
Аплікативний порядок
Аплікативний порядок (або найлівіший найглибший) – стратегія, при якій аргументи функції обчислюються зліва направо в зворотному порядку обходу дерева виразу. Аплікативний порядок відноситься до виклику за значенням.
Виклик за значенням
Виклик за значенням це найпоширеніша стратегія обчислень, яка використовується в різноманітних мовах як С чи Scheme. У виклику за значенням вираз аргументу обчислюється і отримане значення прикріплюється до відповідної змінної у функції (найчастіше копіюванням значення у нову область пам'яті). Якщо функція чи процедура може присвоювати значення своїм параметрам, то тільки локальна копія змінюється, тобто все, що було передане під час виклику, після закінчення роботи функції у зовнішній області видимості не змінюється.
Виклик за значенням це швидше не конкретна стратегія обчислень, а ціле сімейство стратегій обчислень в яких аргумент функції обчислюється перед передачею до функції. Більшість мов програмування, які використовують виклик за значенням (такі як Common Lisp, Eiffel і Java) обчислюють аргументи зліва направо, деякі обчислюють функції та аргументи справа наліво, інші (такі як Scheme, OCaml і C) не встановлюють порядок обчислень.
Неявні обмеження
Іноді термін “виклик за значенням” не є коректним, тому що значення, яке передається, не є значенням змінної як мається на увазі в звичайному значенні змінної, а є посиланням на значення, яке залежить від реалізації. Наслідком є те, що код, який синтаксично виглядає як виклик за значенням може поводити себе як виклик за посиланням чи виклик за співвикористанням (англ. ), що залежить від тонких аспектів семантики мови.
Причина передачі за посиланням зазвичай полягає в тому, що технічно мова не надає конкретне значення для складних даних, а замість цього надає структуру даних, хоча в коді вони виглядають схожими на єдине значення. Важко точно провести межу між власне значеннями та замаскованими під них структурами даних. У С вектор (одномірний масив, частковим випадком якого є символьний рядок) є структурою даних, і тому розглядається як символьний рядок, але структура представляє собою значення, навіть якщо його полем є вектор. У Maple, вектор це частковий випадок таблиці, і тому це структура даних, але список (який будується і може бути проіндексований таким самим способом) є значенням. В Tcl, значення є двоякими, тобто на рівні сценарію вони використовуються у вигляді значення, а мова керує відповідною структурою даних, якщо вона потрібна. Зміни, зроблені зі структурою даних відображаються на значенні і навпаки.
Пояснення “виклик за значенням, де значення це посилання” є загальновживаним (але не слід розуміти це як виклик за посиланням); інший термін - виклик за співвикористанням. Таким чином виклик за значенням у Java або Visual Basic і виклик за значенням у С чи Pascal є істотно різними: у С чи Pascal виклик функції з аргументом, представленим у вигляді великої структури призведе до того, що вся структура буде скопійована (за винятком випадку, коли це буде посилання на структуру), потенційно викликаючи серйозне зниження продуктивності, і зміни в структурі будуть невидимі для того, хто викликав. А в Java або Visual Basic копіюється лише посилання на структуру, що відбувається швидко, і зміни до структури видимі ззовні.
Виклик по посиланню
При виклику по посиланню (також відомий як передача по посиланню) функція отримує неявне посилання на змінну, що використовується як аргумент, а не копію цієї змінної. Зазвичай це означає, що функція може змінювати (тобто присвоювати нове значення) змінній, що передана як аргумент - так, що це буде помітно, для того хто викликав цю функцію. Тому виклик по посиланню може бути використаний для забезпечення додаткового каналу зв'язку між функцією що викликається та функцією яка викликає. У мовах з викликом по посиланню програмісту набагато важче відстежити ефекти виклику функції, що може привести до багів, буде складно виявити.
Багато мов підтримують виклик по посиланню в тій чи іншій формі, але порівняно небагато використовують його за умовчанням. FORTRAN II це може бути прикладом першої з викликом за посиланням. Незначна кількість мов, наприклад , PHP, Visual Basic, .NET, C# і REALbasic за умовчанням використовують виклик за значенням, але надають спеціальний синтаксис для виклику за посиланням. У C++ також є виклик за посиланням на константу.
Виклик за посиланням може бути змодельований в мовах які використовують виклик за значенням та не підтримують виклик за посиланням за допомогою використання посилань (об'єктів які посилаються на інші об'єкти), наприклад вказівників (об'єктів, що містять адресу в пам'яті де зберігається інший об'єкт). Цей прийом використовується у таких мовах як C та ML. Це не окрема стратегія обчислень, але іноді її називають виклик за адресою (або передачею за адресою). В ненадійних мовах, таких як C це може викликати помилки доступу до пам'яті, наприклад нульовий вказівник.
Аналогічний ефект досягається через виклик з співвикористанням (передача об'єкту, що може бути змінений), використовується у мовах Java, Python та Ruby.
В чисто функціональних мовах програмування зазвичай нема семантичної різниці між цими стратегіями (оскільки структури даних незмінні, то у функції нема можливостей змінювати жоден зі своїх аргументів), тож вважається що вони використовують виклик за значенням навіть якщо використовується виклик за посиланням для виграшу в ефективності.
Приклад, що демонструє виклик за посиланням в C:
void Modify(int p, int &q) { p = 27; // передано за значенням - тільки локальна копія змінюється q = 27; // передано за посиланням - початкова змінна теж отримає нове значення } int main() { int a = 1; int b = 1; Modify(a, b); std::cout << "a=" << a << std::endl; //на екран виведеться a=1 std::cout << "b=" << b << std::endl; //на екран виведеться b=27 return(0); }
Виклик з співвикористанням
Використовується в мовах Python, Iota, Java (для посилань на об'єкти), Ruby, JavaScript, Scheme, OCaml, AppleScript, та багатьох інших. При виклику з співвикористанням мається на увазі, що всі значення в мові засновані на об'єктах а не примітивах, тобто всі значення “запаковано” (англ. boxed).
Семантика виклику з співвикористанням відрізняється в тому, що присвоєння значень аргументам всередині функції не будуть видимі для того хто викликав (на відміну від виклику за посиланням), тобто для переданого параметру не можливо імітувати присвоєння в зовнішній області видимості. Проте оскільки функція має доступ до того ж об'єкта що й той хто викликає (копія не створюється), то зміни цього об'єкту, якщо його можна змінювати, будуть видимі для того хто викликав, що відрізняється від виклику за значенням. Зміни об'єктів всередині функції видимі ззовні, тому що об'єкт не копіюється чи клонується - він використовується спільно. Наприклад, в Python списки можна змінювати, тож
def f(l): l.append(1) m = [] f(m) print(m)
... виводить [1] тому що метод append
змінює об'єкт для якого він був викликаний. Присвоєння всередині функції невидимі ззовні, тому що присвоєння прив'язує змінну до іншого об'єкту, а не змінює сам об'єкт. Оскільки цей об'єкт буде існувати лише в області видимості функції, зовнішня копія збереже свою початкову прив'язку. Цей код присвоює формальному параметру новий об'єкт:
def f(l): l = [1] m = [] f(m) print(m)
... і виводить [], тому що вираз l = [1]
присвоює новий список локальній змінній замість присвоєння нового значення для оригінальної змінної.
Для незмінних об'єктів немає різниці між викликом з співвикористанням та викликом за значенням, окрім ідентичності об'єктів. Використання виклику з співвикористанням є альтернативою вхідним та вихідним параметрам: параметри не перезаписуються, а міняють свій стан, зберігаючи ідентичність.
Цей термін отримав розповсюдження в спільноті Python, аналогічні семантики в інших мовах, як Java та Visual Basic зазвичай визначаються як виклик за значенням, де під значенням мається на увазі посилання на об'єкт.
Виклик з копіюванням та відновленням
Виклик з копіюванням та відновленням, виклик із поверненням значення - це окремий випадок виклику по посиланню, в якому для викликаної функції надається унікальне посилання на об'єкт. Цей варіант отримав увагу у багатопроцесовому контексті та виклику віддалених процедур: якщо параметр виклику функції може бути доступний з іншого потоку виконання, його вміст копіюється в нове посилання; коли викликана функція закінчується, змінений вміст цього нового посилання копіюється назад до початкового посилання (відновлюється).
Семантика виклику з копіюванням та відновленням також відрізняється від виклику за посиланням коли два або більше параметрів функції є псевдонімами один для одного, тобто вказують на одну й ту саму змінну. При виклику за посиланням, запис в одну з них вплине на іншу, виклик з копіюванням та відновленням уникає цього наданням функції двох незалежних копій, але залишає результат для того хто викликав невизначеним, результат виконання буде залежати від того, як ці аргументи будуть копіюватись назад.
Часткове обчислення
В частковому обчисленні, обчислення можуть проводитись в тілі невикликаної функції. Підвирази, що не містять незв'язаних змінних обчислюються, застосування функцій з відомими аргументами скорочуються. Якщо побічні ефекти присутні, повне часткове обчислення може призвести до небажаних результатів, через це системи, які підтримують часткові обчислення проводять їх лише в чистих виразах (тобто виразах без побічних ефектів).
Нестрогі обчислення
У нестрогих обчисленнях аргументи обчислюються тільки тоді, коли вони використовуються в тілі функції.
Нормальний порядок
Нормальний порядок (або найлівіший найглибший) обчислення це стратегія обчислення в якій зовнішні вирази скорочуються застосуванням функцій перед обчисленням аргументів функції, що викликається.
На відміну від цієї стратегії, стратегія виклик по імені не обчислює вирази всередині невикликаної функції.
Виклик по імені
В стратегії виклик по імені аргументи функції не обчислюються перед тим, як функція буде викликана, а передаються прямо в тіло функції (використовуючи підстановку, що запобігає захопленню[]), і далі обчислюються при появі у функції. Якщо аргумент в тілі функції не використовується, то він ніколи не обчислюється, якщо він використовується декілька разів, то він обчислюється при кожній появі.
Виклик за іменем іноді є кращим ніж виклик за значенням. Якщо аргумент функції не використовується в ній, виклик по імені збереже час, оскільки він не обчислює аргументи, в той час як виклик по значенню обчислить їх незважаючи ні на що. Якщо обчислення є нескінченними, то перевага є неймовірною. Але коли аргумент функції використовується, виклик по імені зазвичай повільніший і потребує додатковий перехідний механізм.
Вперше був використаний в ALGOL 60. У Scala за умовчанням використовується виклик за значенням, але виклик за іменем також доступний. Сучасні мови .NET можуть імітувати виклик по імені використовуючи делегати або параметри типу Expression<T>
. В останньому випадку у функцію передається абстрактне синтаксичне дерево. В мові Eiffel реалізовані агенти, які представляють операції, що обчислюються за потребою. В мові Seed7 реалізований виклик за іменем з параметрами функції.
Виклик за потребою
Виклик за потребою це вдосконалений варіант виклику за іменем. Якщо аргумент був обчислений, то він зберігається для наступного використання. В чистому (вільному від побічних ефектів) варіанті це приводить до такого ж результату, як і у випадку з викликом по імені; коли аргумент використовується два або більше разів виклик за потребою завжди працює швидше.
Оскільки обчислення виразів може мати високий ступінь вкладення, мови, що використовують виклик за потребою зазвичай не підтримують побічні ефекти, окрім використання монад. Це виключає будь-яке непередбачувані ефекти зі змінних, чиї значення змінюються при відкладених обчисленнях.
Ліниві обчислення це найбільш розповсюджена реалізація семантики виклику за потребою, але існують і інші варіанти, зокрема оптимістичні обчислення.
Haskell є найвідомішою мовою, що використовує стратегію виклику за потребою. R також використовує форму виклику за потребою. Мови платформи .NET можуть емулювати виклик за потребою використовуючи тип Lazy<T>
.
Виклик із розкриттям макросів
Виклик із розкриттям макросів аналогічний до виклику за іменем, але використовує текстову підстановку замість підстановки, що запобігає захопленню. При необачному використанні може призвести до захоплення змінної і непередбачуваної поведінки програми. Гігієнічні макроси уникають цієї проблеми перевіркою і заміною затінених змінних що не є параметрами.
Недетерміновані обчислення
Повне β-скорочення
При повному β-скороченні, будь-яке застосування функції може бути скорочене (підстановкою аргументу функції в функцію з використанням підстановки, що запобігає захопленню) в будь-який час. Це може бути зроблено навіть з тілом невикликаної функції.
Виклик в майбутньому
Виклик в майбутньому (або паралельний виклик за іменем) це стратегія паралельних обчислень. Значення запланованого виразу обчислюється паралельно разом з потоком програми. Коли значення стає потрібним, основна програма блокується поки обчислення запланованого виразу не закінчиться.
Це стратегія не детермінована, оскільки обчислення можуть відбуватись в будь-який момент між плануванням (тобто коли створюється вираз) і використанням запланованого виразу. Це є аналогічним до виклику за іменем, тому що значення обчислюється лише один раз, і обчислення можуть бути відкладені до того моменту, поки значення не стане потрібне, але різниця полягає в тому, що обчислення можуть початись раніше. Більше того, якщо заплановане значення стане не потрібне (наприклад значення локальної змінної у функції, яка закінчила виконання), його обчислення можуть бути зупинені.
Якщо ця стратегія буде реалізована за допомогою процесів або потоків, планування породить один або більше процесів або потоків. Доступ до значення буде синхронізовувати їх з основним потоком, і припинення обчислень призведе до знищення потоків, що обчислюють його значення.
Оптимістичні обчислення
Оптимістичні обчислення це ще один варіант виклику за потребою, при якому аргумент функції частково обчислюється певний проміжок часу (який може бути налаштований під час виконання програми), після чого обчислення припиняються і функція виконується з використанням виклику за потребою. Такий підхід дозволяє уникнути частини витрат виклику за потребою, зберігаючи бажані характеристики припинення обчислень.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Cya stattya ne mistit posilan na dzherela Vi mozhete dopomogti polipshiti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Material bez dzherel mozhe buti piddano sumnivu ta vilucheno traven 2016 Mova programuvannya vikoristovuye strategiyi obchislennya dlya togo shob viznachiti koli obchislyuvati argument i vikliku funkciyi abo operaciyi metodu chi spivvidnoshennya i yaki znachennya peredavati do funkciyi Napriklad viklik za znachennyam viklik za posilannyam viznachayut sho argument obchislyuyetsya do vikonannya tila funkciyi i nadaye dvi mozhlivosti dlya funkciyi otrimati potochne znachennya argumentu ta zminiti jogo cherez viraz prisvoyennya Ponyattya strategiyi skorochennya v lyambda obchislennyah ye shozhim ale maye vidminnosti Na praktici bagato suchasnih mov programuvannya zijshlis na vikoristanni strategiyi vikliku po znachennyu vikliku po posilannyu dlya vikliku funkcij C Java Deyaki movi osoblivo nizhchogo rivnya taki yak S poyednuyut dekilka idej peredachi parametriv Istorichno viklik za znachennyam viklik za posilannyam bere svij pochatok v ALGOL 60 movi stvorenij v piznih 1950 h Viklik po posilannyu vikoristovuyetsya v PL I ta deyakih distributivah Fortran Viklyuchno funkcionalni movi taki yak Haskell a takozh ne povnistyu funkcionalni movi taki yak R vikoristovuyut viklik za potreboyu Strogi obchislennyaV strogih obchislennyah argumenti funkciyi zavzhdi obchislyuyutsya povnistyu pered viklikom funkciyi Aplikativnij poryadok Aplikativnij poryadok abo najlivishij najglibshij strategiya pri yakij argumenti funkciyi obchislyuyutsya zliva napravo v zvorotnomu poryadku obhodu dereva virazu Aplikativnij poryadok vidnositsya do vikliku za znachennyam Viklik za znachennyam Viklik za znachennyam ce najposhirenisha strategiya obchislen yaka vikoristovuyetsya v riznomanitnih movah yak S chi Scheme U vikliku za znachennyam viraz argumentu obchislyuyetsya i otrimane znachennya prikriplyuyetsya do vidpovidnoyi zminnoyi u funkciyi najchastishe kopiyuvannyam znachennya u novu oblast pam yati Yaksho funkciya chi procedura mozhe prisvoyuvati znachennya svoyim parametram to tilki lokalna kopiya zminyuyetsya tobto vse sho bulo peredane pid chas vikliku pislya zakinchennya roboti funkciyi u zovnishnij oblasti vidimosti ne zminyuyetsya Viklik za znachennyam ce shvidshe ne konkretna strategiya obchislen a cile simejstvo strategij obchislen v yakih argument funkciyi obchislyuyetsya pered peredacheyu do funkciyi Bilshist mov programuvannya yaki vikoristovuyut viklik za znachennyam taki yak Common Lisp Eiffel i Java obchislyuyut argumenti zliva napravo deyaki obchislyuyut funkciyi ta argumenti sprava nalivo inshi taki yak Scheme OCaml i C ne vstanovlyuyut poryadok obchislen Neyavni obmezhennya Inodi termin viklik za znachennyam ne ye korektnim tomu sho znachennya yake peredayetsya ne ye znachennyam zminnoyi yak mayetsya na uvazi v zvichajnomu znachenni zminnoyi a ye posilannyam na znachennya yake zalezhit vid realizaciyi Naslidkom ye te sho kod yakij sintaksichno viglyadaye yak viklik za znachennyam mozhe povoditi sebe yak viklik za posilannyam chi viklik za spivvikoristannyam angl sho zalezhit vid tonkih aspektiv semantiki movi Prichina peredachi za posilannyam zazvichaj polyagaye v tomu sho tehnichno mova ne nadaye konkretne znachennya dlya skladnih danih a zamist cogo nadaye strukturu danih hocha v kodi voni viglyadayut shozhimi na yedine znachennya Vazhko tochno provesti mezhu mizh vlasne znachennyami ta zamaskovanimi pid nih strukturami danih U S vektor odnomirnij masiv chastkovim vipadkom yakogo ye simvolnij ryadok ye strukturoyu danih i tomu rozglyadayetsya yak simvolnij ryadok ale struktura predstavlyaye soboyu znachennya navit yaksho jogo polem ye vektor U Maple vektor ce chastkovij vipadok tablici i tomu ce struktura danih ale spisok yakij buduyetsya i mozhe buti proindeksovanij takim samim sposobom ye znachennyam V Tcl znachennya ye dvoyakimi tobto na rivni scenariyu voni vikoristovuyutsya u viglyadi znachennya a mova keruye vidpovidnoyu strukturoyu danih yaksho vona potribna Zmini zrobleni zi strukturoyu danih vidobrazhayutsya na znachenni i navpaki Poyasnennya viklik za znachennyam de znachennya ce posilannya ye zagalnovzhivanim ale ne slid rozumiti ce yak viklik za posilannyam inshij termin viklik za spivvikoristannyam Takim chinom viklik za znachennyam u Java abo Visual Basic i viklik za znachennyam u S chi Pascal ye istotno riznimi u S chi Pascal viklik funkciyi z argumentom predstavlenim u viglyadi velikoyi strukturi prizvede do togo sho vsya struktura bude skopijovana za vinyatkom vipadku koli ce bude posilannya na strukturu potencijno viklikayuchi serjozne znizhennya produktivnosti i zmini v strukturi budut nevidimi dlya togo hto viklikav A v Java abo Visual Basic kopiyuyetsya lishe posilannya na strukturu sho vidbuvayetsya shvidko i zmini do strukturi vidimi zzovni Viklik po posilannyu Pri vikliku po posilannyu takozh vidomij yak peredacha po posilannyu funkciya otrimuye neyavne posilannya na zminnu sho vikoristovuyetsya yak argument a ne kopiyu ciyeyi zminnoyi Zazvichaj ce oznachaye sho funkciya mozhe zminyuvati tobto prisvoyuvati nove znachennya zminnij sho peredana yak argument tak sho ce bude pomitno dlya togo hto viklikav cyu funkciyu Tomu viklik po posilannyu mozhe buti vikoristanij dlya zabezpechennya dodatkovogo kanalu zv yazku mizh funkciyeyu sho viklikayetsya ta funkciyeyu yaka viklikaye U movah z viklikom po posilannyu programistu nabagato vazhche vidstezhiti efekti vikliku funkciyi sho mozhe privesti do bagiv bude skladno viyaviti Bagato mov pidtrimuyut viklik po posilannyu v tij chi inshij formi ale porivnyano nebagato vikoristovuyut jogo za umovchannyam FORTRAN II ce mozhe buti prikladom pershoyi z viklikom za posilannyam Neznachna kilkist mov napriklad C PHP Visual Basic NET C i REALbasic za umovchannyam vikoristovuyut viklik za znachennyam ale nadayut specialnij sintaksis dlya vikliku za posilannyam U C takozh ye viklik za posilannyam na konstantu Viklik za posilannyam mozhe buti zmodelovanij v movah yaki vikoristovuyut viklik za znachennyam ta ne pidtrimuyut viklik za posilannyam za dopomogoyu vikoristannya posilan ob yektiv yaki posilayutsya na inshi ob yekti napriklad vkazivnikiv ob yektiv sho mistyat adresu v pam yati de zberigayetsya inshij ob yekt Cej prijom vikoristovuyetsya u takih movah yak C ta ML Ce ne okrema strategiya obchislen ale inodi yiyi nazivayut viklik za adresoyu abo peredacheyu za adresoyu V nenadijnih movah takih yak C ce mozhe viklikati pomilki dostupu do pam yati napriklad nulovij vkazivnik Analogichnij efekt dosyagayetsya cherez viklik z spivvikoristannyam peredacha ob yektu sho mozhe buti zminenij vikoristovuyetsya u movah Java Python ta Ruby V chisto funkcionalnih movah programuvannya zazvichaj nema semantichnoyi riznici mizh cimi strategiyami oskilki strukturi danih nezminni to u funkciyi nema mozhlivostej zminyuvati zhoden zi svoyih argumentiv tozh vvazhayetsya sho voni vikoristovuyut viklik za znachennyam navit yaksho vikoristovuyetsya viklik za posilannyam dlya vigrashu v efektivnosti Priklad sho demonstruye viklik za posilannyam v C void Modify int p int amp q p 27 peredano za znachennyam tilki lokalna kopiya zminyuyetsya q 27 peredano za posilannyam pochatkova zminna tezh otrimaye nove znachennya int main int a 1 int b 1 Modify a b std cout lt lt a lt lt a lt lt std endl na ekran vivedetsya a 1 std cout lt lt b lt lt b lt lt std endl na ekran vivedetsya b 27 return 0 Viklik z spivvikoristannyam Vikoristovuyetsya v movah Python Iota Java dlya posilan na ob yekti Ruby JavaScript Scheme OCaml AppleScript ta bagatoh inshih Pri vikliku z spivvikoristannyam mayetsya na uvazi sho vsi znachennya v movi zasnovani na ob yektah a ne primitivah tobto vsi znachennya zapakovano angl boxed Semantika vikliku z spivvikoristannyam vidriznyayetsya v tomu sho prisvoyennya znachen argumentam vseredini funkciyi ne budut vidimi dlya togo hto viklikav na vidminu vid vikliku za posilannyam tobto dlya peredanogo parametru ne mozhlivo imituvati prisvoyennya v zovnishnij oblasti vidimosti Prote oskilki funkciya maye dostup do togo zh ob yekta sho j toj hto viklikaye kopiya ne stvoryuyetsya to zmini cogo ob yektu yaksho jogo mozhna zminyuvati budut vidimi dlya togo hto viklikav sho vidriznyayetsya vid vikliku za znachennyam Zmini ob yektiv vseredini funkciyi vidimi zzovni tomu sho ob yekt ne kopiyuyetsya chi klonuyetsya vin vikoristovuyetsya spilno Napriklad v Python spiski mozhna zminyuvati tozh def f l l append 1 m f m print m vivodit 1 tomu sho metod append zminyuye ob yekt dlya yakogo vin buv viklikanij Prisvoyennya vseredini funkciyi nevidimi zzovni tomu sho prisvoyennya priv yazuye zminnu do inshogo ob yektu a ne zminyuye sam ob yekt Oskilki cej ob yekt bude isnuvati lishe v oblasti vidimosti funkciyi zovnishnya kopiya zberezhe svoyu pochatkovu priv yazku Cej kod prisvoyuye formalnomu parametru novij ob yekt def f l l 1 m f m print m i vivodit tomu sho viraz l 1 prisvoyuye novij spisok lokalnijzminnij zamist prisvoyennya novogo znachennya dlya originalnoyi zminnoyi Dlya nezminnih ob yektiv nemaye riznici mizh viklikom z spivvikoristannyam ta viklikom za znachennyam okrim identichnosti ob yektiv Vikoristannya vikliku z spivvikoristannyam ye alternativoyu vhidnim ta vihidnim parametram parametri ne perezapisuyutsya a minyayut svij stan zberigayuchi identichnist Cej termin otrimav rozpovsyudzhennya v spilnoti Python analogichni semantiki v inshih movah yak Java ta Visual Basic zazvichaj viznachayutsya yak viklik za znachennyam de pid znachennyam mayetsya na uvazi posilannya na ob yekt Viklik z kopiyuvannyam ta vidnovlennyam Viklik z kopiyuvannyam ta vidnovlennyam viklik iz povernennyam znachennya ce okremij vipadok vikliku po posilannyu v yakomu dlya viklikanoyi funkciyi nadayetsya unikalne posilannya na ob yekt Cej variant otrimav uvagu u bagatoprocesovomu konteksti ta vikliku viddalenih procedur yaksho parametr vikliku funkciyi mozhe buti dostupnij z inshogo potoku vikonannya jogo vmist kopiyuyetsya v nove posilannya koli viklikana funkciya zakinchuyetsya zminenij vmist cogo novogo posilannya kopiyuyetsya nazad do pochatkovogo posilannya vidnovlyuyetsya Semantika vikliku z kopiyuvannyam ta vidnovlennyam takozh vidriznyayetsya vid vikliku za posilannyam koli dva abo bilshe parametriv funkciyi ye psevdonimami odin dlya odnogo tobto vkazuyut na odnu j tu samu zminnu Pri vikliku za posilannyam zapis v odnu z nih vpline na inshu viklik z kopiyuvannyam ta vidnovlennyam unikaye cogo nadannyam funkciyi dvoh nezalezhnih kopij ale zalishaye rezultat dlya togo hto viklikav neviznachenim rezultat vikonannya bude zalezhati vid togo yak ci argumenti budut kopiyuvatis nazad Chastkove obchislennya V chastkovomu obchislenni obchislennya mozhut provoditis v tili neviklikanoyi funkciyi Pidvirazi sho ne mistyat nezv yazanih zminnih obchislyuyutsya zastosuvannya funkcij z vidomimi argumentami skorochuyutsya Yaksho pobichni efekti prisutni povne chastkove obchislennya mozhe prizvesti do nebazhanih rezultativ cherez ce sistemi yaki pidtrimuyut chastkovi obchislennya provodyat yih lishe v chistih virazah tobto virazah bez pobichnih efektiv Nestrogi obchislennya U nestrogih obchislennyah argumenti obchislyuyutsya tilki todi koli voni vikoristovuyutsya v tili funkciyi Normalnij poryadok Normalnij poryadok abo najlivishij najglibshij obchislennya ce strategiya obchislennya v yakij zovnishni virazi skorochuyutsya zastosuvannyam funkcij pered obchislennyam argumentiv funkciyi sho viklikayetsya Na vidminu vid ciyeyi strategiyi strategiya viklik po imeni ne obchislyuye virazi vseredini neviklikanoyi funkciyi Viklik po imeni V strategiyi viklik po imeni argumenti funkciyi ne obchislyuyutsya pered tim yak funkciya bude viklikana a peredayutsya pryamo v tilo funkciyi vikoristovuyuchi pidstanovku sho zapobigaye zahoplennyu utochniti i dali obchislyuyutsya pri poyavi u funkciyi Yaksho argument v tili funkciyi ne vikoristovuyetsya to vin nikoli ne obchislyuyetsya yaksho vin vikoristovuyetsya dekilka raziv to vin obchislyuyetsya pri kozhnij poyavi Viklik za imenem inodi ye krashim nizh viklik za znachennyam Yaksho argument funkciyi ne vikoristovuyetsya v nij viklik po imeni zberezhe chas oskilki vin ne obchislyuye argumenti v toj chas yak viklik po znachennyu obchislit yih nezvazhayuchi ni na sho Yaksho obchislennya ye neskinchennimi to perevaga ye nejmovirnoyu Ale koli argument funkciyi vikoristovuyetsya viklik po imeni zazvichaj povilnishij i potrebuye dodatkovij perehidnij mehanizm Vpershe buv vikoristanij v ALGOL 60 U Scala za umovchannyam vikoristovuyetsya viklik za znachennyam ale viklik za imenem takozh dostupnij Suchasni movi NET mozhut imituvati viklik po imeni vikoristovuyuchi delegati abo parametri tipu Expression lt T gt V ostannomu vipadku u funkciyu peredayetsya abstraktne sintaksichne derevo V movi Eiffel realizovani agenti yaki predstavlyayut operaciyi sho obchislyuyutsya za potreboyu V movi Seed7 realizovanij viklik za imenem z parametrami funkciyi Viklik za potreboyu Viklik za potreboyu ce vdoskonalenij variant vikliku za imenem Yaksho argument buv obchislenij to vin zberigayetsya dlya nastupnogo vikoristannya V chistomu vilnomu vid pobichnih efektiv varianti ce privodit do takogo zh rezultatu yak i u vipadku z viklikom po imeni koli argument vikoristovuyetsya dva abo bilshe raziv viklik za potreboyu zavzhdi pracyuye shvidshe Oskilki obchislennya viraziv mozhe mati visokij stupin vkladennya movi sho vikoristovuyut viklik za potreboyu zazvichaj ne pidtrimuyut pobichni efekti okrim vikoristannya monad Ce viklyuchaye bud yake neperedbachuvani efekti zi zminnih chiyi znachennya zminyuyutsya pri vidkladenih obchislennyah Linivi obchislennya ce najbilsh rozpovsyudzhena realizaciya semantiki vikliku za potreboyu ale isnuyut i inshi varianti zokrema optimistichni obchislennya Haskell ye najvidomishoyu movoyu sho vikoristovuye strategiyu vikliku za potreboyu R takozh vikoristovuye formu vikliku za potreboyu Movi platformi NET mozhut emulyuvati viklik za potreboyu vikoristovuyuchi tip Lazy lt T gt Viklik iz rozkrittyam makrosiv Viklik iz rozkrittyam makrosiv analogichnij do vikliku za imenem ale vikoristovuye tekstovu pidstanovku zamist pidstanovki sho zapobigaye zahoplennyu Pri neobachnomu vikoristanni mozhe prizvesti do zahoplennya zminnoyi i neperedbachuvanoyi povedinki programi Gigiyenichni makrosi unikayut ciyeyi problemi perevirkoyu i zaminoyu zatinenih zminnih sho ne ye parametrami Nedeterminovani obchislennyaPovne b skorochennya Pri povnomu b skorochenni bud yake zastosuvannya funkciyi mozhe buti skorochene pidstanovkoyu argumentu funkciyi v funkciyu z vikoristannyam pidstanovki sho zapobigaye zahoplennyu v bud yakij chas Ce mozhe buti zrobleno navit z tilom neviklikanoyi funkciyi Viklik v majbutnomu Viklik v majbutnomu abo paralelnij viklik za imenem ce strategiya paralelnih obchislen Znachennya zaplanovanogo virazu obchislyuyetsya paralelno razom z potokom programi Koli znachennya staye potribnim osnovna programa blokuyetsya poki obchislennya zaplanovanogo virazu ne zakinchitsya Ce strategiya ne determinovana oskilki obchislennya mozhut vidbuvatis v bud yakij moment mizh planuvannyam tobto koli stvoryuyetsya viraz i vikoristannyam zaplanovanogo virazu Ce ye analogichnim do vikliku za imenem tomu sho znachennya obchislyuyetsya lishe odin raz i obchislennya mozhut buti vidkladeni do togo momentu poki znachennya ne stane potribne ale riznicya polyagaye v tomu sho obchislennya mozhut pochatis ranishe Bilshe togo yaksho zaplanovane znachennya stane ne potribne napriklad znachennya lokalnoyi zminnoyi u funkciyi yaka zakinchila vikonannya jogo obchislennya mozhut buti zupineni Yaksho cya strategiya bude realizovana za dopomogoyu procesiv abo potokiv planuvannya porodit odin abo bilshe procesiv abo potokiv Dostup do znachennya bude sinhronizovuvati yih z osnovnim potokom i pripinennya obchislen prizvede do znishennya potokiv sho obchislyuyut jogo znachennya Optimistichni obchislennya Optimistichni obchislennya ce she odin variant vikliku za potreboyu pri yakomu argument funkciyi chastkovo obchislyuyetsya pevnij promizhok chasu yakij mozhe buti nalashtovanij pid chas vikonannya programi pislya chogo obchislennya pripinyayutsya i funkciya vikonuyetsya z vikoristannyam vikliku za potreboyu Takij pidhid dozvolyaye uniknuti chastini vitrat vikliku za potreboyu zberigayuchi bazhani harakteristiki pripinennya obchislen