Chciałbym głosować za zwolnieniem, ale nie widać żadnego wysiłku badawczego.
nieważne
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:
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ę”.
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!
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.
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.
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.
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:
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.
źródło
x
osiąga maksymalną wartość swoich danych i1
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 (npfor (i = 0; i <= N; ++i) { ... }
gdzieN
jestINT_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.
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ę.
źródło
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!źródło
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.
źródło
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.
źródło
źródło
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
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.
źródło
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.
źródło
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.
źródło