Ich denke, der Begriff syntaktischer Zucker bezeichnet eine alternative Syntax, um dieselbe zugrunde liegende Semantik auszudrücken.
Nehmen Sie zum Beispiel eine Programmiersprache A mit einer Operation sum
, die eine Liste von Ganzzahlen beliebiger Länge addieren kann. In dieser Sprache können wir die Ausdrücke schreiben
sum []
sum [3, 4, 5, 1]
sum [2, 7]
deren Ergebnisse sind 0, 13 bzw. 9.
Nehmen wir nun an, wir erkennen, dass wir 90% der Zeit sum
mit zwei Argumenten verwenden, und führen daher der Einfachheit halber die neue Notation ein
2 + 7
Das ist nur syntaktischer Zucker für sum [2, 7]
.
Nehmen Sie nun eine zweite Sprache B, die überhaupt keine Additionsoperation hat. Möglicherweise haben wir Operatoren wie <
, =
mit denen wir Zahlen vergleichen können, aber keine Möglichkeit, Zahlen hinzuzufügen . In Release 2 von Sprache B führen wir eine neue Additionsoperation mit Syntax ein
2 + 7
das fügt wie gewohnt Zahlen hinzu.
Im Kontext von Sprache A ist die +
Notation syntaktischer Zucker (es handelt sich um eine alternative, vereinfachte und Ad-hoc-Notation, die anstelle der sum [...]
Notation verwendet werden kann). In ähnlicher Weise ist, wie in der Antwort von Hoa Long Tam ausgeführt, in C die Notation p->field
syntaktischer Zucker für (*p).field
.
Im Kontext von Sprache B ist die +
Notation kein syntaktischer Zucker (dies ist die einzige gültige Syntax, die für die Summenoperation verwendet wird). Wenn C nur über Zeiger auf Strukturelemente zugreifen könnte und die Notation nicht hätte (*p).field
, p->field
wäre die Notation ebenfalls kein syntaktischer Zucker.
Meiner Meinung nach gibt es einige Missverständnisse über syntaktischen Zucker, die auf eine Verwirrung hinsichtlich der Semantik der Programmiersprache zurückzuführen sind. Die Argumentation lautet wie folgt:
- Die Semantik eines Programms berechnet ein Programm.
- Die Ausdruckskraft einer Programmiersprache wird durch die Berechnungen dargestellt, die in dieser Sprache beschrieben werden können.
- Zwei Programmiersprachen, die alle berechenbaren Funktionen beschreiben können (wie sie mit Turing-Maschinen definiert wurden), haben dieselbe Ausdruckskraft ...
- ... und unterscheiden sich daher nur in der Syntax.
- Folgerung: Jede Erweiterung einer Turing-vollständigen Sprache ist nur Syntax (syntaktischer Zucker), da Sie die Ausdruckskraft der Sprache nicht ändern.
Die obige Argumentation führt zu allgemeinen Behauptungen wie "syntaktischer Zucker kann nicht richtig definiert werden", es ist eine "Geschmackssache" oder "jedes Programmiersprachenmerkmal ist schließlich nur syntaktischer Zucker".
Ich denke, das Hauptproblem des obigen Arguments besteht darin, dass es in der Semantik nicht nur darum geht, was von einem Programm berechnet werden kann , sondern auch darum, wie es berechnet wird , dh welche primitiven Konstrukte verwendet und wie sie kombiniert werden.
So sind Objekte beispielsweise kein syntaktischer Zucker für die zugrunde liegenden Bitkonfigurationen und Bittransformationen, sondern ein Konstrukt, mit dem Daten und Operationen modelliert und Berechnungen beschrieben werden können. Das Rechnen mit Objekten, Methoden und Methodenaufrufen ist nicht dasselbe wie das Rechnen mit Bytes, Prozessorregistern und Speicheradressen (selbst wenn die beiden Berechnungen das gleiche Ergebnis haben und selbst wenn die zweite Berechnung zur Implementierung der ersten verwendet wird).
Ich habe diese Beschreibung etwas lang gemacht, aber ich denke, es ist ein wichtiger Aspekt, den ich in anderen Antworten nicht angesprochen habe.
Fazit: Syntaktischer Zucker ist eine alternative (möglicherweise bequemere) Syntax für ein Konstrukt, das bereits in einer Sprache vorliegt und bereits eine genau definierte Syntax und Semantik aufweist. Die neue Syntax (syntaktischer Zucker) unterscheidet sich von der vorhandenen, hat jedoch dieselbe Semantik . Wenn Sie ein neues Konstrukt in einer Sprache und eine neue Syntax dafür einführen, haben Sie keinen syntaktischen Zucker.