Syntethischer Zucker

Im Informatik, syntethischer Zucker ist Syntax innerhalb eines Programmiersprache Das soll die Dinge leichter zu lesen oder auszudrücken. Es macht die Sprache für den menschlichen Gebrauch "süßer": Dinge können klarer, besserer oder in einem alternativen Stil, den manche bevorzugen, klarer, genauer ausgedrückt werden.

Zum Beispiel bieten viele Programmiersprachen eine spezielle Syntax für Verweisen und Aktualisierungen Array Elemente. Abstrakt ist eine Array -Referenz ein Verfahren von zwei Argumenten: ein Array und ein Indexvektor, das als ausgedrückt werden könnte get_array (Array, Vektor (i, j)). Stattdessen liefern viele Sprachen Syntax wie z. Array [i, j]. In ähnlicher Weise ist ein Array -Element -Update eine Prozedur, die beispielsweise aus drei Argumenten besteht set_array (array, vector (i, j), Wert)aber viele Sprachen bieten Syntax wie z. Array [i, j] = Wert.

Ein Konstrukt in einer Sprache ist syntaktischer Zucker, wenn es aus der Sprache entfernt werden kann, ohne dass sich die Sprache auswirkt: Funktionalität und Ausdruckskraft wird gleich bleiben.

Sprachprozessoren, einschließlich Compiler und Statische AnalysatorenErweitern Sie oft vor der Verarbeitung zuckerhaltige Konstrukte in grundlegendere Konstrukte, ein Prozess, der manchmal als "Devaring" bezeichnet wird.

Ursprünge

Der Begriff syntethischer Zucker wurde von geprägt von Peter J. Landin 1964 beschreibt die Oberflächensyntax eines einfachen Algol-ähnliche Programmiersprache, die semantisch in Bezug auf die angewandten Ausdrücke von definiert wurde Lambda -Kalkül,[1][2] zentriert auf lexikalisch ersetzen λ durch "wo".

Später Programmiersprachen, wie z. Clu, Ml und Planen, erweiterte den Begriff, sich auf eine Syntax innerhalb einer Sprache zu beziehen, die als Sprachkern von essentiellen Konstrukten definiert werden könnte; Die bequemen Merkmale auf höherer Ebene könnten "dezared" und in diese Teilmenge zersetzt werden.[3] Dies ist in der Tat die übliche mathematische Praxis, sich aus Primitiven aufzubauen.

Aufbau von Landins Unterscheidung zwischen wesentlichen Sprachkonstrukten und syntaktischem Zucker im Jahr 1991, Matthias Fellisen schlug eine Kodifizierung der "ausdrucksstarken Macht" vor, um sich in der Literatur mit "weit verbreiteten Überzeugungen" auszurichten. Er definierte "ausdrucksstärker", um zu bedeuten, dass ohne die fraglichen Sprachkonstrukte ein Programm vollständig neu organisiert werden müsste.[4]

Bemerkenswerte Beispiele

  • Im CobolViele der Zwischenschlüsselwörter sind syntaktischer Zucker, die optional weggelassen werden können. Zum Beispiel der Satz Bewegen Sie ein B. und der Satz Bewegen Sie A nach B. Führen Sie genau dieselbe Funktion aus, aber die zweite macht die Aktion, die klarer ausgeführt werden soll.
  • Erweiterte Aufgabe oder Verbindungszuweisungsoperatoren: Zum Beispiel, a+= b ist äquivalent zu a = a + b in C und ähnliche Sprachen unter Annahme a hat keine Nebenwirkungen wie wenn a ist eine reguläre Variable.[5][6] Einige Sprachen, wie z. Python[7] könnte erlauben Überlastung Erweiterte Zuordnungsbetreiber, daher können sie sich unterschiedlich verhalten als Standard.
  • Im Perl, es sei denn (Zustand) {...} ist syntaktischer Zucker für if (nicht Bedingung) {...}. Zusätzlich kann jede Aussage von einer Bedingung folgen, also Anweisung wenn Bedingung ist äquivalent zu if (Bedingung) {Anweisung}, aber ersterer ist auf einer einzigen Linie natürlicher formatiert.
  • In dem C Sprache, das A [i] Notation ist syntaktischer Zucker für *(a + i).[8] Ebenso das a-> x Notation ist syntaktischer Zucker für Zugriff auf Mitglieder Verwendung der Dereference -Operator (*Axt.
  • Das Verwendung Aussage in C# stellt sicher, dass bestimmte Objekte korrekt entsorgt werden. Der Compiler erweitert die Aussage in einen Try-final-Block.[9]
  • Mit der C# -Sprache können Variablen als deklariert werden var x = exprr, was es dem Compiler ermöglicht, zu schließen die Art von x Aus dem Ausdruck Expr, anstatt eine explizite Typdeklaration zu benötigen. In ähnlicher Weise erlaubt C ++ Auto x = exprr Da C ++ 11 und Java erlauben var x = exprr Seit Java 11.
  • Python Listen Sie Verständnisse auf (wie zum Beispiel [x*x für x in Bereich (10)] für eine Liste von Quadraten) und Dekorateure (wie zum Beispiel @StaticMethod).
  • Im Haskell, eine String, die in Anführungszeichen bezeichnet wird, entspricht semantisch einer Liste von Zeichen.
  • In dem Tidyverse Sammlung von R Pakete, die Rohr, bezeichnet durch %>%, erklärt, dass die Daten (oder Ausgabe der Funktion) vor dem Rohr als erstes Argument für die Funktion nach dem Rohr dienen.[10] So, x%>% f (y) ist äquivalent zu f (x, y).
  • Im Sql, BEITRETEN ist äquivalent zu Innerer JoinLetztere klar, dass die Join -Erklärung speziell eine innere Verbindung ist, im Gegensatz zu einer äußeren Verbindungsoperation.
  • Methodenanruf in OOP -Sprachen in Form von myObject.mymethod (Parameter1, Parameter2, Parameter3) ist syntaktischer Zucker für die Aufruf einer globalen Funktion als MyMethod (MyObject, Parameter1, Parameter2, Parameter3). Der Verweis auf das Objekt wird als verborgenes Argument übergeben, das normalerweise innerhalb der Methode als zugänglich ist Dies.
  • Ein von Referenz aufgerufener Parameter ist syntaktischer Zucker zum technischen Bestehen a Zeiger Als Parameter, aber syntaktisch behandeln es als Variable selbst, um eine konstante Zeigerabreferenzierung im Code innerhalb der Funktion zu vermeiden.
  • Im Java, ein importieren Die Erklärung ermöglicht es dem Compiler, Klassen zu finden, die nicht mit vollständig qualifizierten Namen angegeben sind. Zum Beispiel Javax.swing importieren.*; ermöglicht dem Programmierer, A zu verweisen, Schwingen Objekt wie javax.swing.jbutton Verwenden des kürzeren Namens Jbutton.

Kritik

Einige Programmierer sind der Ansicht, dass diese Syntax -Usability -Funktionen entweder unwichtig oder leicht leichtfertig sind. Insbesondere machen spezielle syntaktische Formen eine Sprache weniger einheitlicher und ihre Spezifikation komplexer und können Probleme verursachen, wenn Programme groß und komplex werden. Diese Ansicht ist besonders weit verbreitet in der Lispeln Die Community, wie Lisp, hat eine sehr einfache und regelmäßige Syntax, und die Oberflächensyntax kann leicht geändert werden.[11] Zum Beispiel, Alan Perlis Einmal drückte "Epigramme beim Programmieren", in einem Verweis auf Sprachen mit Klammer, dieser "syntaktische Zucker verursacht Krebs der Krebs der Halbkolons".[12]

Ableitungsbegriffe

Syntaktisches Salz

Die Metapher wurde durch die Prägung des Begriffs erweitert syntaktisches SalzDies zeigt eine Funktion an, die es schwieriger macht, schlechten Code zu schreiben.[13] Insbesondere syntaktisches Salz ist ein Reifen, den Programmierer durchspringen müssen, um zu beweisen, dass sie wissen, was vor sich geht, anstatt eine Programmaktion auszudrücken. Zum Beispiel in Java und Pascal Zuweisen a Schwimmerwert zu einer Variablen als als deklariert int Ohne zusätzliche Syntax, die explizit angibt, dass die Absicht zu einem Kompilierfehler führt C und C ++ wird automatisch alle Schwimmer abschneiden, die einem int zugewiesen sind. Dies ist jedoch keine Syntax, sondern die Semantik.

Im C#, wenn ein ererbter Klassenmitglied versteckt ist, wird eine Compiler -Warnung ausgestellt, es sei denn Neu Das Schlüsselwort wird verwendet, um anzugeben, dass das Versteck beabsichtigt ist.[14] Um potenzielle Fehler aufgrund der Ähnlichkeit der zu vermeiden Schaltanweisung Syntax mit der von C oder C ++, erfordert C# a Unterbrechung Für jeden nicht leeren Fall Etikett von a Schalter (wenn nicht gehe zu, Rückkehr, oder Wurf wird verwendet) obwohl es nicht implizit zulässt durchfallen.[15] (Verwendung gehe zu und das Angeben der nachfolgenden Etikett erzeugt ein C/C ++-wie durchfallen.))

Syntaktisches Salz kann seinen Zweck besiegen, indem er den Code nicht lesbar macht und somit seine Qualität verschlechtert - in extremen Fällen kann der wesentliche Teil des Codes kürzer sein als der Overhead, der zur Erfüllung der Sprachanforderungen eingeführt wird.

Eine Alternative zu syntaktischem Salz erzeugt Compiler -Warnungen, wenn eine hohe Wahrscheinlichkeit besteht, dass der Code ein Fehler ist - eine Praxis, die in modernen C/C ++ - Compilern üblich ist.

Syntaktisches Saccharin

Andere Erweiterungen sind syntaktisch Saccharin und syntaktisch Sirup, bedeutet unbegründete Syntax, die die Programmierung nicht erleichtert.[16][17][18][19]

Zuckerhalte Typen

Datentypen mit Core -syntaktischer Unterstützung werden als "zugeschafte Typen" bezeichnet.[20][21][22] Zu den häufigen Beispielen gehören zitierte Zeichenfolgen, lockige Klammern für Objekt- und Aufzeichnungsarten sowie quadratische Klammern für Arrays.

Anmerkungen

  1. ^ Landin, Peter J. (1964). "Die mechanische Bewertung von Ausdrücken" (PDF). Das Computerjournal. Computerjournal. 6 (4): 308–320. doi:10.1093/comjnl/6.4.308. Abgerufen 21. Juli 2014.
  2. ^ Abelson & Sussman 1996, Kapitel 1, Fußnote 11.
  3. ^ Barbara Liskov, "A History of CLU", MIT -Labor für Informatik Technischer Bericht 561 (1993)
  4. ^ Fellisen, Matthias (Dezember 1991). "Über die ausdrucksstarke Kraft der Programmiersprachen". Wissenschaft der Computerprogrammierung. Springer-Verlag. 17 (1–3): 35–75. doi:10.1016/0167-6423 (91) 90036-W. Abgerufen 19. Juli 2014.
  5. ^ "C -Verbindungszuordnung". msdn.microsoft.com. Microsoft. Abgerufen 20. Juni 2016. Die Expression der Verbindungsverhältnisse entspricht jedoch nicht der erweiterten Version, da die Expression von Verbindungsverhältnissen Expression1 nur einmal bewertet, während die erweiterte Version Expression1 zweimal bewertet: im Additionsvorgang und in der Zuordnungsoperation.
  6. ^ Garavaglia, Emilio (26. Juli 2015). "Warum werden Verknüpfungen wie X += y als gute Praxis angesehen?". stackexchange.com. Abgerufen 20. Juni 2016. Die Optimierung kann durchgeführt werden, wenn 'Finding X' keine Nebenwirkungen hat
  7. ^ "Python -Datenmodell". docs.python.org. 21. Dezember 2020.
  8. ^ Raymond, Eric S. (11. Oktober 1996). Das Wörterbuch des neuen Hackers - 3. Auflage. MIT Press. p. 432. ISBN 978-0-262-68092-9. Abgerufen 5. August 2012.
  9. ^ "Verwenden von Anweisung (C# Referenz)". Abgerufen 16. September 2014.
  10. ^ "Magrittr: Vignette". Abgerufen 24. Dezember 2018.
  11. ^ Abelson & Sussman 1996, Kapitel 1, Fußnote 11.
  12. ^ Perlis 1982, Epigramm #3.
  13. ^ "Die Jargon -Datei - syntaktisches Salz". 2003-06-12. Archiviert von das Original am 2003-06-12. Abgerufen 2018-03-19.
  14. ^ "Neuem Modifikator (C# Referenz)". microsoft.com. Microsoft. Abgerufen 3. August 2015.
  15. ^ "Switch (C# Referenz)". microsoft.com. Microsoft. Abgerufen 3. August 2015.
  16. ^ "syntethischer Zucker". Catb.org. Abgerufen 3. August 2015.
  17. ^ Boitten, Eerke A.; Möller, Bernhard (2002-06-26). Mathematik der Programmkonstruktion. ISBN 9783540438571. Abgerufen 3. August 2015.
  18. ^ Dean, Thomas (2004). Sprechen mit Computern: Erkundungen in der Wissenschaft und Technologie des Computers. Cambridge University Press. p.115. ISBN 9780521542043.
  19. ^ Harrison, William; Sheard, Tim (8. bis 10. Juli 2002). "Mathematik der Programmkonstruktion". Mathematik des Programmbaus: 6. Internationale Konferenz, MPC 2002, Dagstuhl Castle, Deutschland, 8. bis 10. Juli 2002. Proceedings. Internationale Konferenz über Mathematik des Programmbaus. Vorlesungsnotizen in Informatik. Vol. 2386. Dagstuhl Castle, Deutschland: Springer Berlin Heidelberg. p. 93. doi:10.1007/3-540-45442-X_6. ISBN 978-3-540-43857-1. S2CID 10059915. {{}}: |archive-url= erfordert |url= (Hilfe)
  20. ^ Chugh, Ravi (2013). Verschachtelte Verfeinerungstypen für JavaScript (PhD). UC San Diego.
  21. ^ "C Language LLVM -Dokumentation". Clang.llvm.org. Abgerufen 30. Juni 2020.
  22. ^ "Das geheime Leben von Typen in Swift". Medium.com/@slavapestov. 14. Juli 2016. Abgerufen 30. Juni 2020.

Verweise