Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

Например, многие языки программирования предоставляют специальный синтаксис для обращения к элементам массива и их обновления . Абстрактно ссылка на массив - это процедура с двумя аргументами: массив и индексный вектор, который может быть выражен как get_array(Array, vector(i,j)). Вместо этого многие языки предоставляют синтаксис, например Array[i,j]. Точно так же обновление элемента массива - это процедура, состоящая, например set_array(Array, vector(i,j), value), из трех аргументов , но многие языки предоставляют синтаксис, такой как Array[i,j] = value.

Конструкция в языке является синтаксическим сахаром, если ее можно удалить из языка без какого-либо влияния на то, что он может делать: функциональность и выразительность останутся прежними.

Языковые процессоры, включая компиляторы и статические анализаторы , часто перед обработкой расширяют подслащенные конструкции в более фундаментальные конструкции, этот процесс иногда называют «десугарингом».

Истоки [ править ]

Термин синтаксический сахар был придуман Питер Дж Landin в 1964 году , чтобы описать поверхность синтаксиса простого АЛГОЛа -как языка программирования , который был определен семантически с точки зрения аппликативных выражений лямбда - исчислении , [1] [2] сосредоточены на лексически замена λ с «где».

Более поздние языки программирования, такие как CLU , ML и Scheme , расширили этот термин для обозначения синтаксиса внутри языка, который можно было бы определить в терминах языкового ядра основных конструкций; удобные высокоуровневые функции могут быть «обессахарены» и разложены на это поднабор. [3] Фактически, это обычная математическая практика построения из примитивов.

Основываясь на различии Ландина между основными языковыми конструкциями и синтаксическим сахаром, в 1991 году Маттиас Фелляйзен предложил кодификацию «выразительной силы», чтобы согласовать ее с «широко распространенными верованиями» в литературе. Он определил «более выразительный» как означающий, что без рассматриваемых языковых конструкций программу пришлось бы полностью реорганизовать. [4]

Известные примеры [ править ]

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

Критика [ править ]

Некоторые программисты считают, что эти особенности использования синтаксиса либо не важны, либо совершенно несерьезны. Примечательно, что особые синтаксические формы делают язык менее однородным, а его спецификацию более сложной и могут вызывать проблемы по мере того, как программы становятся большими и сложными. Это представление особенно широко распространено в сообществе Лиспа , поскольку Лисп имеет очень простой и регулярный синтаксис, а поверхностный синтаксис можно легко изменить. [11] Например, Алан Перлис однажды пошутил в « Эпиграммах по программированию », имея в виду языки , разделенные скобками , что «Синтаксический сахар вызывает рак точки с запятой ». [12]

Производные условия [ править ]

Синтаксическая соль [ править ]

Метафора была расширена за счет введения термина « синтаксическая соль» , который указывает на функцию, разработанную, чтобы затруднить написание плохого кода. [13] В частности, синтаксическая соль - это обруч, через который программисты должны прыгнуть, чтобы доказать, что они знают, что происходит, а не для того, чтобы выразить действие программы. Например, в Java и Pascal присвоение значения float переменной, объявленной как int, без дополнительного синтаксиса, явно указывающего, что это намерение приведет к ошибке компиляции, тогда как C и C ++ автоматически усекут любые числа с плавающей запятой, присвоенные int. Однако это не синтаксис, а семантика.

В C # при скрытии унаследованного члена класса выдается предупреждение компилятора, если только newключевое слово не используется для указания того, что скрытие является преднамеренным. [14] Для того, чтобы избежать возможных ошибок вследствие схожести переключателя заявления синтаксиса с тем, что из C или C ++, C # требует breakдля каждой непустой caseметки switch(если goto, returnили throwиспользуются) , даже если он не допускает неявное падения - сквозной . [15] ( с использованием gotoи указав последующий ярлык производит C / C ++ - как падение-через .)

Синтаксическая соль может нарушить свое предназначение, сделав код нечитаемым и, таким образом, ухудшить его качество - в крайних случаях основная часть кода может быть короче, чем накладные расходы, вводимые для удовлетворения языковых требований.

Альтернативой синтаксической соли является генерация предупреждений компилятора, когда высока вероятность того, что код является результатом ошибки - практика, распространенная в современных компиляторах C / C ++.

Синтаксический сахарин [ править ]

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

Типы с сахаром [ править ]

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

Заметки [ править ]

  1. ^ Ландин, Питер Дж. (1964). «Механическое вычисление выражений» (PDF) . Компьютерный журнал . Компьютерный журнал . 6 (4): 308–320. DOI : 10.1093 / comjnl / 6.4.308 . Проверено 21 июля 2014 года .
  2. ^ Абельсон & Сассмен 1996 , глава 1, сноска 11 .
  3. Барбара Лисков, «История CLU», Технический отчет 561 лаборатории компьютерных наук Массачусетского технологического института (1993)
  4. ^ Felleisen, Матиас (декабрь 1991). «О выразительной силе языков программирования» . Наука компьютерного программирования . Springer-Verlag. 17 (1–3): 35–75. DOI : 10.1016 / 0167-6423 (91) 90036-W . Проверено 19 июля 2014 года .
  5. ^ «Назначение соединения C» . msdn.microsoft.com . Microsoft . Проверено 20 июня +2016 . Однако выражение составного присваивания не эквивалентно расширенной версии, поскольку выражение составного присваивания вычисляет выражение1 только один раз, а расширенная версия вычисляет выражение1 дважды: в операции сложения и в операции присваивания.
  6. ^ Гаравалья, Эмилио (26 июля 2015). «Почему такие сокращения, как x + = y, считаются хорошей практикой?» . stackexchange.com . Проверено 20 июня +2016 . оптимизация может [быть сделана], если «поиск x» не имеет побочных эффектов
  7. ^ {cite web | url = https://docs.python.org/3/reference/datamodel.html#object.__iadd__ | title = Модель данных Python | date = 21 декабря 2020 г. | webiste = docs.python.org}
  8. Эрик С. Реймонд (11 октября 1996 г.). Словарь нового хакера - 3-е издание . MIT Press. п. 432. ISBN. 978-0-262-68092-9. Проверено 5 августа 2012 года .
  9. ^ "Оператор использования (Справочник по C #)" . Проверено 16 сентября 2014 года .
  10. ^ "Магриттр: Виньетка" . Проверено 24 декабря 2018 года .
  11. ^ Абельсон & Сассмен 1996 , глава 1, сноска 11 .
  12. Перейти ↑ Perlis 1982 , Epigram # 3.
  13. ^ «Файл жаргона - синтаксическая соль» . 2003-06-12. Архивировано из оригинала на 2003-06-12 . Проверено 19 марта 2018 .
  14. ^ «новый модификатор (Справочник по C #)» . microsoft.com . Microsoft . Дата обращения 3 августа 2015 .
  15. ^ "переключатель (Справочник по C #)" . microsoft.com . Microsoft . Дата обращения 3 августа 2015 .
  16. ^ "синтаксический сахар" . catb.org . Дата обращения 3 августа 2015 .
  17. ^ Boiten, Eerke A .; Мёллер, Бернхард (26.06.2002). Математика построения программ . ISBN 9783540438571. Дата обращения 3 августа 2015 .
  18. ^ Дин, Томас (2004). Разговор с компьютерами: исследования в области науки и технологий вычислений . Издательство Кембриджского университета. п. 115 . ISBN 9780521542043.
  19. ^ Харрисон, Уильям; Шеард, Тим (8–10 июля 2002 г.). «Тонкое управление спросом в Haskell» (PDF) . Математика построения программ: 6-я Международная конференция, MPC 2002, Замок Дагштуль, Германия, 8–10 июля 2002 г. Труды . Международная конференция по математике построения программ. Замок Дагштуль, Германия: Springer Berlin Heidelberg. п. 93. DOI : 10.1007 / 3-540-45442-X_6 . S2CID 10059915 . Архивировано из оригинального (PDF) 31 марта 2017 года.  
  20. ^ Чага, Рави (2013). Вложенные типы уточнения для JavaScript (PhD). Калифорнийский университет в Сан-Диего.
  21. ^ "Документация по LLVM на языке C" . clang.llvm.org . Проверено 30 июня 2020 .
  22. ^ "Тайная жизнь типов в Swift" . medium.com/@slavapestov . Проверено 30 июня 2020 .

Ссылки [ править ]

  • Абельсон, Гарольд ; Сассман, Джеральд Джей ; Суссман, Джули (1996) [1984]. Структура и интерпретация компьютерных программ . Кембридж, Массачусетс: MIT Press . ISBN 0-262-51087-1.
  • Ландин, Питер Дж. (Февраль – март 1965 г.). «Соответствие между АЛГОЛОМ 60 и лямбда-нотацией Чёрча: части I и II». Коммуникации ACM . 8 (2.3): 89–101, 158–165. DOI : 10.1145 / 363744.363749 . S2CID  6505810 .
  • Ландин, Питер Дж. (Март 1965 г.). «Программирование без императивов - пример». Системное программирование UNIVAC .
  • Ландин, Питер Дж. (Июль 1965 г.). «Избавление от этикеток». Системное программирование UNIVAC .
  • Ландин, Питер Дж. (Август 1965 г.). «Обобщение скачков и меток». Системное программирование UNIVAC ., перепечатано в " Высших порядках и символических вычислениях ". 11 . 1998: 125–143. CiteSeerX 10.1.1.85.2610 .  Цитировать журнал требует |journal=( помощь )
  • Перлис, AJ (сентябрь 1982 г.). «Эпиграммы по программированию» . Уведомления ACM SIGPLAN . Нью-Йорк, Нью-Йорк, США: Ассоциация вычислительной техники. 17 (9): 7–13. DOI : 10.1145 / 947955.1083808 . S2CID  20512767 . Архивировано из оригинала на 17 января 1999 года.CS1 maint: ref дублирует значение по умолчанию ( ссылка )
  • Эта статья основана на материалах, взятых из Free On-line Dictionary of Computing до 1 ноября 2008 г. и включенных в соответствии с условиями «перелицензирования» GFDL версии 1.3 или новее.