Cukier syntaktyczny - Syntactic sugar
W informatyce , cukier syntaktyczny jest składnia w języku programowania , który jest zaprojektowany, aby ułatwić czytać lub wyrazić. To sprawia, że język jest „słodszy” dla ludzi: rzeczy mogą być wyrażone jaśniej, bardziej zwięźle lub w alternatywnym stylu, który niektórzy mogą preferować.
Na przykład wiele języków programowania zapewnia specjalną składnię do odwoływania się i aktualizowania elementów tablicy . Abstrakcyjnie, odwołanie do tablicy to procedura składająca się z dwóch argumentów: tablicy i wektora indeksu dolnego, która może być wyrażona jako get_array(Array, vector(i,j))
. Zamiast tego wiele języków udostępnia składnię, taką jak Array[i,j]
. Podobnie aktualizacja elementu tablicy jest procedurą składającą się z trzech argumentów, na przykład set_array(Array, vector(i,j), value)
, ale wiele języków udostępnia składnię, taką jak Array[i,j] = value
.
Konstrukt w języku jest cukrem składniowym, jeśli można go usunąć z języka bez żadnego wpływu na to, co język może zrobić: funkcjonalność i siła wyrazu pozostaną takie same.
Procesory języka, w tym kompilatory i analizatory statyczne , często przed przetwarzaniem rozszerzają konstrukcje zawierające cukier na bardziej podstawowe konstrukcje, co jest czasem nazywane „odcukrzaniem”.
Początki
Termin cukier składniowy został ukuty przez Petera J. Landina w 1964 roku, aby opisać składnię powierzchniową prostego języka programowania podobnego do ALGOL , który został zdefiniowany semantycznie w kategoriach aplikacyjnych wyrażeń rachunku lambda , skoncentrowanego na leksykalnym zastąpieniu λ przez „gdzie”.
Późniejsze języki programowania, takie jak CLU , ML i Scheme , rozszerzyły termin, aby odnosić się do składni w języku, który można zdefiniować w kategoriach rdzenia językowego podstawowych konstrukcji; wygodne funkcje wyższego poziomu mogą zostać „odcukrzone” i rozłożone na ten podzbiór. Jest to w rzeczywistości zwykła matematyczna praktyka budowania z prymitywów.
Opierając się na rozróżnieniu Landina między podstawowymi konstrukcjami językowymi a cukrem składniowym, w 1991 roku Matthias Felleisen zaproponował kodyfikację „mocy wyrazu” w celu dostosowania do „powszechnych przekonań” w literaturze. Zdefiniował „bardziej ekspresyjny” jako oznaczający, że bez omawianych konstrukcji językowych program musiałby zostać całkowicie zreorganizowany.
Godne uwagi przykłady
- W języku COBOL wiele pośrednich słów kluczowych to cukier składniowy, który można opcjonalnie pominąć. Na przykład zdanie
MOVE A B.
i zdanieMOVE A TO B.
pełnią dokładnie tę samą funkcję, ale drugie sprawia, że czynność do wykonania jest jaśniejsza. -
Operatory przypisania rozszerzonego lub przypisania złożonego: na przykład
a += b
są równoważne za = a + b
C i podobnymi językami, przy założeniu, żea
nie ma skutków ubocznych, takich jak ifa
jest zmienną regularną. Niektóre języki, takie jak Python, mogą zezwalać na przeciążanie operatorów przypisania rozszerzonego, więc mogą zachowywać się inaczej niż standardowe. - W Perl ,
unless (condition) {...}
jest cukier syntaktyczny dlaif (not condition) {...}
. Dodatkowo po każdej instrukcji może występować warunek, więcstatement if condition
jest równoważne zif (condition) {statement}
, ale ta pierwsza jest bardziej naturalnie sformatowana w jednym wierszu. - W języku C The
a[i]
notacja jest cukier syntaktyczny dla*(a + i)
. Podobniea->x
notacja jest cukrem składniowym umożliwiającym dostęp do członków za pomocą operatora wyłuskiwania(*a).x
. using
Oświadczenie w C # , zapewnia, że pewne obiekty są usuwane poprawnie. Kompilator rozwija instrukcję do bloku try-finally.- Język C# umożliwia zadeklarowanie zmiennych jako
var x = expr
, co umożliwia kompilatorowi wywnioskowanie typux
z expressionexpr
, zamiast wymagać jawnej deklaracji typu. Podobnie C++ pozwalaauto x = expr
od C++11, a Javavar x = expr
od Javy 11. - Listy składane w Pythonie (takie jak
[x*x for x in range(10)]
lista kwadratów) i dekoratory (takie jak@staticmethod
). - W Haskell ciąg oznaczony w cudzysłowie jest semantycznie równoważny liście znaków.
- W uporządkowanej kolekcji pakietów języka R potok oznaczony symbolem
%>%
, deklaruje, że dane (lub dane wyjściowe funkcji) poprzedzające potok będą służyć jako pierwszy argument funkcji następującej po potoku. Więcx %>% f(y)
jest równoważnef(x,y)
. - W SQL ,
JOIN
jest równoważnyINNER JOIN
, ten ostatni wyjaśnia, że instrukcja join jest w szczególności operacją łączenia wewnętrznego, w przeciwieństwie do operacji łączenia zewnętrznego. -
Wywołanie metody w językach OOP w postaci
myObject.myMethod(parameter1, parameter2, parameter3)
to cukier składniowy do wywoływania funkcji globalnej jako . Odwołanie do obiektu jest przekazywane jako ukryty argument, zwykle dostępny z poziomu metody jako .myMethod(myObject, parameter1, parameter2, parameter3)
this
- Parametry wywoływane przez referencję to cukier składni do technicznego przekazywania wskaźnika do parametru, ale składniowo traktujący go jako samą zmienną, aby uniknąć ciągłego usuwania referencji wskaźnika w kodzie wewnątrz funkcji.
- W Javie ,
import
deklaracja kompilator pozwala na znalezienie zajęcia, które nie są określone inaczej w pełni kwalifikowanych nazw. Na przykładimport javax.swing.*;
pozwala programiście odwoływać się do obiektu Swing, np.javax.swing.JButton
używając krótszej nazwyJButton
.
Krytyka
Niektórzy programiści uważają, że te funkcje użyteczności składni są albo nieistotne, albo wręcz niepoważne. Warto zauważyć, że specjalne formy składniowe sprawiają, że język jest mniej jednolity, a jego specyfikacja bardziej złożona i może powodować problemy, gdy programy stają się duże i złożone. Ten pogląd jest szczególnie rozpowszechniony w społeczności Lispów , ponieważ Lisp ma bardzo prostą i regularną składnię, a składnię powierzchniową można łatwo modyfikować. Na przykład Alan Perlis zażartował kiedyś w „ Epigramach o programowaniu ”, w odniesieniu do języków oddzielonych nawiasami , że „Cukier składniowy powoduje raka średników ”.
Terminy pochodne
Sól syntaktyczna
Metafora została rozszerzona przez ukucie terminu sól syntaktyczna , który wskazuje na cechę mającą utrudnić pisanie złego kodu. W szczególności sól składniowa to obręcz, przez którą programiści muszą przeskoczyć tylko po to, aby udowodnić, że wiedzą, co się dzieje, a nie wyrażać działania programu. Na przykład w Javie i Pascalu przypisanie wartości zmiennoprzecinkowej do zmiennej zadeklarowanej jako int bez dodatkowej składni wyraźnie stwierdzającej, że zamiar spowoduje błąd kompilacji, podczas gdy C i C++ automatycznie obcinają wszystkie liczby zmiennoprzecinkowe przypisane do int. Nie jest to jednak składnia, ale semantyka.
W C# , podczas ukrywania dziedziczonego elementu członkowskiego klasy zostanie wygenerowane ostrzeżenie kompilatora, chyba że new
słowo kluczowe zostanie użyte do określenia, że ukrywanie jest zamierzone. Aby uniknąć błędów z powodu podobieństwa do instrukcji switch składni z tym z C lub C ++, C # wymaga break
dla każdego niepustego case
etykiecie switch
(chyba goto
, return
albo throw
jest używany), mimo to nie pozwala domniemany spadek przelotowe . (Przy użyciu goto
, a następnie określenie etykieta wytwarza C / C ++ - jak spadek przelotowych ).
Sól syntaktyczna może zniweczyć jego cel, czyniąc kod nieczytelnym, a tym samym pogorszyć jego jakość – w skrajnych przypadkach zasadnicza część kodu może być krótsza niż narzut wprowadzony w celu spełnienia wymagań językowych.
Alternatywą dla soli składniowej jest generowanie ostrzeżeń kompilatora, gdy istnieje duże prawdopodobieństwo, że kod jest wynikiem błędu – praktyka powszechna we współczesnych kompilatorach C/C++.
sacharyna syntaktyczna
Inne rozszerzenia to syntaktyczna sacharyna i syntaktyczna syrop , co oznacza nieuzasadnioną składnię, która nie ułatwia programowania.
Rodzaje słodzone
Typy danych z podstawową obsługą składniową są nazywane „typami cukrowymi”. Typowe przykłady to ciągi oddzielone cudzysłowami, nawiasy klamrowe dla typów obiektów i rekordów oraz nawiasy kwadratowe dla tablic.
Uwagi
Bibliografia
- Abelson, Harold ; Sussman, Gerald Jay ; Sussman, Julia (1996) (1984). Struktura i interpretacja programów komputerowych . Cambridge, MA: MIT Press . Numer ISBN 0-262-51087-1.
- Landin, Peter J. (luty-marzec 1965). „Korespondencja między ALGOL 60 a kościelną notacją lambda: części I i II”. Komunikaty ACM . 8 (2.3): 89–101, 158–165. doi : 10.1145/363744.363749 . S2CID 6505810 .
- Landin, Peter J. (marzec 1965). „Programowanie bez imperatywów – przykład”. Badania programowania systemów UNIVAC .
- Landin, Peter J. (lipiec 1965). „Pozbywanie się etykiet”. Badania programowania systemów UNIVAC .
-
Landin, Peter J. (sierpień 1965). „Uogólnienie skoków i etykiet”. Badania programowania systemów UNIVAC ., przedrukowany w " Wyższego rzędu i symboliczne obliczenia ". 11 . 1998: 125-143. CiteSeerX 10.1.1.85.2610 . Cite journal requires
|journal=
(help) - Perlis, AJ (wrzesień 1982). "Epigramy o programowaniu" . ACM SIGPLAN Uwagi . Nowy Jork, NY, USA: Association for Computing Machinery. 17 (9): 7–13. doi : 10.1145/947955.1083808 . S2CID 20512767 . Zarchiwizowane z oryginału 17 stycznia 1999 r.