Jaka jest różnica między składnią a semantyką w językach programowania?


Odpowiedzi:


201

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:

  • oddzielne oświadczenia ze średnikiem
  • ująć warunkowe wyrażenie instrukcji IF w nawiasach
  • zgrupuj wiele instrukcji w jedną instrukcję, umieszczając je w nawiasach klamrowych
  • typy danych i zmienne muszą być zadeklarowane przed pierwszą instrukcją wykonywalną (ta funkcja została usunięta w C99. C99 i ostatnie zezwalają na deklaracje typu mieszanego).

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?

  • Jeśli x jest zmiennoprzecinkowym typem danych, instrukcja ta nie ma znaczenia (zgodnie z regułami języka C), a zatem jest błędem, mimo że instrukcja jest poprawna składniowo.
  • Jeśli x jest wskaźnikiem do pewnego typu danych , znaczenie tej instrukcji polega na „dodaniu sizeof ( pewnego typu danych ) do wartości pod adresem x i zapisaniu wyniku w lokalizacji pod adresem x”.
  • Jeśli x jest skalarem, znaczenie instrukcji brzmi „dodaj jedynkę do wartości pod adresem x i zapisz wynik w lokalizacji pod adresem x”.

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.


DOBRZE. Jeśli xosiąga maksymalną wartość swoich danych i 1jest do niej dodawany, to skutkuje dziwnym wynikiem ( 0), czy nie jest to błąd semantyczny?
haccks

Rozważmy licznik kilometrów w pojeździe - ma szereg powiązanych ze sobą kół, na każdym z nich są nadrukowane cyfry od 0 do 9. Koło po prawej stronie obraca się najszybciej; kiedy zawija się od 9 z powrotem do zera, koło po jego lewej stronie przesuwa się o jeden. Kiedy to koło przesuwa się z 9 na 0, to koło po jego lewej przesuwa się i tak dalej.
Jeff N,

Typ danych jest jak koło licznika kilometrów: może zawierać tylko określoną wartość. Po osiągnięciu maksymalnej wartości, następny krok powoduje powrót koła do zera. To, czy jest to błąd semantyczny, zależy od reguł języka. W takim przypadku musisz odwołać się do standardu języka C. Nie wiem dokładnie, co mówi standard języka C, ale oto niektóre opcje. Przepełnienie to: - nie jest to błąd; wynik wynosi zero. -błąd; kompilator MUSI wygenerować wyjątek przepełnienia. -NIEDEFINIOWANE; kompilator może robić, co chce.
Jeff N,

2
W przypadku, gdy kogoś obchodzi konkretny przykład, przepełnienie bez znaku jest definiowane jako arytmetyka modularna (a więc 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 Njest INT_MAXnie jest nieskończony w zależności od optymalizacji patrz blog.llvm.org/2011/05/what-every-c-programmer-should-know. html ).
Daniel H

„zauważ, że niektóre semantyki nie mogą być określone w czasie kompilacji i dlatego muszą być oceniane w czasie wykonywania” - podoba mi się, że ma to coś wspólnego z językami naturalnymi. Nie możesz poznać znaczenia niektórych wyrażeń bez kontekstu. Na przykład w wyrażeniu „Lubi banany” znaczenie „on” zależy od kontekstu.
ymln

21

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ę.


@Talespin_Kit znaczenie zamiast struktury: logika jest bardziej abstrakcją, np. P => Q, itp. Lub !! P = P, ale kiedy dodajesz semantykę, rzeczy mogą mieć subtelność, jeśli P jest „szczęśliwe”, to !! P jest „I „Nie jestem
nieszczęśliwy

5
+1 dla „Kompilator lub interpreter może narzekać na błędy składniowe. Twoi współpracownicy będą narzekać na semantykę”.
GeekyJ

11

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 ifstawanie się si, dostawanie się faire, elsestawanie się sinonitp. Itd.), Na pewno zmieniłbyś składnię swojego języka, ale niewiele zmienisz semantyka: programowanie w tym francuskim-C nie będzie prostsze!


8

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.


Czy to rozmowa między różnymi ludźmi? A może to tylko jeden post? Nie rozumiem. Np. „Nie mam pojęcia, co to znaczy. Nie mogło być bardziej źle”.
doubleOrt

5

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.



1

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.


1

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.


1

Zrozumienie, jak kompilator widzi kod

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.

Zrozumieć to w mniej techniczny sposób

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.


Kompilatory Ten link może być pomocny, aby dowiedzieć się więcej
Vedant Panchal
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.