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 SatzBewegen 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 zua = a + b
in C und ähnliche Sprachen unter Annahmea
hat keine Nebenwirkungen wie wenna
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ürif (nicht Bedingung) {...}
. Zusätzlich kann jede Aussage von einer Bedingung folgen, alsoAnweisung wenn Bedingung
ist äquivalent zuif (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 dasa-> 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 vonx
Aus dem AusdruckExpr
, anstatt eine explizite Typdeklaration zu benötigen. In ähnlicher Weise erlaubt C ++Auto x = exprr
Da C ++ 11 und Java erlaubenvar 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 zuf (x, y)
. - Im Sql,
BEITRETEN
ist äquivalent zuInnerer Join
Letztere 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 alsMyMethod (MyObject, Parameter1, Parameter2, Parameter3)
. Der Verweis auf das Objekt wird als verborgenes Argument übergeben, das normalerweise innerhalb der Methode als zugänglich istDies
. - 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 BeispielJavax.swing importieren.*;
ermöglicht dem Programmierer, A zu verweisen, Schwingen Objekt wiejavax.swing.jbutton
Verwenden des kürzeren NamensJbutton
.
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
- ^ 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.
- ^ Abelson & Sussman 1996, Kapitel 1, Fußnote 11.
- ^ Barbara Liskov, "A History of CLU", MIT -Labor für Informatik Technischer Bericht 561 (1993)
- ^ 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.
- ^ "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.
- ^ 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
- ^ "Python -Datenmodell". docs.python.org. 21. Dezember 2020.
- ^ 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.
- ^ "Verwenden von Anweisung (C# Referenz)". Abgerufen 16. September 2014.
- ^ "Magrittr: Vignette". Abgerufen 24. Dezember 2018.
- ^ Abelson & Sussman 1996, Kapitel 1, Fußnote 11.
- ^ Perlis 1982, Epigramm #3.
- ^ "Die Jargon -Datei - syntaktisches Salz". 2003-06-12. Archiviert von das Original am 2003-06-12. Abgerufen 2018-03-19.
- ^ "Neuem Modifikator (C# Referenz)". microsoft.com. Microsoft. Abgerufen 3. August 2015.
- ^ "Switch (C# Referenz)". microsoft.com. Microsoft. Abgerufen 3. August 2015.
- ^ "syntethischer Zucker". Catb.org. Abgerufen 3. August 2015.
- ^ Boitten, Eerke A.; Möller, Bernhard (2002-06-26). Mathematik der Programmkonstruktion. ISBN 9783540438571. Abgerufen 3. August 2015.
- ^ Dean, Thomas (2004). Sprechen mit Computern: Erkundungen in der Wissenschaft und Technologie des Computers. Cambridge University Press. p.115. ISBN 9780521542043.
- ^ 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) - ^ Chugh, Ravi (2013). Verschachtelte Verfeinerungstypen für JavaScript (PhD). UC San Diego.
- ^ "C Language LLVM -Dokumentation". Clang.llvm.org. Abgerufen 30. Juni 2020.
- ^ "Das geheime Leben von Typen in Swift". Medium.com/@slavapestov. 14. Juli 2016. Abgerufen 30. Juni 2020.
Verweise
- Abelson, Harold; Sussman, Gerald Jay; Sussman, Julie (1996) [1984]. Struktur und Interpretation von Computerprogrammen. Cambridge, MA: MIT Press. ISBN 0-262-51087-1.
- Landin, Peter J. (Februar -März 1965). "Eine Korrespondenz zwischen Algol 60 und Lambda-Notation der Kirche: Teile I und II". Kommunikation der ACM. 8 (2.3): 89–101, 158–165. doi:10.1145/363744.363749. S2CID 6505810.
- Landin, Peter J. (März 1965). "Programmierung ohne Imperative - ein Beispiel". UNIVAC Systems Programmierforschung.
- Landin, Peter J. (Juli 1965). "Etiketten loswerden". UNIVAC Systems Programmierforschung.
- Landin, Peter J. (August 1965). "Eine Verallgemeinerung von Sprüngen und Etiketten". UNIVAC Systems Programmierforschung., nachgedruckt "Höherer Ordnung und symbolische Berechnung". 11. 1998: 125–143. Citeseerx 10.1.1.85.2610.
{{}}
: Journal zitieren erfordert|journal=
(Hilfe) - Perlis, A. J. (September 1982). "Epigramme zum Programmieren". ACM Sigplan nennt. New York, NY, USA: Vereinigung für Computermaschinen. 17 (9): 7–13. doi:10.1145/947955.1083808. S2CID 20512767. Archiviert von das Original Am 17. Januar 1999.