Фон
На странице Википедии о синтаксическом сахаре говорится:
В информатике синтаксический сахар - это синтаксис в языке программирования, предназначенный для облегчения чтения или выражения. Это делает язык «более сладким» для использования людьми: вещи могут быть выражены более четко, более кратко или в альтернативном стиле, который некоторые могут предпочесть.
Я не очень понимаю, в чем разница между синтаксическим сахаром и синтаксисом.
Я ценю тот факт, что сладкая версия может быть более ясной, более краткой, возможно, испариться с некоторыми шаблонами. Но я чувствую, что на некотором уровне весь синтаксис по сути делает это, чтобы сформировать абстракцию над тем, к чему компилируется код.
С той же страницы Википедии:
Языковые процессоры, включая компиляторы, статические анализаторы и т. П., Часто перед обработкой расширяют подслащенные конструкции в более фундаментальные конструкции, процесс, который иногда называют «десагерингом».
В качестве упражнения для размышления, если я принимаю слово «часто» в этом выражении как «всегда»: если бы разница заключалась лишь в том, «компилирует ли» компилятор синтаксис перед переходом к следующему этапу, как мог бы кодер, который не знает внутренностей компилятора знают (или заботятся), что такое синтаксис Sugar'd или нет?
Очень связанный вопрос на этом сайте "Строгое определение синтаксического сахара?" имеет ответ, который начинается:
ИМХО, я не думаю, что у вас может быть определение для синтаксического сахара, потому что эта фраза написана на BS и, вероятно, будет использоваться людьми, которые говорят о «настоящих программистах», использующих «настоящие инструменты» в «реальных операционных системах»
Что может указывать мне на то, что, возможно, между программистом, использующим язык, нет большой разницы? Возможно, разница заметна только автору компилятора? Хотя могут быть случаи, когда программисту, использующему язык, полезно знать, что скрыто под синтаксическим сахаром? (Но, возможно, в действительности любой дискурс на эту тему имеет тенденцию использовать этот термин в качестве пламени приманки?)
Суть вопроса
Итак ... краткая версия вопроса:
- Есть ли реальная разница между синтаксисом и синтаксическим сахаром?
- Для кого это важно?
Дополнительная пища для размышления
Бонус на противоречие темы:
На странице Википедии приведен пример:
Например, в языке C
a[i]
обозначение является синтаксическим сахаром для*(a + i)
Принимая во внимание, что другой ответ на вышеупомянутый связанный вопрос говорит о том же примере:
Теперь посмотрим
a[i] == *(a + i)
. Подумайте о любой программе на C, которая использует массивы любым существенным образом.
И резюмирует, что:
[]
Обозначения облегчает эту абстракцию. Это не синтаксический сахар.
Обратный вывод к тому же примеру!
источник
Ответы:
Основное отличие состоит в том, что синтаксис - это грамматика, определенная на языке, которая позволяет вам раскрыть некоторые функции. Как только вы достигнете этой функциональности, любой другой синтаксис, который позволяет вам делать то же самое, считается сахаром. Это, конечно, приводит к странным сценариям того, какой из двух синтаксисов является сахаром, тем более что не всегда ясно, что было первым.
На практике синтаксический сахар используется только для описания синтаксиса, добавляемого в язык для облегчения использования, например, для создания инфиксной
lhs + rhs
картыlhs.Add(rhs)
. Я бы посчитал индексирование массива C синтаксическим сахаром.Это имеет значение главным образом потому, что элегантный дизайн имеет тенденцию ограничивать количество дублирования. Необходимость (или, по крайней мере, желание) синтаксического сахара рассматривается некоторыми как признак неудачного замысла.
источник
if (a) return blah; ...
противresult_type res; if (a) res = blah; else {...}; return res;
. Чтобы найти разницу между этими программами, вам нужно было бы использовать определенные языки и использовать исключительно language-lawyer-y (часто с точки зрения мелкомасштабной операционной семантики).Синтаксис - это то, что использует языковой процессор, чтобы понять, что означают конструкции языка. Конструкции, которые считаются синтаксическим сахаром, также должны интерпретироваться языковым процессором и, следовательно, являются частью синтаксиса языков.
То, что отличает синтаксический сахар от остальной части синтаксиса языка, состоит в том, что можно было бы удалить синтаксический сахар из языка, не затрагивая программы, которые могут быть написаны на языке.
Чтобы дать более формальное определение, я бы сказал,
Это никоим образом не предназначено для клеветы на синтаксический сахар или языки, которые его имеют, потому что использование синтаксического сахара часто приводит к программам, цель которых более понятна.
источник
->
оператор Си, и я не вижу, как этот оператор менее общий, чем любой другой.Другие ответы не упомянули ключевую концепцию: абстрактный синтаксис ; без этого термин «синтаксический сахар» не имеет никакого смысла.
Абстрактный синтаксис определяет элементы и структуру языков, а также то, как фразы этого языка могут быть объединены для создания больших фраз. Абстрактный синтаксис не зависит от конкретного синтаксиса. Термин «синтаксический сахар», насколько я понимаю, относится к конкретному синтаксису.
В общем, при разработке языка вам нужно создать конкретный синтаксис для каждого термина вашего абстрактного синтаксиса, чтобы люди могли писать код на вашем языке, используя простой текст.
Допустим, вы создали неуклюжий конкретный синтаксис для foo . Пользователи жалуются, и вы реализуете новый конкретный синтаксис для представления того же абстрактного синтаксиса . В результате ваш абстрактный синтаксис и семантика не изменились, но теперь у вас есть два конкретных синтаксиса для одного и того же термина абстрактного синтаксиса.
Я полагаю, что именно это имеют в виду, когда говорят «синтаксический сахар» - изменения, которые влияют только на конкретный синтаксис, но не влияют на абстрактный синтаксис или семантику.
Итак, разница между «синтаксическим сахаром» и «конкретным синтаксисом» теперь очевидна. Мне. :)
Эта интерпретация также помогает объяснить, что Алан Перлис мог иметь в виду, когда говорил «синтаксический сахар вызывает рак точки с запятой»: весь конкретный синтаксический сахар в мире не может исправить слабый абстрактный синтаксис, и все усилия, которые вы тратите, добавляя, что сахар усилия, которые вы не тратите на решение реальной проблемы - абстрактного синтаксиса.
Я должен также отметить, что это исключительно мое мнение; Я верю в это только потому, что это единственная интерпретация, которую я могу придумать, которая имеет смысл для меня.
источник
p
на структуру, содержащую полеx
, выражения(*p).x
иp->x
имеют ли тот же абстрактный синтаксис? Но я думаю, было бы здорово, если бы все сводилось к абстрактному или конкретному синтаксису..
корнем в корне. Левый подузел корня - это*
, а его дочерний -p
. Правый подузел корня естьx
. Для второго выражения абстрактное синтаксическое дерево имеет->
корень а, а корень имеет двух дочерних элементовp
иx
. Я пытаюсь выяснить, имеет ли смысл анализировать оба выражения по-разному, чтобы они имели одно и то же абстрактное синтаксическое дерево, но пока не вижу, как это сделать.x
)(
или;
) для создания дерева, отражающего фактическую структуру программы (см. En.wikipedia.org/wiki/Abstract_syntax_tree ). Однако в абстрактном синтаксисе ничего не сказано (пока) о семантике программы.Синтаксический сахар - это подмножество синтаксиса языков. Основная идея заключается в том, что существует несколько способов сказать одно и то же.
Что мешает сказать, какие фрагменты являются синтаксическим сахаром, а какие - «чистым синтаксисом», это такие утверждения, как «трудно сказать, какая форма появилась первой» или «трудно понять, как автор языка намеревался» или «это несколько произвольно решить, какая форма проще ".
Что позволяет легко решить, какие части являются чистыми или сладкими, так это задать вопрос в рамках конкретного компилятора или интерпретатора. Чистый синтаксис - это то, что компилятор преобразует напрямую в машинный код или на что интерпретатор напрямую реагирует. Сахар - это материал, который сначала превращается в какой-то другой синтаксический материал, прежде чем эти прямые вещи происходят. В зависимости от реализации, это может совпадать с тем, что задумал автор, или даже с тем, что утверждается в спецификации языка
На практике именно так решается реальность вопроса.
источник
Действительно, ваша первая цитата из Википедии гласит, что все "... облегчает чтение ...", ".... людям приятнее пользоваться ....".
В письменной форме укороченные формы, такие как «не» или «не», могут считаться синтаксическим сахаром.
источник
Обычно синтаксический сахар - это часть языка, которая может быть выражена существующей частью языка (синтаксисом) без потери общности, но с потерей ясности. Иногда компиляторы имеют явный шаг десагеринга, который преобразует AST, созданный в исходном коде, и применяют простые шаги для удаления узлов, соответствующих сахару.
Например, у Haskell есть синтаксический сахар для монад с рекурсивным применением следующих правил
Прямо сейчас не имеет значения, что именно это означает - однако вы можете видеть, что специальный синтаксис в LHS может быть преобразован во что-то более базовое в RHS (а именно, приложения функций, лямбды и т. Д.
let
). Этот шаг позволяет сохранить лучшее из обоих миров:Точно так же в C вы можете представить себе правило перезаписи desugaring (из-за перегрузки операторов и т. Д. Это не так для C ++):
Вы можете представить, что пишете все программы без использования
->
или[]
в C, которые используют эту конструкцию сегодня. Однако программистам было бы сложнее использовать его, поэтому он предоставил синтаксический сахар (я думаю, в 70-х годах это могло бы упростить работу и для компиляторов). Возможно, это менее понятно, поскольку вы можете технически добавить следующее, совершенно правильное правило переписывания:Синтаксис сахара плох? Не обязательно - есть опасность, что он будет использоваться как культ груза, не понимая более глубокого смысла. Например, следующие функции эквивалентны в Haskell, но многие начинающие пишут первую форму, не понимая, что они злоупотребляют синтаксическим сахаром:
Кроме того, синтаксический сахар может слишком усложнять язык или быть слишком узким, чтобы допускать обобщенный идиоматический код. Кроме того, это может означать, что язык недостаточно мощный, чтобы легко выполнять определенные задачи - это может быть из-за замысла (не предоставляйте разработчикам острые инструменты или очень специфический нишевый язык, который добавление более мощной конструкции нанесет ущерб другим целям) или из-за упущения - последнее форма дала синтаксису сахар плохое имя. Если язык достаточно мощный, чтобы использовать другие конструкции без добавления синтаксического сахара, считается более элегантным использовать их.
источник
Я думаю, что наиболее очевидным примером будет синтаксис "+ =" в C.
а также
сделать то же самое и собрать точно такой же набор машинных инструкций. Вторая форма сохраняет пару символов ввода, но, что более важно, очень ясно дает понять, что вы изменяете значение на основе его текущего значения.
Я собирался привести оператор ++ / префикс «++» в качестве канонического примера, но понял, что это было больше, чем синтаксический сахар. Невозможно выразить разницу между ++ i и i ++ в одном выражении с использованием
i = i + 1
синтаксиса.источник
a[f(x)] += 1
.Сначала я приведу некоторые другие ответы на конкретном примере. Цикл for в C ++ 11 (очень похож на циклы foreach в других языках)
в точности эквивалентно (то есть, засахаренная версия)
Теперь, несмотря на отсутствие нового абстрактного синтаксиса или семантики в языке, он действительно полезен.
Первая версия делает намерение (посещение каждого элемента в контейнере) явным. Это также запрещает необычное поведение, такое как изменение контейнера во время обхода, или дальнейшее продвижение
iterator
в теле цикла, или получение условий цикла слегка неправильно. Это позволяет избежать возможных источников ошибок и тем самым уменьшает сложность чтения и рассуждений о коде.Например, односимвольная ошибка во второй версии:
дает ошибку «один за другим» и неопределенное поведение.
Таким образом, версия с сахаром полезна именно потому, что она более ограничительна и, следовательно, проще доверять и понимать.
Во-вторых, к первоначальному вопросу:
Нет, «синтаксический сахар» - это (конкретный) синтаксис языка, который считается «сахаром», потому что он не расширяет абстрактный синтаксис или основные функциональные возможности языка. Мне нравится ответ Мэтта Фенвика на это.
Это имеет значение для пользователей языка, так же как и любой другой синтаксис, и в этом сахар предоставляется для поддержки (и в некотором смысле благословения) определенных идиом.
Наконец, о бонусном вопросе
это очень похоже на определение синтаксического сахара: оно поддерживает (и предоставляет благословение авторов языка) использование указателей в качестве массивов.
p[i]
Форма на самом деле не более ограничительная , чем*(p+i)
, поэтому единственное отличием является четкой связью намерения (и небольшой выигрыш читаемости).источник
Каким бы ни был исходный оттенок этой фразы, в настоящее время это в первую очередь уничижительный, почти всегда формулируемый как «просто» или «только» синтаксический сахар. Это в значительной степени имеет значение только для программистов, которые любят делать вещи нечитаемым образом и хотят получить краткий способ объяснить это своим коллегам. Определение тех, кто в основном использует термин сегодня, с их точки зрения, было бы что-то вроде:
Вот почему вы получаете два противоположных вывода для одного и того же синтаксического элемента. Ваш первый пример записи в массиве использует исходное положительное значение термина, что-то похожее на ответ Барта. Ваш второй пример защищает нотацию массива от обвинения в том, что он является синтаксическим сахаром в уничижительном смысле. Другими словами, он утверждает, что синтаксис является полезной абстракцией, а не опорой.
источник