Ця стаття потребує додаткових для поліпшення її . |
Обчислення за короткою схемою, мінімальне обчислювання або обчислювання Маккарті (за Джоном Маккарті) — це семантика деяких булевих операторів у деяких мовах програмування, в яких другий аргумент виконується або обчислюється лише в тому випадку, якщо значення першого аргументу недостатньо для визначення загального значення виразу. Інакше кажучи, для функції AND
значення false
першого аргументу достатньо, щоб отримати загальне значення false
; і для функції OR
значення true
першого аргументу достатньо, щоб отримати загальне значення true
.
У мовах програмування з лінивими обчислюваннями (Lisp, Perl, Haskell) звичайні булеві оператори обчислюються за короткою схемою. В інших (Ada, Java, Delphi) доступні як оператори мінімального обчислювання, так і стандартні булеві оператори. Для деяких булевих операцій, таких як виключне «або» (XOR), неможливо здійснити мінімальне обчислювання, оскільки для визначення результату завжди потрібні обидва операнди.
Визначення
У будь-якій мові програмування, що реалізує мінімальне обчислювання, вираз x and y
еквівалентний умовному виразу if x then y else x
, а вираз x or y
еквівалентний if x then x else y
. В обох випадках x обчислюється лише один раз.
Наведене вище узагальнене визначення також стосується мов, які мають більше, ніж два значення істинності True
і False
, де оператори короткої схеми повертають останнє обчислене значення підвиразу. У таблиці нижче це називається «останнім значенням». Для строго визначеної мови вираз спрощується: if x then y else false
і if x then true else y
відповідно до логічних виразів AND
і OR
.
Перевага
Хоча AND
має більший пріоритет, ніж OR
у багатьох мовах, це не є універсальною властивістю оцінки короткого замикання. Прикладом того, як два оператори мають однаковий пріоритет і мають ліву асоціацію один з одним, є синтаксис списку команд оболонки POSIX.
Наступний приклад встановлює пріоритет для AND
перед OR
використовуючи continue
:
function short-circuit-eval (operators, values) let result := True for each (op, val) in (operators, values): if op = "AND" && result = False continue else if op = "OR" && result = True return result else result := val return result
Формалізація
Логіка «короткої схеми» (з побічними ефектами або без них) була формалізована на основі логіки Гоара. Результатом є те, що оператори, що не діють за принципом мінімального обчислення, можуть бути визначені з логіки «короткої схеми», щоб мати однакову послідовність обчислення.
Підтримка загальних та скриптових мов програмування
Мова | Оператори строгого обчислювання | Оператори мінімального обчислювання | Вихідний тип даних |
---|---|---|---|
Ada | and , or | and then , or else | Булевий |
ALGOL 68 | and, &, ∧ ; or, ∨ | andf ,orf (обидва визначені користувачем) | Булевий |
APL | ∧ , ∨ , ⍲ (nand), ⍱ (nor), etc. | :AndIf , :OrIf | Булевий |
awk | відсутні | && , || | Булевий |
Bash | відсутні | && , || | Булевий |
C, Objective-C | відсутні | && , || , ? | int (&& ,|| ), залежить від операнда (? ) |
відсутні | && , || , ? | Булевий (&& ,|| ), залежить від операнда (? ) | |
C# | & , | | && , || , ? , ? ? | Булевий (&& ,|| ), залежить від операнда(? , ? ? ) |
D | & , | | && , || , ? | Булевий (&& ,|| ), залежить від операнда (? ) |
Eiffel | and , or | and then , or else | Булевий |
Erlang | and , or | andalso , orelse | Булевий |
Fortran | .and. , .or. | .and. , .or. | Булевий |
Go, Haskell, OCaml | відсутні | && , || | Булевий |
Java, MATLAB, R, Swift | & , | | && , || | Булевий |
JavaScript, Julia | & , | | && , || | Останнє значення |
Kotlin | and , or | && , || | Булевий |
Lisp, Lua, Scheme | відсутні | and , or | Останнє значення |
Oberon | відсутні | & , OR | Булевий |
OCaml | відсутні | && , || | Булевий |
Pascal | and , or | and_then , or_else | Булевий |
Perl, Ruby | & , | | && , and , || , or | Last value |
PHP | & , | | && , and , || , or | Булевий |
POSIX shell (command list) | відсутні | && , || | Останнє значення |
Python | відсутні | and , or | Останнє значення |
Rust | & , | | && , || | Булевий |
Smalltalk | & , | | and: , or: | Булевий |
Standard ML | Невідомо | andalso , orelse | Булевий |
Visual Basic .NET | And , Or | AndAlso , OrElse | Булевий |
Visual Basic, Visual Basic for Applications (VBA) | And , Or | Select Case | Числовий |
- ABAP та APL не мають окремого булевого типу.
- При перевантаженні оператори
&&
та||
є строгими та можуть повернути будь-який тип. - Це стосується лише виразів
static if
таstatic assert
, обчислених під час виконання. Вирази в статичних ініціалізаторах або маніфестних константах використовують повне обчислення. - Оператори Fortran не мають окремих операторів мінімального чи повного обчислювання: специфікація мови дозволяє компілятору вибрати метод оптимізації.
- ISO / IEC 10206: 1990 Extended Pascal дозволяє, але не вимагає мінімального обчислення.
- Delphi та Free Pascal за замовчуванням обчислюють за короткою схемою. Це може бути змінено параметрами компілятора, але не використовується широко.
- ISO / IEC 10206: 1990 Extended Pascal підтримує
and_then
таor_else
.. Gnu-pascal.de. Архів оригіналу за 5 червня 2021. Процитовано 24 серпня 2013. - Smalltalk використовує семантику «короткої схеми» до тих пір, поки аргументом
and:
є блок (наприклад,false and: [Transcript show: 'Wont see me']
) - Мови BASIC, які підтримували оператори CASE, робили це за допомогою системи умовної оцінки, а не як таблиці переходів, обмежених фіксованими мітками.
Загальне використання
Уникнення небажаних побічних ефектів другого аргументу
Звичайний приклад використання мови на основі С:
int denom = 0; if (denom != 0 && num / denom) { ... // гарантується, що обчислення num/denom ніколи не призведе до помилки, пов'язаної з діленням на нуль }
Розглянемо наступний приклад:
int a = 0; if (a != 0 && myfunc(b)) { do_something(); }
У цьому прикладі мінімальне обчислення гарантує, що myfunc(b)
ніколи не викликається. Це тому, що a != 0
має значення false . Ця функція дозволяє дві корисні конструкції програмування.
- Якщо перший підвираз перевіряє, чи потрібне строге обчислення, і перевірка має значення false, можна усунути строге обчислення у другому аргументі.
- Це дозволяє конструкцію, де перший вираз гарантує умову, без якої другий вираз може спричинити помилку під час виконання .
Обидва вони проілюстровані в наведеному нижче фрагменті C, де мінімальна оцінка запобігає як розіменовуванню нульового покажчика, так і надмірному вибору пам'яті:
bool is_first_char_valid_alpha_unsafe(const char *p) { return isalpha(p[0]); // Помилка сегментації цілком можлива при p == NULL } bool is_first_char_valid_alpha(const char *p) { return p != NULL && isalpha(p[0]); // 1) не потрібно виконувати isalpha() при p == NULL, 2) немає жодного ризику виникнення помилки сегментації }
Ідіоматична умовна конструкція
Оскільки мінімальна оцінка є частиною семантичного визначення оператора, а не (необов'язковою) оптимізацією, то існує багато моделей кодування, що почали використовувати її як ідіоматичну умовну конструкцію. Приклади включають: Ідіоми Perl:
some_condition or die; # Перервати виконання якщо значення some_condition - false some_condition and die; # Перервати виконання якщо значення some_condition - true
Ідіоми POSIX shell:
modprobe -q some_module && echo "some_module installed" || echo "some_module not installed"
Ця ідіома передбачає, що echo
не може зазнати невдачі.
Можливі проблеми
Неперевірена друга умова призводить до невиконання побічного ефекту
Незважаючи на ці переваги, мінімальне обчислення може спричинити проблеми для програмістів, які не усвідомлюють (або забувають), що відбувається. Наприклад, у коді
if (expressionA && myfunc(b)) { do_something(); }
Якщо myfunc(b)
повинен виконати якусь необхідну операцію незалежно від того, чи do_something()
взагалі виконується, наприклад, розподіл системних ресурсів, а expressionA
дорівнює false
, то myfunc(b)
не буде виконуватися, що може спричинити проблеми. Деякі мови програмування, такі як Java, мають два оператори — один, який використовує мінімальне обчислення, а другий — ні, щоб уникнути цієї проблеми.
Проблеми з невиконаними операторами побічних ефектів можна легко вирішити за допомогою належного стилю програмування, тобто, не використовуючи побічні ефекти в булевих операторах, оскільки використання значень з побічними ефектами в оцінках, як правило, робить код непрозорим і схильним до помилок.
Зниження ефективності через обмежувальні оптимізації
Обчислення за короткою схемою може призвести до помилок у прогнозуванні розгалужень на сучасних центральних процесорах (ЦП) і різко знизити продуктивність. Деякі компілятори можуть виявляти такі випадки та швидше випускати код, але семантика мови програмування може стримувати таку оптимізацію.
Прикладом компілятора, який не може знайти оптимізації для такого випадку, є Hotspot VM Java 2012 року.
Примітки
- . pubs.opengroup.org. Архів оригіналу за 29 вересня 2020. Процитовано 4 жовтня 2020.
- . Архів оригіналу за 29 вересня 2020. Процитовано 4 жовтня 2020.
{{}}
: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title () - . doc.rust-lang.org. Архів оригіналу за 25 вересня 2020. Процитовано 12 лютого 2019.
- . stackexchange.com. Архів оригіналу за 6 жовтня 2021. Процитовано 9 січня 2019.
- (PDF). Itu.dk. Архів оригіналу (PDF) за 19 серпня 2020. Процитовано 24 серпня 2013.
- Wasserman, Louis. java - What are the cases in which it is better to use unconditional AND (& instead of &&). Stack Overflow.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Cya stattya potrebuye dodatkovih posilan na dzherela dlya polipshennya yiyi perevirnosti Bud laska dopomozhit udoskonaliti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Zvernitsya na za poyasnennyami ta dopomozhit vipraviti nedoliki Material bez dzherel mozhe buti piddano sumnivu ta vilucheno Obchislennya za korotkoyu shemoyu minimalne obchislyuvannya abo obchislyuvannya Makkarti za Dzhonom Makkarti ce semantika deyakih bulevih operatoriv u deyakih movah programuvannya v yakih drugij argument vikonuyetsya abo obchislyuyetsya lishe v tomu vipadku yaksho znachennya pershogo argumentu nedostatno dlya viznachennya zagalnogo znachennya virazu Inakshe kazhuchi dlya funkciyi AND znachennya false pershogo argumentu dostatno shob otrimati zagalne znachennya false i dlya funkciyi OR znachennya true pershogo argumentu dostatno shob otrimati zagalne znachennya true U movah programuvannya z linivimi obchislyuvannyami Lisp Perl Haskell zvichajni bulevi operatori obchislyuyutsya za korotkoyu shemoyu V inshih Ada Java Delphi dostupni yak operatori minimalnogo obchislyuvannya tak i standartni bulevi operatori Dlya deyakih bulevih operacij takih yak viklyuchne abo XOR nemozhlivo zdijsniti minimalne obchislyuvannya oskilki dlya viznachennya rezultatu zavzhdi potribni obidva operandi ViznachennyaU bud yakij movi programuvannya sho realizuye minimalne obchislyuvannya viraz i x i and i y i ekvivalentnij umovnomu virazu if i x i then i y i else i x i a viraz i x i or i y i ekvivalentnij if i x i then i x i else i y i V oboh vipadkah x obchislyuyetsya lishe odin raz Navedene vishe uzagalnene viznachennya takozh stosuyetsya mov yaki mayut bilshe nizh dva znachennya istinnosti True i False de operatori korotkoyi shemi povertayut ostannye obchislene znachennya pidvirazu U tablici nizhche ce nazivayetsya ostannim znachennyam Dlya strogo viznachenoyi movi viraz sproshuyetsya if i x i then i y i else b false b i if i x i then b true b else i y i vidpovidno do logichnih viraziv AND i OR Perevaga Hocha AND maye bilshij prioritet nizh OR u bagatoh movah ce ne ye universalnoyu vlastivistyu ocinki korotkogo zamikannya Prikladom togo yak dva operatori mayut odnakovij prioritet i mayut livu asociaciyu odin z odnim ye sintaksis spisku komand obolonki POSIX Nastupnij priklad vstanovlyuye prioritet dlya AND pered OR vikoristovuyuchi continue function short circuit eval operators values let result True for each op val in operators values if op AND amp amp result False continue else if op OR amp amp result True return result else result val return result Formalizaciya Logika korotkoyi shemi z pobichnimi efektami abo bez nih bula formalizovana na osnovi logiki Goara Rezultatom ye te sho operatori sho ne diyut za principom minimalnogo obchislennya mozhut buti viznacheni z logiki korotkoyi shemi shob mati odnakovu poslidovnist obchislennya Pidtrimka zagalnih ta skriptovih mov programuvannyaBulevi operatori v riznih movah programuvannya Mova Operatori strogogo obchislyuvannya Operatori minimalnogo obchislyuvannya Vihidnij tip danih Ada and or and then or else Bulevij ALGOL 68 and amp or andf orf obidva viznacheni koristuvachem Bulevij APL nand nor etc AndIf OrIf Bulevij awk vidsutni amp amp Bulevij Bash vidsutni amp amp Bulevij C Objective C vidsutni amp amp int amp amp zalezhit vid operanda C vidsutni amp amp Bulevij amp amp zalezhit vid operanda C amp amp amp Bulevij amp amp zalezhit vid operanda D amp amp amp Bulevij amp amp zalezhit vid operanda Eiffel and or and then or else Bulevij Erlang and or andalso orelse Bulevij Fortran and or and or Bulevij Go Haskell OCaml vidsutni amp amp Bulevij Java MATLAB R Swift amp amp amp Bulevij JavaScript Julia amp amp amp Ostannye znachennya Kotlin and or amp amp Bulevij Lisp Lua Scheme vidsutni and or Ostannye znachennya Oberon vidsutni amp OR Bulevij OCaml vidsutni amp amp Bulevij Pascal and or and then or else Bulevij Perl Ruby amp amp amp and or Last value PHP amp amp amp and or Bulevij POSIX shell command list vidsutni amp amp Ostannye znachennya Python vidsutni and or Ostannye znachennya Rust amp amp amp Bulevij Smalltalk amp and or Bulevij Standard ML Nevidomo andalso orelse Bulevij Visual Basic NET And Or AndAlso OrElse Bulevij Visual Basic Visual Basic for Applications VBA And Or Select Case Chislovij ABAP ta APL ne mayut okremogo bulevogo tipu Pri perevantazhenni operatori amp amp ta ye strogimi ta mozhut povernuti bud yakij tip Ce stosuyetsya lishe viraziv static if ta static assert obchislenih pid chas vikonannya Virazi v statichnih inicializatorah abo manifestnih konstantah vikoristovuyut povne obchislennya Operatori Fortran ne mayut okremih operatoriv minimalnogo chi povnogo obchislyuvannya specifikaciya movi dozvolyaye kompilyatoru vibrati metod optimizaciyi ISO IEC 10206 1990 Extended Pascal dozvolyaye ale ne vimagaye minimalnogo obchislennya Delphi ta Free Pascal za zamovchuvannyam obchislyuyut za korotkoyu shemoyu Ce mozhe buti zmineno parametrami kompilyatora ale ne vikoristovuyetsya shiroko ISO IEC 10206 1990 Extended Pascal pidtrimuye and then ta or else Gnu pascal de Arhiv originalu za 5 chervnya 2021 Procitovano 24 serpnya 2013 Smalltalk vikoristovuye semantiku korotkoyi shemi do tih pir poki argumentom and ye blok napriklad false and Transcript show Wont see me Movi BASIC yaki pidtrimuvali operatori CASE robili ce za dopomogoyu sistemi umovnoyi ocinki a ne yak tablici perehodiv obmezhenih fiksovanimi mitkami Zagalne vikoristannyaUniknennya nebazhanih pobichnih efektiv drugogo argumentu Zvichajnij priklad vikoristannya movi na osnovi S int denom 0 if denom 0 amp amp num denom garantuyetsya sho obchislennya num denom nikoli ne prizvede do pomilki pov yazanoyi z dilennyam na nul Rozglyanemo nastupnij priklad int a 0 if a 0 amp amp myfunc b do something U comu prikladi minimalne obchislennya garantuye sho myfunc b nikoli ne viklikayetsya Ce tomu sho a 0 maye znachennya false Cya funkciya dozvolyaye dvi korisni konstrukciyi programuvannya Yaksho pershij pidviraz pereviryaye chi potribne stroge obchislennya i perevirka maye znachennya false mozhna usunuti stroge obchislennya u drugomu argumenti Ce dozvolyaye konstrukciyu de pershij viraz garantuye umovu bez yakoyi drugij viraz mozhe sprichiniti pomilku pid chas vikonannya Obidva voni proilyustrovani v navedenomu nizhche fragmenti C de minimalna ocinka zapobigaye yak rozimenovuvannyu nulovogo pokazhchika tak i nadmirnomu viboru pam yati bool is first char valid alpha unsafe const char p return isalpha p 0 Pomilka segmentaciyi cilkom mozhliva pri p NULL bool is first char valid alpha const char p return p NULL amp amp isalpha p 0 1 ne potribno vikonuvati isalpha pri p NULL 2 nemaye zhodnogo riziku viniknennya pomilki segmentaciyi Idiomatichna umovna konstrukciya Oskilki minimalna ocinka ye chastinoyu semantichnogo viznachennya operatora a ne neobov yazkovoyu optimizaciyeyu to isnuye bagato modelej koduvannya sho pochali vikoristovuvati yiyi yak idiomatichnu umovnu konstrukciyu Prikladi vklyuchayut Idiomi Perl some condition or die Perervati vikonannya yaksho znachennya some condition false some condition and die Perervati vikonannya yaksho znachennya some condition true Idiomi POSIX shell modprobe q some module amp amp echo some module installed echo some module not installed Cya idioma peredbachaye sho echo ne mozhe zaznati nevdachi Mozhlivi problemiNeperevirena druga umova prizvodit do nevikonannya pobichnogo efektu Nezvazhayuchi na ci perevagi minimalne obchislennya mozhe sprichiniti problemi dlya programistiv yaki ne usvidomlyuyut abo zabuvayut sho vidbuvayetsya Napriklad u kodiif expressionA amp amp myfunc b do something Yaksho myfunc b povinen vikonati yakus neobhidnu operaciyu nezalezhno vid togo chi do something vzagali vikonuyetsya napriklad rozpodil sistemnih resursiv a expressionA dorivnyuye false to myfunc b ne bude vikonuvatisya sho mozhe sprichiniti problemi Deyaki movi programuvannya taki yak Java mayut dva operatori odin yakij vikoristovuye minimalne obchislennya a drugij ni shob uniknuti ciyeyi problemi Problemi z nevikonanimi operatorami pobichnih efektiv mozhna legko virishiti za dopomogoyu nalezhnogo stilyu programuvannya tobto ne vikoristovuyuchi pobichni efekti v bulevih operatorah oskilki vikoristannya znachen z pobichnimi efektami v ocinkah yak pravilo robit kod neprozorim i shilnim do pomilok Znizhennya efektivnosti cherez obmezhuvalni optimizaciyi Obchislennya za korotkoyu shemoyu mozhe prizvesti do pomilok u prognozuvanni rozgaluzhen na suchasnih centralnih procesorah CP i rizko zniziti produktivnist Deyaki kompilyatori mozhut viyavlyati taki vipadki ta shvidshe vipuskati kod ale semantika movi programuvannya mozhe strimuvati taku optimizaciyu Prikladom kompilyatora yakij ne mozhe znajti optimizaciyi dlya takogo vipadku ye Hotspot VM Java 2012 roku Primitki pubs opengroup org Arhiv originalu za 29 veresnya 2020 Procitovano 4 zhovtnya 2020 Arhiv originalu za 29 veresnya 2020 Procitovano 4 zhovtnya 2020 a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite web title Shablon Cite web cite web a Obslugovuvannya CS1 Storinki z tekstom archived copy yak znachennya parametru title posilannya doc rust lang org Arhiv originalu za 25 veresnya 2020 Procitovano 12 lyutogo 2019 stackexchange com Arhiv originalu za 6 zhovtnya 2021 Procitovano 9 sichnya 2019 PDF Itu dk Arhiv originalu PDF za 19 serpnya 2020 Procitovano 24 serpnya 2013 Wasserman Louis java What are the cases in which it is better to use unconditional AND amp instead of amp amp Stack Overflow