Я всегда думал, что ссылаться на синтаксис языка было то же самое, что ссылаться на семантику языка. Но мне сообщили, что, видимо, это не так. Какая разница?
Я всегда думал, что ссылаться на синтаксис языка было то же самое, что ссылаться на семантику языка. Но мне сообщили, что, видимо, это не так. Какая разница?
Ответы:
Семантика ~ Значение
Синтаксис ~ Символическое представление
Таким образом, две программы, написанные на разных языках, могут выполнять одно и то же (семантика), но символы, используемые для написания программы, будут разными (синтаксис).
Компилятор проверит ваш синтаксис для вас (ошибки времени компиляции) и выведет семантику из правил языка (скажем, сопоставление синтаксиса с машинными инструкциями), но не найдет все семантические ошибки (ошибки времени выполнения, например, вычисление неверный результат, потому что код говорит добавить 1 вместо добавления 2).
x + y
там, где нет подходящего +
оператора для этих операндов). Добавление 1 вместо 2 - это то, что я бы назвал логической ошибкой.
На самом деле существует не два уровня, а три:
i
и f
производит if
)if
, (
, 42
, ==
, answer
и )
производят условный оператор)ValidIdentifier
терминал, который можно определить как что-то вроде ![AnyKeyword] [Identifier]
(здесь я использую PEG-подобную запись). Вам не нужен отдельный проход для такого языка. См., Например, основанные на GLR синтаксические анализаторы C ++.
Семантика описывает логические сущности языка программирования и их взаимодействия. Синтаксис определяет, как они выражаются в символах.
Например, концепция арифметики указателей является частью семантики C; то , как +
и -
операторы могут быть использованы для выражения операций с указателями являются частью синтаксиса.
Иногда два языка разделяют часть своей семантики, но синтаксис сильно отличается (например, C # и VB.NET - оба используют типы значений и ссылочные типы, но символы, которые вы вводите для их определения, различны); в других случаях два языка синтаксически похожи, но семантика не совпадает (рассмотрите Java против JavaScript, где сходство часто путает новичков).
Синтаксис - это то, как вы размещаете лексемы языка. Семантика - это то, что означают эти токены (обычно, что означает конкретное расположение токенов).
Вы не указали, ссылаетесь ли вы только на языки программирования или на общие языки, используемые в программировании, поэтому я отвечаю на вопрос о языках данных (таких как XML, RDF, системы типов данных и т. Д.):
Брайан Л. Мик в своих семи золотых правилах разработки стандартов, не зависящих от языка (1995), пишет, что «синтаксис одного языка может быть семантикой другого» . Он ссылается на слова «синтаксис» и «семантика», используемые в описании данных: поэтому, если вы наткнетесь на эти слова в спецификации какого-либо формата данных, вам следует лучше заменить оба слова на «Potrzebie», чтобы прояснить, что вы должны работать смысл для себя.
Соотношение между синтаксисом и семантикой, по крайней мере, в точно определенных данных, может быть лучше описано термином «кодирование» . Семантика закодирована в синтаксисе. Поскольку записи могут быть вложенными, синтаксис одного языка является семантикой другого. Если человек выходит за пределы области данных, это вложение может быть практически бесконечным, как это описывает Умберто Эко как «неограниченный семиозис».
Чтобы привести пример:
Люди обычно останавливаются на каком-то уровне и воспринимают это как семантику, но в конце концов нет окончательной семантики, если только какой-то человек не интерпретирует данные в своем уме. Как только кто-то пытается выразить семантику в форме данных, он становится синтаксисом.
Если это можно описать в BNF (форма Бэкуса-Наура) или что-то подобное, это синтаксис. Если нет, то нет.
Семантика, с другой стороны, касается значения программы (или другого фрагмента исходного кода).
И иногда грань между ними может быть размытой.
Один из способов понять это различие состоит в том, чтобы посмотреть, какие ошибки вы получаете, если синтаксис или семантика вашей программы неверны.
Синтаксическая ошибка - это неспособность исходного кода соответствовать грамматике языка, например, отсутствие точки с запятой там, где требуется.
Семантическая ошибка - это неспособность удовлетворить требования других языков (то, что C, например, называет «ограничениями»); Примером может быть запись x + y
где x
и y
имеют несовместимые типы. Языковая грамматика говорит о том, что сложение выглядит something + something
, но оно недостаточно мощное, чтобы выразить требования к типам левого и правого операндов.
(Логические ошибки, такие как использование 1, где 2 будет правильным, как правило, не обнаруживаются компилятором - хотя в некоторых случаях компилятор может предупреждать о сомнительном коде.)
Синтаксис - это то, что говорят (лексические) символы. Семантика это то, что они имеют в виду.
Рассмотреть возможность:
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
- Тот же синтаксис, другая семантика (для целых чисел).
Синтаксис - это грамматическое расположение слов в предложении, т.е. порядок слов.
(Английский) ' cat dog boy ' и (программирование) ' hi.5 ' не являются синтаксически правильными.
(Английский) ' cat hugs boy ' и (программирование) '* 3.2 * 5 *' синтаксически допустимы.
Статическая семантика - имеет ли смысл синтаксически допустимые операторы.
(Английский) « Я большой » (программирование) (python) « 3 +« привет » синтаксически правильно, но имеет статическую семантическую ошибку.
Семантика - это значение, связанное с синтаксически правильной строкой символов без статической семантической ошибки, т. Е. Предложение синтаксически и семантически правильно, но его значение может не соответствовать тому, что предполагалось.
(Английский) « Летающие самолеты могут быть опасными » могут иметь два значения, то есть летающие самолеты могут быть опасными или летающие самолеты могут быть опасными.
(Программирование) 'компьютер не будет генерировать никаких сообщений об ошибках, но он не будет делать то, что вы сказали; это будет делать что-то еще.
Источник : MIT 6.00.1
Синтаксис относится к формальным правилам, регулирующим построение допустимых утверждений на языке. Семантика относится к набору правил, которые придают смысл утверждению.
Ошибки, связанные с синтаксисом, возникают в программе, когда правила языка программирования нарушаются или используются неправильно. Ошибки из-за семантики возникают в программе, когда операторы не имеют смысла.
Порядок слов является основным принципом синтаксиса, те, кто пытается понять написанное, используют синтаксические сигналы порядка слов, чтобы помочь придать структуре и значению предложения. Семантика - это индивидуальное толкование человеком значения «предложения», основанное на их предварительных знаниях. Поэтому предложение, которое, по-видимому, не имеет синтаксического смысла, может иметь значение при использовании семантических сигналов.
Синтаксис касается только того, что является лингвистически и грамматически правильным. Семантика требует всех предварительных знаний, которые выходят далеко за рамки специфического языка.
Предложение «Детские молочные напитки» не имеет синтаксического значения, но с помощью семантики большинство людей интерпретируют его как означающее «Ребенок пьет молоко», так как наши предварительные знания говорят нам, что ребенок пьет молоко, и поэтому мы можем найти значение из ключевые слова
Синтаксис и семантика подобны стратегии и тактике или слева и справа .
Они не являются действительно независимыми универсальными понятиями, но представляют собой связанную пару слов, которые, когда вы находитесь в определенном контексте, указывают на противоположные направления. Но то же самое, что стратегия в одном масштабе - это тактика в другом.
Поэтому, если вы пишете код на языке, синтаксис - это язык, который вы используете, а желаемое поведение - семантика. Но если вы реализуете или обсуждаете компилятор для этого языка, то синтаксис - это грамматика и, возможно, система типов и семантика всего, что построено на этом. И так далее.
Синтаксис - это то, что понимает компьютер, семантика - это то, что понимает человек.
Компилятор / интерпретатор не заботится о вашем дизайне, и в любом коде, скомпилированном до машинного уровня, вам будет сложно определить дизайн. Разработчики заботятся о дизайне, потому что хороший дизайн - это снижение сложности путем абстрагирования сложных поведений и взаимодействий, а различные виды проблем поддаются различной семантике. Выбор языка во многом зависит от того, насколько легко и эффективно семантика, которую вы хотите использовать, может быть выражена в ее синтаксисе.
Очень короткий пример с "обычным c":
void main()
{
int a = 10;
int x = a - 1;
int y = - 1;
printf("x = %i", x);
printf("y = %i", y);
getch();
}
В этом примере синтаксис для токена «-» одинаков, но имеет различное значение («семантическое») в зависимости от того, где он используется.
В присвоении «х» «-» означает операцию «вычитание», в назначении «у» «-» означает операцию «знак минуса».
-
оператора - это один и тот же токен , но синтаксически они разные, потому что они используются в разных контекстах. 0 - 1
соответствует правилу синтаксиса additive-expression: additive-expression - multiplicative-expression
, а - 1
соответствует правилу синтаксиса unary-expression: unary-operator cast-expression
(ссылка: стандарт C99).
-
этими двумя операторами является синтаксическим, а не только семантическим (хотя они также имеют различную семантику). Синтаксис определяется грамматикой языка, а два оператора указываются в разных разделах грамматики. См. Проект N1570 , раздел 6.5.3 для унарных операторов и 6.5.6 для аддитивных операторов. (Кстати, если вы собираетесь использовать пример на C, он, вероятно, должен быть правильным; void main()
должно быть int main(void)
, и вы пропустили, #include <stdio.h>
и какой бы заголовок ни объявлялgetch