Відповіді:
Синтаксис - це про будову або граматику мови. Він відповідає на питання: як я будую дійсне речення? Усі мови, навіть англійська та інші людські (також "природні") мови, мають граматики, тобто правила, які визначають, чи правильно побудовано речення.
Ось кілька правил синтаксису мови 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 не буде простішим!
Семантика - це те, що означає ваш код - те, що ви можете описати в псевдо-коді. Синтаксис - це фактична структура - все - від змінних імен до напівколонок.
Синтаксис - це структура або форма виразів, висловлювань та програмних одиниць, але семантика - це значення цих виразів, висловлювань та програмних одиниць. Семантика випливає безпосередньо з синтаксису . Синтаксис посилається на структуру / форму коду, яку конкретна мова програмування визначає, але семантика має справу зі значенням, присвоєним символам, символам та словам.
Синтаксис мови програмування є формою його вираження, заяв і програмних модулів. Його семантика - значення цих виразів, висловлювань та програмних одиниць. Наприклад, синтаксис оператора Java while
while (boolean_expr) statement
Семантика цієї форми тверджень полягає в тому, що коли поточне значення булевого виразу є істинним, вбудований вислів виконується. Потім контроль неявно повертається до булевого виразу, щоб повторити процес. Якщо вираз Boolean хибний, контроль передає оператору, наступному за конструкцією while.
Синтаксис: Мається на увазі граматична структура мови .. Якщо ви пишете мову c. Ви повинні дуже дбати про використання типів даних, лексем [це може бути буквально або символом типу "printf ()". Він має 3 знаки, "printf, (,)"]. Таким же чином, ви повинні бути дуже обережними, як ви використовуєте функцію, синтаксис функції, оголошення функції, визначення, ініціалізацію та виклик її.
У той час як семантика стосується логіки чи поняття речення чи висловлювань. Якщо ви говорите чи пишете щось поза поняттям або логікою, то ви семантично помиляєтесь.
Зазвичай аналіз синтаксису та семантики коду проводиться в частині 'frontend' компілятора.
Синтаксис: Компілятор генерує маркери для кожного ключового слова та символів: маркер містить тип інформації ключового слова та його розташування в коді. За допомогою цих лексем створюється та аналізується AST (короткий текст для абстрактного синтаксичного дерева). Що компілятор насправді перевіряє, чи є код лексично значущим, тобто чи відповідає "послідовність ключових слів" мовним правилам? Як було запропоновано в попередніх відповідях, ви можете бачити це як граматику мови (а не сенс / значення коду). Побічна примітка: на цій фазі повідомляються про синтаксичні помилки (повертає маркери з типом помилки в систему)
Семантика: Тепер компілятор перевірить, чи має сенс ваші операції з кодом. Наприклад, якщо мова підтримує тип виводу, про помилку буде повідомлено про помилку, якщо ви намагаєтеся призначити рядок float. АБО оголосити одну і ту ж змінну двічі. Це помилки, які є "граматично" / синтаксично правильними, але не мають сенсу під час операції. Бічна примітка: Щоб перевірити, чи однакова змінна оголошена двічі, компілятор управляє таблицею символів
Отже, висновок цих двох фаз фронтену - це анотація AST (з типами даних) та таблиця символів.
Враховуючи нормальну мову, якою ми користуємося; тут, англійська:
наприклад, Він ходить до школи. - Неправильна граматика / синтаксис, хоча він хотів передати правильний сенс / семантичний.
наприклад, Він йде на холод. - холод - прикметник. Англійською мовою ми можемо сказати, що це не відповідає граматиці, але насправді це найближчий приклад неправильної семантики з правильним синтаксисом, про який я міг би придумати.