Я завжди думав, що посилання на синтаксис мови те саме, що посилання на семантику мови. Але мені повідомили, що, мабуть, це не так. Яка різниця?
Я завжди думав, що посилання на синтаксис мови те саме, що посилання на семантику мови. Але мені повідомили, що, мабуть, це не так. Яка різниця?
Відповіді:
Семантика ~ Значення
Синтаксис ~ Символічне подання
Тож дві програми, написані різними мовами, могли б робити те саме (семантика), але символи, які використовуються для написання програми, були б різними (синтаксис).
Компілятор перевірить ваш синтаксис (помилки часу компіляції) та виведе семантику з мовних правил (відображення синтаксису в машинних інструкціях), але не знайде всіх семантичних помилок (помилки під час виконання, наприклад обчислення неправильний результат, оскільки в коді написано додати 1, а не 2).
x + y
якщо +
для цих операндів немає відповідного оператора). Додавання 1, а не 2 - це те, що я б назвав логічною помилкою.
Насправді існує не два рівні, а три:
i
і f
виробляє if
)if
, (
, 42
, ==
, answer
і )
виробляють умовний оператор)ValidIdentifier
термінал, який можна визначити як щось на зразок ![AnyKeyword] [Identifier]
(тут я використовую PEG-подібні позначення). Вам не потрібен окремий лексичний пропуск для такої мови. Дивіться, наприклад, партери C ++ на базі GLR.
Семантика описує логічні сутності мови програмування та їх взаємодії. Синтаксис визначає, як вони виражаються символами.
Наприклад, поняття арифметики вказівника є частиною семантики С; те, як +
і -
оператори можуть бути використані для вираження операцій вказівника, є частиною його синтаксису.
Іноді дві мови поділяють частину своєї семантики, але синтаксис сильно відрізняється (наприклад, C # і VB.NET - обидва використовують значення значень і типи посилань, але символи, які ви вводите для їх визначення, відрізняються); в інших випадках дві мови синтаксично схожі, але семантика не збігається (розгляньте Java проти JavaScript, де подібності часто плутають початківців).
Синтаксис - це впорядкування лексеми мови. Семантика - це те, що означають ті лексеми (як правило, що означає певне розташування лексем).
Ви не вказали, чи посилаєтесь ви лише на мови програмування або на загальні мови, які використовуються в програмуванні, тому моя відповідь стосується мов даних (таких як XML, RDF, системи типів даних тощо):
Брайан Л. Мек у своїх семи золотих правилах створення стандартів, незалежних від мови (1995) пише, що «синтаксис однієї мови може бути семантикою іншого» . Він посилається на слова "синтаксис" і "семантичний", що використовуються в описі даних: тому якщо ви натрапите на ці слова в специфікації якогось формату даних, вам краще замінити обидва слова на "Potrzebie", щоб зрозуміти, що ви повинні працювати значення для себе.
Співвідношення між синтаксисом і семантикою, принаймні в точно вказаних даних, можна краще описати терміном "кодування" . Семантичний зашифрований у синтаксисі. Оскільки записи можуть бути вкладені, синтаксис однієї мови є семантикою іншого. Якщо виходити за межі сфери даних, це гніздування може бути практично нескінченним, як описано Умберто Еко як "необмежений семіоз".
Щоб навести приклад:
Люди зазвичай зупиняються на якомусь рівні і сприймають це як семантичне, але врешті-решт немає остаточної семантики, якщо якась людина не інтерпретує дані у своєму розумі. Як тільки людина намагається виразити семантичне у формі даних, він стає синтаксисом.
Якщо його можна описати в BNF (Backus-Naur Form) або щось подібне, це синтаксис. Якщо не може, це не так.
З іншого боку, семантика - це значення програми (або іншого фрагмента вихідного коду).
І іноді лінія між ними може бути розмитою.
Один із способів зрозуміти відмінність - це переглянути види помилок, які ви отримуєте, коли синтаксис або семантика вашої програми неправильні.
Помилка синтаксису - це невідповідність вихідного коду граматиці мови, наприклад, відсутність крапки з комою, де потрібна.
Семантична помилка - це невиконання інших вимог до мови (те, що C, наприклад, називає "обмеження"); прикладом може бути написання, x + y
де x
і y
є несумісні типи. Граматика мови говорить про те, що додаток виглядає так something + something
, але воно недостатньо потужне, щоб висловити вимоги щодо типів лівого та правого операндів.
(Логічні помилки, такі як використання 1, де було б правильно, компілятор, як правило, не виявляють - хоча в деяких випадках компілятор може попереджати про сумнівний код.)
Синтаксис - це те, про що говорять (лексичні) символи. Семантика - це те, що вони означають.
Поміркуйте:
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();
}
У цьому прикладі синтаксис символу "-" однаковий, але він має інше значення ("семантичний"), залежно від місця його використання.
У присвоєнні "x", "-" означає операцію "субстракція", У "а" асигнації "-" означає операцію "негативний знак".
-
оператора ті ж лексема , але вони синтаксично різні, тому що вони використовуються в різних контекстах. 0 - 1
відповідає правилу синтаксису additive-expression: additive-expression - multiplicative-expression
, тоді як - 1
відповідає правилу синтаксису unary-expression: unary-operator cast-expression
(посилання: стандарт C99).
-
ептера є синтаксичним, а не просто семантичним (хоча вони також мають різну семантику). Синтаксис визначається граматикою мови, а два оператори вказані в різних розділах граматики. Див. Проект N1570 , розділ 6.5.3 для одинарних операторів та 6.5.6 - для операторів добавок. (BTW, якщо ви збираєтесь використовувати приклад C, він, мабуть, має бути правильним; void main()
повинен бути int main(void)
, і ви не вистачаєте, #include <stdio.h>
і все, що заголовок оголошуєgetch