Syntaktický cukr - Syntactic sugar
v počítačová věda, syntaktický cukr je syntax v rámci programovací jazyk který je navržen tak, aby usnadňoval čtení a vyjadřování. Dělá jazyk „sladším“ pro lidské použití: 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 pole elementy. Abstraktně je odkaz na pole procedurou dvou argumentů: pole a dolní indexový vektor, který lze vyjádřit jako get_array (pole, vektor (i, j))
. Místo toho mnoho jazyků poskytuje syntaxi, například Pole [i, j]
. Podobně aktualizace prvku pole je procedura skládající se například ze tří argumentů set_array (pole, vektor (i, j), hodnota)
, ale mnoho jazyků poskytuje syntaxi, například Pole [i, j] = hodnota
.
Konstrukt v jazyce se nazývá „syntaktický cukr“, pokud jej lze z jazyka odebrat bez jakéhokoli vlivu na to, co jazyk dokáže: funkčnost a expresivní síla zůstane stejný.
Jazykové procesory, včetně překladače a statické analyzátory, často rozšiřují cukerné konstrukty do základních konstrukcí před zpracováním, což je proces někdy nazývaný „desugaring“.
Počátky
Termín syntaktický cukr byl vytvořen Peter J. Landin v roce 1964 k popisu povrchové syntaxe jednoduchého ALGOL -jako programovací jazyk, který byl sémanticky definován pomocí aplikačních výrazů lambda kalkul,[1][2] zaměřeno na lexikální nahrazení λ za „kde“.
Pozdější programovací jazyky, jako např CLU, ML a Systém, rozšířil termín tak, aby odkazoval na syntaxi v jazyce, kterou lze definovat z hlediska jazykového jádra základních konstrukcí; pohodlné funkce na vyšší úrovni lze „desugarovat“ a rozložit na tuto podmnožinu.[3] Toto je ve skutečnosti obvyklá matematická praxe sestavování z primitiv.
V návaznosti na Landinův rozdíl mezi základními jazykovými konstrukty a syntaktickým cukrem v roce 1991 Matthias Felleisen navrhl kodifikaci „expresivní síly“, která by odpovídala „široce uznávaným názorům“ v literatuře. Definoval „výraznější“, což znamená, že bez dotyčných jazykových konstruktů by musel být program zcela přeorganizován.[4]
Pozoruhodné příklady
- v COBOL, mnoho z přechodných klíčových slov je syntaktický cukr, který lze volitelně vynechat. Například věta
POHYB A B.
a větaPŘESUNOUT A DO B.
provádět přesně stejnou funkci, ale druhá dělá akci jasnější. - Rozšířené přiřazení nebo operátory složeného přiřazení: Například
a + = b
je ekvivalentní ka = a + b
v jazyce C a podobných jazycích, za předpokladuA
nemá žádné vedlejší účinky, jako kdybyA
je regulární proměnná.[5][6] - v Perl,
pokud (podmínka) {...}
je syntaktický cukr propokud (není podmínka) {...}
. Za libovolným výrokem může dále následovat podmínka, takžeprohlášení, pokud podmínka
je ekvivalentní kif (podmínka) {prohlášení}
, ale první je přirozeněji formátován na jednom řádku. - V Jazyk C.,
a [i]
notace je syntaktický cukr pro* (a + i)
.[7] Stejně taka-> x
notace je syntaktický cukr pro přístup ke členům za použití operátor dereference(*sekera
. - The
použitím
prohlášení v C# zajišťuje, že určité objekty budou zlikvidovány správně. Kompilátor rozšíří příkaz do bloku try-finally.[8] - Jazyk C # umožňuje deklarovat proměnné jako
var x = výraz
, což umožňuje kompilátoru usoudit typX
z výrazuexpr
, místo toho, aby vyžadoval výslovné prohlášení o typu. Podobně to umožňuje C ++auto x = výraz
od C ++ 11. - Krajta seznam porozumění (jako
[x * x pro x v rozsahu (10)]
pro seznam čtverců) a dekoratéři (jako@staticmethod
). - v Haskell, řetězec označený v uvozovkách, je sémanticky ekvivalentní seznamu znaků.
- V uklizený sbírka R balíčky, trubka, označeno
%>%
, prohlašuje, ž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.[9] Tak,x%>% f (y)
je ekvivalentní kf (x, y)
. - v SQL,
PŘIPOJIT SE
je ekvivalentní kVNITŘNÍ SPOJENÍ
, druhý objasňuje, že příkaz join je konkrétně operace vnitřního spojení na rozdíl od operace vnějšího spojení. - Metoda volání v jazycích OOP ve formě
myObject.myMethod (parametr1, parametr2, parametr3)
je syntaktický cukr pro volání globální funkce jakomyMethod (myObject, parametr1, parametr2, parametr3)
. Odkaz na objekt je předán jako skrytý argument, obvykle přístupný zevnitř metody jakotento
. - Parametry volané odkazem je syntaxe cukru pro technické předání a ukazatel k parametru, ale syntakticky se s ním zachází jako s proměnnou samotnou, aby se zabránilo neustálému odstraňování odkazů ukazatele v kódu uvnitř funkce.
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 díky zvláštním syntaktickým formám je jazyk méně uniformní a jeho specifikace komplexnější a mohou způsobit problémy, jak se programy stanou velkými a složitými. Tento názor je zvláště rozšířený v EU Lisp komunita, protože Lisp má velmi jednoduchou a pravidelnou syntaxi a povrchovou syntaxi lze snadno upravit.[10]Například, Alan Perlis jednou navázáno "Epigramy o programování ", v odkazu na jazyky s oddělenými závorkami, že „Syntaktický cukr způsobuje rakovinu středníky ".[11]
Další maxima s podobným významem je: „syntaktický cukr způsobuje sémantické dutiny“.[Citace je zapotřebí ]
Odvozené termíny
Syntaktická sůl
Metafora byla rozšířena vytvořením termínu syntaktická sůl, což označuje funkci navrženou tak, aby bylo obtížnější psát špatný kód.[12] Konkrétně syntaktická sůl je obruč, kterou musí programátoři projít, aby dokázali, že vědí, o co jde, spíše než vyjádřit akci programu. Například v Jáva a Pascal přiřazení a float value na proměnnou deklarovanou jako int bez další syntaxe výslovně uvádějící, že záměr povede k chybě kompilace, zatímco C a C ++ automaticky zkrátí všechny plováky přiřazené k int. To však není syntaxe, ale sémantika.
v C# při skrytí zděděného člena třídy se vydá varování kompilátoru, pokud Nový
klíčové slovo se používá k určení, že skrývání je úmyslné.[13] Aby se předešlo možným chybám kvůli podobnosti příkaz switch syntaxe se syntaxí C nebo C ++, C # vyžaduje a přestávka
pro každou neprázdnou případ
štítek a přepínač
(pokud jít do
, vrátit se
nebo házet
je používán), i když to neumožňuje implicitní propadnout.[14] (Použitím jít do
a zadáním následujícího štítku se vytvoří C / C ++ propadnout.)
Syntaktická sůl může porazit svůj účel tím, že způsobí nečitelnost kódu, 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á k uspokojení jazykových požadavků.
Alternativou k syntaktické soli je generování varování kompilátoru, pokud je vysoká pravděpodobnost, že je kód výsledkem chyby - což je postup běžný v moderních kompilátorech C / C ++.
Syntaktický sacharin
Další rozšíření jsou syntaktický sacharin a syntaktický sirup, což znamená bezodplatnou syntaxi, která programování nijak neusnadňuje.[15][16][17][18]
Doporučené typy
O datových typech s jádrovou syntaktickou podporou se říká, že jsou „cukerné typy“.[19][20][21] Mezi běžné příklady patří řetězce s oddělovači uvozovek, složené závorky pro typy objektů a záznamů a hranaté závorky pro pole.
Poznámky
- ^ Landin, Peter J. (1964). „Mechanické vyhodnocení výrazů“ (PDF). Počítačový deník. Počítačový deník. 6 (4): 308–320. doi:10.1093 / comjnl / 6.4.308. Citováno 21. července 2014.
- ^ Abelson & Sussman 1996, Kapitola 1, poznámka pod čarou 11.
- ^ Barbara Liskov, "A History of CLU", MIT Laboratory for Computer Science Technical Report 561 (1993)
- ^ Felleisen, Matthias (prosinec 1991). „O expresivní síle programovacích jazyků“. Věda o počítačovém programování. Springer-Verlag. 17 (1–3): 35–75. doi:10.1016 / 0167-6423 (91) 90036-W. Citováno 19. července 2014.
- ^ „Přiřazení sloučeniny C“. msdn.microsoft.com. Microsoft. Citováno 20. června 2016.
Výraz složeného přiřazení však není ekvivalentní rozšířené verzi, protože výraz složeného přiřazení hodnotí výraz1 pouze jednou, zatímco rozšířená verze hodnotí výraz1 dvakrát: v operaci přidání a v operaci přiřazení.
- ^ Garavaglia, Emilio (26. července 2015). „Proč jsou zkratky jako x + = y považovány za dobrou praxi?“. stackexchange.com. Citováno 20. června 2016.
optimalizaci lze [provést], pokud „nalezení x“ nemá žádné vedlejší účinky
- ^ Eric S.Raymond (11. října 1996). The New Hacker's Dictionary - 3. vydání. MIT Stiskněte. p. 432. ISBN 978-0-262-68092-9. Citováno 5. srpna 2012.
- ^ "using Statement (C # Reference)". Citováno 16. září 2014.
- ^ "magrittr: Viněta". Citováno 24. prosince 2018.
- ^ Abelson & Sussman 1996, Kapitola 1, poznámka pod čarou 11.
- ^ Perlis 1982, Epigram # 3.
- ^ „Soubor žargonu - syntaktická sůl“. 12. 06. 2003. Archivovány od originál dne 12. 6. 2003. Citováno 2018-03-19.
- ^ „new Modifier (C # Reference)“. microsoft.com. Microsoft. Citováno 3. srpna 2015.
- ^ "switch (C # reference)". microsoft.com. Microsoft. Citováno 3. srpna 2015.
- ^ "syntaktický cukr". catb.org. Citováno 3. srpna 2015.
- ^ Boiten, Eerke A .; Möller, Bernhard (26. 06. 2002). Matematika konstrukce programu. ISBN 9783540438571. Citováno 3. srpna 2015.
- ^ Dean, Thomas (2004). Talking with Computers: Explorations in the Science and Technology of Computing. Cambridge University Press. p.115. ISBN 9780521542043.
- ^ Harrison, William; Sheard, Tim (8. – 10. Července 2002). „Jemná kontrola poptávky v Haskellu“ (PDF). Matematika konstrukce programu: 6. mezinárodní konference, MPC 2002, hrad Dagstuhl, Německo, 8. – 10. Července 2002. Sborník. Mezinárodní konference o matematice konstrukce programů. Hrad Dagstuhl, Německo: Springer Berlin Heidelberg. p. 93. doi:10.1007 / 3-540-45442-X_6. S2CID 10059915.
- ^ Chugh, Ravi (2013). Vnořené typy upřesnění pro JavaScript (PhD). UC San Diego.
- ^ „Dokumentace LLVM v jazyce C“. clang.llvm.org. Citováno 30. června 2020.
- ^ „Tajný život typů ve Swift“. medium.com/@slavapestov. Citováno 30. června 2020.
Reference
- Abelson, Harold; Sussman, Gerald Jay; Sussman, Julie (1996) [1984]. Struktura a interpretace počítačových programů. Cambridge, MA: MIT Stiskněte. ISBN 0-262-51087-1.
- Landin, Peter J. (únor - březen 1965). „Korespondence mezi ALGOL 60 a Churchovou lambda notací: čá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., dotisk dovnitř "Vyšší řád a symbolický výpočet". 11. 1998: 125–143. CiteSeerX 10.1.1.85.2610. Citovat deník vyžaduje
| deník =
(Pomoc) - Perlis, A. J. (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ány od originál dne 17. ledna 1999.
- Tento článek je založen na materiálu převzatém z Zdarma on-line slovník výpočetní techniky před 1. listopadem 2008 a začleněno pod "licencování" podmínek GFDL, verze 1.3 nebo novější.