Что такое синтаксический сахар в программировании
Перейти к содержимому

Что такое синтаксический сахар в программировании

  • автор:

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

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

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

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

  • не изменяйте его выразительность;
  • сделать так, чтобы писать было приятнее, а не читать.

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

В Perl , например, вы можете опустить круглые скобки, которые требуются в других языках:

print $a, $b, $c;
print ($a, $b, $c);

Этот язык также позволяет писать:

print "OK" if $debug;

if ($debug)

Синтаксический сахар может быть легко переведен (без подслащивания), если кто-то действительно хочет создать программу с базовым, более строгим и менее понятным синтаксисом языка. Эту работу по удалению сахара может выполнить простой препроцессор . Например, в C обозначение tableau[i] — это синтаксический сахар для выражения *(tableau+i) .

Использование инфиксной записи x+y также можно рассматривать как синтаксический сахар для обратной польской записи x y + .

В макросы из Lisp или схемы позволяют подсластить, синтаксически говоря, программы , написанные на этих языках; возможны все виды синтаксических расширений.

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

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

На практике синтаксическая соль подобна обязательному проходу, который программист должен пройти, чтобы доказать, что он знает, что он делает, без написанного для этого кода, выражающего конкретное действие программного обеспечения. Некоторые программисты считают требование объявления переменных и их типов синтаксической солью. Точно так же нужно написать end if (или fi ), end until ( end while ), end do ( end do или od ) и т. Д. закрыть блок инструкций управляющей инструкции вместо того, чтобы просто записать конец, можно рассматривать как синтаксическую соль; это ограничение особенно контрпродуктивно, если у вас нет подходящего редактора синтаксиса , что можно понять при удалении длинного блока в программе. Удаление начала действительно требует второго исследования, на этот раз конца блока, и удаления этого, что может отвлечь программиста. Если концовка была в стиле PL / I :

end; end; end;

удаление любого из них end; поможет. В Python нет end возможности отмечать конец структуры, потому что это отступ, который определяет блок.

Примечания и ссылки

  1. ↑ (in) Питер Ландин, » Механическая оценка выражений » , Computer Journal , Vol. 6, п о 4, 1964 г. , стр. 308–320 ( читать онлайн , по состоянию на 20 августа 2015 г. )
  2. ↑« Синтаксическая соль — французский жаргон 4.1 — компьютерный словарь » , на французском жаргоне , 1995 г. (по состоянию на 9 октября 2017 г. )
  3. ↑« Файл жаргона — синтаксическая соль »[ архив 12 июня 2003 г. ] , 12 июня 2003 г. (по состоянию на 19 марта 2018 г. )

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

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

Определение

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

Необходимо отметить, что понятие синтаксического сахара во многом условно. Его использование предполагает, что из всего множества синтаксических конструкций можно выделить некоторый «базовый набор», обеспечивающий всю функциональность языка, и тогда дополнительные синтаксические средства, которые при желании можно выразить с помощью базового набора, и будут для данного языка синтаксическим сахаром. Однако многие конструкции являются взаимозаменяемыми, и далеко не всегда можно определённо сказать, какие именно из них являются базовыми, а какие — дополнительными. Например, в языке Модула-2 есть четыре вида циклов: цикл с предусловием, цикл с постусловием, цикл с шагом и безусловный цикл. Теоретически, первые три вида циклов могут быть легко выражены через последний. Являются ли они, в таком случае, синтаксическим сахаром? Обычно так не говорят, хотя формально под вышеприведённое определение они попадают.

Примеры

Массивы в Си

Массивы в Си представляют собой блоки в памяти. Доступ к элементам массива производится через указатель на начало блока памяти (то есть, на начало массива) и смещение элемента относительно начального адреса. Это может быть записано без использования специального синтаксиса для массивов ( a — указатель на начало массива, i — индекс необходимого элемента, size — размер элемента данного типа в памяти): *(a + i * size) , но непосредственные операции с адресами в памяти и смещениями являются большим источником ошибок программистов, поэтому язык предоставляет специальный синтаксис: a[i] . Кроме того, для массивов с size = 1 есть возможность обратиться к i -му элементу массива уж совсем экзотическим способом: i[a] , что аналогично a[i] , так как значение указателя i+a , очевидно, равно a+i .

Тернарная операция в Си

Другой известный пример специализированной языковой конструкции — тернарная условная операция языка Си ?: . Следующие два фрагмента кода делают одно и тоже:

int fn(); int a = 1; int b; if (a > 0) b = fn(1); else b = fn(2); 
int fn(); int a = 1; int b = fn((a > 0)? 1 : 2); 

Причина введения такой операции — желание вставлять проверку простых условий прямо в выражения и возможность прямо указать компилятору, что результатом проверки условия будет единственное значение. Конструкция действительно сокращает запись, но вот по поводу её удобства мнения могут быть разными. Многие считают, что сокращение записи в данном случае не окупает ухудшение читаемости кода.

Переопределение операторов

К синтаксическому сахару можно отнести и переопределение операторов, поддерживаемое многими языками программирования. В принципе, любая операция может быть оформлена как процедура (функция, метод). Переопределение операторов позволяет выполнять операции, созданные программистом, внешне так же, как и встроенные в язык.

Свойства

Ещё одним примером синтаксического сахара является концепция «свойств», поддерживаемая многими современными языками программирования. Имеется в виду объявление в классе псевдополей, которые внешне ведут себя как поля класса (имеют имя, тип, допускают присваивание и чтение), но в действительности таковыми не являются. Каждое обращение к свойству преобразуется компилятором в вызов метода доступа. Свойства совершенно не являются необходимыми (методы доступа можно вызывать и непосредственно) и используются исключительно для удобства, поскольку код с использованием свойств выглядит несколько проще и понятнее.

Критика

Не все программисты считают наличие синтаксического сахара в языках программирования и использование его программистами благом. Известна точка зрения Никлауса Вирта, которую разделяет часть программистского сообщества: согласно ей, любое расширение языка, не вызванное необходимостью, ухудшает его, так как приводит к усложнению транслятора и, соответственно, к понижению его надёжности и производительности. Одновременно возрастает сложность изучения языка и сложность сопровождения программ. Кроме того, сам факт наличия дополнительных синтаксических средств часто играет провоцирующую роль: он побуждает программиста прибегать к различным синтаксическим трюкам вместо того, чтобы глубже анализировать задачу и реализовывать более эффективные алгоритмы. Эти взгляды отразились в языках семейства Оберон, очень простых и практически лишённых синтаксического сахара.

Известен афоризм Алана Перлиса: «Синтаксический сахар вызывает рак точек с запятой». Точка с запятой («;»), являясь обязательной частью большинства популярных языков программирования, даже если в новом языке бесполезна, оставляется как необязательный элемент, так как большинство программистов имеют прочную привычку её использования. В оригинале афоризм обыгрывает созвучие английских слов semicolon (точка с запятой) и colon, последнее из которых означает не только двоеточие, но и толстый кишечник (colon cancer — рак толстого кишечника).

Чаще критика направляется на отдельные, часто встречающиеся виды синтаксического сахара: переопределение операций, свойства, сложные операции (вроде вышеупомянутой тернарной операции ?: в Си). Доводы критиков, в основном, сводятся к тому, что подобные средства, в действительности, не делают программу ни проще, ни понятнее, ни эффективнее, ни короче, но приводят к дополнительной трате ресурсов и усложняют восприятие, а значит и сопровождение программы.

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

В противоположность «синтаксическому сахару» в понятие «синтаксическая соль» (англ. syntactic salt ) [1] на жаргоне хакеров обозначает конструкции в языке программирования, которые необходимо употреблять при выполнении потенциально небезопасных действий. Таким образом, используя их, программист подтверждает, что сомнительное действие предпринято им сознательно, а не является случайной ошибкой или результатом непонимания. Так же, как «синтаксический сахар» не добавляет языку выразительности, «синтаксическая соль» не расширяет возможности языка и не нужна транслятору для корректной компиляции программы; она предназначена исключительно для людей, пользующихся данным языком. Классическим примером общеизвестной и широко применяемой «синтаксической соли» являются имеющиеся почти в любом языке со статической типизацией встроенные команды преобразования типов данных. Формально эти команды излишни (что доказывает классический язык Си, где любое преобразование типов допустимо и выполняется автоматически), но в языках, где их применение обязательно, программист вынужден каждый раз обращать внимание на то, что он выполняет потенциально опасное смешение типов (которое часто указывает на логическую ошибку в программе). В зависимости от строгости языка программирования использование «синтаксической соли» может быть обязательным или факультативным. В первом случае транслятор воспринимает её отсутствие как синтаксическую ошибку, во втором — выдаёт при трансляции предупреждение, которое программист может проигнорировать. В отличие от «синтаксического сахара», который расширяет свободу выражения программиста, «синтаксическая соль» её сужает, требуя «без причины» писать длинные конструкции.

В Jargon File написано: «синтаксическая соль вредна, поскольку повышает артериальное давление хакера». Действительно, при написании небольших программ, создаваемых и поддерживаемых одним человеком, предосторожности могут показаться излишними, однако при промышленной разработке крупных программных комплексов, поддерживаемых большими коллективами программистов (зачастую, к тому же, не самой высокой квалификации), «синтаксическая соль» помогает не ошибаться в разработке и эффективнее разбираться в коде, написанном другими разработчиками.

  • Директива override в Delphi явно указывает на то, что помеченный ею метод подменяет виртуальный метод класса-родителя. Наличие этой директивы требует от компилятора проверить соответствие сигнатуры подменяющего и подменяемого метода, так что при изменении в базовом классе программист будет вынужден внести те же изменения в классы-потомки, иначе программа не будет компилироваться.
  • Операция reinterpret_cast в C++ обеспечивает небезопасное преобразование типа. Операция не производит никакого кода, она лишь обходит контроль типов. Единственный смысл её использования — напоминание, что подобное небезопасное преобразование типов использовано намеренно.

Примечания

Литература

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

Подобные конструкции index = index + 1 в JavaScript используются довольно часто, поэтому создатели языка добавили сокращённый вариант записи: index += 1 . Такие сокращения принято называть синтаксическим сахаром, потому что они делают процесс написания кода немного проще и приятнее, «подслащивая» его 🙂

Существуют сокращённые формы для всех арифметических операций и для конкатенации строк:

  • a = a + 1 → a += 1
  • a = a — 1 → a -= 1
  • a = a * 2 → a *= 2
  • a = a / 1 → a /= 1
  • a = a + ‘foo’ → a += ‘foo’

Задание

Реализуйте функцию filterString() , принимающую на вход строку и символ, и возвращающую новую строку, в которой удален переданный символ во всех его позициях. Регистр символов важен.

const str = 'If I look back I am lost'; filterString(str, 'I'); // 'f look back am lost' filterString('zz Zorro', 'z'); // ' Zorro' 

Упражнение не проходит проверку — что делать? ��

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

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

В моей среде код работает, а здесь нет ��

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

Мой код отличается от решения учителя ��

Это нормально ��, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно ��

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

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

Полезное

Определения

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

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

Подобные конструкции index = index + 1 в Java используются довольно часто, поэтому создатели языка добавили сокращенный вариант записи: index += 1 . Такие сокращения принято называть синтаксическим сахаром, потому что они делают процесс написания кода немного проще и приятнее.

Существуют сокращенные формы для всех арифметических операций и для конкатенации строк:

  • a = a + 1 → a += 1
  • a = a — 1 → a -= 1
  • a = a * 2 → a *= 2
  • a = a / 1 → a /= 1
  • a = a + «foo» → a += «foo»

Задание

Реализуйте статический метод App.filterString() , принимающую на вход строку и символ, и возвращающую новую строку, в которой удален переданный символ во всех его позициях.

var str = "If I look back I am lost"; App.filterString(str, 'I'); // "f look back am lost" App.filterString(str, 'o'); // "If I lk back I am lst" 

Упражнение не проходит проверку — что делать? ��

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

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

В моей среде код работает, а здесь нет ��

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

Мой код отличается от решения учителя ��

Это нормально ��, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно ��

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *