Syntaktický cukr v programovacím jazyce je syntaktická vlastnost , která neovlivňuje chování programu, ale činí jazyk uživatelsky přívětivějším.
Může to být jakýkoli prvek syntaxe, který dává programátorovi alternativní způsob zápisu syntaktické konstrukce již v jazyce, který je pohodlnější, stručnější nebo podobný jinému běžnému způsobu psaní, nebo pomáhá psát programy dobrým stylem.
Syntaktický cukr je jakýkoli syntaktický prvek, mechanismus, metoda popisu dostupná v programovacím jazyce, která duplikuje jiný prvek nebo mechanismus dostupný v jazyce, ale je pohodlnější k použití, je výstižnější, vypadá přirozeněji nebo je známější ( podobné podobným prvkům v jiných jazycích), nebo jednoduše lépe vnímané při čtení programu osobou. Klíčovým bodem je, že syntaktický cukr lze teoreticky vždy z jazyka odstranit, aniž by ztratil jeho schopnosti – vše, co lze napsat pomocí syntaktického cukru, lze ve stejném jazyce napsat i bez něj. Syntaktický cukr má tedy pouze usnadnit programátorovi psaní programu.
Koncept syntaktického cukru je do značné míry libovolný. Jeho použití předpokládá, že z celé množiny syntaktických konstrukcí dostupných v jazyce lze vyčlenit nějakou „základní množinu“, která zajišťuje funkčnost jazyka, a další syntaktické prostředky, které lze v případě potřeby vyjádřit pomocí základní množiny. ; ten druhý bude syntaktickým cukrem pro daný jazyk. Mnoho provedení je však zaměnitelných a zdaleka ne vždy lze s jistotou říci, které z nich jsou základní a které doplňkové. Například v Modula-2 existují čtyři typy smyček : smyčka předběžné podmínky , smyčka postcondition , kroková smyčka a nepodmíněná smyčka . Teoreticky lze první tři druhy cyklů snadno vyjádřit pomocí posledního. Jsou to tedy syntaktický cukr? Obvykle to neříkají, ačkoli formálně spadají pod výše uvedenou definici.
Přiřazení některých konstrukcí k syntaktickému cukru je z historických důvodů nejednoznačné. Například jazyk C a jeho potomci mají operátory increment , decrement a složené přiřazení ( ++, --, +=, -=a další). Zavedení těchto operátorů do jazyka bylo způsobeno potřebou podporovat manuální optimalizaci programů, protože kód, který je používají, by mohl být přeložen do efektivnějších strojových instrukcí („ ++a“ byl přeložen do jedné instrukce INC a podobný výraz „ a=a+1“ do celá skupina pokynů). Vývoj technologie optimalizace kódu učinil takovou manuální optimalizaci zbytečnou; nyní kompilátory generují stejný kód pro "dlouhou" a "krátkou" verzi operace. V důsledku toho se zkrácené operátory změnily v syntaktický cukr, ačkoli původně nebyly.
V některých případech je pojem „syntaktický cukr“ vykládán šířeji než „jiný způsob zápisu pro již existující syntaktické konstrukce“. Jack Crenshaw v Let's Build a Compiler! [1] tento termín používá pro syntaktické prvky, které nejsou potřebné pro správnou kompilaci programu, ale jsou v jazyce zahrnuty pouze pro pohodlí programátora a pro čitelnost programu:
Koneckonců, lidé by také měli číst programy... Žetony cukru slouží jako užitečné orientační body, které vám pomohou zůstat na správné cestě...
Příkladem takového syntaktického cukru je „pak“ v příkazu „if“ nebo „do“ v příkazu „while“ a také středník: překladač jednoznačně určí konec podmínky a místo, kde příkaz končí bez ale přítomnost těchto konstrukcí činí program čitelnějším. Je zřejmé, že úzký výklad pojmu "syntaktický cukr" je neslučitelný s tím širokým: v C nebo Pascalu není možné psát operátory jiným způsobem, bez "pak", "dělat" a středníku. V takovém případě je vhodné hovořit o „ syntaktickém smetí “. Vzhledem k tomu, že slova navíc v programovacím jazyce jsou tokeny navíc, bylo by správnější používat termín „ lexikální smetí “ [2] . Na druhou stranu není zcela správné nazývat takové „nadbytečné“ prvky jazyka „odpadky“, protože ve skutečnosti mohou výrazně ovlivnit kvalitu programování, protože přítomnost redundance v syntaxi usnadňuje kompilátoru k lokalizaci chyb v kódu. Vezměme si příklad v nějakém podmíněném jazyce podobném BASICu, kde slovo potom je v podmíněném příkazu nepovinné a středník mezi příkazy a rovnítko může v závislosti na pozici označovat jak logickou rovnost, tak přiřazení:
pokud a > b a k = 20 , f = 10Zde je "a>ba k=20" podmínkou a "f=10" je větev "ta". Pokud však programátor vynechá nebo omylem odstraní operátor „a“, konstrukce se stane:
pokud a > b k = 20 f = 10Program zůstane syntakticky správný, ale podmínka bude jednoduše „a>b“ a větev „ta“ bude v závislosti na pravidlech jazyka buď „k=20“, což se změnilo z podmínky na přiřazení nebo oba operátory „k=20 f= deset“. V důsledku chyby dojde k porušení podmínky a zničení hodnoty proměnné k. Protože program zůstane syntakticky správný, když je zavedena logická chyba, kompilátor si chyby nevšimne. Vyžadování povinné přítomnosti obslužného slova "pak" mezi podmínkou a operátorem způsobí, že kompilátor zjistí v podmínce syntaktickou chybu. Povinný středník mezi operátory také umožní kompilátoru odhalit chybu – absenci středníku za operátorem „k=20“. Přítomnost „cukrových“ tokenů tedy, stejně jako jakákoli redundance v jazyce obecně, vede k tomu, že logické chyby v kódu přecházejí v syntaktické a kompilátor je může odhalit.
Termín syntaktický cukr byl vytvořen Peterem J. Landinem v roce 1964 k popisu povrchové syntaxe jednoduchého jazyka podobného algolu, sémanticky definovaného v termínech aplikačních výrazů lambda kalkulu , po kterém následovalo čistě lexikální nahrazení λ za . where
Pole v C jsou bloky v paměti . K prvkům pole se přistupuje přes ukazatel na začátek bloku paměti (tj. na začátek pole) a offset prvku vzhledem k počáteční adrese. To lze zapsat bez použití speciální syntaxe pro pole ( a - ukazatel na začátek pole, i - index prvku): *(a + i), ale jazyk poskytuje speciální syntaxi: a[i]. Zajímavé je, že lze použít i tvar i[a], což je vzhledem ke komutativitě operace sčítání celkem logické.
Syntaktickému cukru lze přičíst také předefinování operátorů , podporované mnoha programovacími jazyky . V zásadě lze jakoukoli operaci zarámovat jako proceduru (funkci, metodu). Předefinování operátoru umožňuje provádět operace vytvořené programátorem externě stejným způsobem, jako jsou ty vestavěné do jazyka [3] [4] .
Dalším příkladem syntaktického cukru je koncept „vlastností“ podporovaný mnoha moderními programovacími jazyky. To se týká deklarace ve třídě pseudopolí, které se navenek chovají jako pole třídy (mají název, typ, umožňují přiřazení a čtení), ale ve skutečnosti nejsou. Každý přístup k vlastnosti je kompilátorem přeložen do volání přístupové metody. Vlastnosti jsou zcela zbytečné (přístupy lze volat i přímo) a používají se čistě pro pohodlí, protože kód využívající vlastnosti vypadá poněkud jednodušeji a přehledněji.
Ne všichni programátoři považují přítomnost syntaktického cukru v programovacích jazycích a jeho použití programátory za výhodu. Známý je pohled Niklause Wirtha , který sdílí i část programátorské komunity: podle ní jakékoli rozšíření jazyka, které není způsobeno nutností, jej zhoršuje, protože vede ke komplikacím překladatele a, v důsledku toho ke snížení jeho spolehlivosti a výkonu. Zároveň se zvyšuje složitost učení jazyka a složitost údržby programů. Kromě toho samotná skutečnost, že existují další syntaktické nástroje, často hraje provokující roli: povzbuzuje programátora, aby se uchýlil k různým syntaktickým trikům místo hlubší analýzy problému a implementace efektivnějších algoritmů. Tyto názory se odrážejí v jazycích rodiny Oberonů , které jsou velmi jednoduché a prakticky postrádají syntaktický cukr.
Známý je aforismus Alana Perlise : „Syntaktický cukr způsobuje rakovinu středníků“ . Středník ( ;), přestože je povinná součást většiny oblíbených programovacích jazyků, i když je v novém jazyce k ničemu, je ponechán jako volitelný prvek, protože většina programátorů má silný zvyk jej používat. V originále si aforismus hraje na souzvuk anglických slov semicolon („středník“) a colon , z nichž druhé znamená nejen tlusté střevo, ale také tlusté střevo ( rakovina tlustého střeva – „rakovina tlustého střeva“).
Častěji je kritika zaměřena na jednotlivé, často se vyskytující typy syntaktických cukrů: redefinující operace, vlastnosti, komplexní operace (jako ternární podmíněná operace ). Argumenty kritiků se v zásadě scvrkávaly na skutečnost, že takové nástroje ve skutečnosti nečiní program jednodušší, jasnější, efektivnější nebo kratší, ale vedou k dalšímu plýtvání zdroji a komplikují vnímání, a tedy údržba programu.
Na rozdíl od „syntaktického cukru“ pojem „ syntaktická sůl “ ( anglicky syntactic salt ) [5] v žargonu programátorů označuje technicky neužitečné konstrukce v programovacím jazyce, které pravidla jazyka vyžadují použití při provádění potenciálně nebezpečných funkcí. akce. Do jazyka se zavádějí pouze proto, aby jejich používáním programátor potvrdil, že pochybnou akci provedl vědomě a nejedná se o náhodnou chybu nebo výsledek nedorozumění. Stejně jako „syntaktický cukr“ ani „syntaktická sůl“ nerozšiřuje možnosti jazyka a kompilátor ji ke správné kompilaci programu nepotřebuje; je určen výhradně lidem, kteří tento jazyk používají. Klasickým příkladem dobře známé a široce používané "syntaktické soli" jsou vestavěné příkazy pro převod datových typů, které lze nalézt v téměř každém staticky typovaném jazyce. Formálně jsou tyto příkazy nadbytečné (jak ukazuje klasický C, ve kterém je povolena jakákoli konverze typu a provádí se automaticky), ale v jazycích, kde je jejich použití povinné, je programátor nucen věnovat pozornost pokaždé, když provádí potenciálně nebezpečné typové míchání, které často indikuje logickou chybu v programu. V závislosti na náročnosti programovacího jazyka může být použití „soli syntaxe“ vyžadováno nebo volitelné. V prvním případě kompilátor vnímá jeho absenci jako syntaktickou chybu, v druhém případě vydá při překladu varování, které může programátor ignorovat.
Na rozdíl od "syntaktického cukru", který rozšiřuje svobodu vyjadřování programátora, "syntaktická sůl" ji zužuje a vyžaduje "bezdůvodně" psát dlouhé konstrukce. Soubor žargonu říká, že "syntax salt je špatná, protože zvyšuje hackerův krevní tlak." Při psaní malých programů vytvořených a spravovaných jednou osobou se skutečně mohou opatření zdát nadbytečná, nicméně při průmyslovém vývoji velkých softwarových systémů podporovaných velkými týmy programátorů, často, navíc ne nejvyšší kvalifikace, pomáhá „syntaktická sůl“. nedělat chyby ve vývoji a efektivněji porozumět kódu napsanému jinými vývojáři.
Příklady: