Odpowiedzi:
Składnia dotyczy struktury lub gramatyki języka. Odpowiada na pytanie: jak skonstruować prawidłowe zdanie? Wszystkie języki, nawet angielski i inne języki ludzkie (zwane też „naturalnymi”), mają gramatykę, czyli reguły określające, czy zdanie jest poprawnie skonstruowane.
Oto kilka reguł składni języka C:
Semantyka dotyczy znaczenia zdania. Odpowiada na pytania: czy to zdanie jest prawidłowe? Jeśli tak, co oznacza to zdanie? Na przykład:
x++; // increment
foo(xyz, --b, &qrs); // call foo
są poprawnymi składniowo instrukcjami języka C. Ale co one oznaczają? Czy jest w ogóle słuszna próba przekształcenia tych instrukcji w wykonywalną sekwencję instrukcji? Te pytania stanowią sedno semantyki.
Rozważmy operator ++ w pierwszej instrukcji. Przede wszystkim, czy w ogóle jest to uzasadnione?
Na koniec należy zauważyć, że niektórych semantyki nie można określić w czasie kompilacji i dlatego należy je ocenić w czasie wykonywania. W przykładzie operatora ++, jeśli x osiągnął już maksymalną wartość dla swojego typu danych, co się stanie, gdy spróbujesz dodać 1 do tego? Inny przykład: co się stanie, jeśli program spróbuje wyłuskać wskaźnik o wartości NULL?
Podsumowując, składnia jest pojęciem, które dotyczy tylko tego, czy zdanie jest poprawne dla gramatyki języka. Semantyka dotyczy tego, czy zdanie ma ważne znaczenie.
x
osiąga maksymalną wartość swoich danych i 1
jest do niej dodawany, to skutkuje dziwnym wynikiem ( 0
), czy nie jest to błąd semantyczny?
UINT_MAX + 1 == 0
). Podpisane przepełnienie jest niezdefiniowane. Współczesne kompilatory zwykle mają INT_MAX + 1 == INT_MIN
, ale zdarzają się przypadki, że nie może liczyć na to (np for (i = 0; i <= N; ++i) { ... }
gdzie N
jest INT_MAX
nie jest nieskończony w zależności od optymalizacji patrz blog.llvm.org/2011/05/what-every-c-programmer-should-know. html ).
Składnia odnosi się do struktury języka, śledząc jego etymologię w tym, jak rzeczy są połączone.
Na przykład możesz wymagać złożenia kodu poprzez zadeklarowanie typu, a następnie nazwy i średnika, aby był poprawny składniowo.
Type token;
Z drugiej strony semantyka dotyczy znaczenia. Kompilator lub interpreter może narzekać na błędy składniowe. Twoi współpracownicy będą narzekać na semantykę.
Wikipedia ma odpowiedź. Przeczytaj strony wiki dotyczące składni (języki programowania) i semantyki (informatyka) .
Albo pomyśl o pracy dowolnego kompilatora lub tłumacza . Pierwszym krokiem jest analiza leksykalna, w której tokeny są generowane przez podzielenie ciągu znaków na leksemy, a następnie ich analizę , która tworzy abstrakcyjne drzewo składniowe (które jest reprezentacją składni). Kolejne kroki obejmują przekształcenie lub ocenę tych AST (semantyki).
Zwróć też uwagę, że gdybyś zdefiniował wariant języka C, w którym każde słowo kluczowe zostało przekształcone w jego francuski odpowiednik (a więc if
stawanie się si
, do
stawanie się faire
, else
stawanie się sinon
itp. Itd.), Na pewno zmieniłbyś składnię swojego języka, ale niewiele zmienisz semantyka: programowanie w tym francuskim-C nie będzie prostsze!
Semantyka jest tym, co oznacza twój kod - co możesz opisać w pseudokodzie. Składnia to rzeczywista struktura - wszystko od nazw zmiennych po średniki.
Składnia to struktura lub forma wyrażeń, instrukcji i jednostek programu, ale semantyka to znaczenie tych wyrażeń, instrukcji i jednostek programu. Semantyka wynika bezpośrednio ze składni . Składnia odnosi się do struktury / formy kodu, którą określa określony język programowania, ale semantyka dotyczy znaczenia przypisanego do symboli, znaków i słów.
Składni języka programowania jest formą jej przejawach, oświadczeń i jednostek programowych. Jego semantyka jest znaczeniem tych wyrażeń, instrukcji i jednostek programu. Na przykład składnia instrukcji while w języku Java to
while (boolean_expr) statement
Semantyka tej formy instrukcji polega na tym, że gdy bieżąca wartość wyrażenia boolowskiego jest prawdziwa, osadzona instrukcja jest wykonywana. Następnie formant niejawnie powraca do wyrażenia logicznego, aby powtórzyć proces. Jeśli wyrażenie logiczne ma wartość false, sterowanie przenosi się do instrukcji następującej po konstrukcji while.
Składnia: odnosi się do struktury gramatycznej języka .. Jeśli piszesz w języku c. Musisz bardzo uważać, aby używać typów danych, tokenów [może to być dosłowny lub symbol taki jak "printf ()". Ma 3 tokes, "printf, (,)"]. W ten sam sposób musisz bardzo uważać, jak używasz funkcji, składni funkcji, deklaracji funkcji, definicji, inicjalizacji i wywoływania funkcji.
Podczas semantyki dotyczy logiki lub koncepcji zdania lub zdań. Jeśli mówisz lub piszesz coś z koncepcji lub logiki, to mylisz się semantycznie.
Zazwyczaj analiza składniowa i semantyczna kodu jest wykonywana w części „frontendowej” kompilatora.
Składnia: Kompilator generuje tokeny dla każdego słowa kluczowego i symboli: token zawiera informację o typie słowa kluczowego i jego lokalizacji w kodzie. Przy użyciu tych tokenów tworzony i analizowany jest AST (skrót od Abstract Syntax Tree). To, co kompilator faktycznie sprawdza tutaj, to czy kod ma znaczenie leksykalne, tj. Czy „sekwencja słów kluczowych” jest zgodna z regułami języka? Jak sugerowano w poprzednich odpowiedziach, można to postrzegać jako gramatykę języka (a nie sens / znaczenie kodu). Uwaga dodatkowa: na tym etapie zgłaszane są błędy składniowe. (Zwraca tokeny z typem błędu do systemu)
Semantyka: teraz kompilator sprawdzi, czy operacje na kodzie „mają sens”. np. jeśli język obsługuje wnioskowanie o typie, przy próbie przypisania ciągu do zmiennej typu float zostanie zgłoszony błąd sematyczny. LUB dwukrotne zadeklarowanie tej samej zmiennej. Są to błędy, które są poprawne gramatycznie / składniowo, ale nie mają sensu podczas operacji. Uwaga dodatkowa: Aby sprawdzić, czy ta sama zmienna jest zadeklarowana dwukrotnie, kompilator zarządza tablicą symboli
Tak więc wyjście tych 2 faz frontendu jest opatrzone adnotacjami AST (z typami danych) i tablicą symboli.
Biorąc pod uwagę normalny język, którego używamy; tutaj, angielski:
np. idzie do szkoły. - Nieprawidłowa gramatyka / składnia, chociaż chciał przekazać poprawny sens / semantyczny.
np. idzie na zimno. - zimno to przymiotnik. W języku angielskim możemy powiedzieć, że nie jest to zgodne z gramatyką, ale w rzeczywistości jest to najbliższy przykład niepoprawnej semantyki z poprawną składnią, jaki przychodzi mi do głowy.