Antworten:
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:
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?
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.
x
der maximale Wert für seine Daten erreicht ist und 1
zu diesen hinzugefügt wird, führt dies zu einer seltsamen Ausgabe ( 0
), ist es nicht ein semantischer Fehler?
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 N
ist INT_MAX
auf die Optimierung nicht unendlich abhängig, siehe blog.llvm.org/2011/05/what-every-c-programmer-should-know. html ).
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.
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 if
Werden si
, do
Werden faire
, else
Werden sinon
usw. usw.) Die Semantik: Das Programmieren in diesem Französisch-C wird nicht einfacher!
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.
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.
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.
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.
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.
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.