Яка різниця між синтаксисом та семантикою в мовах програмування?


120

Яка різниця між синтаксисом і семантикою в мовах програмування (наприклад, C, C ++)?


2
Я хотів би проголосувати, але жодних зусиль для дослідження не очевидно.
недійсне

Відповіді:


201

Синтаксис - це про будову або граматику мови. Він відповідає на питання: як я будую дійсне речення? Усі мови, навіть англійська та інші людські (також "природні") мови, мають граматики, тобто правила, які визначають, чи правильно побудовано речення.

Ось кілька правил синтаксису мови 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), чи не семантична помилка?
хакі

Розглянемо одометр у транспортному засобі - на ньому є ряд взаємопов’язаних коліс з цифрами від 0 до 9, надрукованими на кожному. Найправіше колесо обертається найшвидше; коли він завертається з 9 назад до нуля, колесо до його прямого лівого просування рухається на одиницю. Коли це колесо просувається від 9 до 0, ліве ліворуч і так далі.
Jeff N

Тип даних схожий на колесо одометра: він може містити лише певне значення. Коли максимальне значення буде досягнуто, наступний заздалегідь примушує колесо повернутися до нуля. Чи це семантична помилка чи ні, залежить від мовних правил. У цьому випадку вам потрібно повернутися до стандарту мови С. Я не знаю точно, що говорить стандарт мови 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 ).
Даніель Н

"зауважте, що деяку семантику не можна визначити під час компіляції, і тому її необхідно оцінювати під час виконання" - мені подобається, як це має паралель природним мовам. Ви не можете знати значення деяких фраз без контексту. Наприклад, у фразі "Йому подобаються банани" значення "він" залежить від контексту.
ymln

21

Синтаксис посилається на структуру мови, простежуючи її етимологію до того, як складаються речі.
Наприклад, вам може знадобитися код, який потрібно скласти, оголосивши тип, а потім ім'я, а потім крапкою з комою, щоб бути синтаксично правильним.

Type token;

З іншого боку, семантика - це значення. Компілятор або інтерпретатор може скаржитися на синтаксичні помилки. Ваші колеги будуть скаржитися на семантику.


@ Talespin_Kit означає, а не структуру: логіка - це швидше абстракція, наприклад, P => Q, тощо або !! P = P, але коли ви додаєте семантику, речі можуть мати тонкощі, якщо P "щасливий", то !! P - це "я" 'не не щасливий'! = "Я щасливий"
doctorlove

5
+1 для "Компілятор або інтерпретатор може поскаржитися на синтаксичні помилки. Ваші колеги будуть скаржитися на семантику."
GeekyJ

11

У Вікіпедії є відповідь. Читання синтаксису (мови програмування) та семантики (інформатика) .

Або подумайте про роботу будь-якого упорядника чи перекладача . Перший крок - це лексичний аналіз, де лексеми генеруються шляхом поділу рядка на лексеми, потім розбору , які будують деяке абстрактне синтаксичне дерево (що є поданням синтаксису). Наступні кроки включають перетворення або оцінку цих AST (семантики).

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


8

Семантика - це те, що означає ваш код - те, що ви можете описати в псевдо-коді. Синтаксис - це фактична структура - все - від змінних імен до напівколонок.


Це розмова між різними людьми? Або це лише одна посада? Я не розумію. Напр. "Поняття не має, що має означати наступне. Більше помилок не могло бути".
подвійнийокт

5

Синтаксис - це структура або форма виразів, висловлювань та програмних одиниць, але семантика - це значення цих виразів, висловлювань та програмних одиниць. Семантика випливає безпосередньо з синтаксису . Синтаксис посилається на структуру / форму коду, яку конкретна мова програмування визначає, але семантика має справу зі значенням, присвоєним символам, символам та словам.


5
  • Для компіляції потрібен правильний синтаксис .
  • Вам потрібна правильна семантика, щоб вона працювала.

1

Синтаксис мови програмування є формою його вираження, заяв і програмних модулів. Його семантика - значення цих виразів, висловлювань та програмних одиниць. Наприклад, синтаксис оператора Java while

while (boolean_expr) statement

Семантика цієї форми тверджень полягає в тому, що коли поточне значення булевого виразу є істинним, вбудований вислів виконується. Потім контроль неявно повертається до булевого виразу, щоб повторити процес. Якщо вираз Boolean хибний, контроль передає оператору, наступному за конструкцією while.


1

Синтаксис: Мається на увазі граматична структура мови .. Якщо ви пишете мову c. Ви повинні дуже дбати про використання типів даних, лексем [це може бути буквально або символом типу "printf ()". Він має 3 знаки, "printf, (,)"]. Таким же чином, ви повинні бути дуже обережними, як ви використовуєте функцію, синтаксис функції, оголошення функції, визначення, ініціалізацію та виклик її.

У той час як семантика стосується логіки чи поняття речення чи висловлювань. Якщо ви говорите чи пишете щось поза поняттям або логікою, то ви семантично помиляєтесь.


1

Розуміння того, як компілятор бачить код

Зазвичай аналіз синтаксису та семантики коду проводиться в частині 'frontend' компілятора.

  • Синтаксис: Компілятор генерує маркери для кожного ключового слова та символів: маркер містить тип інформації ключового слова та його розташування в коді. За допомогою цих лексем створюється та аналізується AST (короткий текст для абстрактного синтаксичного дерева). Що компілятор насправді перевіряє, чи є код лексично значущим, тобто чи відповідає "послідовність ключових слів" мовним правилам? Як було запропоновано в попередніх відповідях, ви можете бачити це як граматику мови (а не сенс / значення коду). Побічна примітка: на цій фазі повідомляються про синтаксичні помилки (повертає маркери з типом помилки в систему)

  • Семантика: Тепер компілятор перевірить, чи має сенс ваші операції з кодом. Наприклад, якщо мова підтримує тип виводу, про помилку буде повідомлено про помилку, якщо ви намагаєтеся призначити рядок float. АБО оголосити одну і ту ж змінну двічі. Це помилки, які є "граматично" / синтаксично правильними, але не мають сенсу під час операції. Бічна примітка: Щоб перевірити, чи однакова змінна оголошена двічі, компілятор управляє таблицею символів

Отже, висновок цих двох фаз фронтену - це анотація AST (з типами даних) та таблиця символів.

Розуміння цього менш технічним способом

Враховуючи нормальну мову, якою ми користуємося; тут, англійська:

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

наприклад, Він йде на холод. - холод - прикметник. Англійською мовою ми можемо сказати, що це не відповідає граматиці, але насправді це найближчий приклад неправильної семантики з правильним синтаксисом, про який я міг би придумати.


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