Ich habe immer gedacht, dass das Beziehen auf die Syntax einer Sprache dasselbe ist wie das Beziehen auf die Semantik einer Sprache. Aber mir wurde mitgeteilt, dass dies anscheinend nicht der Fall ist. Was ist der Unterschied?
Ich habe immer gedacht, dass das Beziehen auf die Syntax einer Sprache dasselbe ist wie das Beziehen auf die Semantik einer Sprache. Aber mir wurde mitgeteilt, dass dies anscheinend nicht der Fall ist. Was ist der Unterschied?
Antworten:
Semantik ~ Bedeutung
Syntax ~ Symbolische Darstellung
Zwei in verschiedenen Sprachen geschriebene Programme könnten also dasselbe tun (Semantik), aber die zum Schreiben des Programms verwendeten Symbole wären unterschiedlich (Syntax).
Ein Compiler überprüft Ihre Syntax für Sie (Fehler bei der Kompilierung) und leitet die Semantik aus den Sprachregeln ab (z. B. Zuordnung der Syntax zu Maschinenanweisungen), findet jedoch nicht alle semantischen Fehler (Laufzeitfehler, z. B. Berechnen) das falsche Ergebnis, weil der Code add 1 anstelle von add 2 sagt).
x + y
wenn es +
für diese Operanden keinen geeigneten Operator gibt ) diagnostizieren . Das Hinzufügen von 1 anstelle von 2 ist ein logischer Fehler.
Tatsächlich gibt es nicht zwei Ebenen, sondern drei:
i
und f
erzeugt if
)if
, (
, 42
, ==
, answer
und )
erzeugt eine bedingte Anweisung)ValidIdentifier
Terminal, das als so etwas wie definiert werden könnte ![AnyKeyword] [Identifier]
(ich verwende hier eine PEG-ähnliche Notation). Für eine solche Sprache benötigen Sie keinen separaten Lexing-Pass. Siehe beispielsweise GLR-basierte C ++ - Parser.
Die Semantik beschreibt die logischen Entitäten einer Programmiersprache und ihre Wechselwirkungen. Die Syntax definiert, wie diese in Zeichen ausgedrückt werden.
Zum Beispiel ist das Konzept der Zeigerarithmetik Teil der Semantik von C; Die Art +
und Weise, wie die -
Operatoren und zum Ausdrücken von Zeigeroperationen verwendet werden können, ist Teil der Syntax.
Manchmal teilen zwei Sprachen einen Teil ihrer Semantik, aber die Syntax unterscheidet sich stark (z. B. C # und VB.NET - beide verwenden Werttypen und Referenztypen, aber die Zeichen, die Sie eingeben, um sie zu definieren, sind unterschiedlich). In anderen Fällen sind zwei Sprachen syntaktisch ähnlich, aber die Semantik stimmt nicht überein (ziehen Sie Java gegenüber JavaScript in Betracht, wo die Ähnlichkeiten Anfänger oft verwirren).
Mit der Syntax ordnen Sie die Token einer Sprache an. Semantik ist, was diese Token bedeuten (normalerweise, was eine bestimmte Anordnung von Token bedeutet).
Sie haben nicht angegeben, ob Sie sich nur auf Programmiersprachen oder auf allgemeine Programmiersprachen beziehen. Meine Antwort bezieht sich daher auf Datensprachen (wie XML, RDF, Datentypsysteme usw.):
Brian L. Meek schreibt in seinen sieben goldenen Regeln für die Erstellung sprachunabhängiger Standards (1995), dass "die Syntax einer Sprache die Semantik einer anderen Sprache sein kann" . Er bezieht sich auf die in der Datenbeschreibung verwendeten Wörter "Syntax" und "Semantik". Wenn Sie also in einer Spezifikation eines Datenformats auf diese Wörter stoßen, sollten Sie beide Wörter besser durch "Potrzebie" ersetzen , um zu verdeutlichen, dass Sie arbeiten müssen die Bedeutung für dich.
Die Beziehung zwischen Syntax und Semantik lässt sich zumindest in genau festgelegten Daten besser mit dem Begriff "Codierung" beschreiben . Die Semantik ist in Syntax codiert. Da Aufzeichnungen verschachtelt werden können, entspricht die Syntax einer Sprache der Semantik einer anderen. Wenn man über den Bereich der Daten hinausgeht, kann diese Verschachtelung praktisch unendlich sein, wie von Umberto Eco als "unbegrenzte Semiose" beschrieben.
Um ein Beispiel zu geben:
Die Leute hören normalerweise auf einer bestimmten Ebene auf und nehmen sie als semantisch, aber am Ende gibt es keine abschließende Semantik, es sei denn, ein Mensch interpretiert die Daten in seinem Kopf. Sobald man versucht, Semantik in Form von Daten auszudrücken, wird sie zur Syntax.
Wenn es in BNF (Backus-Naur-Form) oder ähnlichem beschrieben werden kann, ist es die Syntax. Wenn es nicht geht, geht es nicht.
In der Semantik geht es dagegen um die Bedeutung eines Programms (oder eines anderen Teils des Quellcodes).
Und manchmal kann die Linie zwischen den beiden verschwommen sein.
Eine Möglichkeit, den Unterschied zu verstehen, besteht darin, die Art der Fehler zu untersuchen, die auftreten, wenn die Syntax oder Semantik Ihres Programms falsch ist.
Ein Syntaxfehler ist ein Fehler im Quellcode, der nicht mit der Sprachgrammatik übereinstimmt, z. B. ein Semikolon fehlt, wenn eines erforderlich ist.
Ein semantischer Fehler ist ein Fehler, der andere Sprachanforderungen nicht erfüllt (was C beispielsweise "Einschränkungen" nennt). Ein Beispiel könnte sein Schreiben , x + y
wo x
und y
sind inkompatible Typen. Die Sprachgrammatik besagt, dass ein Zusatz wie folgt aussieht something + something
, aber nicht leistungsfähig genug ist, um die Anforderungen an die Typen der linken und rechten Operanden auszudrücken.
(Logische Fehler, wie die Verwendung von 1, wobei 2 korrekt wäre, können vom Compiler im Allgemeinen nicht erkannt werden. In einigen Fällen kann ein Compiler jedoch vor fragwürdigem Code warnen.)
Syntax ist das, was die (lexikalischen) Symbole aussagen. Semantik ist das, was sie bedeuten.
Erwägen:
C #: condition ? true_value : false_value
VB.NET: If(condition, true_value, false_value)
- Unterschiedliche Syntax, gleiche Semantik.
C #: left_value / right_value
VB.NET: left_value / right_value
- Gleiche Syntax, unterschiedliche Semantik (für ganze Zahlen).
Syntax ist die grammatische Anordnung von Wörtern in einem Satz, dh die Reihenfolge der Wörter.
(Englisch) ' cat dog boy ' und (programming) ' hi.5 ' sind syntaktisch nicht korrekt.
(Englisch) ' cat hugs boy ' und (programming) '* 3.2 * 5 *' sind syntaktisch gültig.
Statische Semantik ist, ob syntaktisch gültige Anweisungen eine Bedeutung haben.
(Englisch) ' I are big ' (Programmierung) (Python) ' 3 +' hi ' ' ist syntaktisch korrekt, hat aber einen statischen semantischen Fehler.
Semantik ist die Bedeutung einer syntaktisch korrekten Zeichenfolge ohne statischen semantischen Fehler, dh der Satz ist syntaktisch und semantisch korrekt, aber seine Bedeutung entspricht möglicherweise nicht der beabsichtigten.
(Englisch) ' Fliegende Flugzeuge können gefährlich sein ' kann zwei Bedeutungen haben, dh das Fliegen von Flugzeugen kann gefährlich sein oder die Flugzeuge, die fliegen, können gefährlich sein.
(Programmierung) 'Der Computer erzeugt keine Fehlermeldungen, aber er tut nicht das, was Sie ihm gesagt haben. es wird etwas anderes tun. '
Quelle : MIT 6.00.1
Die Syntax bezieht sich auf formale Regeln für die Erstellung gültiger Aussagen in einer Sprache. Die Semantik bezieht sich auf das Regelwerk, das die Bedeutung einer Aussage angibt.
Syntaxbedingte Fehler treten in einem Programm auf, wenn Ruels der Programmiersprache verletzt oder missbraucht werden. Semantische Fehler treten in einem Programm auf, wenn Anweisungen nicht aussagekräftig sind.
Die Wortreihenfolge ist das Grundprinzip der Syntax. Diejenigen, die versuchen zu verstehen, was geschrieben ist, verwenden die syntaktischen Hinweise der Wortreihenfolge, um die Satzstruktur und -bedeutung zu bestimmen. Die Semantik ist eine individuelle Interpretation der Bedeutung eines "Satzes" auf der Grundlage ihrer Vorkenntnisse. Daher kann ein Satz, der keinen syntaktischen Sinn ergibt, eine Bedeutung haben, wenn semantische Hinweise verwendet werden.
Die Syntax befasst sich nur mit dem, was sprachlich und grammatisch korrekt ist. Die Semantik erfordert alle Vorkenntnisse, die weit über das sprachspezifische hinausgehen.
Der Satz "Babymilchgetränke" hat keine syntaktische Bedeutung, aber durch die Semantik würden die meisten Leute ihn als "Babymilchgetränke" interpretieren, da unser Vorwissen uns sagt, dass ein Baby Milch trinkt und wir daher eine Bedeutung aus dem finden können Schlüsselwörter.
Syntax und Semantik sind wie Strategie und Taktik oder links und rechts .
Sie sind keine wirklich unabhängigen universellen Konzepte, sondern ein verwandtes Paar von Wörtern, die, wenn Sie sich in einem bestimmten Kontext befinden, entgegengesetzte Richtungen anzeigen. Aber das Gleiche, was Strategie auf einer Skala ist, ist Taktik auf einer anderen.
Wenn Sie also Code in einer Sprache schreiben, ist die Syntax die Sprache, die Sie verwenden, und das gewünschte Verhalten ist die Semantik. Aber wenn Sie den Compiler für diese Sprache implementieren oder diskutieren, dann ist die Syntax die Grammatik und vielleicht das Typensystem und die Semantik, die alles darauf aufbaut. Und so weiter.
Syntax versteht der Computer, Semantik versteht der Mensch.
Ein Compiler / Interpreter kümmert sich nicht um Ihr Design, und in jedem Code, der bis zur Maschinenebene kompiliert wurde, fällt es Ihnen schwer, das Design zu bestimmen. Entwickler legen großen Wert auf Design, da es bei einem guten Design darum geht, die Komplexität zu reduzieren, indem komplexe Verhaltensweisen und Interaktionen abstrahiert werden, und verschiedene Arten von Problemen sich für unterschiedliche Semantiken eignen. Bei der Wahl der Sprache kommt es hauptsächlich darauf an, wie einfach und effizient die von Ihnen gewünschte Semantik in ihrer Syntax ausgedrückt werden kann.
Sehr kurzes Beispiel mit "plain c":
void main()
{
int a = 10;
int x = a - 1;
int y = - 1;
printf("x = %i", x);
printf("y = %i", y);
getch();
}
In diesem Beispiel ist die Syntax für das Token "-" identisch, hat jedoch eine andere Bedeutung ("Semantik"), je nachdem, wo sie verwendet wird.
In der "x" -Zuweisung bedeutet "-" die "Subtraktions" -Operation. In der "y" -Zuweisung bedeutet "-" die "negative Vorzeichen" -Operation.
-
Operatoren sind dasselbe Token , jedoch syntaktisch unterschiedlich, da sie in unterschiedlichen Kontexten verwendet werden. 0 - 1
stimmt mit der Syntaxregel überein additive-expression: additive-expression - multiplicative-expression
, - 1
stimmt jedoch mit der Syntaxregel überein unary-expression: unary-operator cast-expression
(Referenz: C99-Standard).
-
Oepratoren ist syntaktisch und nicht nur semantisch (obwohl sie auch unterschiedliche Semantiken haben). Die Syntax wird durch die Sprachgrammatik definiert, und die beiden Operatoren werden in verschiedenen Abschnitten der Grammatik angegeben. Siehe den N1570-Entwurf , Abschnitt 6.5.3 für unäre Operatoren und 6.5.6 für additive Operatoren. (Übrigens, wenn Sie ein C-Beispiel verwenden, sollte es wahrscheinlich richtig sein; void main()
sollte es sein int main(void)
, und Sie fehlen #include <stdio.h>
und was auch immer der Header angibtgetch