„Cikkjelölt:Szintaktikai cukor” változatai közötti eltérés

A Wikipédiából, a szabad enciklopédiából
Tartalom törölve Tartalom hozzáadva
Bggb1226 (vitalap | szerkesztései)
Készült a(z) „Syntactic sugar” oldal lefordításával
(Nincs különbség)

A lap 2023. június 18., 23:02-kori változata

Az informatikában a szintaktikai cukorka olyan szintaxis, amelyet egy programozási nyelvben arra terveznek, hogy könnyebbé tegye a dolgok olvashatóságát és kifejezését. A nyelvet "édesíti" az emberi felhasználásra: dolgokat tisztábban, tömörebben vagy alternatív stílusban lehet kifejezni, amit néhányan talán jobban kedvelnek. A szintaktikai cukorka általában egy gyakori művelet rövidítése, amely alternatív, részletesebb formában is kifejezhető lenne. A programozónak választása van arról, hogy használja-e a rövidebb vagy a hosszabb formát, de általában a rövidebb formát fogja használni, mert az rövidebb, könnyebb gépelni és olvasni.

Például sok programozási nyelv biztosít speciális szintaxist tömbelemek hivatkozására és frissítésére. Absztrakt módon egy tömbhivatkozás egy két argumentumú eljárás: egy tömb és egy indexvektor. Ezt lehetne kifejezni például a get_array(array, vector(i,j)) formában. Azonban sok nyelv biztosít olyan szintaxist, mint például array[i,j]. Hasonlóképpen, egy tömbelem frissítése egy három argumentumú eljárás, például set_array(array, vector(i,j), érték), de sok nyelv szintaxisa lehetővé teszi például a array[i,j] = érték formát is.

Egy nyelvben található szerkezet szintaktikai cukorka, ha eltávolítható a nyelvből anélkül, hogy hatással lenne arra, hogy mit tud a nyelv: a funkcionalitás és a kifejezőképesség ugyanaz marad.

Nyelvi feldolgozók, ideértve a fordítókat és a statikus elemzőket, gyakran kibontják a szintaktikai cukorkákat a részletesebb megfelelőikre a feldolgozás előtt, ami néha "szintaktikai cukorka felbontásnak" nevezett folyamat.

Eredet

A "syntactic sugar" kifejezést Peter J. Landin alkotta meg 1964-ben annak leírására, hogy egy egyszerű ALGOL-szerű programozási nyelv felületi szintaxisát hogyan lehet szemantikailag a lambda számítás alkalmazó kifejezéseihez kapcsolódva meghatározni, ahol a λ-t "where"-re cserélik a lexikális szinten.

Későbbi programozási nyelvek, mint például a CLU, ML és Scheme, kibővítették a "syntactic sugar" kifejezést arra, hogy a nyelv szintaxisát olyan formában definiálják, amely a nyelv lényegi konstrukcióira épül. A kényelmes, magasabb szintű funkciókat lehet "szintaktikai cukorka felbontásával" és felbontásával lebontani ezen alapvető részhalmazra. Ez a gyakorlatban a matematika szokásos módja az alapvető elemek felépítésének.

Peter J. Landin által meghatározott különbség alapján az alapvető nyelvi konstrukciók és a szintaktikai cukorka között, Matthias Felleisen 1991-ben javasolt egy "kifejező erő" kódifikációt, hogy igazodjon a "széles körben elfogadott nézetekhez" a szakirodalomban. Ő az "kifejezőbb" fogalmát úgy határozta meg, hogy ha nincsenek jelen a kérdéses nyelvi konstrukciók, akkor a programot teljesen át kellene szervezni.

Figyelemre méltó példák

COBOL-ban sok köztes kulcsszó szintaktikai cukorka, amely opcionálisan elhagyható. Például a MOVE A B. mondat és a MOVE A TO B. mondat pontosan ugyanazt a funkciót látja el, de a második esetben világosabbá válik, hogy melyik műveletet hajtja végre.

Bővített értékadás vagy összetett értékadó operátorok: Például a += b kifejezés ekvivalens az a = a + b kifejezéssel C és hasonló nyelvekben, feltéve, hogy az a változóra nincs mellékhatása, mint például ha az a egy rendes változó lenne. Néhány nyelv, például Python, lehetővé teszi az augmented assignment operátorok túlterhelését, így eltérően viselkedhetnek a szabványos operátoroktól.

Perl-ben az unless (feltétel) {...} szintaktikai cukorka az if (not feltétel) {...} számára. Továbbá, bármely utasítás után megadható egy feltétel, tehát az utasítás if feltétel ekvivalens az if (feltétel) {utasítás} formával, de az előző formát természetesebben lehet formázni egyetlen sorban.

A C nyelvben az a[i] jelölés szintaktikai cukorka az *(a + i) hozzáféréssel. Hasonlóan az a->x jelölés szintaktikai cukorka a tagokhoz történő hozzáféréssel a dereferencia operátor (*a).x segítségével.

A C# nyelvben a using utasítás biztosítja, hogy bizonyos objektumokat helyesen megszüntessenek. A fordító a using utasítást egy try-finally blokkká bontja.

A C# nyelv lehetővé teszi a változók deklarálását var x = kifejezés formában, amely lehetővé teszi a fordítónak, hogy a változó típusát kikövetkeztetés alapján határozza meg az expr kifejezésből, anélkül, hogy külön nyilvános típust deklarálna. Hasonlóképpen, a C++ lehetővé teszi az auto x = expr formát C++11 óta, és a Java pedig a var x = expr formát Java 11 óta engedélyezi.

Python list comprehensions (például [x*x for x in range(10)] a négyzetek listája) és dekorátorok (például @staticmethod).

Haskell-ben egy karakterlánc, idézőjelek között megadva, szemantikailag ekvivalens egy karakterek listájával.

Az R csom

agok tidyverse gyűjteményében a pipe, amit a %>%-al jelölünk, jelzi, hogy az előtte álló adat (vagy a függvény kimenete) az első argumentumként szolgál majd a pipe-ot követő függvénynek. Tehát x %>% f(y) ekvivalens a f(x,y) kifejezéssel.

Az SQL-ben egy egyszerű JOIN ekvivalens egy INNER JOIN-nal, az utóbbi azt jelzi, hogy a join művelet kifejezetten egy belső összekapcsolást végez, nem pedig egy külső összekapcsolást. Hasonlóképpen, kihagyhatja az OUTER kulcsszót a LEFT OUTER JOIN, RIGHT OUTER JOIN és FULL OUTER JOIN esetén.

Az OOP (objektumorientált programozás) nyelvekben a metódus hívás a myObject.myMethod(parameter1, parameter2, parameter3) formában szintaktikai cukorka a globális függvényként történő hívásra myMethod(myObject, parameter1, parameter2, parameter3). Az objektumra való hivatkozás egy rejtett argumentumként kerül átadásra, általában a metóduson belül a this kulcsszóval érhető el.

A hivatkozással átadott paraméter szintaktikai cukorka a technikailag egy mutató átadását jelenti paraméterként, de szintaktikailag kezeli azt, mintha maga a változó lenne, hogy elkerülje a konstans mutató dereferálását a függvényben lévő kódban.

Java-ban az import deklaráció lehetővé teszi a fordítónak, hogy megtalálja azokat az osztályokat, amelyeket máskülönben teljesen meghatározott nevekkel nem lehetne elérni. Például az import javax.swing.*; lehetővé teszi a programozónak, hogy a Swing objektumokra, például a javax.swing.JButton-ra a rövidebb nevet JButton használja.

Az ES6 JavaScript verziójában a nyilvánfüggvényeknek van egy rövidebb verziója (x) => x + 1, ami ekvivalens a hosszabb (x) => { return x + 1; } kifejezéssel.

Kritika

Néhány programozó úgy érzi, hogy ezek a szintaktikai használhatósági funkciók vagy fontoskodók, vagy teljesen értelmetlenek. Különösen figyelemre méltó, hogy a különleges szintaktikai formák egy nyelvet kevésbé egységesé tesznek és a specifikációját bonyolultabbá teszik, valamint problémákat okozhatnak, amikor a programok nagyok és összetettek lesznek. Ez a nézet különösen elterjedt a Lisp közösségben, mivel a Lisp nagyon egyszerű és szabályos szintaxissal rendelkezik, és a felületi szintaxis könnyen módosítható. Például Alan Perlis egyszer megjegyezte a "Programozási epigrammák" című művében, egy zárójellel elválasztott nyelvekre utalva, hogy "A szintaktikai cukor rákot okoz a pontosvesszőkben".

Származékos kifejezések

Szintaktikai só

A metafora kiterjesztése során a "syntactic salt" kifejezést alkották meg, amely egy olyan jellemzőt jelöl, amelynek célja, hogy nehezebbé tegye a rossz kód írását. Konkrétan a "syntactic salt" egy olyan akadály, amelyen a programozóknak át kell ugraniuk annak bizonyítása érdekében, hogy tisztában vannak azzal, mi történik, nem pedig a program műveletének kifejezésére szolgál. Például a Java és a Pascal nyelvekben, ha egy lebegőpontos értéket rendelünk egy intként deklarált változónak anélkül, hogy külön szintaxis explicit módon megjelölné azt az szándékot, akkor fordítási hibát kapunk, míg a C és a C++ nyelvek automatikusan lekerekítik a lebegőpontos értékeket, amikor azokat egy inthoz rendeljük. Ez azonban nem szintaxis, hanem szemantika.

A C# nyelvben, amikor egy örökölt osztálytagot elrejtünk, a fordító figyelmeztetést ad, hacsak a new kulcsszót nem használjuk azzal, hogy szándékosan akarjuk elrejteni az örökölt tagot. Azért, hogy elkerüljük a lehetséges hibákat a switch utasítás szintaxisának hasonlósága miatt a C vagy a C++ nyelvekével, a C# minden nem üres case címkéhez kéri a break kulcsszót a switch esetében (kivéve, ha a goto, return vagy throw használata történik), még akkor is, ha implicit esés nem engedélyezett. (A goto használata és a következő címke megadása egy C/C++-szerű eséshez vezet.)

A szintaktikai só meghiúsíthatja a célját, mivel az kód olvashatatlanná válhat, és ezzel a minőségét ronthatja - extrém esetekben a kód lényeges része rövidebb lehet, mint az a pluszköltség, amit a nyelvi követelmények kielégítéséhez bevezettek.

A szintaktikai só alternatívája a fordítói figyelmeztetések generálása, ha nagy a valószínűsége, hogy a kód hibából származik – a modern C/C++ fordítóprogramokban megszokott gyakorlat.

Szintaktikus szacharin (cukor helyettesítő)

További kiterjesztések a szintaktikai szacharin és a szintaktikai szirup, ami ingyenes szintaxist jelent, amely nem könnyíti meg a programozást. [1] [2] [3] [4]

Cukrozott fajták

Az alapvető szintaktikai támogatással rendelkező adattípusokat "cukrozott típusoknak" nevezik. [5] [6] [7] Gyakori példák közé tartoznak az idézőjelekkel határolt karakterláncok, az objektum- és rekordtípusok kapcsos zárójelei, valamint a tömbök szögletes zárójelei.

Megjegyzések

  1. syntactic sugar. catb.org. (Hozzáférés: 2015. augusztus 3.)
  2. Boiten, Eerke A.. Mathematics of Program Construction (2002. június 26.). ISBN 9783540438571. Hozzáférés ideje: 2015. augusztus 3. 
  3. Dean, Thomas. Talking with Computers: Explorations in the Science and Technology of Computing. Cambridge University Press, 115. o. (2004. május 25.). ISBN 9780521542043 
  4. Harrison, William (Hiba: Érvénytelen idő.). „Mathematics of Program Construction”. 2386: 93, Springer Berlin Heidelberg. doi:10.1007/3-540-45442-X_6. 
  5. Nested Refinement Types for JavaScript
  6. C Language LLVM Documentation. clang.llvm.org. (Hozzáférés: 2020. június 30.)
  7. The Secret Life of Types in Swift. medium.com/@slavapestov, 2016. július 14. (Hozzáférés: 2020. június 30.)

Hivatkozások