Синтаксичний цукор

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

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

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

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