Wie wäre es damit: "Syntaktischer Zucker ist eine Abkürzung für einige Funktionen, die keine sinnvolle Abstraktionsebene einführen."
Nehmen Sie a->b
, was, wie Sie betonen, gleichbedeutend ist mit (*a).b
. Können Sie mit dieser Notation den Code auf nützliche, ansonsten verborgene Weise betrachten? Nein, es ist also syntaktischer Zucker.
Nun überlegen Sie a[i] == *(a + i)
. Denken Sie an jedes C-Programm, das Arrays inhaltlich verwendet. Können Sie sich vorstellen, es ohne die []
Notation zu verstehen ? Mit mehrdimensionalen Arrays? Es ist sinnvoll, Arrays als ganze Einheiten zu betrachten, nicht als Referenz für den Beginn eines zusammenhängenden Speicherblocks. Es ist zwar hilfreich zu wissen, wie Arrays in C funktionieren, wenn Sie komplizierte Dinge damit tun möchten, aber es ist unproduktiv, immer denken zu müssen: "Ich muss die zwei Speicherbits 2 * i Bytes rechts von der speichern Speicherort, auf den verwiesen wird a
. " Der springende Punkt eines Arrays ist die Fähigkeit, den Prozess des Speicherns einer Sequenz als kohärente Einheit zu abstrahieren. Die []
Notation erleichtert diese Abstraktion. Es ist kein syntaktischer Zucker.
Dies bedeutet nicht, dass syntaktischer Zucker immer eine schlechte Sache ist. Wie viele Alliterationen ist es zu einem Beinamen geworden und steht "echten Merkmalen" gegenüber. Aber LISP und Schema wären zum Beispiel ohne die let
Kurzschrift (und andere) nicht lesbar .
Der ternäre Operator <pred> ? <cnsq> : <alt>
ist ein weiteres Beispiel. Syntaktischer Zucker kann dabei helfen, Programme zu organisieren und redundanten Code zu entfernen, was später zu Wartungsarbeiten führen kann. Syntaktischer Zucker ist manchmal dem Anhäufen von "echten Merkmalen" vorzuziehen, wenn er dazu beiträgt, syntaktische Hindernisse für die Programmierung zu beseitigen.
Um R ^ 5RS zu zitieren : "Programmiersprachen sollten nicht durch Stapeln von Funktionen über Funktionen entworfen werden, sondern durch Entfernen der Schwachstellen und Einschränkungen, die zusätzliche Funktionen erforderlich machen." Meiner Meinung nach kann die Syntax als Schwäche und Einschränkung eingestuft werden. Wenn Programmierer sich von der Syntax entfernen, kann dies die Ausdruckskraft einer Sprache erhöhen .
Hier ist eine sehr strenge Definition für ein verwandtes Konzept: Ausdruckskraft , von
Matthias Felleisen:
Siehe auch diesen Eintrag zur Java-Sprache und zu den Schließungen .
Tatsächlich ist etwas syntaktischer Zucker, wenn es in eine Form ohne Syntax geändert werden kann, indem nur lokale Änderungen vorgenommen werden. Wenn Sie beispielsweise ohne die syntaktische Form mehrere verschiedene Codepositionen ändern oder Fragmente an andere Positionen verschieben müssten, handelt es sich nicht um Zucker.
Trotzdem ist syntaktischer Zucker bei sachgemäßer Verwendung in Ordnung. Ich denke, jeder Scheme-Programmierer würde lieber eine
let
spezielle Form haben, als eine neue anonyme Funktion erstellen und dann anwenden zu müssen, was dasselbe tun würde. Der Zweck besteht darin, den Code klarer zu gestalten.quelle
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 schreibenderen 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 einDas 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 eindas 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 dersum [...]
Notation verwendet werden kann). In ähnlicher Weise ist, wie in der Antwort von Hoa Long Tam ausgeführt, in C die Notationp->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 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.
quelle
syntaktischer Zucker ist eine Funktion, die die Ausdruckskraft der Sprache selbst nicht erweitert, daher überflüssig und manchmal ein Missbrauch der Notation ist, aber sowohl das Leben des Schriftstellers vereinfacht als auch dem Leser mehr Einblick gibt.
quelle
Um meine eigene Frage zu beantworten: Ein Merkmal ist syntaktischer Zucker, wenn und nur wenn er in erster Linie zur Verbesserung der Ästhetik und Lesbarkeit enthalten war und trivial in einer Eins-zu-Eins-Weise in die entzuckerte Version übersetzt werden kann. (Mit ungefähr eins zu eins meine ich modulo triviale Dinge wie die Reihenfolge der kommutativen Operationen, Variablennamen und Leerzeichen.)
Jedes Merkmal, das nur mit einem erheblichen Maß an Programmiererdisziplin entzuckert werden kann, ist kein syntaktischer Zucker. Als Teilmenge davon ist jedes Merkmal, das die Typensicherheit erhöht, kein syntaktischer Zucker, da die manuelle Durchsetzung der Typensicherheit über die Disziplin des Programmierers höchst trivial ist. Zum Beispiel ist das Objektsystem von C ++ mehr als syntaktischer Zucker über dem C-Zeiger-Cast-Polymorphismus.
Jedes Merkmal, das entweder eine signifikante Codeduplizierung oder eine größere Neugestaltung erfordert, wenn es entfernt wird, ist kein syntaktischer Zucker, da keines dieser Merkmale ein triviales Unterfangen ist. Zum Beispiel sind Vorlagen nicht nur syntaktischer Zucker, da das Erhalten der entsprechenden Funktionalität ohne sie Tonnen von Klonen und Ändern erfordern würde.
Beispiel für Dinge, die syntaktischen Zucker sind:
a[i]
Anstatt von*(a + i)
a -> b
Anstatt von(*a).b
foreach
Syntax anstelle der manuellen Eingabe der Iteratorsyntax.Jede Überladung des Bedieners ist reiner syntaktischer Zucker.
Klingt dies nach einer fairen und einigermaßen eindeutigen Definition?
quelle
"Syntaktischer Zucker" ist kein streng definierter Begriff. Je nachdem, wen Sie fragen, erhalten Sie höchstwahrscheinlich eine der folgenden Definitionen:
quelle
Ich bin mir in den Bereichen der Informatik nicht sicher, aber im Bereich der Logik scheinen die Konzepte der Konservativität und Eliminierbarkeit von Definitionen [ 1 ] in die gleiche Richtung zu gehen.
Wenn man die Curry-Howard-Korrespondenz anwendet, kann man möglicherweise ein paralleles Konzept für „syntaktischen Zucker“ entwickeln.
quelle