Lukier składniowy
Lukier składniowy (lukier syntaktyczny, cukier syntaktyczny) (ang. syntactic sugar) – w programowaniu dowolna cecha składni języka, którą można wyeliminować przez proste przekształcenia składniowe, istniejąca jedynie dla wygody programisty. Dzięki lukrowi składniowemu programy stają się czytelniejsze oraz uzyskują bardziej zwartą formę. Termin wymyślony przez Petera Landina[1].
Przykłady
edytujJęzyk C
edytujx[i]
to tylko lukier składniowy dla nieintuicyjnego*(x+i)
. W języku C wyróżnione pojęcie tablicy istnieje jedynie z punktu widzenia programisty; dla kompilatora jest ono tożsame z pojęciem wskaźnika. W rezultacie wyrażeniex[i]
jest w pełni równoważne wyrażeniu*(x+i)
.
++c
teoretycznie może być lukrem składniowym dla instrukcjic=c+1
lubc+=1
. Wszystkie trzy formy zapisu powodują inkrementację zmiennejc
i zwracają wyrażenie równe jej nowej wartości, chociaż w rzeczywistych kompilatorach równoważność tych wyrażeń zależy od procesora i stosowanej optymalizacji, a instrukcje te mogą różnić się czasem wykonania, a także liczbą bajtów w kodzie maszynowym.
Język C++
edytujW języku C++ powyższe przykłady mogą być traktowane jako lukier składniowy jedynie dla prostych typów danych. Jeśli zmienna c
byłaby obiektem, operatory ++
, =
, +
oraz +=
mogłyby zostać zdefiniowane lub przeciążone w taki sposób, że wykonanie wymienionych działań prowadziłoby do niejednakowych efektów. To samo dotyczy użytych w pierwszym przykładzie operatorów [ ]
, *
i +
.
x += y
oznacza x = x + y
, co z kolei oznacza x = x.+(y)
, gdzie +
to metoda będąca
przeciążonym operatorem.
- konstrukcja
with
stanowi lukier składniowy, umożliwiający zapisanie kodu odpowiedzialnego za pracę z pojedynczym obiektem w bardziej czytelnej formie. Przykładowo:
Form1.MDIChildren[0].Panel1.Caption:='Tytuł';
Form1.MDIChildren[0].Panel1.Width:=500;
Form1.MDIChildren[0].Panel1.Height:=400;
można zapisać następująco:
with Form1.MDIChildren[0].Panel1 do
begin
Caption:='Tytuł';
Width:=500;
Height:=400;
end;
W wersji ECMAScript 6, gdzie zostały dodane funkcje strzałkowe, gdy zwracane jest pojedyncze wyrażenie można pominąć słowo kluczowe return i użyć krótszej składni:
const f = (x) => x + 2;
Jest odpowiednikiem dłuższego zapisu:
const f = (x) => {
return x + 2;
};
Języki funkcyjne
edytujW programowaniu funkcyjnym często wykorzystywane są listy elementów, dlatego standardowe operacje sprawdzania (nie)pustości głowy (początku) listy oraz wyciągania tejże głowy z listy, zastępowane są cukrami syntaktycznymi.
Komentarze
edytujKomentarze i opcjonalne białe znaki, zwiększające czytelność programu, to również lukier składniowy – w żaden sposób semantycznie nie wpływają na przebieg kompilacji i tworzony kod wynikowy programu.
Lukier składniowy a efektywność programu
edytujLukru (cukru) składniowego nie należy mylić z np. strukturyzacją programu, tj. umieszczaniem części kodu np. w funkcjach, tworzeniem obiektów posiadającym klasy wirtualne, gdyż zabiegi te mają odzwierciedlenie w kodzie maszynowym programu (np. jako wywołanie stosu dla funkcji, zapamiętanie adresu powrotu) – lukier składniowy jest tylko szybszym/wygodniejszym/czytelniejszym sposobem zapisu kodu i jest on zastępowany „czystym” językiem na poziomie interpretacji kodu – kompilacji poddany zostaje kod nie zawierający już lukru syntaktycznego.
Przypisy
edytuj- ↑ Eric S.: The New Hacker's Dictionary, third edition. MIT Press, 1996, s. 432. ISBN 0-262-68092-0. (ang.).