Syntaktisk sukker - Syntactic sugar
I datalogi , syntaktisk sukker er syntaksen i en programmeringssprog , der er designet til at gøre tingene lettere at læse eller at udtrykke. Det gør sproget "sødere" til menneskelig brug: Ting kan udtrykkes mere klart, mere kortfattet eller i en alternativ stil, som nogle foretrækker.
For eksempel giver mange programmeringssprog en særlig syntaks til henvisning og opdatering af matrixelementer . Abstrakt er en arrayreference en procedure med to argumenter: en array og en subscriptvektor, som kan udtrykkes som get_array(Array, vector(i,j))
. I stedet giver mange sprog syntaks som f.eks Array[i,j]
. Tilsvarende er en array -elementopdatering en procedure, der f.eks. Består af tre argumenter set_array(Array, vector(i,j), value)
, men mange sprog giver syntaks som f.eks Array[i,j] = value
.
En konstruktion i et sprog er syntaktisk sukker, hvis den kan fjernes fra sproget uden nogen indflydelse på, hvad sproget kan: funktionalitet og udtrykskraft forbliver den samme.
Sprogprocessorer, herunder kompilatorer og statiske analysatorer , udvider ofte sukkerholdige konstruktioner til mere fundamentale konstruktioner før behandling, en proces der undertiden kaldes "desugaring".
Oprindelse
Udtrykket syntaktisk sukker blev opfundet af Peter J. Landin i 1964 for at beskrive overfladesyntaksen for et simpelt ALGOL -lignende programmeringssprog, der blev defineret semantisk med hensyn til de anvendelige udtryk for lambda calculus , centreret om leksisk at erstatte λ med "hvor".
Senere programmeringssprog, såsom CLU , ML og Scheme , udvidede udtrykket til at referere til syntaks inden for et sprog, der kunne defineres ud fra en sprogkerne af essentielle konstruktioner; de bekvemme funktioner på højere niveau kunne "desugares" og nedbrydes til denne delmængde. Dette er faktisk den sædvanlige matematiske praksis med at bygge op fra primitiver.
Med udgangspunkt i Landins sondring mellem essentielle sprogkonstruktioner og syntaktisk sukker foreslog Matthias Felleisen i 1991 en kodificering af "udtrykkende kraft" for at stemme overens med "udbredt tro" i litteraturen. Han definerede "mere udtryksfuld" til at betyde, at uden de pågældende sprogkonstruktioner skulle et program være fuldstændigt reorganiseret.
Bemærkelsesværdige eksempler
- I COBOL er mange af de mellemliggende søgeord syntaktisk sukker, der eventuelt kan udelades. For eksempel udfører sætningen
MOVE A B.
og sætningenMOVE A TO B.
nøjagtig den samme funktion, men den anden gør handlingen, der skal udføres, tydeligere. -
Forstærket tildeling eller sammensatte tildelingsoperatorer: Eksempelvis
a += b
svarer det tila = a + b
på C og lignende sprog, forudsat at det ikkea
har nogen bivirkninger, f.eks. Hvis deta
er en regelmæssig variabel. Nogle sprog, f.eks. Python , tillader muligvis overbelastning af forstørrede tildelingsoperatorer, så de kan opføre sig anderledes end standard. - I Perl ,
unless (condition) {...}
er syntaktisk sukker tilif (not condition) {...}
. Derudover kan enhver erklæring efterfølges af en betingelse, såstatement if condition
svarer tilif (condition) {statement}
, men førstnævnte er mere naturligt formateret på en enkelt linje. - I C -sproget er
a[i]
notationen syntaktisk sukker til*(a + i)
. På samme måde era->x
notationen syntaktisk sukker til adgang til medlemmer ved hjælp af dereference -operatoren(*a).x
. - Den
using
erklæring i C # , garanterer, at visse genstande bortskaffes korrekt. Kompilatoren udvider erklæringen til en prøve-endelig-blok. - C# -sproget tillader variabler at blive erklæret som
var x = expr
, hvilket gør det muligt for kompilatoren at udlede typen afx
udtrykketexpr
i stedet for at kræve en eksplicit typedeklaration. På samme måde tillader C ++auto x = expr
siden C ++ 11 og Java tilladervar x = expr
siden Java 11. - Python -listeforståelser (f.eks.
[x*x for x in range(10)]
For en liste over firkanter) og dekoratører (f.eks.@staticmethod
). - I Haskell svarer en streng, angivet med anførselstegn, semantisk til en liste med tegn.
- I den ryddelige samling af R -pakker erklærer røret , betegnet med
%>%
, at dataene (eller output fra funktionen) forud for røret vil tjene som det første argument for funktionen, der følger efter røret. Såx %>% f(y)
det svarer tilf(x,y)
. - I SQL ,
JOIN
svarer tilINNER JOIN
, sidstnævnte præciserer, at join -sætningen specifikt er en indre join -operation i modsætning til en ydre join -operation. -
Metodeopkald på OOP -sprog i form af
myObject.myMethod(parameter1, parameter2, parameter3)
er syntaktisk sukker til at kalde en global funktion som . Henvisningen til objektet sendes som et skjult argument, normalt tilgængeligt indefra metoden som .myMethod(myObject, parameter1, parameter2, parameter3)
this
- Parametre kaldet ved reference er et syntaksukker til teknisk overførsel af en markør til parameteren, men syntaktisk håndtering af det som variablen selv, for at undgå konstant af-referencer til markøren i koden inde i funktionen.
- I Java giver en
import
erklæring kompilatoren mulighed for at finde klasser, der ikke på anden måde er specificeret med fuldt kvalificerede navne. F.eks.import javax.swing.*;
Giver programmereren mulighed for at henvise til et Swing -objekt, f.eks. Ved atjavax.swing.JButton
bruge det kortere navnJButton
.
Kritik
Nogle programmører mener, at disse syntaksfunktioner enten er uvæsentlige eller ligefrem useriøse. Især særlige syntaktiske former gør et sprog mindre ensartet og dets specifikation mere komplekst og kan forårsage problemer, efterhånden som programmer bliver store og komplekse. Denne opfattelse er særlig udbredt i Lisp -samfundet, da Lisp har en meget enkel og regelmæssig syntaks, og overfladesyntaksen let kan ændres. For eksempel skrev Alan Perlis engang i " Epigrams on Programming ", i en henvisning til parentesafgrænsede sprog , at "Syntaktisk sukker forårsager kræft i semikolonerne ".
Afledte vilkår
Syntaktisk salt
Metaforen er blevet udvidet ved at opfinde udtrykket syntaktisk salt , hvilket angiver en funktion designet til at gøre det sværere at skrive dårlig kode. Specifikt er syntaktisk salt en bøjle, som programmører skal springe igennem for blot at bevise, at de ved, hvad der foregår, frem for at udtrykke en programhandling. For eksempel i Java og Pascal tildeler en float -værdi til en variabel erklæret som int uden yderligere syntaks, der eksplicit angiver, at intentionen vil resultere i en kompileringsfejl, mens C og C ++ automatisk afkorter alle floats, der er tildelt en int. Dette er dog ikke syntaks, men semantik.
I C# udsendes der en compiler -advarsel, når et skjult et arvet klassemedlem skjules, medmindre new
søgeordet bruges til at angive, at skjulet er forsætligt. For at undgå potentielle fejl på grund af ligheden af switch-statement syntaksen med den af C eller C ++, C # kræver en break
for hver ikke-tom case
etiket af et switch
(medmindre goto
, return
eller throw
bliver brugt), selv om den ikke tillader implicit fall-igennem . (Brug goto
og angivelse af den efterfølgende etiket giver et C/C ++-lignende gennemslag .)
Syntaktisk salt kan ødelægge dets formål ved at gøre koden ulæselig og dermed forringe dens kvalitet - i ekstreme tilfælde kan den væsentlige del af koden være kortere end den indførte omkostning for at tilfredsstille sprogkrav.
Et alternativ til syntaktisk salt er at generere compiler -advarsler, når der er stor sandsynlighed for, at koden er et resultat af en fejl - en praksis, der er almindelig i moderne C/C ++ - kompilatorer.
Syntaktisk saccharin
Andre udvidelser er syntaktisk saccharin og syntaktisk sirup , hvilket betyder gratis syntaks, der ikke gør programmeringen lettere.
Sukkerarter
Datatyper med kernesyntaktisk støtte siges at være "sukkerarter". Almindelige eksempler omfatter citatafgrænsede strenge, krøllede seler til objekt- og posttyper og firkantede parenteser til arrays.
Noter
Referencer
- Abelson, Harold ; Sussman, Gerald Jay ; Sussman, Julie (1996) [1984]. Struktur og fortolkning af computerprogrammer . Cambridge, MA: MIT Press . ISBN 0-262-51087-1.
- Landin, Peter J. (februar - marts 1965). "En korrespondance mellem ALGOL 60 og Kirkens Lambda-notation: del I og II". Kommunikation af ACM . 8 (2.3): 89–101, 158–165. doi : 10.1145/363744.363749 . S2CID 6505810 .
- Landin, Peter J. (marts 1965). "Programmering uden imperativer - et eksempel". UNIVAC Systems Programming Research .
- Landin, Peter J. (juli 1965). "Slippe af med etiketter". UNIVAC Systems Programming Research .
-
Landin, Peter J. (august 1965). "En generalisering af spring og etiketter". UNIVAC Systems Programming Research ., genoptrykt i " Højere orden og symbolsk beregning ". 11 . 1998: 125–143. CiteSeerX 10.1.1.85.2610 . Citer journal kræver
|journal=
( hjælp ) - Perlis, AJ (september 1982). "Epigrammer om programmering" . ACM SIGPLAN -meddelelser . New York, NY, USA: Association for Computing Machinery. 17 (9): 7–13. doi : 10.1145/947955.1083808 . S2CID 20512767 . Arkiveret fra originalen den 17. januar 1999.