Синтаксичний цукор (англ. syntactic sugar) — узагальнена назва, яка позначає доповнення синтаксису мови програмування, які не додають нових можливостей, а роблять використання мови програмування зручнішим для людини. Зазвичай це додаткові легкозасвоювані синтаксичні конструкції, часто схожі на інші мови програмування, до яких могла звикнути людина. Інколи синтаксичним цукром називають додаткові бібліотеки, у яких реалізовані готовий функціонал, застосування якого потребує написання малої кількості коду та під'єднання відповідних бібліотек. Синтаксичний цукор дає програмісту альтернативний спосіб запису іншої, вже наявної в мові синтаксичної конструкції і при цьому є більш зручним, більш коротким, схожим на інший поширений спосіб запису, або допомагає писати програми в хорошому стилі. З формальної точки зору, синтаксичний цукор нічого не змінює і виразності мові не додає, однак може помітно полегшити програмісту опис деяких операцій. Одночасно, синтаксичний цукор, особливо при його надмірному застосуванні, може погіршувати читання коду і ускладнювати його підтримку. Конструкції, які є синтаксичним цукром, можуть легко транслюватися в конструкції основного синтаксису.

Слід зазначити, що поняття синтаксичного цукру багато в чому є умовним. Його використання припускає, що з багатьох синтаксичних конструкцій можна виділити деякий «базовий набір», що забезпечує всю функціональність мови. Тоді додаткові синтаксичні засоби, які при бажанні можна виразити за допомогою базового набору, і будуть для цієї мови синтаксичним цукром. Однак багато конструкцій є взаємозамінними і далеко не завжди можна точно сказати, які саме з них є базовими, а які — додатковими. Наприклад, у мові Модула-2 є чотири види циклів: цикл з передумовою, цикл з післяумовою, цикл з кроком і безумовний цикл. Теоретично, перші три види циклів можуть бути легко виражені через останній. Чи є вони, в такому випадку, синтаксичним цукром? Зазвичай так не кажуть, хоча формально під вищенаведене визначення вони потрапляють.

Приклади ред.

Масиви в Сі

Масиви в Сі являють собою блоки в пам'яті. Доступ до елементів масиву здійснюється через вказівник на початок блоку пам'яті (тобто, на початок масиву) і зсув елемента щодо початкової адреси. Це може бути записано без використання спеціального синтаксису для масивів (a — вказівник на початок масиву, i — індекс необхідного елемента): *(a+i), але безпосередні операції з адресами в пам'яті і зсувами є великим джерелом помилок програмістів, тому мова надає спеціальний синтаксис: a[i]. Крім того, є можливість звернутися до i-го елементу масиву вже зовсім екзотичним способом: i[a], що аналогічно a[i], оскільки значення вказівника i+a, очевидно, є таке саме, як і a+i.

Тернарна операція в Сі ред.

Інший відомий приклад спеціалізованої мовної конструкції — тернарна умовна операція мови Сі ?:. Наступні два фрагменти коду роблять одне і теж:

int fn();
int a = 1;
int b;
if (a > 0)
    b = fn(1);
else
    b = fn(2);


int fn();
int a = 1;
int b = fn((a > 0)? 1 : 2);

Причина введення такої операції — бажання вставляти перевірку простих умов прямо у вирази і можливість прямо вказати компілятору, що результатом перевірки умови буде єдине значення. Конструкція дійсно скорочує запис, але от з приводу її зручності думки можуть бути різними. Багато хто вважає, що скорочення запису в даному випадку не виправдовує погіршення читання коду.

Перевизначення операторів ред.

До синтаксичного цукру можна віднести і перевизначення операторів, яке підтримується багатьма мовами програмування. Загалом будь-яка операція може бути оформлена як процедура (функція, метод). Перевизначення операторів дозволяє виконувати операції, створені програмістом зовні так само, як і вбудовані в мову.

Властивості ред.

Ще одним прикладом синтаксичного цукру є концепція «властивостей», яка підтримується багатьма сучасними мовами програмування. Мається на увазі визначення в класі псевдополів, які зовні ведуть себе як поля класу (мають ім'я, тип, допускають присвоювання та читання), але насправді такими не є. Кожне звернення до властивості перетвориться компілятором у виклик методу доступу. Властивості абсолютно не є необхідними (методи доступу можна викликати і безпосередньо) і використовуються виключно для зручності, оскільки код з використанням властивостей виглядає дещо простіше і зрозуміліше.

Критика ред.

Не всі програмісти вважають наявність синтаксичного цукру в мовах програмування і використання його програмістами благом. Відома точка зору Ніклауса Вірта, яку поділяє частина спільноти програмістів: згідно з нею, будь-яке розширення мови, не викликане необхідністю, погіршує її, так як призводить до ускладнення транслятора і відповідно до зниження його надійності і продуктивності. Одночасно зростає складність вивчення мови і складність супроводу програм. Крім того, сам факт наявності додаткових синтаксичних засобів часто грає провокуючу роль: він спонукає програміста вдаватися до різних синтаксичних трюків замість того, щоб глибше аналізувати завдання і реалізовувати більш ефективні алгоритми. Ці погляди відображені в мовах сімейства Оберон, дуже простих і практично позбавлених синтаксичного цукру.

Відомий афоризм Алана Перліса: «Синтаксичний цукор викликає рак крапок з комою». Крапка з комою («;»), будучи обов'язковою частиною більшості популярних мов програмування, навіть якщо в новій мові вона не потрібна, залишається як необов'язковий елемент, так як більшість програмістів мають звичку її використовувати. В оригіналі афоризм обігрує співзвуччя англійських слів semicolon (крапка з комою) і colon, останнє з яких означає не тільки двокрапка, але і пряму кишку (colon cancer — рак прямої кишки).

Див. також ред.

Посилання ред.