Różnica między semantyką a składnią języka

0

Cześć, jaka jest różnica między semantyką a składnią? Potrzebuje obydwóch definicji - z podkreśleniem różnic. Wiem, że są na wikipedii, ale potrzebuje definicji, które będę w stanie zrozumieć i znaleźć różnice między tymi pojęciami.

5

W dużym uproszczeniu:

  • składnia to jak coś wygląda na wierzchu
  • semantyka to jak coś działa pod spodem

Ta sama składnia może mieć różną semantykę w zależności od kontekstu - inaczej mówiąc: to co wygląda tak samo może inaczej działać. Dla przykładu return w Scali działa inaczej gdy jest w domknięciu (wtedy rzuca wyjątek https://github.com/scala/scala/blob/2.13.x/src/library/scala/runtime/NonLocalReturnControl.scala ), a inaczej gdy jest bezpośrednio w metodzie (wtedy kompiluje się jak return w Javie).

Ta sama semantyka może dotyczyć różnych składni - inaczej mowiąc: to co działa tak samo może inaczej wyglądać. Najczęstszym przykładem jest cukier składniowy typu for-loops/ for-comprehensions który można ręcznie rozwinąć do bardziej niskopoziomowego kodu. Javowy for-each na kolekcjach to nic innego jak użycie iteratora i jego metod hasNext i next.

Do powyższej definicji można się przyczepić, bo semantyka teoretycznie to udokumentowane intencje autorów, a z tej mojej definicji wynika iż szczegóły implementacyjne wchodzą w obręb semantyki. W praktyce jednak często szczegóły implementacyjne stają się de facto standardem, bo wpływają na sposób używania składni i zachowanie programu i dlatego można polemizować.

4

składnia - jak zgodnie z regułami zbudować np zdanie
semantyka - co to zdanie znaczy

0

Definicje na Wikipedii są megaklarowne, czego w nich nie Rozumiesz?

2

Będę musiał o tym opowiedzieć, a wolę zrobić to własnymi słowami, a nie kuć na pamięć. Myślę, już rozumiem, dziękuje wszystkim za odpowiedź.

W moim rozumieniu, składnia określa zasady pisania zdań w programie, tak aby były zrozumiałe dla kompilatora i program mógł się wykonać. Natomiast semantyka określa znaczenie (np. wynik lub obliczenia) danych funkcji lub zdań.

Jeżeli coś się nie zgadza, proszę mnie poprawić.

0

Chyba prościej się nie da:

Składnia:Poprawne składniowo zdanie niekoniecznie jest znaczącym zdaniem.
Semantyka:Znaczące zdanie musi być poprawne składniowo.

Za https://pl.strephonsays.com/difference-between-syntax-and-semantics

Przykład z Wikipedii:

Zauważmy, że na etapie przetwarzania składni w ogóle nie jest brane pod uwagę znaczenie poszczególnych symboli. W praktyce kod poprawny składniowo nie musi być poprawny semantycznie. Występuje tu analogia do języków naturalnych. Zdanie „Bźdźiągwy się mucioszą” jest poprawne pod względem gramatycznym, lecz nie posiada żadnego znaczenia, ponieważ zostały w nim użyte nieistniejące słowa.

0

Zdanie „Bźdźiągwy się mucioszą” jest poprawne pod względem gramatycznym, lecz nie posiada żadnego znaczenia, ponieważ zostały w nim użyte nieistniejące słowa

Przy czym ta uwaga dotyczy języka naturalnego, ale nie do końca pasuje do programowania. Jeśli w kodzie się użyje się nieznanych słów, to całość się nie skompiluje/wywali błędy/rzuci wyjątkami/cokolwiek. Dlatego nie da się w programowaniu napisać czegoś w stylu

for (i=7, i<bźdźwiągwa) {
do macioszenie;
}

(oczywiście przy założeniu, że ani bźdźwiągwy ani macioszenie nie zostały nigdzie wcześnie zdefiniowane)

Przykładem bardziej pasującym do programowania będzie jakaś konstrukcja, która posiada znane słowa, ułożone w sposób zgodny ze składnią danego języka, ale dające bezsensowny wynik. Coś na kształt

for (i=7, i<999) {
  if (FALSE or TRUE)
    i= -32423;
}

Kod niby jest poprawny, powinien się skompilować, ale sensu żadnego nie posiada i nic przydatnego z niego nie wyjdzie. Czyli innymi słowami - ostatni przykład składniowo jest poprawny, ale semantycznie jest śmieciem ;)

4

W moim rozumieniu, składnia określa zasady pisania zdań w programie, tak aby były zrozumiałe dla kompilatora i program mógł się wykonać. Natomiast semantyka określa znaczenie (np. wynik lub obliczenia) danych funkcji lub zdań.

Składnia mówi jak zbudować zdanie/poprawny kod. Semantyka mówi jak ten kod rozumieć. Nie miałeś na studiach Teorii Języków Formalnych? Uczą tam jak pisać gramatyki dla pewnych języków. Taka gramatyka określa składnie języka. Popatrzmy na przykład:

S ->A (B) C

Taka gramatyka określa nam jakie wyrażenia będa poprawne składniowo. Ale co to właściwie znaczy? Jeśli to byłby kod języka programowania, to co by takie wyrażenie nam dało? Tu wchodzi właśnie semantyka.
Przepiszmy to teraz na bardziej czytelne symbole:

condition -> if (expr) command

Teraz dla ludzi którzy umieją programować, semantyka powinna byc już jasna. Ale widać że w tym pierwszym przykładzie wcale tak nie było i bez określenia co oznaczają te S, A, B, C niewiele by nam to powiedziało.

Popatrz np. na asemblery, one często mają zupełnie trywialną składnie w stylu:

S -> INSTR | S INSTR
INSTR -> OPCODE L_OPERAND, R_OPERAND
L_OPERAND -> REGISTER | MEM
R_OPERAND -> REGISTER | MEM | VALUE
OPCODE -> MOV | ADD | SUB | XOR

Ale co własciwie znaczy taki MOV, ADD, SUB, czy XOR? To trzeba określić za pomocą semantyki właśnie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1