Syntaktický cukr - Syntactic sugar
Ve vědě o počítačích , syntaktický cukr je syntax v programovacím jazyku , který je navržen tak, aby to bylo snazší číst nebo vyjádřit. Díky tomu je jazyk „sladší“ pro lidskou potřebu: věci lze vyjádřit jasněji, výstižněji nebo alternativním stylem, který někteří mohou preferovat.
Například mnoho programovacích jazyků poskytuje speciální syntaxi pro odkazování a aktualizaci prvků pole . Abstraktně je odkaz na pole postupem dvou argumentů: pole a vektoru dolního indexu, který lze vyjádřit jako get_array(Array, vector(i,j))
. Místo toho mnoho jazyků poskytuje syntaxi, jako například Array[i,j]
. Obdobně aktualizace prvku pole je postup, který se skládá například ze tří argumentů set_array(Array, vector(i,j), value)
, ale mnoho jazyků poskytuje syntaxi, jako je Array[i,j] = value
.
Konstrukt v jazyce je syntaktický cukr, pokud jej lze z jazyka odstranit bez jakéhokoli vlivu na to, co jazyk umí: funkčnost a vyjadřovací síla zůstanou stejné.
Jazykové procesory, včetně kompilátorů a statických analyzátorů , často před zpracováním rozšiřují cukrované konstrukty na zásadnější konstrukce, proces se někdy nazývá „desugaring“.
Původy
Termín syntaktický cukr byl vytvořen Peter J. Landin v roce 1964 k popisu povrchové syntaxe jednoduchého ALGOL like programovací jazyk, který byl definován sémanticky z hlediska aplikačních výrazů lambda kalkulu , se soustředil na lexically nahrazení lambda s „kde“.
Pozdější programovací jazyky, jako CLU , ML a Scheme , rozšířily termín tak, aby odkazoval na syntaxi v jazyce, který by mohl být definován z hlediska jazykového jádra základních konstruktů; praktické funkce vyšší úrovně by mohly být „odcukřeny“ a rozloženy do této podmnožiny. Toto je ve skutečnosti obvyklá matematická praxe budování z primitivů.
V návaznosti na Landinův rozdíl mezi esenciálními jazykovými konstrukty a syntaktickým cukrem navrhl v roce 1991 Matthias Felleisen kodifikaci „expresivní síly“, aby byla v souladu s „široce uznávanými vírami“ v literatuře. Definoval „expresivnější“ tak, že bez dotyčných jazykových konstrukcí by musel být program zcela reorganizován.
Pozoruhodné příklady
- V COBOL jsou mnoho mezilehlých klíčových slov syntaktickým cukrem, který lze volitelně vynechat. Například věta
MOVE A B.
a větaMOVE A TO B.
plní přesně stejnou funkci, ale díky druhé je akce, která má být provedena, jasnější. -
Operátory rozšířeného přiřazení nebo složeného přiřazení: Například
a += b
je ekvivalentnía = a + b
v jazyce C a podobných jazycích, za předpokladu, žea
nemá žádné vedlejší účinky, jakoa
je například pravidelná proměnná. Některé jazyky, například Python, mohou povolit přetížení operátorů rozšířeného přiřazení, takže se mohou chovat jinak než standardní. - V Perlu ,
unless (condition) {...}
je syntaktický cukr proif (not condition) {...}
. Kromě toho za jakýmkoli příkazem může následovat podmínka, takžestatement if condition
je ekvivalentníif (condition) {statement}
, ale první je přirozeněji formátováno na jednom řádku. - V jazyce C je
a[i]
notace syntaktickým cukrem pro*(a + i)
. Podobně jea->x
notace syntaktickým cukrem pro přístup ke členům pomocí operátoru dereference(*a).x
. - Příkaz
using
v C# zajišťuje, že určité objekty jsou správně zlikvidovány. Kompilátor rozbalí příkaz do bloku try-finally. - Jazyk C# umožňuje deklarovat proměnné jako
var x = expr
, což kompilátoru umožňuje odvodit typx
z výrazuexpr
, místo aby vyžadoval explicitní deklaraci typu. Podobně C ++ umožňujeauto x = expr
od C ++ 11 a Java umožňujevar x = expr
od Java 11. - Porozumění seznamu v Pythonu (například
[x*x for x in range(10)]
pro seznam čtverců) a dekoratéry (jako@staticmethod
). - V Haskellu je řetězec označený uvozovkami sémanticky ekvivalentní seznamu znaků.
- V kolekci tidyverse R balíčků, potrubí , označené
%>%
, deklaruje, že data (nebo výstup funkce) předcházející kanálu budou sloužit jako první argument pro funkci následující po kanálu. Je tedyx %>% f(y)
ekvivalentníf(x,y)
. - V SQL ,
JOIN
je ekvivalentníINNER JOIN
, druhý objasnit, že spoje tvrzení je specificky vnitřní spojení operace, na rozdíl od vnějšího spojení provoz. -
Volání metody v jazycích OOP ve formě
myObject.myMethod(parameter1, parameter2, parameter3)
je syntaktický cukr pro volání globální funkce jako . Odkaz na objekt je předán jako skrytý argument, obvykle přístupný z metody jako .myMethod(myObject, parameter1, parameter2, parameter3)
this
- Parametry nazývané odkazem jsou syntaxí cukru pro technické předávání ukazatele parametru, ale syntakticky s ním zachází jako s proměnnou samotnou, aby se zabránilo neustálému rušení odkazů na ukazatel v kódu uvnitř funkce.
- V Javě , An
import
prohlášení umožňuje kompilátor najít třídy, které nejsou jinak specifikované s plně kvalifikovaných jmen. Napříkladimport javax.swing.*;
umožňuje programátorovi odkazovat na objekt Swing , napříkladjavax.swing.JButton
pomocí kratšího názvuJButton
.
Kritika
Někteří programátoři se domnívají, že tyto funkce použitelnosti syntaxe jsou buď nedůležité, nebo přímo frivolní. Zejména speciální syntaktické formy činí jazyk méně jednotným a jeho specifikace složitějším a mohou způsobovat problémy, protože programy se stávají velkými a složitými. Tento pohled je zvláště rozšířený v komunitě Lisp , protože Lisp má velmi jednoduchou a pravidelnou syntaxi a povrchovou syntaxi lze snadno upravit. Například Alan Perlis jednou vtipkoval v „ Epigramech o programování “, v odkazu na jazyky oddělené závorkami , že „syntaktický cukr způsobuje rakovinu středníků “.
Derivační termíny
Syntaktická sůl
Metafora byla rozšířena vytvořením pojmu syntaktická sůl , který označuje funkci navrženou tak, aby bylo těžší psát špatný kód. Konkrétně, syntaktická sůl je obruč, kterou musí programátoři přeskočit, jen aby dokázali, že vědí, co se děje, než aby vyjádřili akci programu. Například v Javě a Pascalu přiřazení hodnoty float proměnné deklarované jako int bez další syntaxe výslovně uvádějící, že tento záměr povede k chybě při kompilaci, zatímco C a C ++ automaticky zkrátí všechny plováky přiřazené int. Nejde však o syntaxi, ale o sémantiku.
V C# je při skrývání zděděného člena třídy vydáno varování kompilátoru, pokud není new
klíčové slovo použito k určení, že skrytí je záměrné. Aby se předešlo případným chyby vzhledem k podobnosti příkazu switch syntaxe s to C nebo C ++, C # vyžaduje break
pro každou non-prázdné case
etiketě switch
(pokud není goto
, return
nebo throw
se používá), přestože to neumožňuje implicitní pokles-through . (Použitím goto
a zadáním následujícího štítku vytvoříte propad C/C ++ .)
Syntaktická sůl může porazit svůj účel tím, že učiní kód nečitelným, a tím zhorší jeho kvalitu - v extrémních případech může být podstatná část kódu kratší než režie zavedená za účelem uspokojení jazykových požadavků.
Alternativou k syntaktické soli je generování varování kompilátoru, pokud existuje vysoká pravděpodobnost, že kód je výsledkem chyby - což je v moderních kompilátorech C/C ++ běžná praxe.
Syntaktický sacharin
Dalšími rozšířeními jsou syntaktický sacharin a syntaktický sirup , což znamená bezplatnou syntaxi, která nijak neulehčuje programování.
Sugarované typy
Datové typy s jádrovou syntaktickou podporou jsou údajně „cukrované typy“. Mezi běžné příklady patří řetězce oddělené uvozovkami, složené závorky pro typy objektů a záznamů a hranaté závorky pro pole.
Poznámky
Reference
- Abelson, Harold ; Sussman, Gerald Jay ; Sussman, Julie (1996) [1984]. Struktura a interpretace počítačových programů . Cambridge, MA: MIT Press . ISBN 0-262-51087-1.
- Landin, Peter J. (únor – březen 1965). „Korespondence mezi ALGOL 60 a Church's Lambda-Notation: části I a II“. Komunikace ACM . 8 (2,3): 89–101, 158–165. doi : 10,1145/363744,363749 . S2CID 6505810 .
- Landin, Peter J. (březen 1965). „Programování bez imperativů - příklad“. Výzkum programování systémů UNIVAC .
- Landin, Peter J. (červenec 1965). „Zbavení štítků“. Výzkum programování systémů UNIVAC .
-
Landin, Peter J. (srpen 1965). „Zobecnění skoků a štítků“. Výzkum programování systémů UNIVAC ., přetištěno v „ Vyšší pořadí a symbolické výpočty “. 11 . 1998: 125–143. CiteSeerX 10.1.1.85.2610 . Citační deník vyžaduje
|journal=
( nápověda ) - Perlis, AJ (září 1982). „Epigramy o programování“ . Oznámení ACM SIGPLAN . New York, NY, USA: Sdružení pro výpočetní techniku. 17 (9): 7–13. doi : 10,1145/947955.1083808 . S2CID 20512767 . Archivováno od originálu 17. ledna 1999.