Синтаксический сахар - Syntactic sugar

В информатике , синтаксический сахар является синтаксис в языке программирования , который предназначен , чтобы сделать вещи легче читать или выразить. Это делает язык «слаще» для человеческого употребления: вещи могут быть выражены более ясно, лаконично или в альтернативном стиле, который некоторые могут предпочесть.

Например, многие языки программирования предоставляют специальный синтаксис для обращения к элементам массива и их обновления . Абстрактно ссылка на массив - это процедура с двумя аргументами: массив и вектор индекса, который может быть выражен как 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 году Маттиас Фелляйзен предложил кодификацию «выразительной силы» для согласования с «широко распространенными верованиями» в литературе. Он определил «более выразительный» как означающий, что без рассматриваемых языковых конструкций программу пришлось бы полностью реорганизовать.

Известные примеры

  • В COBOL многие промежуточные ключевые слова представляют собой синтаксический сахар, который можно опустить. Например, предложение MOVE A B.и предложение MOVE A TO B.выполняют одну и ту же функцию, но второе делает действие, которое нужно выполнить, более четким.
  • Операторы расширенного присваивания или составного присваивания: например, a += bэквивалентны оператору a = a + bC и аналогичным языкам, предполагая, что aне имеет побочных эффектов, например, если aэто обычная переменная. Некоторые языки, такие как Python, могут допускать перегрузку операторов расширенного присваивания, поэтому они могут вести себя иначе, чем стандартные.
  • В Perl , unless (condition) {...} является синтаксически if (not condition) {...}. Кроме того, за любым оператором может следовать условие, поэтому statement if conditionоно эквивалентно if (condition) {statement}, но первое более естественно отформатировано в одной строке.
  • В языке Си , то a[i]обозначение синтаксический *(a + i). Точно так же a->xнотация является синтаксическим сахаром для доступа к членам с помощью оператора разыменования (*a).x .
  • usingЗаявление в C # гарантирует , что некоторые объекты расположены правильно. Компилятор разворачивает инструкцию в блок try-finally.
  • Язык C # позволяет объявлять переменные как var x = expr, что позволяет компилятору выводить тип xиз выражения expr, вместо того, чтобы требовать явного объявления типа. Точно так же C ++ позволяет, auto x = exprпоскольку C ++ 11 и Java позволяют, var x = exprначиная с Java 11.
  • Понимания списков Python (например, [x*x for x in range(10)]для списка квадратов) и декораторы (например, @staticmethod).
  • В Haskell строка, заключенная в кавычки, семантически эквивалентна списку символов.
  • В коллекции пакетов R tidyverse канал , обозначенный как , объявляет, что данные (или выходные данные функции), предшествующие каналу, будут служить первым аргументом для функции, следующей за конвейером. Итак, эквивалентно .%>%x %>% f(y)f(x,y)
  • В SQL , JOINэквивалентно INNER JOIN, последний осветляющий , что присоединиться заявление именно внутреннее объединение операции , в отличие от внешнего соединения операции.
  • Вызов метода на языках ООП в форме myObject.myMethod(parameter1, parameter2, parameter3)является синтаксическим сахаром для вызова глобальной функции как . Ссылка на объект передается как скрытый аргумент, обычно доступный из метода как .myMethod(myObject, parameter1, parameter2, parameter3)this
  • Параметры, вызываемые по ссылке, являются синтаксическим сахаром для технической передачи указателя на параметр, но синтаксически обрабатывают его как саму переменную, чтобы избежать постоянного разыменования указателя в коде внутри функции.
  • В Java , 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 ++.

Синтаксический сахарин

Другие расширения - это синтаксический сахарин и синтаксический сироп , что означает бесплатный синтаксис, который не упрощает программирование.

Засахаренные типы

Типы данных с базовой синтаксической поддержкой называются «засахаренными типами». Общие примеры включают строки, разделенные кавычками, фигурные скобки для типов объектов и записей и квадратные скобки для массивов.

Примечания

использованная литература