В чем разница между синтаксисом и семантикой в ​​языках программирования?


121

В чем разница между синтаксисом и семантикой в языках программирования (например, C, C ++)?


2
Я хотел бы проголосовать за, но никаких исследований нет.
null

Ответы:


202

Синтаксис - это структура или грамматика языка. Он отвечает на вопрос: как построить правильное предложение? Все языки, даже английский и другие человеческие (также известные как «естественные») языки имеют грамматику, то есть правила, которые определяют, правильно ли построено предложение.

Вот некоторые правила синтаксиса языка C:

  • отдельные утверждения с точкой с запятой
  • заключите условное выражение оператора IF в круглые скобки
  • сгруппируйте несколько операторов в один оператор, заключив их в фигурные скобки
  • типы данных и переменные должны быть объявлены перед первым исполняемым оператором (эта функция была удалена в C99. C99 и последний допускают объявления смешанных типов).

Семантика - это значение предложения. Он отвечает на вопросы: действительно ли это предложение? Если да, то что означает это предложение? Например:

x++;                  // increment
foo(xyz, --b, &qrs);  // call foo

являются синтаксически допустимыми операторами C. Но что они означают? Допустимо ли вообще пытаться преобразовать эти операторы в исполняемую последовательность инструкций? Эти вопросы лежат в основе семантики.

Рассмотрим оператор ++ в первом утверждении. Прежде всего, допустимо ли даже пытаться это сделать?

  • Если x является типом данных с плавающей запятой, этот оператор не имеет смысла (согласно правилам языка C) и, следовательно, является ошибкой, даже если оператор синтаксически правильный.
  • Если x является указателем на некоторый тип данных , смысл инструкции состоит в том, чтобы «добавить sizeof ( некоторый тип данных ) к значению по адресу x и сохранить результат в месте по адресу x».
  • Если x является скаляром, смысл оператора следующий: «добавить единицу к значению по адресу x и сохранить результат в месте по адресу x».

Наконец, обратите внимание, что некоторая семантика не может быть определена во время компиляции и поэтому должна быть оценена во время выполнения. В примере с оператором ++, если x уже имеет максимальное значение для своего типа данных, что произойдет, когда вы попытаетесь добавить к нему 1? Другой пример: что произойдет, если ваша программа попытается разыменовать указатель, значение которого равно NULL?

Таким образом, синтаксис - это концепция, которая касается только того, действительно ли предложение для грамматики языка. Семантика заключается в том, имеет ли предложение действительное значение.


ХОРОШО. Если xэто максимальное значение для его данных и 1добавляется к нему, это приводит к некоторому странному выводу ( 0), не является ли это семантической ошибкой?
haccks

Рассмотрим одометр в автомобиле - он имеет ряд взаимосвязанных колес, на каждом из которых нанесены цифры от 0 до 9. Самое правое колесо вращается быстрее всех; когда он переходит с 9 обратно на ноль, колесо слева от него перемещается на единицу. Когда это колесо перемещается от 9 до 0, перемещается колесо слева и так далее.
Jeff N

Тип данных похож на колесо одометра: он может удерживать только определенное значение. Когда достигается максимальное значение, при следующем продвижении колесо возвращается в нулевое положение. Является ли это семантической ошибкой или нет, зависит от языковых правил. В этом случае вам нужно вернуться к стандарту языка C. Я не знаю точно, что говорит стандарт языка C, но вот некоторые из вариантов. Переполнение - это: -не ошибка; результат нулевой. -ошибка; компилятор ДОЛЖЕН генерировать исключение переполнения. -НЕОПРЕДЕЛЕННО; компилятор может делать все, что захочет.
Jeff N

2
В случае, если кого-то интересует конкретный пример, переполнение без знака определяется как модульная арифметика (так UINT_MAX + 1 == 0). Подписанное переполнение не определено. Современные компиляторы обычно имеют INT_MAX + 1 == INT_MIN, но бывают случаи , вы не можете рассчитывать на это (например , for (i = 0; i <= N; ++i) { ... }где Nнаходится INT_MAXне бесконечен в зависимости от оптимизации, см blog.llvm.org/2011/05/what-every-c-programmer-should-know. html ).
Daniel H

«обратите внимание, что некоторая семантика не может быть определена во время компиляции и поэтому должна быть оценена во время выполнения» - мне нравится, как это имеет параллель с естественными языками. Вы не можете узнать значение некоторых фраз без контекста. Например, во фразе «Он любит бананы» значение слова «он» зависит от контекста.
ymln

22

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

Type token;

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


@Talespin_Kit означает, а не структуру: логика - это скорее абстракция, например, P => Q и т. Д. Или !! P = P, но когда вы добавляете семантику, вещи могут иметь тонкость, если P «счастлив», тогда !! P это «I 'm not un un-happy "! =" I'm happy "
doctorlove

6
+1 за «Компилятор или интерпретатор могут пожаловаться на синтаксические ошибки. Ваши коллеги будут жаловаться на семантику».
GeekyJ

11

В Википедии есть ответ. Читайте вики-страницы по синтаксису (языки программирования) и семантике (информатика) .

Или подумайте о работе любого компилятора или интерпретатора . Первым шагом является лексический анализ, при котором токены генерируются путем разделения строки на лексемы и последующего синтаксического анализа , которые создают некоторое абстрактное синтаксическое дерево (которое является представлением синтаксиса). Следующие шаги включают преобразование или оценку этой AST (семантики).

Также обратите внимание, что если вы определили вариант C, где каждое ключевое слово было преобразовано в его французский эквивалент (то есть ifстановление si, doстановление faire, elseстановление и sinonт. Д. И т. Д.), Вы определенно измените синтаксис своего языка, но вы не сильно измените семантика: программировать на этом французском C не будет легче!


9

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


Это разговор разных людей? Или это всего лишь один пост? Я не понимаю. Например, «Не знаю, что должно означать следующее. Это не могло быть более неправильным».
doubleOrt


5

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


1

Синтаксис языка программирования является формой его выражения, заявлений и программных модулей. Его семантика - это значение этих выражений, операторов и программных модулей. Например, синтаксис оператора while в Java:

while (boolean_expr) statement

Семантика этой формы оператора заключается в том, что когда текущее значение логического выражения истинно, внедренный оператор выполняется. Затем управление неявно возвращается к логическому выражению, чтобы повторить процесс. Если логическое выражение ложно, управление передается инструкции, следующей за конструкцией while.


1

Синтаксис: относится к грамматической структуре языка .. Если вы пишете на языке c. Вы должны очень осторожно использовать типы данных, токены [это может быть буквальное значение или символ, например «printf ()». Он имеет 3 токена, «printf, (,)»]. Точно так же вы должны очень внимательно следить за тем, как вы используете функцию, синтаксис функции, объявление функции, определение, инициализацию и ее вызов.

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


1

Понимание того, как компилятор видит код

Обычно синтаксический и семантический анализ кода выполняется во «внешней» части компилятора.

  • Синтаксис: Компилятор генерирует токены для каждого ключевого слова и символов: токен содержит информационный тип ключевого слова и его расположение в коде. Используя эти токены, создается и анализируется AST (сокращение от Abstract Syntax Tree). Что компилятор здесь на самом деле проверяет, так это то, является ли код лексически значимым, т.е. соответствует ли «последовательность ключевых слов» правилам языка? Как было предложено в предыдущих ответах, вы можете рассматривать это как грамматику языка (а не смысл / значение кода). Боковое примечание: на этом этапе сообщается об ошибках синтаксиса. (Возвращает в систему токены с типом ошибки)

  • Семантика: теперь компилятор проверит, «имеет ли смысл» ваши операции с кодом. например, если язык поддерживает вывод типа, будет сообщено о сематической ошибке, если вы попытаетесь назначить строку для числа с плавающей запятой. ИЛИ дважды объявить одну и ту же переменную. Это ошибки, которые «грамматически» / синтаксически правильны, но не имеют смысла во время операции. Боковое примечание: для проверки того, объявляется ли одна и та же переменная дважды, компилятор управляет таблицей символов

Итак, результатом этих двух фаз внешнего интерфейса является аннотированный AST (с типами данных) и таблица символов.

Понимание этого менее техническим способом

Учитывая нормальный язык, который мы используем; здесь, английский:

Например, он ходит в школу. - Неправильная грамматика / синтаксис, хотя он хотел передать правильный смысл / семантику.

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


Компиляторы Эта ссылка может быть полезна, чтобы узнать больше
Vedant Panchal
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.