Strenge Definition von syntaktischem Zucker? [geschlossen]

9

Es scheint, als würden die Menschen in heiligen Kriegen der Sprache ständig jedes Merkmal verunglimpfen, das sie als "nur syntaktischen Zucker" nicht besonders nützlich finden. Die Grenze zwischen "echten Merkmalen" und "syntaktischem Zucker" verschwimmt in diesen Debatten. Was ist Ihrer Meinung nach eine vernünftige und eindeutige Definition von syntaktischem Zucker, die verhindert, dass er als eine Funktion definiert wird, die der Sprecher / Verfasser nicht für nützlich hält?

Dsimcha
quelle

Antworten:

19

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 letKurzschrift (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 .

Hoa Long Tam
quelle
7

IMHO Ich glaube nicht, dass Sie eine Definition für syntaktischen Zucker haben können, da der Ausdruck BS ist und wahrscheinlich von Leuten verwendet wird, die über "echte Programmierer" sprechen, die "echte Werkzeuge" auf "echten Betriebssystemen" verwenden.

Es ist BS, weil die Idee von "echten Merkmalen" oder "syntaktischem Zucker" wie der No-True-Scotsman-Irrtum ist . Insofern sind die Sätze "Ad-hoc-Versuche, eine unvernünftige Behauptung beizubehalten". Die Behauptung hier ist, dass eine Funktion hier trivial ist, weil Sie stattdessen eine "echte Funktion" verwenden könnten.

Es ist BS, weil einige argumentieren, dass die Verwendung von Zucker vermieden werden sollte, weil Sie einen Fehler schreiben können, aber Sie sollten sich daran halten, weil es schwieriger ist, Fehler zu schreiben. Ist das nicht großartig? Der gleiche Satz führt zu genau entgegengesetzten Schlussfolgerungen unter Verwendung derselben Logik.

Seine BS, weil niemand Usability-Studien oder Fehlerzählungsstudien zitiert, um ihre Lesbarkeit oder Wartbarkeit oder wahrscheinliche Fehlerargumente zu sichern.

Es ist BS, weil Menschen oft falsch liegen oder sich in Bezug auf die Äquivalenz irren. Diese Frage besagt beispielsweise , dass eine C # -String Zucker für ein char-Array ist. Sie sind nicht .

Wenn Sie jedoch sagen möchten, dass zwei Dinge Zucker sind, wenn sie semantisch äquivalent sind, und dies hilft, es so zu definieren, wie Sie es möchten.

Wenn Sie jemanden ablehnen möchten, können Sie auch den Ausdruck verwenden.

Conrad Frix
quelle
2
"Wenn Sie jemanden ablehnen möchten, können Sie auch den Ausdruck verwenden." - Wie in: "Hast du Barbara schon getroffen? Sie ist unser syntaktischer Zucker."?
Wolf
@ Wolf. Das ist ziemlich lustig. Ich meine, ich meinte jemandes Ideen oder Arbeiten oder Werkzeuge. Wie: "Hast du Barbara schon getroffen, sie hält sie für eine echte Programmiererin, aber sie verwendet zu viel Zucker." Oder "Barbra ist ein Experte für Bar ++ v8.0, aber 8.0 ist wirklich nur 7.0 mit viel Zucker."
Conrad Frix
7

Hier ist eine sehr strenge Definition für ein verwandtes Konzept: Ausdruckskraft , von
Matthias Felleisen:

Über die Ausdruckskraft von Programmiersprachen [Postscript war die einzige freie Form, die ich finden konnte.]

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 letspezielle 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.

Macneil
quelle
5
+1: syntaktischer Zucker ist wichtig. Die moderne algebraische Notation ist nur syntaktischer Zucker für die lateinische Prosa, die sie ersetzt hat, aber sie macht einen großen Unterschied in unserer Fähigkeit, mathematisch zu argumentieren.
Kevin Cline
3

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 summit 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->fieldsyntaktischer 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->fieldwä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.

Giorgio
quelle
0

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.

Lorenzo Stella
quelle
0

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?

Dsimcha
quelle
3
Operatorüberladung ist kein syntaktischer Zucker. Dies ermöglicht es C ++, Vorlagen zu haben, die sowohl für grundlegende Typen (z. B. int) als auch für meine eigenen Klassen funktionieren.
Kate Gregory
@KateGregory: Wenn man akzeptiert, dass Funktionsüberladung kein syntaktischer Zucker ist, kann Operatorüberladung als syntaktischer Zucker angesehen werden, um einfach überladbare Funktionen für die angegebenen Werte aufzurufen.
Supercat
0

"Syntaktischer Zucker" ist kein streng definierter Begriff. Je nachdem, wen Sie fragen, erhalten Sie höchstwahrscheinlich eine der folgenden Definitionen:

  1. Kein echter schottischer Ansatz. Dinge, die ich mag, sind echte Programmierung, und Dinge, die ich nicht mag, sind syntaktischer Zucker.
  2. Alles nach MIPS war syntaktischer Zucker, und selbst einige dieser Anweisungen sind wahrscheinlich nicht notwendig.
  3. Alles, was jemandem irgendwo das Programmieren erleichtert, ist nützlich und kein syntaktischer Zucker. Da ein Feature nicht hinzugefügt worden wäre, wenn es unter keinen Umständen für nützlich befunden worden wäre, ist jedes vorhandene Feature kein syntaktischer Zucker. Hypothetische Merkmale können syntaktischer Zucker sein, bis jemand entscheidet, dass dieses Merkmal für ihn nützlich ist.
Patrick87
quelle
-3

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.

Kammern
quelle