Was ist der Unterschied zwischen Syntax und Semantik in Programmiersprachen?


120

Was ist der Unterschied zwischen Syntax und Semantik in Programmiersprachen (wie C, C ++)?


2
Ich würde gerne abstimmen, aber es sind keine Forschungsanstrengungen erkennbar.
null

Antworten:


201

Bei der Syntax geht es um die Struktur oder die Grammatik der Sprache. Es beantwortet die Frage: Wie konstruiere ich einen gültigen Satz? Alle Sprachen, auch Englisch und andere menschliche (auch "natürliche") Sprachen genannt, haben Grammatiken, dh Regeln, die definieren, ob der Satz richtig aufgebaut ist oder nicht.

Hier sind einige Syntaxregeln für die C-Sprache:

  • separate Anweisungen mit einem Semikolon
  • Schließen Sie den bedingten Ausdruck einer IF-Anweisung in Klammern ein
  • Gruppieren Sie mehrere Anweisungen zu einer einzigen Anweisung, indem Sie sie in geschweifte Klammern setzen
  • Datentypen und Variablen müssen vor der ersten ausführbaren Anweisung deklariert werden (diese Funktion wurde in C99 entfernt. C99 und letztere ermöglichen gemischte Typdeklarationen.)

In der Semantik geht es um die Bedeutung des Satzes. Es beantwortet die Fragen: Ist dieser Satz gültig? Wenn ja, was bedeutet der Satz? Beispielsweise:

x++;                  // increment
foo(xyz, --b, &qrs);  // call foo

sind syntaktisch gültige C-Anweisungen. Aber was meinen sie? Ist es überhaupt gültig zu versuchen, diese Anweisungen in eine ausführbare Folge von Anweisungen umzuwandeln? Diese Fragen stehen im Zentrum der Semantik.

Betrachten Sie den ++ - Operator in der ersten Anweisung. Ist es überhaupt gültig, dies zu versuchen?

  • Wenn x ein Float-Datentyp ist, hat diese Anweisung keine Bedeutung (gemäß den Regeln der C-Sprache) und ist daher ein Fehler , obwohl die Anweisung syntaktisch korrekt ist.
  • Wenn x ein Zeiger auf einen Datentyp ist , bedeutet die Anweisung, "sizeof ( einen Datentyp ) zum Wert an Adresse x hinzuzufügen und das Ergebnis an der Stelle an Adresse x zu speichern".
  • Wenn x ein Skalar ist, lautet die Bedeutung der Anweisung "Addiere eins zum Wert an Adresse x und speichere das Ergebnis an der Stelle an Adresse x".

Beachten Sie schließlich, dass einige Semantiken zur Kompilierungszeit nicht bestimmt werden können und daher zur Laufzeit ausgewertet werden müssen. Was passiert im Beispiel des ++ - Operators, wenn x bereits den Maximalwert für seinen Datentyp hat, wenn Sie versuchen, 1 hinzuzufügen? Ein weiteres Beispiel: Was passiert, wenn Ihr Programm versucht, einen Zeiger zu dereferenzieren, dessen Wert NULL ist?

Zusammenfassend ist Syntax das Konzept, das sich nur darum kümmert, ob der Satz für die Grammatik der Sprache gültig ist oder nicht. In der Semantik geht es darum, ob der Satz eine gültige Bedeutung hat oder nicht.


OK. Wenn xder maximale Wert für seine Daten erreicht ist und 1zu diesen hinzugefügt wird, führt dies zu einer seltsamen Ausgabe ( 0), ist es nicht ein semantischer Fehler?
Haccks

Stellen Sie sich einen Kilometerzähler in einem Fahrzeug vor - er verfügt über eine Reihe miteinander verbundener Räder, auf denen jeweils die Ziffern 0 bis 9 aufgedruckt sind. Das Rad ganz rechts dreht sich am schnellsten. Wenn es von 9 zurück auf Null geht, bewegt sich das Rad unmittelbar links um eins vor. Wenn dieses Rad von 9 auf 0 vorrückt, rückt das links davon vor und so weiter.
Jeff N

Ein Datentyp ist wie das Rad eines Kilometerzählers: Er kann nur bis zu einem bestimmten Wert halten. Wenn der Maximalwert erreicht ist, kehrt das Rad beim nächsten Vorschub auf Null zurück. Ob dies ein semantischer Fehler ist oder nicht, hängt von den Sprachregeln ab. In diesem Fall müssen Sie auf den C-Sprachstandard zurückgreifen. Ich weiß nicht genau, was der C-Sprachstandard sagt, aber hier sind einige der Optionen. Überlauf ist: -nicht ein Fehler; Das Ergebnis ist Null. -ein Fehler; Der Compiler MUSS eine Überlaufausnahme generieren. -UNDEFINED: Der Compiler kann tun, was er will.
Jeff N

2
Falls sich jemand für das spezifische Beispiel interessiert, wird ein vorzeichenloser Überlauf als modulare Arithmetik (so UINT_MAX + 1 == 0) definiert. Der signierte Überlauf ist undefiniert. Moderne Compiler in der Regel haben INT_MAX + 1 == INT_MIN, aber es gibt Fälle , die Sie nicht auf diese verlassen können (zB for (i = 0; i <= N; ++i) { ... }wo Nist INT_MAXauf die Optimierung nicht unendlich abhängig, siehe blog.llvm.org/2011/05/what-every-c-programmer-should-know. html ).
Daniel H

"Beachten Sie, dass einige Semantiken zur Kompilierungszeit nicht bestimmt werden können und daher zur Laufzeit ausgewertet werden müssen" - Ich mag, wie dies eine Parallele zu natürlichen Sprachen hat. Sie können die Bedeutung einiger Phrasen ohne Kontext nicht kennen. Zum Beispiel hängt in der Phrase "Er mag Bananen" die Bedeutung von "er" vom Kontext ab.
Ymln

21

Syntax bezieht sich auf die Struktur einer Sprache und führt ihre Etymologie darauf zurück , wie Dinge zusammengesetzt sind.
Beispielsweise müssen Sie den Code möglicherweise zusammensetzen, indem Sie einen Typ, dann einen Namen und dann ein Semikolon deklarieren, um syntaktisch korrekt zu sein.

Type token;

Andererseits geht es in der Semantik um Bedeutung. Ein Compiler oder Interpreter könnte sich über Syntaxfehler beschweren. Ihre Mitarbeiter werden sich über die Semantik beschweren.


@Talespin_Kit bedeutet eher als Struktur: Logik ist eher eine Abstraktion, zB P => Q usw. oder !! P = P, aber wenn Sie Semantik hinzufügen, können die Dinge subtil sein, wenn P "glücklich" ist, dann ist !! P "I. bin nicht
unglücklich

5
+1 für "Ein Compiler oder Interpreter könnte sich über Syntaxfehler beschweren. Ihre Mitarbeiter werden sich über die Semantik beschweren."
GeekyJ

11

Wikipedia hat die Antwort. Lesen Sie die Wikipages Syntax (Programmiersprachen) und Semantik (Informatik) .

Oder denken Sie an die Arbeit eines Compilers oder Interpreters . Der erste Schritt ist die lexikalische Analyse, bei der Token generiert werden, indem Zeichenfolgen in Lexeme unterteilt und anschließend analysiert werden , wodurch ein abstrakter Syntaxbaum (der eine Darstellung der Syntax darstellt) erstellt wird. Die nächsten Schritte umfassen die Transformation oder Bewertung dieser AST (Semantik).

Beachten Sie außerdem, dass Sie die Syntax Ihrer Sprache definitiv ändern würden , wenn Sie eine Variante von C definieren würden, bei der jedes Schlüsselwort in sein französisches Äquivalent umgewandelt wurde (also ifWerden si, doWerden faire, elseWerden sinonusw. usw.) Die Semantik: Das Programmieren in diesem Französisch-C wird nicht einfacher!


8

Semantik ist das, was Ihr Code bedeutet - was Sie im Pseudocode beschreiben könnten. Die Syntax ist die eigentliche Struktur - von Variablennamen bis zu Semikolons.


Ist es ein Gespräch zwischen verschiedenen Menschen? Oder ist es nur ein Beitrag? Ich verstehe es nicht ZB "Keine Ahnung, was das Folgende bedeuten soll. Es könnte nicht falscher sein".
DoubleOrt

4

Syntax ist die Struktur oder Form von Ausdrücken, Anweisungen und Programmeinheiten, aber Semantik ist die Bedeutung dieser Ausdrücke, Anweisungen und Programmeinheiten. Die Semantik folgt direkt aus der Syntax . Die Syntax bezieht sich auf die Struktur / Form des Codes, den eine bestimmte Programmiersprache angibt, aber die Semantik behandelt die Bedeutung, die den Symbolen, Zeichen und Wörtern zugewiesen ist.


4
  • Zum Kompilieren benötigen Sie die richtige Syntax .
  • Sie benötigen die richtige Semantik , damit es funktioniert.

1

Die Syntax einer Programmiersprache ist die Form ihrer Ausdrücke, Anweisungen und Programmeinheiten. Seine Semantik ist die Bedeutung dieser Ausdrücke, Anweisungen und Programmeinheiten. Die Syntax einer Java while-Anweisung lautet beispielsweise

while (boolean_expr) statement

Die Semantik dieses Anweisungsformulars lautet, dass die eingebettete Anweisung ausgeführt wird, wenn der aktuelle Wert des Booleschen Ausdrucks wahr ist. Dann kehrt die Steuerung implizit zum Booleschen Ausdruck zurück, um den Vorgang zu wiederholen. Wenn der Boolesche Ausdruck false ist, wird die Steuerung an die Anweisung nach dem while-Konstrukt übertragen.


1

Syntax: Bezieht sich auf die grammatikalische Struktur der Sprache. Wenn Sie die Sprache c schreiben. Sie müssen sehr darauf achten, Datentypen und Token zu verwenden [es kann ein Literal oder ein Symbol wie "printf ()" sein. Es hat 3 Token, "printf, (,)"]. Ebenso müssen Sie sehr vorsichtig sein, wie Sie Funktion, Funktionssyntax, Funktionsdeklaration, Definition, Initialisierung und Aufruf verwenden.

Während der Semantik geht es um Logik oder Konzept von Sätzen oder Aussagen. Wenn Sie etwas aus Konzept oder Logik heraus sagen oder schreiben, dann liegen Sie semantisch falsch.


1

Verstehen, wie der Compiler den Code sieht

Normalerweise wird die Syntax- und Semantikanalyse des Codes im Frontend-Teil des Compilers durchgeführt.

  • Syntax: Der Compiler generiert Token für jedes Schlüsselwort und jedes Symbol: Das Token enthält den Informationstyp des Schlüsselworts und seine Position im Code. Mit diesen Token wird ein AST (kurz für Abstract Syntax Tree) erstellt und analysiert. Was der Compiler hier tatsächlich prüft, ist, ob der Code lexikalisch bedeutsam ist, dh ob die 'Folge von Schlüsselwörtern' den Sprachregeln entspricht? Wie in früheren Antworten vorgeschlagen, können Sie es als Grammatik der Sprache sehen (nicht als Sinn / Bedeutung des Codes). Randnotiz: Syntaxfehler werden in dieser Phase gemeldet (gibt Token mit dem Fehlertyp an das System zurück)

  • Semantik: Jetzt prüft der Compiler, ob Ihre Codeoperationen "sinnvoll" sind. Wenn die Sprache beispielsweise Typinferenz unterstützt, wird ein sematischer Fehler gemeldet, wenn Sie versuchen, einem Float eine Zeichenfolge zuzuweisen. ODER dieselbe Variable zweimal deklarieren. Dies sind Fehler, die 'grammatikalisch' / syntaktisch korrekt sind, aber während der Operation keinen Sinn ergeben. Randnotiz: Um zu überprüfen, ob dieselbe Variable zweimal deklariert ist, verwaltet der Compiler eine Symboltabelle

Die Ausgabe dieser beiden Frontend-Phasen ist also eine mit Anmerkungen versehene AST (mit Datentypen) und eine Symboltabelle.

Weniger technisch verstehen

In Anbetracht der normalen Sprache, die wir verwenden; hier Englisch:

zB geht er zur Schule. - Falsche Grammatik / Syntax, obwohl er einen korrekten Sinn / eine korrekte Semantik vermitteln wollte.

zB geht er in die Kälte. - Kälte ist ein Adjektiv. Auf Englisch könnte man sagen, dass dies nicht der Grammatik entspricht, aber es ist tatsächlich das beste Beispiel für eine falsche Semantik mit der richtigen Syntax, die ich mir vorstellen kann.


Compiler Dieser Link könnte hilfreich sein, um mehr zu erfahren
Vedant Panchal
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.