Ответы:
Синтаксис - это структура или грамматика языка. Он отвечает на вопрос: как построить правильное предложение? Все языки, даже английский и другие человеческие (также известные как «естественные») языки имеют грамматику, то есть правила, которые определяют, правильно ли построено предложение.
Вот некоторые правила синтаксиса языка C:
Семантика - это значение предложения. Он отвечает на вопросы: действительно ли это предложение? Если да, то что означает это предложение? Например:
x++; // increment
foo(xyz, --b, &qrs); // call foo
являются синтаксически допустимыми операторами C. Но что они означают? Допустимо ли вообще пытаться преобразовать эти операторы в исполняемую последовательность инструкций? Эти вопросы лежат в основе семантики.
Рассмотрим оператор ++ в первом утверждении. Прежде всего, допустимо ли даже пытаться это сделать?
Наконец, обратите внимание, что некоторая семантика не может быть определена во время компиляции и поэтому должна быть оценена во время выполнения. В примере с оператором ++, если x уже имеет максимальное значение для своего типа данных, что произойдет, когда вы попытаетесь добавить к нему 1? Другой пример: что произойдет, если ваша программа попытается разыменовать указатель, значение которого равно NULL?
Таким образом, синтаксис - это концепция, которая касается только того, действительно ли предложение для грамматики языка. Семантика заключается в том, имеет ли предложение действительное значение.
x
это максимальное значение для его данных и 1
добавляется к нему, это приводит к некоторому странному выводу ( 0
), не является ли это семантической ошибкой?
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 ).
Синтаксис относится к структуре языка, прослеживая его этимологию до того, как все устроено вместе.
Например, вам может потребоваться составить код, объявив тип, затем имя, а затем точку с запятой, чтобы быть синтаксически правильным.
Type token;
С другой стороны, семантика имеет значение. Компилятор или интерпретатор могут пожаловаться на синтаксические ошибки. Ваши коллеги будут жаловаться на семантику.
В Википедии есть ответ. Читайте вики-страницы по синтаксису (языки программирования) и семантике (информатика) .
Или подумайте о работе любого компилятора или интерпретатора . Первым шагом является лексический анализ, при котором токены генерируются путем разделения строки на лексемы и последующего синтаксического анализа , которые создают некоторое абстрактное синтаксическое дерево (которое является представлением синтаксиса). Следующие шаги включают преобразование или оценку этой AST (семантики).
Также обратите внимание, что если вы определили вариант C, где каждое ключевое слово было преобразовано в его французский эквивалент (то есть if
становление si
, do
становление faire
, else
становление и sinon
т. Д. И т. Д.), Вы определенно измените синтаксис своего языка, но вы не сильно измените семантика: программировать на этом французском C не будет легче!
Семантика - это то, что означает ваш код, то, что вы могли бы описать псевдокодом. Синтаксис - это фактическая структура - от имен переменных до точек с запятой.
Синтаксис - это структура или форма выражений, операторов и программных модулей, но семантика - это значение этих выражений, операторов и программных модулей. Семантика прямо вытекает из синтаксиса . Синтаксис относится к структуре / форме кода, который определяет конкретный язык программирования, но семантика имеет дело со значением, присвоенным символам, символам и словам.
Синтаксис языка программирования является формой его выражения, заявлений и программных модулей. Его семантика - это значение этих выражений, операторов и программных модулей. Например, синтаксис оператора while в Java:
while (boolean_expr) statement
Семантика этой формы оператора заключается в том, что когда текущее значение логического выражения истинно, внедренный оператор выполняется. Затем управление неявно возвращается к логическому выражению, чтобы повторить процесс. Если логическое выражение ложно, управление передается инструкции, следующей за конструкцией while.
Синтаксис: относится к грамматической структуре языка .. Если вы пишете на языке c. Вы должны очень осторожно использовать типы данных, токены [это может быть буквальное значение или символ, например «printf ()». Он имеет 3 токена, «printf, (,)»]. Точно так же вы должны очень внимательно следить за тем, как вы используете функцию, синтаксис функции, объявление функции, определение, инициализацию и ее вызов.
Хотя семантика, это относится к логике или концепции предложения или утверждений. Если вы говорите или пишете что-то исходя из концепции или логики, вы ошибаетесь семантически.
Обычно синтаксический и семантический анализ кода выполняется во «внешней» части компилятора.
Синтаксис: Компилятор генерирует токены для каждого ключевого слова и символов: токен содержит информационный тип ключевого слова и его расположение в коде. Используя эти токены, создается и анализируется AST (сокращение от Abstract Syntax Tree). Что компилятор здесь на самом деле проверяет, так это то, является ли код лексически значимым, т.е. соответствует ли «последовательность ключевых слов» правилам языка? Как было предложено в предыдущих ответах, вы можете рассматривать это как грамматику языка (а не смысл / значение кода). Боковое примечание: на этом этапе сообщается об ошибках синтаксиса. (Возвращает в систему токены с типом ошибки)
Семантика: теперь компилятор проверит, «имеет ли смысл» ваши операции с кодом. например, если язык поддерживает вывод типа, будет сообщено о сематической ошибке, если вы попытаетесь назначить строку для числа с плавающей запятой. ИЛИ дважды объявить одну и ту же переменную. Это ошибки, которые «грамматически» / синтаксически правильны, но не имеют смысла во время операции. Боковое примечание: для проверки того, объявляется ли одна и та же переменная дважды, компилятор управляет таблицей символов
Итак, результатом этих двух фаз внешнего интерфейса является аннотированный AST (с типами данных) и таблица символов.
Учитывая нормальный язык, который мы используем; здесь, английский:
Например, он ходит в школу. - Неправильная грамматика / синтаксис, хотя он хотел передать правильный смысл / семантику.
например, он идет на холод. прилагательное - холод. По-английски мы могли бы сказать, что это не соответствует грамматике, но на самом деле это самый близкий пример неправильной семантики с правильным синтаксисом, который я мог придумать.