Синтаксичний цукор: визначення, походження і приклади
Синтаксичний цукор: що це таке?
Багато мови програмування надають спеціальний відділ граматики для оновлення елементів. Абстрактно, посилання на даний об'єкт — це процедура двох аргументів: масиву і нижнього індексу, який може бути виражений як get_array(Array, vector(i, j))
. Замість цього, багато мови надають синтаксис, такий як Array[i, j]
. Точно так само оновлення елемента масиву, наприклад, set_array(Array, vector(i, j), value)
представляє собою процедуру з трьох аргументів, але багато професіонали надають такий код, як Array[i, j]= value
. Конструкція в мові називається «синтаксичним цукром», якщо вона може бути вилучена з програми без будь-якого впливу на функціональність і виразність.
Різні процесори, у тому числі компілятори і статичні аналізатори, часто розширюють підсолоджені конструкції до більш фундаментальних пристроїв перед обробкою. Такий процес називається «десагеринг».
<script> (adsbygoogle = window.adsbygoogle ||[]).push({});
Походження
Термін «синтаксичний цукор» був введений Пітером Дж. Ландином в 1964 році для опису поверхневого відділу граматики простого ALGOL, мови програмування, який був визначений семантично у термінах аплікативного виразів лямбда-числення, зосереджених на лексичної заміни ? з «де».
Більш пізні мови програмування, такі як CLU, ML і Scheme, розширили термін для позначення похідної в мові, яка може бути визначена як синтаксичний цукор c точки зору ядра основних конструкцій. Зручні функції більш високого рівня можуть бути «дезагрегированы» і розкладені на підмножину. Це, насправді, звичайна математична практика побудови з примітивів.
Спираючись на відмінність Ландін між основними мовними конструкціями і властивостями синтаксичного цукру, в 1991 році Матіас Феллайзен запропонував кодифікацію «виразної сили», щоб відповідати широко поширеним переконанням в літературі. Він визначив це як «більш багатозначний», щоб позначити, що без розглянутих мовних конструкцій програма повинна бути повністю реорганізована.
Відомі приклади синтаксичного цукру
У мові COBOL багато з проміжних ключових слів є «солодкими», тобто при бажанні можуть бути опущені. Наприклад, пропозиція MOVE A B. TO MOVE A B. точно виконують одну і ту ж функцію, а друге робить дію, яке повинно бути виконано, більш чітким.
<script> (adsbygoogle = window.adsbygoogle ||[]).push({});
Розширені оператори складеного присвоювання: наприклад, a += b еквівалентно a = a + b в C і аналогічних мовами, припускають, що a не має побічних ефектів, наприклад, a є регулярною змінної if.
У Perl, unless (condition) {}
є синтаксично if (not condition) {}
. Крім того, за будь-яким оператором може дотримуватися умова, що statement if condition
еквівалентно if (condition) {statement}
, але перший більш природно відформатований в одному рядку.
У мові Сі вказівники на початок елемента пам'яті можуть записуватися без застосування спеціальних синтаксисів: *(a + i)
. Хоча в цій мові існує і спеціальний синтаксис для цього процесу: a[i]. Аналогічно, a->x
запис є синтаксичним цукром для доступу до членів за допомогою оператора розіменування (*a). x
.
Using
Заява в C # гарантує, що деякі об'єкти утилізовані правильно. Компілятор розширює оператор в блок try-finally.
Мова C # дозволяє оголошувати змінні як var x = expr
, що дозволяє компілятору виводити тип x
з виразу expr
замість того , щоб вимагати явного оголошення.
[x*x for x in range (10)]
для списку квадратів) і декоратори ( @staticmethod
). В Haskell рядок, позначений лапками, семантично еквівалентна кількості символів. У пакеті rvest зустрічається позначення %>%, і говорить про те, що дані (або вихід функції), що передують йому, будуть служити в якості першого аргументу наступного інструменту. Це забезпечує більш лінійний потік і дизайн маніпулювання даними. Tidyverse написано для розміщення значень. Критика
Деякі програмісти вважають, що ці можливості використання синтаксису або не важливі, або просто несерйозні. Примітно, що спеціальні лінгвістичні форми роблять мову менш одноманітним, а його специфікацію — більш складною, і можуть викликати проблеми по мірі того, як програми стають великими. Це уявлення особливо широко поширене в співтоваристві Lisp, так як воно має дуже простий, регулярний і поверхневий синтаксис, який може бути легко змінений.Похідні терміни
Синтаксична сіль. Метафора була розширена за рахунок введення цього терміна, що позначає функцію, розроблену, щоб утруднити написання поганого коду. Зокрема, синтаксична сіль — це обруч, через який програмісти повинні перестрибнути, щоб довести, що вони знають, що відбувається, а не виражати дію програми. Наприклад, в Java і Pascal присвоєння значення з плаваючою точкою змінної, оголошеної як int, без додаткового синтаксису, явно заявляє, що намір призведе до помилки компіляції, в той час як C і C ++ автоматично усекают всі числа з плаваючою точкою, призначені int. Однак це не синтаксис, а семантика.В C # при приховуванні успадкованого члена класу видається попередження компілятора, якщо ключове слово не використовується для вказівки того, що приховання є навмисним. Це потрібно для того, щоб уникнути можливих помилок внаслідок схожості перемикача заяви синтаксису з тим, що з C або C ++, C # вимагає break для кожної заповненої case мітки switch, навіть якщо він не допускає неявне падіння. Синтаксична сіль може порушити своє призначення, зробивши код нечитабельним і, таким чином, погіршивши його якість. У крайніх випадках основна частина може бути коротше, ніж накладні витрати, запроваджені для задоволення вимог мови. Альтернативою даного поняття є генерація попереджень компілятора, коли існує висока ймовірність того, що код представляється результатом помилки практика, поширена у сучасних компіляторах C /C ++.