Lukier składniowy

Z Wikipedii, wolnej encyklopedii

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 | 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 *(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 | 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 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 +.

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;

JavaScript[edytuj | edytuj kod]

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 | edytuj kod]

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 | edytuj kod]

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

Przypisy[edytuj | edytuj kod]

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