Синтаксический сахар
В информатике , синтаксический сахар — это синтаксис языка программирования предназначенный для облегчения чтения или выражения вещей. Это делает язык «более приятным» для человеческого использования: вещи можно выражать более четко, более кратко или в альтернативном стиле, который некоторые могут предпочесть. Синтаксический сахар обычно является сокращением для общей операции, которую также можно выразить в альтернативной, более подробной форме: у программиста есть выбор, использовать ли более короткую или более длинную форму, но обычно он будет использовать более короткую форму, поскольку она короче, его легче печатать и читать.
Например, многие языки программирования предоставляют специальный синтаксис для обращения к элементам массива и их обновления . Абстрактно ссылка на массив — это процедура с двумя аргументами: массивом и вектором индекса, которую можно выразить как get_array(Array, vector(i,j))
. Вместо этого многие языки предоставляют синтаксис, такой как Array[i,j]
. Аналогично, обновление элемента массива — это процедура, состоящая из трех аргументов, например set_array(Array, vector(i,j), value)
, но многие языки также предоставляют синтаксис, например Array[i,j] = value
.
Конструкция в языке является синтаксическим сахаром, если ее можно удалить из языка без какого-либо влияния на возможности языка: функциональность и выразительная сила останутся прежними.
Языковые процессоры, включая компиляторы и статические анализаторы , перед обработкой часто расширяют засахаренные конструкции до их более многословных эквивалентов — процесс, который иногда называют «обессериванием».
Происхождение [ править ]
Термин «синтаксический сахар» был придуман Питером Дж. Ландином в 1964 году для описания поверхностного синтаксиса простого АЛГОЛ -подобного языка программирования, который был семантически определен в терминах аппликативных выражений лямбда-исчисления . [1] [2] сосредоточен на лексической замене λ на «где».
Более поздние языки программирования, такие как CLU , ML и Scheme , расширили этот термин для обозначения синтаксиса внутри языка, который можно было определить с точки зрения языкового ядра основных конструкций; удобные функции более высокого уровня можно «очистить» и разложить на это подмножество. [3] По сути, это обычная математическая практика построения из примитивов.
Основываясь на различении Лэндина между основными языковыми конструкциями и синтаксическим сахаром, в 1991 году Матиас Феллизен предложил кодификацию «выразительной силы», чтобы она соответствовала «широко распространенным убеждениям» в литературе. Он определил слово «более выразительный» как означающее, что без рассматриваемых языковых конструкций программу придется полностью реорганизовать. [4]
Известные примеры [ править ]
- В COBOL многие промежуточные ключевые слова представляют собой синтаксический сахар, который при желании можно опустить. Например, предложение
MOVE A B.
и предложениеMOVE A TO B.
выполняют точно такую же функцию, но второй делает выполняемое действие более понятным. - Расширенные операторы присваивания или составные операторы присваивания: например,
a += b
эквивалентноa = a + b
в C и подобных языках, предполагаяa
не имеет побочных эффектов, например, еслиa
является обычной переменной. [5] [6] Некоторые языки, например Python [7] может допускать перегрузку расширенных операторов присваивания, поэтому они могут вести себя иначе, чем стандартные. - В Перле ,
unless (condition) {...}
это синтаксический сахар дляif (not condition) {...}
. Кроме того, за любым оператором может следовать условие, поэтомуstatement if condition
эквивалентноif (condition) {statement}
, но первый вариант более естественно форматируется в одну строку. - В языке Си ,
a[i]
нотация — это синтаксический сахар для*(a + i)
. [8] Аналогично,a->x
нотация — это синтаксический сахар для доступа к членам с помощью оператора разыменования.(*a).x
. - The
using
Оператор в C# гарантирует правильное удаление определенных объектов. Компилятор расширяет оператор до блока try-finally . [9] - Язык 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 строка, заключенная в кавычки, семантически эквивалентна списку символов. Необязательное расширение языка OverloadedStrings позволяет строковым литералам создавать и другие типы значений, например текстовые.
- В tidyverse коллекции R пакетов канал , обозначаемый
%>%
, объявляет, что данные (или выходные данные функции), предшествующие каналу, будут служить первым аргументом для функции, следующей за каналом. [10] Так,x %>% f(y)
эквивалентноf(x,y)
. - В SQL это просто
JOIN
эквивалентноINNER JOIN
, причем последнее поясняет, что оператор соединения является, в частности, операцией внутреннего соединения, а не операцией внешнего соединения. Аналогичным образом можно опуститьOUTER
изLEFT OUTER JOIN
,RIGHT OUTER JOIN
иFULL OUTER JOIN
. - Вызов метода в языках ООП в виде
myObject.myMethod(parameter1, parameter2, parameter3)
это синтаксический сахар для вызова глобальной функции какmyMethod(myObject, parameter1, parameter2, parameter3)
. Ссылка на объект передается как скрытый аргумент, обычно доступный из метода какthis
. - Параметр, вызываемый по ссылке, является синтаксическим сахаром для технической передачи указателя в качестве параметра, но синтаксически обрабатывает его как саму переменную, чтобы избежать постоянного разыменования указателя в коде внутри функции.
- На Java
import
Объявление позволяет компилятору находить классы, которые не указаны иным образом, с полными именами. Напримерimport javax.swing.*;
позволяет программисту ссылаться на объект Swing , напримерjavax.swing.JButton
используя более короткое имяJButton
. - В ES6 для версии JavaScript стрелочные функции имеют короткую форму.
(x) => x + 1
, что эквивалентно более длинной форме(x) => { return x + 1; }
. - В Scala тройные знаки вопроса (
???
) эквивалентноthrow new NotImplementedError
. Это полезно, чтобы отметить место для еще не написанного кода. [11]
Критика [ править ]
Некоторые программисты считают, что эти функции удобства использования синтаксиса либо неважны, либо совершенно несерьезны. Примечательно, что специальные синтаксические формы делают язык менее единообразным, а его спецификацию более сложной и могут вызывать проблемы по мере того, как программы становятся большими и сложными. Эта точка зрения особенно широко распространена в сообществе Lisp , поскольку Lisp имеет очень простой и регулярный синтаксис, а поверхностный синтаксис можно легко изменить. [12] Например, Алан Перлис однажды пошутил в « Эпиграммах по программированию », ссылаясь на языки, разделенные скобками , что «Синтаксический сахар вызывает рак точек с запятой ». [13]
Производные термины [ править ]
Синтаксическая соль [ править ]
Метафора была расширена за счет введения термина «синтаксическая соль» , который указывает на функцию, предназначенную для того, чтобы усложнить написание плохого кода. [14] В частности, синтаксическая соль — это обруч, через который программисты должны перепрыгнуть, чтобы доказать, что они знают, что происходит, а не для того, чтобы выразить действие программы.
В C# при сокрытии унаследованного члена класса выдается предупреждение компилятора, если только new
Ключевое слово используется для указания того, что сокрытие является намеренным. [15] Чтобы избежать потенциальных ошибок из-за сходства синтаксиса оператора переключения с синтаксисом C или C++, C# требует break
за каждый непустой case
этикетка switch
(пока не goto
, return
, или throw
используется), даже несмотря на то, что он не допускает неявного провала . [16] (С использованием goto
и указание последующей метки приводит к провалу , подобному C/C++ .)
Синтаксическая соль может противоречить своей цели, делая код нечитаемым и, таким образом, ухудшая его качество — в крайних случаях существенная часть кода может быть короче, чем накладные расходы, вносимые для удовлетворения языковых требований.
Альтернативой синтаксической соли является генерация предупреждений компилятора, когда существует высокая вероятность того, что код является результатом ошибки – практика, распространенная в современных компиляторах C/C++.
Синтаксический сахарин [ править ]
Другими расширениями являются синтаксический сахарин и синтаксический сироп , что означает необоснованный синтаксис, который не упрощает программирование. [17] [18] [19] [20]
Типы сахаристых [ править ]
Типы данных с базовой синтаксической поддержкой называются «сахарными типами». [21] [22] [23] Общие примеры включают строки, разделенные кавычками, фигурные скобки для типов объектов и записей, а также квадратные скобки для массивов.
Примечания [ править ]
- ^ Ландин, Питер Дж. (1964). «Механическая оценка выражений» (PDF) . Компьютерный журнал . 6 (4). Компьютерный журнал : 308–320. дои : 10.1093/comjnl/6.4.308 . Проверено 21 июля 2014 г.
- ^ Abelson & Sussman 1996 , Глава 1, сноска 11 .
- ^ Барбара Лисков, «История CLU», Технический отчет Лаборатории компьютерных наук Массачусетского технологического института 561 (1993)
- ^ Феллейзен, Матиас (декабрь 1991 г.). «О выразительной силе языков программирования» . Наука компьютерного программирования . 17 (1–3). Спрингер-Верлаг: 35–75. дои : 10.1016/0167-6423(91)90036-W . Проверено 19 июля 2014 г.
- ^ «Задание соединения С» . msdn.microsoft.com . Майкрософт . Проверено 20 июня 2016 г.
Однако выражение составного присваивания не эквивалентно расширенной версии, поскольку выражение составного присваивания оценивает выражение1 только один раз, а расширенная версия оценивает выражение1 дважды: в операции сложения и в операции присваивания.
- ^ Гаравалья, Эмилио (26 июля 2015 г.). «Почему такие сочетания клавиш, как x += y, считаются хорошей практикой?» . stackexchange.com . Проверено 20 июня 2016 г.
оптимизацию можно [выполнить], если «поиск x» не имеет побочных эффектов
- ^ «Модель данных Python» . docs.python.org . 21 декабря 2020 г.
- ^ Раймонд, Эрик С. (11 октября 1996 г.). Новый словарь хакера – 3-е издание . МТИ Пресс. п. 432. ИСБН 978-0-262-68092-9 . Проверено 5 августа 2012 г.
- ^ «Использование оператора (Справочник по C#)» . Проверено 16 сентября 2014 г.
- ^ "Магриттр: Виньетка" . Проверено 24 декабря 2018 г.
- ^ «Переполнение стека: что означает тройной вопросительный знак в Scala?» . Проверено 23 января 2024 г.
- ^ Abelson & Sussman 1996 , Глава 1, сноска 11 .
- ^ Перлис 1982 , Эпиграмма №3.
- ^ «Жаргонный файл — синтаксическая соль» . 12 июня 2003 г. Архивировано из оригинала 12 июня 2003 г. Проверено 19 марта 2018 г.
- ^ «новый модификатор (ссылка на C#)» . microsoft.com . Майкрософт . Проверено 3 августа 2015 г.
- ^ "переключатель (Справочник по C#)" . microsoft.com . Майкрософт . Проверено 3 августа 2015 г.
- ^ «синтаксический сахар» . catb.org . Проверено 3 августа 2015 г.
- ^ Бойтен, Эрке А.; Мёллер, Бернхард (26 июня 2002 г.). Математика построения программ . Спрингер. ISBN 9783540438571 . Проверено 3 августа 2015 г.
- ^ Дин, Томас (2004). Разговор с компьютерами: исследования в области науки и компьютерных технологий . Издательство Кембриджского университета. п. 115 . ISBN 9780521542043 .
- ^ Харрисон, Уильям; Шеард, Тим (8–10 июля 2002 г.). «Математика построения программ» (PDF) . Математика построения программ: 6-я Международная конференция, MPC 2002, Замок Дагштуль, Германия, 8–10 июля 2002 г. Труды . Международная конференция по математике построения программ. Конспекты лекций по информатике. Том. 2386. Замок Дагштуль, Германия: Springer Berlin Heidelberg. п. 93. дои : 10.1007/3-540-45442-X_6 . ISBN 978-3-540-43857-1 . S2CID 10059915 . Архивировано из оригинала (PDF) 31 марта 2017 г.
- ^ Чу, Рави (2013). Вложенные типы уточнений для JavaScript (доктор философии). Калифорнийский университет в Сан-Диего.
- ^ «Документация LLVM по языку C» . clang.llvm.org . Проверено 30 июня 2020 г.
- ^ «Тайная жизнь типов в Swift» . medium.com/@slavapestov . 14 июля 2016 года . Проверено 30 июня 2020 г.
Ссылки [ править ]
- Абельсон, Гарольд ; Сассман, Джеральд Джей ; Сассман, Джули (1996) [1984]. Структура и интерпретация компьютерных программ . Кембридж, Массачусетс: MIT Press . ISBN 0-262-51087-1 .
- Ландин, Питер Дж. (февраль – март 1965 г.). «Соответствие между АЛГОЛом 60 и лямбда-нотацией Чёрча: части I и II» . Коммуникации АКМ . 8 (2,3): 89–101, 158–165. дои : 10.1145/363744.363749 . S2CID 6505810 .
- Ландин, Питер Дж. (март 1965 г.). «Программирование без императивов - пример». Исследование системного программирования UNIVAC .
- Ландин, Питер Дж. (июль 1965 г.). «Избавление от ярлыков». Исследование системного программирования UNIVAC .
- Ландин, Питер Дж. (август 1965 г.). «Обобщение переходов и меток». Исследование системного программирования UNIVAC . , перепечатано в « Высший порядок и символические вычисления ». 11 . 1998: 125–143. CiteSeerX 10.1.1.85.2610 .
{{cite journal}}
: Для цитирования журнала требуется|journal=
( помощь ) - Перлис, AJ (сентябрь 1982 г.). «Эпиграммы по программированию» . Уведомления ACM SIGPLAN . 17 (9). Нью-Йорк, штат Нью-Йорк, США: Ассоциация вычислительной техники: 7–13. дои : 10.1145/947955.1083808 . S2CID 20512767 . Архивировано из оригинала 17 января 1999 года.