stringtranslate.com

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

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

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

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

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

Происхождение

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

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

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

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

Критика

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

Производные термины

Синтаксическая соль

Метафора была расширена путем введения термина «синтаксическая соль» , который обозначает функцию, призванную усложнить написание плохого кода. [14] В частности, синтаксическая соль — это обруч, через который программисты должны прыгнуть, чтобы доказать, что они знают, что происходит, а не чтобы выразить действие программы.

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

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

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

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

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

Засахаренные виды

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

Примечания

  1. ^ Ландин, Питер Дж. (1964). «Механическая оценка выражений» (PDF) . The Computer Journal . 6 (4). Computer Journal : 308–320. doi : 10.1093/comjnl/6.4.308 . Получено 21 июля 2014 г. .
  2. ^ Абельсон и Сассман 1996, Глава 1, сноска 11.
  3. ^ Барбара Лисков, «История CLU», Технический отчет 561 Лаборатории компьютерных наук Массачусетского технологического института (1993)
  4. ^ Felleisen, Matthias (декабрь 1991 г.). «О выразительной силе языков программирования». Science of Computer Programming . 17 (1–3). Springer-Verlag: 35–75. doi : 10.1016/0167-6423(91)90036-W . Получено 19 июля 2014 г.
  5. ^ "C Compound Assignment". msdn.microsoft.com . Microsoft . Получено 20 июня 2016 г. Однако выражение составного присваивания не эквивалентно расширенной версии, поскольку выражение составного присваивания вычисляет expression1 только один раз, тогда как расширенная версия вычисляет expression1 дважды: в операции сложения и в операции присваивания.
  6. ^ Гаравалья, Эмилио (26 июля 2015 г.). «Почему сокращения вроде x += y считаются хорошей практикой?». stackexchange.com . Получено 20 июня 2016 г. . оптимизация может [быть выполнена], если «нахождение x» не имеет побочных эффектов
  7. ^ "Модель данных Python". docs.python.org . 21 декабря 2020 г.
  8. ^ Рэймонд, Эрик С. (11 октября 1996 г.). Новый словарь хакера – 3-е издание. MIT Press. стр. 432. ISBN 978-0-262-68092-9. Получено 5 августа 2012 г.
  9. ^ "using Statement (C# Reference)" . Получено 16 сентября 2014 г. .
  10. ^ "magrittr: Vignette" . Получено 24 декабря 2018 г. .
  11. ^ "Stack Overflow: Что означает тройной вопросительный знак в Scala?" . Получено 23 января 2024 г. .
  12. ^ Абельсон и Сассман 1996, Глава 1, сноска 11.
  13. Перлис 1982, Эпиграмма № 3.
  14. ^ "The Jargon File - syntactic salt". 2003-06-12. Архивировано из оригинала 2003-06-12 . Получено 2018-03-19 .
  15. ^ "new Modifier (C# Reference)". microsoft.com . Microsoft . Получено 3 августа 2015 г. .
  16. ^ "switch (C# Reference)". microsoft.com . Microsoft . Получено 3 августа 2015 г. .
  17. ^ "синтаксический сахар". catb.org . Получено 3 августа 2015 г. .
  18. ^ Бойтен, Эрке А.; Мёллер, Бернхард (2002-06-26). Математика построения программ. Springer. ISBN 9783540438571. Получено 3 августа 2015 г.
  19. ^ Дин, Томас (2004). Разговоры с компьютерами: исследования в области науки и технологий вычислений . Cambridge University Press. стр. 115. ISBN 9780521542043.
  20. ^ Харрисон, Уильям; Шеард, Тим (8–10 июля 2002 г.). "Математика построения программ" (PDF) . Математика построения программ: 6-я международная конференция, MPC 2002, Замок Дагштуль, Германия, 8–10 июля 2002 г. Труды . Международная конференция по математике построения программ. Lecture Notes in Computer Science. Том 2386. Замок Дагштуль, Германия: Springer Berlin Heidelberg. стр. 93. doi :10.1007/3-540-45442-X_6. ISBN 978-3-540-43857-1. S2CID  10059915. Архивировано из оригинала (PDF) 31 марта 2017 г.
  21. ^ Чу, Рави (2013). Вложенные типы уточнения для JavaScript (PhD). Калифорнийский университет в Сан-Диего.
  22. ^ "Документация языка C LLVM". clang.llvm.org . Получено 30 июня 2020 г. .
  23. ^ "Тайная жизнь типов в Swift". medium.com/@slavapestov . 14 июля 2016 г. Получено 30 июня 2020 г.

Ссылки