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(inne języki)[1].

Przykłady

edytuj

Języki C i C++

edytuj

Język C

edytuj
  • 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 *(x+i).
  • ++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

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

edytuj

W 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

edytuj

Komentarze 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

edytuj

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.

Przypisy

edytuj
  1. Eric S.: The New Hacker's Dictionary, third edition. MIT Press, 1996, s. 432. ISBN 0-262-68092-0. (ang.).