Lukier składniowy

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacji, wyszukiwania

Lukier składniowy (lukier syntaktyczny, cukier syntaktyczny) (ang. syntactic sugar) to 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ę.

Przykłady[edytuj | edytuj kod]

Języki C i C++[edytuj | edytuj kod]

Język C[edytuj | edytuj kod]

  • x[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żenie x[i] jest w pełni równoważne wyrażeniu i[x].
  • ++c teoretycznie może być lukrem składniowym dla instrukcji c=c+1 lub c+=1. Wszystkie trzy formy zapisu powodują inkrementację zmiennej c 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++[edytuj | edytuj kod]

W 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 instancją obiektu, 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 +.

Ruby[edytuj | edytuj kod]

x += y oznacza x = x + y, co z kolei oznacza x = x.+(y), gdzie + to metoda będąca przeciążonym operatorem.

Pascal, Delphi[edytuj | edytuj kod]

  • 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;

Języki funkcyjne[edytuj | edytuj kod]

W programowaniu funkcyjnym bardzo 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[edytuj | edytuj kod]

Komentarze a także 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[edytuj | edytuj kod]

Lukru (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.