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ætningen MOVE 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 += bsvarer det til a = a + bpå C og lignende sprog, forudsat at det ikke ahar nogen bivirkninger, f.eks. Hvis det aer 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 til if (not condition) {...}. Derudover kan enhver erklæring efterfølges af en betingelse, så statement if conditionsvarer til if (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 er a->xnotationen syntaktisk sukker til adgang til medlemmer ved hjælp af dereference -operatoren (*a).x .
  • Den usingerklæ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 af xudtrykket expri stedet for at kræve en eksplicit typedeklaration. På samme måde tillader C ++ auto x = exprsiden C ++ 11 og Java tillader var x = exprsiden 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 til f(x,y).
  • I SQL , JOINsvarer til INNER 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 importerklæ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 at javax.swing.JButtonbruge det kortere navn JButton.

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 newsø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 breakfor hver ikke-tom caseetiket af et switch(medmindre goto, returneller throwbliver brugt), selv om den ikke tillader implicit fall-igennem . (Brug gotoog 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