Синтаксичний цукор
Синтаксичний цукор (англ. 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 — рак прямої кишки).