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ěta MOVE 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 += bje ekvivalentní a = a + bv jazyce C a podobných jazycích, za předpokladu, že anemá žádné vedlejší účinky, jako aje 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 pro if (not condition) {...}. Kromě toho za jakýmkoli příkazem může následovat podmínka, takže statement if conditionje 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ě je a->xnotace syntaktickým cukrem pro přístup ke členům pomocí operátoru dereference (*a).x .
  • Příkaz usingv 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 typ xz výrazu expr, místo aby vyžadoval explicitní deklaraci typu. Podobně C ++ umožňuje auto x = exprod C ++ 11 a Java umožňuje var x = exprod 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 tedy x %>% f(y)ekvivalentní f(x,y).
  • V SQL , JOINje 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 importprohlášení umožňuje kompilátor najít třídy, které nejsou jinak specifikované s plně kvalifikovaných jmen. Například import javax.swing.*;umožňuje programátorovi odkazovat na objekt Swing , například javax.swing.JButtonpomocí kratšího názvu JButton.

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í newklíč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 breakpro každou non-prázdné caseetiketě switch(pokud není goto, returnnebo throwse používá), přestože to neumožňuje implicitní pokles-through . (Použitím gotoa 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