Я думаю, що термін синтаксичний цукор вказує на альтернативний синтаксис для вираження тієї ж основної семантики.
Візьмемо для прикладу мову програмування A, яка має операцію, sum
яка може скласти список цілих чисел довільної довжини. Цією мовою ми можемо записати вирази
sum []
sum [3, 4, 5, 1]
sum [2, 7]
результати яких 0, 13 та 9 відповідно.
Тепер припустимо, що ми усвідомлюємо, що 90% разів використовуємо sum
два аргументи, і тому для зручності вводимо нове позначення
2 + 7
який є просто синтаксичним цукром для sum [2, 7]
.
Тепер візьміть другу мову B, яка не має жодної операції додавання. У нас можуть бути оператори на кшталт <
, =
що дозволяють нам порівнювати числа, але ніякого способу додати числа. У випуску 2 мови B ми вводимо нову операцію додавання з синтаксисом
2 + 7
який додає числа, як зазвичай.
У контексті мови A +
позначення є синтаксичним цукром (це альтернативна, спрощена та спеціальна позначення, яку можна використовувати замість sum [...]
позначення). Аналогічно, як було зазначено у відповіді Хоа Лонг Там, у С позначення p->field
є синтаксичним цукром для (*p).field
.
У контексті мови B +
позначення не є синтаксичним цукром (це єдиний дійсний синтаксис, що використовується для операції суми). Так само, якби C міг отримати доступ до членів структури лише через покажчики, а якби вони не мали позначення (*p).field
, то позначення p->field
не було б синтаксичним цукром.
На мою думку, є деякі непорозуміння щодо синтаксичного цукру, які можна простежити до плутанини щодо семантики мови програмування. Міркування виходять так:
- Семантика програми - це те, що програма обчислює.
- Експресивна сила мови програмування представлена обчисленнями, які можна описати цією мовою.
- Дві мови програмування, які можуть описати всі обчислювані функції (як визначено за допомогою машин Тьюрінга), мають однакову виразну силу ...
- ... і тому відрізняються лише синтаксисом.
- Висновок: будь-яке розширення мови, повного Тюрінга, є лише синтаксисом (синтаксичним цукром), оскільки ви не змінюєте виражальну силу мови.
Вищенаведений рядок міркувань призводить до загальних тверджень, таких як "синтаксичний цукор не можна визначити належним чином", це "питання смаку", або "кожна особливість мови програмування - це, зрештою, лише синтаксичний цукор".
Я думаю, що головна проблема в наведеному вище аргументі полягає в тому, що семантика полягає не тільки в тому, що можна обчислити програмою, але і в тому, як вона обчислюється , тобто які примітивні конструкції використовуються і як вони поєднуються.
Так, наприклад, об'єкти не є синтаксичним цукром для базових бітових конфігурацій та бітових перетворень, вони є конструкцією, яка дозволяє моделювати дані та операції та описувати обчислення. Обчислення з об'єктами, методами, викликами методів - це не те саме, що обчислення з байтами, регістрами процесора, адресами пам'яті (навіть якщо два обчислення мають однаковий результат, і навіть якщо друге обчислення використовується для реалізації першого).
Я зробив цей опис трохи довгим, але вважаю, що це важливий аспект, якого я не бачив, в якому відповіли в інших відповідях.
Підсумок: синтаксичний цукор - це альтернативний (можливо, зручніший) синтаксис для конструкції, яка вже є мовою і має чітко визначені синтаксис та семантику. Новий синтаксис (синтаксичний цукор) відрізняється від існуючого, але має ту саму семантику . Якщо ви введете нову конструкцію в мові та новий синтаксис для неї, то у вас немає синтаксичного цукру.