В чем разница между синтаксисом и семантикой?

87

Я всегда думал, что ссылаться на синтаксис языка было то же самое, что ссылаться на семантику языка. Но мне сообщили, что, видимо, это не так. Какая разница?

gsingh2011
источник
6
«Бесцветные зеленые идеи спят яростно» синтаксически нормально, но не имеют смыслового смысла. См en.wikipedia.org/wiki/Colorless_green_ideas_sleep_furiously
CesarGon
+1 за вопрос. Я задавался вопросом, то же самое, был слишком ленив, чтобы искать это в Интернете, и, очевидно, никогда не спрашивал.
К.К.
Я бы сказал, более или менее ... Семантика - это типы экземпляров, их отношения с другими экземплярами и гарантии, которые существуют между ними. Синтаксис - это способ объявить эти вещи через строки символов. Более менее.
Dehbop

Ответы:

106

Семантика ~ Значение

Синтаксис ~ Символическое представление

Таким образом, две программы, написанные на разных языках, могут выполнять одно и то же (семантика), но символы, используемые для написания программы, будут разными (синтаксис).

Компилятор проверит ваш синтаксис для вас (ошибки времени компиляции) и выведет семантику из правил языка (скажем, сопоставление синтаксиса с машинными инструкциями), но не найдет все семантические ошибки (ошибки времени выполнения, например, вычисление неверный результат, потому что код говорит добавить 1 вместо добавления 2).

Крис Кард
источник
2
Проверка ошибок не является критерием для разграничения синтаксиса и семантики. Компилятор может и должен диагностировать как синтаксические ошибки (например, пропущенную точку с запятой), так и семантические ошибки (например, x + yтам, где нет подходящего +оператора для этих операндов). Добавление 1 вместо 2 - это то, что я бы назвал логической ошибкой.
Кит Томпсон
3
@Keith - но логика (как в «логической ошибке») - это семантика. Некоторые семантические проверки могут быть выполнены компилятором - в частности, проверка типов - поэтому я согласен, что компиляторы не только находят синтаксические ошибки, но Крис только сказал, что " не найдет все семантические ошибки", что не означает "не может найти любой ".
Steve314
1
@ Steve314: Согласен. Но если вы хотите провести четкое различие между ошибками, которые должен обнаруживать компилятор, и ошибками, которые он не должен обнаруживать, то я думаю, что «семантические» и «логические» - хороший способ выразить это различие.
Кит Томпсон
4
@KeithThompson На самом деле, теоретически, компилятор или интерпретатор для языка с достаточно сильной и мощной (то есть, зависимой ) системой типов может проверять любое произвольное свойство вашего кода (по модулю проблемы остановки, если применимо), таким образом разбивая семантические ошибки на «проверяемый» и «не проверяемый» не имеет смысла вообще.
Пламя Птариена
@ Ptharien'sFlame Я просто на мгновение вытащу эту дискуссию из-под облаков, выделив «теоретически» часть вашего заявления. На практике применение семантики в коде требует дополнительного синтаксиса, чтобы дать подсказкам компилятора функциональность. Дополнительная семантическая проверка приходит как стоимость (то есть сложность / читаемость). Утверждать, что язык может быть достаточно мощным, чтобы проверять все семантические ошибки, все равно, что говорить, что правовая система может быть достаточно совершенной, чтобы предотвращать все преступления. Лично я предпочитаю свободу, а не безопасность, но именно это делает эту тему «религиозной».
Эван Плейс
35

На самом деле существует не два уровня, а три:

  • лексический уровень: как символы объединяются для создания языковых элементов ( iи fпроизводит if)
  • синтаксический уровень: как элементы языка объединяются для получения языковых выражений ( if, (, 42, ==, answerи )производят условный оператор)
  • семантический уровень: как языковые выражения преобразуются в инструкции ЦП для формирования значения (условный оператор позволяет выполнять одну или другую ветвь в зависимости от результата логического выражения)
mouviciel
источник
10
Разделение между лексическими и синтаксическими этапами является полностью искусственным, это не более чем оптимизация. И есть некоторые языки, в которых не определен конечный плоский набор лексем, но все же существует четко определенный синтаксис. Итак, я бы предпочел определять лексемы как часть синтаксиса, это не отдельная сущность.
SK-logic
@ SK-logic: во многих языках указывается список разрешенных или запрещенных лексем, образующих имя переменной. Так что разделение имеет смысл.
Mouviciel
5
@mouviciel, это имеет смысл только в качестве оптимизации - в противном случае у вас просто будет ValidIdentifierтерминал, который можно определить как что-то вроде ![AnyKeyword] [Identifier](здесь я использую PEG-подобную запись). Вам не нужен отдельный проход для такого языка. См., Например, основанные на GLR синтаксические анализаторы C ++.
SK-logic
2
@EvanPlaice, о чем ты говоришь? Моя точка зрения заключается в том, что лексирование не является необходимым (и фактически ограничивает ваш язык), а не анализирует .
SK-logic
1
@ SK-logic. Мне кажется, я прочитал ваш комментарий, чтобы обозначить противоположное тому, что вы намеревались. Я думал, что вы говорите о случаях, когда нужен только лексер - например, на «обычных» или «контекстно-свободных» языках. В языках более высокого уровня лексер может не понадобиться, но он обеспечивает быстрый способ запуска однократной проверки синтаксиса. Я полностью согласен с тем, что во многих случаях было бы полезно отключить или полностью устранить этап лексера.
Эван Плейс
18

Я объясню вам простой пример на языке ENGLISH:

The glass drank Ben

Это синтаксически правильное утверждение. У него есть существительное, глагол и т. Д.

Но семантически это неправильно, потому что это утверждение не имеет мыслимого или правильного значения.

IcyFlame
источник
15

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

Например, концепция арифметики указателей является частью семантики C; то , как +и -операторы могут быть использованы для выражения операций с указателями являются частью синтаксиса.

Иногда два языка разделяют часть своей семантики, но синтаксис сильно отличается (например, C # и VB.NET - оба используют типы значений и ссылочные типы, но символы, которые вы вводите для их определения, различны); в других случаях два языка синтаксически похожи, но семантика не совпадает (рассмотрите Java против JavaScript, где сходство часто путает новичков).

tdammers
источник
Итак, «Парадигмы» связаны с семантикой? Я имею в виду парадигму - это набор взаимосвязанной семантики?
Гюльшан
1
@Gulshan, парадигма - гораздо более широкое понятие, чем такая формализованная вещь, как семантика. Парадигма может включать семантику, но это скорее методология или, что еще шире, философия.
SK-logic
6

Синтаксис - это то, как вы размещаете лексемы языка. Семантика - это то, что означают эти токены (обычно, что означает конкретное расположение токенов).

Майк Шеррилл 'Cat Recall'
источник
5

Вы не указали, ссылаетесь ли вы только на языки программирования или на общие языки, используемые в программировании, поэтому я отвечаю на вопрос о языках данных (таких как XML, RDF, системы типов данных и т. Д.):

Брайан Л. Мик в своих семи золотых правилах разработки стандартов, не зависящих от языка (1995), пишет, что «синтаксис одного языка может быть семантикой другого» . Он ссылается на слова «синтаксис» и «семантика», используемые в описании данных: поэтому, если вы наткнетесь на эти слова в спецификации какого-либо формата данных, вам следует лучше заменить оба слова на «Potrzebie», чтобы прояснить, что вы должны работать смысл для себя.

Соотношение между синтаксисом и семантикой, по крайней мере, в точно определенных данных, может быть лучше описано термином «кодирование» . Семантика закодирована в синтаксисе. Поскольку записи могут быть вложенными, синтаксис одного языка является семантикой другого. Если человек выходит за пределы области данных, это вложение может быть практически бесконечным, как это описывает Умберто Эко как «неограниченный семиозис».

Чтобы привести пример:

  • Синтаксис XML (материал со всеми этими скобками) - это синтаксис с XML Infoset (абстрактное дерево) как семантический.
  • Инфо-набор XML в качестве синтаксиса может выражать запись в некотором формате данных XML как семантическую, например, документ RDF / XML, который кодирует граф RDF.
  • Граф RDF (материал с ссылками URI) в качестве синтаксиса кодирует граф абстрактных ресурсов как семантический.
  • Граф абстрактных ресурсов как синтаксис кодирует концептуальную модель как семантическую.

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

Jakob
источник
4

Если это можно описать в BNF (форма Бэкуса-Наура) или что-то подобное, это синтаксис. Если нет, то нет.

Семантика, с другой стороны, касается значения программы (или другого фрагмента исходного кода).

И иногда грань между ними может быть размытой.

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

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

Семантическая ошибка - это неспособность удовлетворить требования других языков (то, что C, например, называет «ограничениями»); Примером может быть запись x + yгде xи yимеют несовместимые типы. Языковая грамматика говорит о том, что сложение выглядит something + something, но оно недостаточно мощное, чтобы выразить требования к типам левого и правого операндов.

(Логические ошибки, такие как использование 1, где 2 будет правильным, как правило, не обнаруживаются компилятором - хотя в некоторых случаях компилятор может предупреждать о сомнительном коде.)

Кит Томпсон
источник
0

Синтаксис - это то, что говорят (лексические) символы. Семантика это то, что они имеют в виду.

Рассмотреть возможность:

C #: condition ? true_value : false_value
VB.NET: If(condition, true_value, false_value)
- Различный синтаксис, та же семантика.

C #: left_value / right_value
VB.NET: left_value / right_value
- Тот же синтаксис, другая семантика (для целых чисел).

Марк Херд
источник
0

Синтаксис - это грамматическое расположение слов в предложении, т.е. порядок слов.

(Английский) ' cat dog boy ' и (программирование) ' hi.5 ' не являются синтаксически правильными.

(Английский) ' cat hugs boy ' и (программирование) '* 3.2 * 5 *' синтаксически допустимы.

Статическая семантика - имеет ли смысл синтаксически допустимые операторы.

(Английский) « Я большой » (программирование) (python) « 3 +« привет » синтаксически правильно, но имеет статическую семантическую ошибку.

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

(Английский) « Летающие самолеты могут быть опасными » могут иметь два значения, то есть летающие самолеты могут быть опасными или летающие самолеты могут быть опасными.

(Программирование) 'компьютер не будет генерировать никаких сообщений об ошибках, но он не будет делать то, что вы сказали; это будет делать что-то еще.

Источник : MIT 6.00.1

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

  2. Ошибки, связанные с синтаксисом, возникают в программе, когда правила языка программирования нарушаются или используются неправильно. Ошибки из-за семантики возникают в программе, когда операторы не имеют смысла.

  3. Порядок слов является основным принципом синтаксиса, те, кто пытается понять написанное, используют синтаксические сигналы порядка слов, чтобы помочь придать структуре и значению предложения. Семантика - это индивидуальное толкование человеком значения «предложения», основанное на их предварительных знаниях. Поэтому предложение, которое, по-видимому, не имеет синтаксического смысла, может иметь значение при использовании семантических сигналов.

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

  5. Предложение «Детские молочные напитки» не имеет синтаксического значения, но с помощью семантики большинство людей интерпретируют его как означающее «Ребенок пьет молоко», так как наши предварительные знания говорят нам, что ребенок пьет молоко, и поэтому мы можем найти значение из ключевые слова

Прадип Бхатт
источник
1
Upvote для всего, кроме последнего (пункт 5)
Nawfal
-2

Синтаксис и семантика подобны стратегии и тактике или слева и справа .

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

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

Сору
источник
4
Что это за эзотерическая БС? Как слева и справа? Нравится стратегия и тактика? Может быть, даже как Инь и Ян, Бог и Дьявол, Гарри и Волдеморт?
JensG
-3

Синтаксис - это то, что понимает компьютер, семантика - это то, что понимает человек.

Компилятор / интерпретатор не заботится о вашем дизайне, и в любом коде, скомпилированном до машинного уровня, вам будет сложно определить дизайн. Разработчики заботятся о дизайне, потому что хороший дизайн - это снижение сложности путем абстрагирования сложных поведений и взаимодействий, а различные виды проблем поддаются различной семантике. Выбор языка во многом зависит от того, насколько легко и эффективно семантика, которую вы хотите использовать, может быть выражена в ее синтаксисе.

kylben
источник
«Синтаксис - это то, что понимает компьютер, семантика - это то, что понимает человек», - это большое упрощение. Люди тоже понимают синтаксис, а компьютеры понимают некоторые виды семантики.
CesarGon
4
Совершенно неправильно. Существуют языки с идентичным синтаксисом и совершенно другой семантикой (например, нетерпеливые и ленивые версии одного и того же языка), есть языки практически без синтаксиса и очень богатой и изменчивой семантикой (например, Forth и Lisp). Семантика - это то, как компилятор интерпретирует ваш язык. Человек может ничего не знать об этом и все же быть в состоянии использовать язык.
SK-logic
@ SK-логика, ты сам себе противоречишь. Если разные семантики могут быть выражены одним и тем же синтаксисом, то ясно, что семантика содержится не в синтаксисе, а в том, как он используется. Тем не менее, компилятор имеет только синтаксис для работы. Он не интерпретирует семантику, он интерпретирует синтаксис. Он не компилирует один и тот же синтаксис по-разному в зависимости от того, что хотел сказать разработчик, а только от того, что он напечатал. Семантика предоставляется разработчиком и имеет для него значение.
kylben
3
@kylben, я не противоречу себе, потому что я никогда не говорил, что синтаксис и семантика даже связаны. И компилятор ничего не делает с синтаксисом сразу после этапа синтаксического анализа - компилятор реализует семантику . Очевидно, что ваша интерпретация терминологии неверна. Прочитайте это для начала: en.wikipedia.org/wiki/Denotational_semantics
SK-logic
3
Вы говорите о значении программы , которая является «семантикой», как ее определил бы лингвист. Но в информатике семантика - это значение языка , а не конкретной программы.
SK-logic
-3

Очень короткий пример с "обычным c":

void main()
{
  int a = 10;
  int x = a - 1;
  int y = - 1;

  printf("x = %i", x);
  printf("y = %i", y);
    getch();
}

В этом примере синтаксис для токена «-» одинаков, но имеет различное значение («семантическое») в зависимости от того, где он используется.

В присвоении «х» «-» означает операцию «вычитание», в назначении «у» «-» означает операцию «знак минуса».

umlcat
источник
3
Неправильно. Два -оператора - это один и тот же токен , но синтаксически они разные, потому что они используются в разных контекстах. 0 - 1соответствует правилу синтаксиса additive-expression: additive-expression - multiplicative-expression, а - 1соответствует правилу синтаксиса unary-expression: unary-operator cast-expression(ссылка: стандарт C99).
Кит Томпсон
@ Кит Томпсон: Вы пропустили суть. Это вопрос семантики или синтаксиса, а не вопрос стандартов Си. Стандарт верен, но мой ответ был направлен на объяснение концепции, а не буквально следования стандарту. Это похоже на вопрос «Капитан Кирк» и «Доктор Спок». Приветствия ;-)
umlcat
Я не согласен. Различие между -этими двумя операторами является синтаксическим, а не только семантическим (хотя они также имеют различную семантику). Синтаксис определяется грамматикой языка, а два оператора указываются в разных разделах грамматики. См. Проект N1570 , раздел 6.5.3 для унарных операторов и 6.5.6 для аддитивных операторов. (Кстати, если вы собираетесь использовать пример на C, он, вероятно, должен быть правильным; void main()должно быть int main(void), и вы пропустили, #include <stdio.h>и какой бы заголовок ни объявлялgetch
Кит Томпсон,
Чтобы прояснить ситуацию, синтаксис - это не просто последовательность токенов, а то, как эти токены создают более крупные конструкции. Компилятор обычно имеет лексический анализатор (токенизатор) и синтаксический анализатор как отдельные компоненты; оба они имеют дело с синтаксисом.
Кит Томпсон