it-swarm.com.de

Was ist der Unterschied zwischen "Syntax" und "Syntactic Sugar"

Hintergrund

Auf der Wikipedia-Seite zu Syntactic Sugar heißt es:

In der Informatik ist syntaktischer Zucker eine Syntax innerhalb einer Programmiersprache, die das Lesen oder Ausdrücken erleichtern soll. Es macht die Sprache für den Menschen "süßer": Dinge können klarer, präziser oder in einem alternativen Stil ausgedrückt werden, den manche bevorzugen.

Ich verstehe nicht wirklich, was der Unterschied zwischen Syntactic Sugar und Syntax ist.

Ich schätze den Punkt, dass die zuckerhaltige Version klarer, prägnanter sein kann, vielleicht etwas Boilerplate abkochen kann. Aber ich habe das Gefühl, dass die gesamte Syntax dies im Wesentlichen tut, um eine Abstraktion darüber zu bilden, worauf der Code kompiliert wird.

Von derselben Wikipedia-Seite:

Sprachprozessoren, einschließlich Compiler, statische Analysatoren und dergleichen, erweitern gezuckerte Konstrukte häufig vor der Verarbeitung zu grundlegenderen Konstrukten, ein Prozess, der manchmal als "Desugaring" bezeichnet wird.

Als Gedankenübung, wenn ich "oft" in dieser Aussage als "immer" verstehe: Wenn der Unterschied nur darin besteht, ob der Compiler die Syntax "desugiert", bevor er zu einer nächsten Stufe übergeht, wie könnte ein Codierer, der die Innereien nicht kennt des Compilers wissen (oder sich darum kümmern), was Sugar'd Syntax ist oder nicht?

Eine sehr verwandte Frage auf dieser Seite "Rigorose Definition von syntaktischem Zucker?" hat eine Antwort die beginnt:

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.

Was könnte mir bedeuten, dass es für den Codierer, der die Sprache verwendet, vielleicht keinen großen Unterschied gibt? Vielleicht ist der Unterschied nur für den Compiler-Writer spürbar? Obwohl es Fälle geben kann, in denen es für den Codierer hilfreich ist, die Sprache zu verwenden, um zu wissen, was sich unter der Haube des Syntaktischen Zuckers befindet? (Aber vielleicht tendiert in der Realität ein Diskurs zu diesem Thema dazu, den Begriff als Flammenköder zu verwenden?)

Das Herzstück der Frage

Also ... die Kurzversion der Frage:

  • Gibt es einen echten Unterschied zwischen Syntax und syntaktischem Zucker?
  • Wem ist es wichtig?

Extra Denkanstöße

Bonus auf Themenwiderspruch:

Auf der Wikipedia-Seite wird ein Beispiel gegeben:

In der C-Sprache ist die Notation a[i] Beispielsweise syntaktischer Zucker für *(a + i)

Während ein anderes Antwort auf die oben verlinkte Frage über dasselbe Beispiel spricht:

Betrachten Sie nun a[i] == *(a + i). Denken Sie an jedes C-Programm, das Arrays inhaltlich verwendet.

Und fasst das zusammen:

Die Notation [] Erleichtert diese Abstraktion. Es ist kein syntaktischer Zucker.

Die gegenteilige Schlussfolgerung für dasselbe Beispiel!

46
Don Vince

Der Hauptunterschied besteht darin, dass die Syntax eine Grammatik ist, die in einer Sprache definiert ist, damit Sie einige Funktionen verfügbar machen können. Sobald Sie zu dieser Funktionalität gelangen, wird jede andere Syntax, mit der Sie dasselbe tun können, als Zucker betrachtet. Das führt natürlich zu merkwürdigen Szenarien darüber, welche der beiden Syntaxen der Zucker ist, zumal nicht immer klar ist, welche zuerst kam.

In der Praxis wird syntaktischer Zucker nur verwendet, um die Syntax zu beschreiben, die einer Sprache hinzugefügt wurde, um die Verwendung zu vereinfachen, z. B. das Zuordnen von Infix lhs + rhs Zu lhs.Add(rhs). Ich würde Cs Array-Indizierung als syntaktischen Zucker betrachten.

Dies ist vor allem deshalb wichtig, weil elegante Designs dazu neigen, das Ausmaß der Vervielfältigung zu begrenzen. Das Bedürfnis (oder zumindest der Wunsch) nach syntaktischem Zucker wird von manchen als Zeichen für ein Versagen des Designs angesehen.

34
Telastyn

Syntax ist das, was ein Sprachprozessor verwendet, um zu verstehen, was die Konstrukte einer Sprache bedeuten. Konstrukte, die als syntaktischer Zucker gelten, müssen ebenfalls vom Sprachprozessor interpretiert werden und sind daher Teil einer Sprachensyntax.

Das, was syntaktischen Zucker vom Rest der Syntax einer Sprache unterscheidet, ist, dass es möglich wäre, den syntaktischen Zucker aus der Sprache zu entfernen, ohne die Programme zu beeinflussen, die in der Sprache geschrieben werden können.

Um eine formalistischere Definition zu geben, würde ich sagen

Syntaktischer Zucker sind diejenigen Teile der Syntax einer Sprache, deren Auswirkungen durch andere Syntaxkonstrukte in der Sprache definiert werden.

Dies soll in keiner Weise den syntaktischen Zucker oder die Sprachen, in denen er vorkommt, verunglimpfen, da die Verwendung von syntaktischem Zucker häufig zu Programmen führt, deren Absicht verständlicher ist.

Die anderen Antworten haben kein Schlüsselkonzept erwähnt: abstrakte Syntax; ohne sie macht der Begriff "syntaktischer Zucker" keinen Sinn.

Die abstrakte Syntax definiert die Elemente und die Struktur von Sprachen und wie Phrasen dieser Sprache kombiniert werden können, um größere Phrasen zu erstellen. Die abstrakte Syntax ist unabhängig von der konkreten Syntax. Der Begriff "syntaktischer Zucker" bezieht sich, wie ich es verstehe, auf konkrete Syntax.

Im Allgemeinen möchten Sie beim Entwerfen einer Sprache eine konkrete Syntax für jeden Begriff Ihrer abstrakten Syntax erstellen, damit Benutzer Code in Ihrer Sprache mit einfachem Text schreiben können.

Angenommen, Sie erstellen eine umständliche konkrete Syntax für foo . Benutzer beschweren sich und Sie implementieren eine neue konkrete Syntax zur Darstellung von dieselbe abstrakte Syntax. Das Ergebnis ist, dass sich Ihre abstrakte Syntax und Semantik nicht geändert haben, Sie jedoch jetzt zwei konkrete Syntaxen für denselben abstrakten Syntaxbegriff haben.

Ich glaube, das meinen die Leute, wenn sie "syntaktischen Zucker" sagen - Änderungen, die nur die konkrete Syntax beeinflussen, aber nicht die abstrakte Syntax oder Semantik.

Damit ist der Unterschied zwischen "syntaktischem Zucker" und "konkreter Syntax" klar. Mir. :) :)

Diese Interpretation hilft auch zu erklären, was Alan Perlis gemeint haben könnte, als er sagte "syntaktischer Zucker verursacht Krebs des Semikolons": Der gesamte konkrete syntaktische Zucker der Welt kann die schwache abstrakte Syntax nicht reparieren, und der Aufwand, den Sie für das Hinzufügen dieses Zuckers aufwenden, ist Sie müssen sich nicht mit dem eigentlichen Problem befassen - der abstrakten Syntax.


Ich sollte auch beachten, dass dies ausschließlich meine Meinung ist; Ich glaube es nur, weil es die einzige Interpretation ist, an die ich denken kann, die für mich Sinn macht.

6
user39685

Syntaktischer Zucker ist eine Teilmenge der Sprachsyntax. Die Grundidee ist, dass es mehr als einen Weg gibt, dasselbe zu sagen.

Was macht es schwierig zu sagen, welche Stücke syntaktischer Zucker sind und welche Stücke "reine Syntax" sind Aussagen wie "es ist schwer zu sagen, welche Form zuerst kam" oder "es ist schwer zu wissen, auf welche Weise der Autor die beabsichtigte Sprache "oder" es ist etwas willkürlich zu entscheiden, welche Form einfacher ist ".

Was macht es einfach zu entscheiden, welche Stücke rein oder zuckerhaltig sind, ist die Frage im Rahmen eines bestimmten Compilers oder Interpreters zu stellen. Die reine Syntax ist das Material, das ein Compiler direkt in Maschinencode konvertiert oder auf das der Interpreter direkt reagiert. Der Zucker ist das Zeug, das zuerst in ein anderes Syntaxmaterial verwandelt wird, bevor diese direkten Dinge passieren. Abhängig von der Implementierung kann dies mit dem übereinstimmen, was der Autor beabsichtigt hat, oder sogar mit dem, was die Sprachspezifikation behauptet.

In der Praxis wird auf diese Weise die Realität der Sache entschieden.

4
Jeff Wolski

Normalerweise ist Syntaxzucker der Teil der Sprache, der durch einen vorhandenen Teil der Sprache (Syntax) ohne Verlust der Allgemeinheit, aber möglicherweise mit Verlust an Klarheit ausgedrückt werden kann. Manchmal haben die Compiler einen expliziten Desugaring-Schritt, der das vom Quellcode erstellte AST] transformiert und einfache Schritte anwendet, um Knoten zu entfernen, die Zucker entsprechen.

Zum Beispiel hat Haskell Syntaxzucker für Monaden mit den folgenden Regeln, die rekursiv angewendet werden

do { f }            ~> f
do { g; h }         ~> g >> do h
do { x <- f; h }    ~> f >>= \x -> do h
do { let x = f; h } ~> let x = f in do h

Im Moment spielt es keine Rolle, was es genau bedeutet - Sie können jedoch sehen, dass die spezielle Syntax von LHS in etwas Grundlegenderes von RHS umgewandelt werden kann (nämlich Funktionsanwendungen, Lambdas und let). Dieser Schritt ermöglicht es, das Beste aus beiden Welten zu behalten:

  1. Die Syntax in LHS ist für Programmierer (Syntaxzucker) einfacher, um die vorhandenen Ideen klarer auszudrücken
  2. Da die Unterstützung im Compiler für RHS-Konstrukte jedoch bereits im Compiler vorhanden ist, muss sie nicht als etwas Besonderes außerhalb von Parser und Desugaring behandelt werden (mit Ausnahme der Fehlerberichterstattung).

In ähnlicher Weise können Sie sich in C vorstellen, die Umschreiberegel zu deaktivieren (aufgrund von Überladung des Operators usw. gilt dies nicht für C++):

f->h ~> (*f).h
f[h] ~> *(f + h)

Sie können sich vorstellen, alle Programme zu schreiben, ohne -> Oder [] In C zu verwenden, die diese Konstruktion heute verwenden. Für Programmierer wäre es jedoch schwieriger, es zu verwenden, daher wird Syntaxzucker bereitgestellt (ich denke, in den 70er Jahren könnte dies die Arbeit auch für Compiler vereinfachen). Es ist möglicherweise weniger klar, da Sie technisch die folgende, vollkommen gültige Umschreiberegel hinzufügen können:

*f ~> f[0] -- * and [] have the same expressiveness 

Ist Syntax Zucker schlecht? Nicht unbedingt - es besteht die Gefahr, dass es als Frachtkult verwendet wird, ohne die tiefere Bedeutung zu verstehen. Zum Beispiel sind die folgenden Funktionen in Haskell gleichwertig, aber viele Anfänger würden das erste Formular schreiben, ohne zu verstehen, dass sie Syntaxzucker übermäßig verwenden:

f1 = do x <- doSomething
        return x
f2 = doSomething

Darüber hinaus kann Syntaxzucker die Sprache überkomplizieren oder zu eng sein, um verallgemeinerten idiomatischen Code zuzulassen. Es kann auch bedeuten, dass die Sprache nicht leistungsfähig genug ist, um bestimmte Dinge einfach zu erledigen - es kann beabsichtigt sein (geben Sie Entwicklern keine scharfen Werkzeuge oder eine ganz bestimmte Nischensprache, bei der das Hinzufügen eines leistungsfähigeren Konstrukts andere Ziele verletzen würde) oder durch Auslassung - letztere Form gab der Syntax Zucker den schlechten Ruf. Wenn die Sprache leistungsfähig genug ist, um andere Konstrukte zu verwenden, ohne Syntaxzucker hinzuzufügen, wird es als eleganter angesehen, diese zu verwenden.

3

Ich denke, das offensichtlichste Beispiel wäre die "+ =" - Syntax in C.

i = i + 1;

und

 i +=  1;

machen Sie genau das Gleiche und kompilieren Sie genau die gleichen Maschinenanweisungen. Das zweite Formular spart ein paar Zeichen beim Eingeben, macht aber vor allem deutlich, dass Sie einen Wert basierend auf seinem aktuellen Wert ändern.

Ich wollte den Post-/Präfix-Operator "++" als kanonisches Beispiel anführen, erkannte jedoch, dass dies mehr als syntaktischer Zucker war. Es gibt keine Möglichkeit, den Unterschied zwischen ++ i und i ++ in einem einzelnen Ausdruck mit der Syntax i = i + 1 Auszudrücken.

3
James Anderson

Wirklich, Ihr erstes Zitat aus Wikipedia sagt alles "... macht das Lesen einfacher ...", "... süßer für Menschen ...".

Beim Schreiben können verkürzte Formen wie "nicht" oder "nicht" als syntaktischer Zucker betrachtet werden.

3
ozz

Was auch immer die ursprüngliche Konnotation der Phrase war, heutzutage ist sie in erster Linie abwertend und wird fast immer als "nur" oder "nur" syntaktischer Zucker formuliert. Es ist so ziemlich nur für Programmierer wichtig, die Dinge gerne unleserlich machen und eine präzise Art und Weise wollen, um dies ihren Kollegen gegenüber zu rechtfertigen. Eine Definition von jenen, die den Begriff heute aus ihrer Sicht hauptsächlich verwenden, wäre ungefähr so:

Syntax, die mit anderen allgemeiner anwendbaren Syntaxen redundant ist, um Programmierern, die die Sprache nicht wirklich verstehen, eine Krücke zu bieten.

Aus diesem Grund erhalten Sie zwei entgegengesetzte Schlussfolgerungen für dasselbe syntaktische Element. Ihr erstes Beispiel zur Array-Notation verwendet die ursprüngliche positive Bedeutung des Begriffs, ähnlich wie Barts Antwort. Ihr zweites Beispiel ist die Verteidigung der Array-Notation gegen den Vorwurf, syntaktischer Zucker im abwertenden Sinne zu sein. Mit anderen Worten, es wird argumentiert, dass die Syntax eher eine nützliche Abstraktion als eine Krücke ist.

1
Karl Bielefeldt

Zunächst werde ich einige der anderen Antworten mit einem konkreten Beispiel ansprechen. Die C++ 11-Range-basierte for-Schleife (ähnlich wie foreach-Schleifen in verschiedenen anderen Sprachen)

for (auto value : container) {
    do_something_with(value);
}

ist genau gleichbedeutend mit (dh einer gezuckerten Version von)

for (auto iterator = begin(container); iterator != end(container); ++iterator) {
    do_something_with(*iterator);
}

Obwohl der Sprache keine neue abstrakte Syntax oder Semantik hinzugefügt wurde, ist sie jetzt wirklich nützlich.

Die erste Version macht die Absicht (Besuch jedes Elements in einem Container) explizit. Es verhindert auch ungewöhnliches Verhalten wie das Ändern des Containers während des Durchlaufs oder das weitere Vorrücken von iterator im Schleifenkörper oder das subtile Falschen der Schleifenbedingungen. Dies vermeidet mögliche Fehlerquellen und verringert auf diese Weise die Schwierigkeit, den Code zu lesen und zu überlegen.

Zum Beispiel ein Ein-Zeichen-Fehler in der zweiten Version:

for (auto iterator = begin(container); iterator <= end(container); ++iterator) {
    do_something_with(*iterator);
}

gibt einen One-Past-The-End-Fehler und undefiniertes Verhalten.

Die gezuckerte Version ist also gerade deshalb nützlich, weil sie restriktiver und damit einfacher zu vertrauen und zu verstehen ist.


Zweitens zur ursprünglichen Frage:

Gibt es einen echten Unterschied zwischen Syntax und syntaktischem Zucker?

Nein, "syntaktischer Zucker" ist eine (konkrete) Sprachsyntax, die als "Zucker" bezeichnet wird, da sie die abstrakte Syntax oder die Kernfunktionalität der Sprache nicht erweitert. Ich mag Matt Fenwicks Antwort darauf.

Wem ist es wichtig?

Es ist für die Benutzer der Sprache genauso wichtig wie für jede andere Syntax, und in diesem Sinne wird Zucker bereitgestellt, um bestimmte Redewendungen zu unterstützen (und in gewissem Sinne zu segnen).

Zum Schluss noch zur Bonusfrage

Die Notation [] erleichtert diese Abstraktion.

dies klingt sehr nach Definition von syntaktischem Zucker: Es unterstützt (und bietet den Segen der Sprachautoren) die Verwendung von Zeigern als Arrays. Das Formular p[i] Ist nicht wirklich restriktiver als *(p+i), daher besteht der einzige Unterschied in der klaren Kommunikation der Absicht (und einem leichten Lesbarkeitsgewinn).

1
Useless