Zawsze uważałem, że odwołanie się do składni języka jest tym samym, co odwołanie się do semantyki języka. Ale zostałem poinformowany, że najwyraźniej tak nie jest. Co za różnica?
Zawsze uważałem, że odwołanie się do składni języka jest tym samym, co odwołanie się do semantyki języka. Ale zostałem poinformowany, że najwyraźniej tak nie jest. Co za różnica?
Odpowiedzi:
Semantyka ~ Znaczenie
Składnia ~ Reprezentacja symboliczna
Tak więc dwa programy napisane w różnych językach mogłyby zrobić to samo (semantyka), ale symbole użyte do napisania programu byłyby inne (składnia).
Kompilator sprawdzi Twoją składnię (błędy w czasie kompilacji) i wyprowadzi semantykę z reguł językowych (np. Odwzorowanie składni na instrukcje maszynowe), ale nie znajdzie wszystkich błędów semantycznych (błędów w czasie wykonywania, np. Obliczeń zły wynik, ponieważ kod mówi: dodaj 1 zamiast dodać 2).
x + y
gdy nie ma odpowiedniego +
operatora dla tych operandów). Dodanie 1 zamiast 2 jest tym, co nazwałbym błędem logicznym .
W rzeczywistości nie ma dwóch poziomów, ale trzy:
i
i f
produkuje if
)if
, (
, 42
, ==
, answer
i )
produkuje warunkową deklarację)ValidIdentifier
terminal, który można by zdefiniować jako coś podobnego ![AnyKeyword] [Identifier]
(używam tutaj notacji podobnej do PEG). Nie potrzebujesz osobnej przepustki leksykalnej dla takiego języka. Zobacz na przykład parsery C ++ oparte na GLR.
Semantyka opisuje logiczne byty języka programowania i ich interakcje. Składnia określa sposób ich wyrażania w znakach.
Na przykład koncepcja arytmetyki wskaźnika jest częścią semantyki języka C; sposób, w jaki operatory +
i -
mogą być używane do wyrażania operacji wskaźnika, jest częścią jego składni.
Czasami dwa języki dzielą część semantyki, ale składnia jest bardzo różna (np. C # i VB.NET - oba używają typów wartości i typów referencji, ale znaki, które wpisujesz, aby je zdefiniować, są różne); w innych przypadkach dwa języki są podobne pod względem składniowym, ale semantyka się nie zgadza (rozważmy Java vs. JavaScript, gdzie podobieństwa często mylą początkujących).
Składnia to sposób rozmieszczania tokenów języka. Semantyka jest tym, co oznaczają te tokeny (zwykle, co oznacza określony układ tokenów).
Nie określiłeś, czy odwołujesz się tylko do języków programowania, czy też do ogólnych języków używanych w programowaniu, więc moja odpowiedź dotyczy języków danych (takich jak XML, RDF, systemy typów danych itp.):
Brian L. Meek w swoich siedmiu złotych zasadach tworzenia niezależnych od języka standardów (1995) pisze, że „składnia jednego języka może być semantyką innego” . Odwołuje się do słów „składnia” i „semantyczny” używanych w opisie danych: więc jeśli natkniesz się na te słowa w specyfikacji jakiegoś formatu danych, lepiej zastąp oba słowa słowem „Potrzebie”, aby wyjaśnić, że musisz wypracować znaczenie dla siebie.
Zależność między składnią a semantyczną, przynajmniej w dokładnie określonych danych, można lepiej opisać terminem „kodowanie” . Semantyczny jest zakodowany w składni. Ponieważ nagrania można zagnieżdżać, składnia jednego języka jest semantyką drugiego. Jeśli ktoś wykracza poza sferę danych, zagnieżdżanie może być praktycznie nieskończone, jak opisuje Umberto Eco jako „nieograniczona semioza”.
Aby podać przykład:
Ludzie zwykle zatrzymują się na pewnym poziomie i traktują to jako semantyczne, ale ostatecznie nie ma ostatecznej semantycznej, chyba że jakaś istota ludzka interpretuje dane w jego umyśle. Gdy tylko spróbujemy wyrazić semantyczny w postaci danych, staje się on składnią.
Jeśli można to opisać w BNF (Backus-Naur Form) lub czymś podobnym, to jego składnia. Jeśli nie, to nie jest.
Z drugiej strony semantyka dotyczy znaczenia programu (lub innej części kodu źródłowego).
A czasami linia między nimi może być rozmyta.
Jednym ze sposobów zrozumienia tego rozróżnienia jest przyjrzenie się rodzajom błędów, które występują, gdy składnia lub semantyka programu jest nieprawidłowa.
Błąd składniowy to błąd w dopasowaniu kodu źródłowego do gramatyki języka, na przykład brak średnika, w którym jest wymagany.
Błąd semantyczny to niespełnienie innych wymagań językowych (co na przykład C nazywa „ograniczeniami”); przykładem może być pisanie x + y
gdzie x
i y
są niezgodnych typów. Gramatyka języka informuje, że dodatek wygląda something + something
, ale nie jest wystarczająco potężny, aby wyrazić wymagania dotyczące typów lewego i prawego operandu.
(Błędy logiczne, takie jak użycie 1, gdzie 2 byłoby poprawne, na ogół nie jest wykrywalne przez kompilator - chociaż w niektórych przypadkach kompilator może ostrzec o wątpliwym kodzie).
Składnia jest tym, co mówią symbole (leksykalne). Znaczenie semantyki.
Rozważać:
C #: condition ? true_value : false_value
VB.NET: If(condition, true_value, false_value)
- Inna składnia, ta sama semantyka.
C #: left_value / right_value
VB.NET: left_value / right_value
- Ta sama składnia, inna semantyka (dla liczb całkowitych).
Składnia to gramatyczne uporządkowanie słów w zdaniu, tj. Kolejność słów.
(Angielski) „ cat dog boy ” i (programowanie) „ hi.5 ” nie są poprawne składniowo.
(Angielski) „ cat hugs boy ” i (programowanie) „* 3.2 * 5 *” jest poprawne pod względem składniowym.
Semantyka statyczna to, czy stwierdzenia poprawne pod względem składniowym mają jakieś znaczenie.
(Angielski) „ I are big ” (programowanie) (python) „ 3 +„ hi ”jest poprawne składniowo, ale ma statyczny błąd semantyczny.
Semantyka jest znaczeniem związanym z poprawnym składniowo ciągiem symboli bez statycznego błędu semantycznego, tzn. Zdanie jest poprawne składniowo i semantycznie, ale jego znaczenie może nie być zgodne z przeznaczeniem.
(Polski) „ Latanie samolotami może być niebezpieczne ” może mieć dwa znaczenia, tzn. Latanie samolotami może być niebezpieczne lub samoloty, które latają, mogą być niebezpieczne.
(Programowanie) ”komputer nie wygeneruje żadnych komunikatów o błędach, ale nie zrobi tego, co mu kazałeś; zrobi coś innego.
Źródło : MIT 6.00.1
Składnia odnosi się do formalnych zasad rządzących konstruowaniem prawidłowych instrukcji w języku. Semantyka odnosi się do zestawu reguł, które nadają sens stwierdzeniu.
Błędy spowodowane składnią występują w programie, gdy ruele języka programowania są naruszane lub niewłaściwie używane. Błędy wynikające z semantyki występują w programie, gdy instrukcje nie mają znaczenia.
Porządek słów jest podstawową zasadą składni, a ci, którzy próbują zrozumieć, co jest napisane, używają składniowych wskazówek porządku słów, aby pomóc nadać strukturę i znaczenie zdaniu. Semantyka to indywidualna interpretacja znaczenia „zdania” na podstawie ich wcześniejszej wiedzy. Dlatego zdanie, które pozornie nie ma sensu składniowego, może mieć znaczenie przy stosowaniu sygnałów semantycznych.
Składnia dotyczy tylko tego, co jest poprawne językowo i gramatycznie. Semantyka wymaga wcześniejszej wiedzy, która wykracza poza wszystko, co jest specyficzne dla języka.
Zdanie „Napoje mleczne dla niemowląt” nie ma znaczenia składniowego, ale przez semantykę większość ludzi interpretuje to jako „Napoje mleczne dla niemowląt”, ponieważ nasza wcześniejsza wiedza mówi nam, że dziecko pije mleko, i dlatego możemy znaleźć znaczenie na podstawie słowa kluczowe.
Składnia i semantyka jest jak strategia i taktyka lub lewa i prawa .
Nie są to tak naprawdę niezależne uniwersalne pojęcia, ale pokrewna para słów, które w określonym kontekście wskazują przeciwne kierunki. Ale to samo, co strategia na jedną skalę, to taktyka na innej.
Więc jeśli piszesz kod w języku, składnia jest językiem, którego używasz, a pożądanym zachowaniem jest semantyka. Ale jeśli wdrażasz lub omawiasz kompilator dla tego języka, wówczas składnia to gramatyka i być może system piszący oraz semantyka, wszystko na niej oparte. I tak dalej.
Komputer rozumie składnię, semantykę rozumie człowiek.
Kompilator / interpreter nie przejmuje się odrobiną twojego projektu, aw każdym kodzie skompilowanym do poziomu maszyny trudno byłoby wydedukować projekt. Deweloperzy dbają o projekt, ponieważ dobry projekt polega na zmniejszaniu złożoności poprzez wyodrębnianie złożonych zachowań i interakcji, a różne rodzaje problemów mogą mieć różną semantykę. Wybór języka zależy w dużej mierze od tego, jak łatwo i wydajnie można użyć semantyki w jego składni.
Bardzo krótki przykład z „zwykłym c”:
void main()
{
int a = 10;
int x = a - 1;
int y = - 1;
printf("x = %i", x);
printf("y = %i", y);
getch();
}
W tym przykładzie składnia tokenu „-” jest taka sama, ale ma inne znaczenie („semantyczne), w zależności od tego, gdzie jest używane.
W przypisaniu „x” „-” oznacza operację „odejmowania”, w przypisaniu „y” „-” oznacza operację „znaku ujemnego”.
-
operatory są tym samym tokenem , ale różnią się składniowo , ponieważ są używane w różnych kontekstach. 0 - 1
dopasowuje regułę składni additive-expression: additive-expression - multiplicative-expression
, a - 1
dopasowuje regułę składni unary-expression: unary-operator cast-expression
(odniesienie: standard C99).
-
operatorami jest składniowa, a nie tylko semantyczna (chociaż mają one również inną semantykę). Składnia jest zdefiniowana przez gramatykę języka, a dwa operatory są określone w różnych sekcjach gramatyki. Patrz projekt N1570 , sekcja 6.5.3 dla operatorów jednoargumentowych i 6.5.6 dla operatorów addytywnych. (BTW, jeśli zamierzasz użyć przykładu C, prawdopodobnie powinien być poprawny; void main()
powinien być int main(void)
, i brakuje cię, #include <stdio.h>
i jakikolwiek nagłówek deklarujegetch