В информатике, синтаксический сахар является синтаксис в языке программирования, который предназначен, чтобы сделать вещи легче читать или выразить. Это делает язык «слаще» для человеческого употребления: вещи могут быть выражены более ясно, лаконично или в альтернативном стиле, который некоторые могут предпочесть.
Например, многие языки программирования предоставляют специальный синтаксис для обращения к элементам массива и их обновления. Абстрактно ссылка на массив - это процедура с двумя аргументами: массив и вектор индекса, который может быть выражен как get_array(Array, vector(i,j))
. Вместо этого многие языки предоставляют синтаксис, например Array[i,j]
. Точно так же обновление элемента массива - это процедура, состоящая, например set_array(Array, vector(i,j), value)
, из трех аргументов, но многие языки предоставляют синтаксис, такой как Array[i,j] = value
.
Конструкция в языке является синтаксическим сахаром, если ее можно удалить из языка без какого-либо влияния на его возможности: функциональность и выразительность останутся прежними.
Языковые процессоры, включая компиляторы и статические анализаторы, часто перед обработкой расширяют подслащенные конструкции в более фундаментальные конструкции, этот процесс иногда называют «десугарингом».
Термин синтаксический сахар был введен Питером Дж. Ландином в 1964 году для описания поверхностного синтаксиса простого АЛГОЛ- подобного языка программирования, который был определен семантически в терминах аппликативных выражений лямбда-исчисления, сосредоточенных на лексической замене λ на «где».
Более поздние языки программирования, такие как CLU, ML и Scheme, расширили этот термин для обозначения синтаксиса внутри языка, который можно было бы определить в терминах языкового ядра основных конструкций; удобные высокоуровневые функции могут быть «обессахарены» и разложены на это подмножество. Фактически, это обычная математическая практика построения из примитивов.
Основываясь на различии Ландина между существенными языковыми конструкциями и синтаксическим сахаром, в 1991 году Маттиас Фелляйзен предложил кодификацию «выразительной силы» для согласования с «широко распространенными верованиями» в литературе. Он определил «более выразительный» как означающий, что без рассматриваемых языковых конструкций программу пришлось бы полностью реорганизовать.
MOVE A B.
и предложение MOVE A TO B.
выполняют одну и ту же функцию, но второе делает действие, которое нужно выполнить, более четким.a += b
эквивалентны оператору a = a + b
C и аналогичным языкам, предполагая, что a
не имеет побочных эффектов, например, если a
это обычная переменная. Некоторые языки, такие как Python, могут допускать перегрузку операторов расширенного присваивания, поэтому они могут вести себя иначе, чем стандартные.unless (condition) {...}
является синтаксически if (not condition) {...}
. Кроме того, за любым оператором может следовать условие, поэтому statement if condition
оно эквивалентно if (condition) {statement}
, но первое более естественно отформатировано в одной строке.a[i]
обозначение синтаксический *(a + i)
. Точно так же a-gt;x
нотация является синтаксическим сахаром для доступа к членам с помощью оператора разыменования (*a).x
.using
Заявление в C # гарантирует, что некоторые объекты расположены правильно. Компилятор разворачивает инструкцию в блок try-finally.var x = expr
, что позволяет компилятору выводить тип x
из выражения expr
, вместо того, чтобы требовать явного объявления типа. Точно так же C ++ позволяет, auto x = expr
поскольку C ++ 11 и Java позволяют, var x = expr
начиная с Java 11.[x*x for x in range(10)]
для списка квадратов) и декораторы (например, @staticmethod
).%gt;%
x %gt;% f(y)
f(x,y)
JOIN
эквивалентно INNER JOIN
, последний осветляющий, что присоединиться заявление именно внутреннее объединение операции, в отличие от внешнего соединения операции.myObject.myMethod(parameter1, parameter2, parameter3)
является синтаксическим сахаром для вызова глобальной функции как. Ссылка на объект передается как скрытый аргумент, обычно доступный из метода как.myMethod(myObject, parameter1, parameter2, parameter3)
this
import
объявление позволяет компилятору найти классы, которые не указаны иным с полностью квалифицированными именами. Например, import javax.swing.*;
позволяет программисту ссылаться на объект Swing, javax.swing.JButton
используя более короткое имя JButton
.Некоторые программисты считают, что эти особенности использования синтаксиса либо не важны, либо совершенно несерьезны. Примечательно, что специальные синтаксические формы делают язык менее однородным, а его спецификацию более сложной и могут вызывать проблемы, поскольку программы становятся большими и сложными. Это представление особенно широко распространено в сообществе Лиспа, поскольку Лисп имеет очень простой и регулярный синтаксис, а поверхностный синтаксис можно легко изменить. Например, Алан Перлис однажды пошутил в « Эпиграммах по программированию », ссылаясь на языки, разделенные скобками, что «Синтаксический сахар вызывает рак точки с запятой ».
Метафора была расширена за счет введения термина « синтаксическая соль», который указывает на особенность, разработанную для того, чтобы усложнить написание плохого кода. В частности, синтаксическая соль - это обруч, через который программисты должны пройти, чтобы доказать, что они знают, что происходит, а не для выражения действия программы. Например, в Java и Pascal присвоение значения float переменной, объявленной как int, без дополнительного синтаксиса, явно указывающего, что это намерение приведет к ошибке компиляции, тогда как C и C ++ автоматически усекут любые числа с плавающей запятой, присвоенные int. Однако это не синтаксис, а семантика.
В C # при скрытии унаследованного члена класса выдается предупреждение компилятора, если только new
ключевое слово не используется для указания того, что скрытие является преднамеренным. Для того, чтобы избежать возможных ошибок вследствие схожести переключателя заявления синтаксиса с тем, что из C или C ++, C # требует break
для каждой непустой case
метки switch
(если goto
, return
или throw
используются), даже если он не допускает неявного падение сквозным. (Использование goto
и указав последующий ярлык производит C / C ++ - как осень-через.)
Синтаксическая соль может нарушить свое предназначение, сделав код нечитаемым и, таким образом, ухудшить его качество - в крайних случаях основная часть кода может быть короче, чем накладные расходы, вводимые для удовлетворения языковых требований.
Альтернативой синтаксической соли является генерация предупреждений компилятора, когда высока вероятность того, что код является результатом ошибки - практика, распространенная в современных компиляторах C / C ++.
Другие расширения - это синтаксический сахарин и синтаксический сироп, что означает бесплатный синтаксис, который не упрощает программирование.
Типы данных с базовой синтаксической поддержкой называются «засахаренными типами». Общие примеры включают строки, разделенные кавычками, фигурные скобки для типов объектов и записей и квадратные скобки для массивов.
|journal=
( помощь )