Co uczyniło Lispa wyjątkowym

«Największy język programowania, jaki kiedykolwiek stworzono«
— Alan Kay, „na Lisp”

Co uczyniło Lispa wyjątkowym

Kiedy McCarthy opracował Lisp pod koniec lat pięćdziesiątych, radykalnie różnił się on od istniejących języków, z których najważniejszym był Fortran.

Lisp wprowadził dziewięć nowych pomysłów:

1. Warunki. Instrukcje warunkowe są konstrukcjami typu „jeżeli-to-else”. Teraz traktujemy je jako coś oczywistego. Byli wynaleziony McCarthy podczas rozwoju Lisp. (W tamtym czasie Fortran miał tylko instrukcje goto, ściśle powiązane z instrukcjami branżowymi dotyczącymi podstawowego sprzętu.) McCarthy, będąc członkiem komisji Algol, wniósł wkład do Algol w oparciu o instrukcje warunkowe, skąd rozprzestrzeniły się one na inne języki.

2. Typ funkcji. W Lisp funkcje są obiektami pierwszej klasy - są typem danych, podobnie jak liczby, ciągi znaków itp. i mają dosłowną reprezentację, mogą być przechowywane w zmiennych, mogą być przekazywane jako argumenty itp.

3. Rekurencja. Rekurencja istniała oczywiście jako koncepcja matematyczna przed Lispem, ale Lisp był pierwszym językiem programowania, który ją obsługiwał. (Być może oznacza to tworzenie funkcji jako obiektów pierwszej klasy.)

4. Nowa koncepcja zmiennych. W Lisp wszystkie zmienne są skutecznymi wskaźnikami. Wartościami są to, co mają typy, a nie zmienne, a przypisywanie lub wiązanie zmiennych oznacza kopiowanie wskaźników, a nie tego, na co wskazują.

5. Zbieranie śmieci.

6. Programy złożone z wyrażeń. Programy Lisp są drzewami wyrażeń, z których każde zwraca wartość. (Niektóre wyrażenia Lisp mogą zwracać wiele wartości.) Kontrastuje to z Fortranem i wieloma innymi popularnymi językami, które rozróżniają „wyrażenia” i „instrukcje”.

To rozróżnienie w Fortranie było naturalne, ponieważ język był zorientowany liniowo (co nie jest zaskakujące w przypadku języka, którego format wejściowy stanowiła karta dziurkowana). Nie można mieć zagnieżdżonych instrukcji. Dopóki do działania potrzebne były wyrażenia matematyczne, nie było sensu, aby cokolwiek innego zwracało wartość, ponieważ mogłoby nie być niczego oczekującego na zwrócenie.

Ograniczenia zostały zniesione wraz z pojawieniem się języków o strukturze blokowej, ale wtedy było już za późno. Rozróżnienie między wyrażeniami i instrukcjami zostało już ustalone. Przeszedł z Fortranu do Algolu i dalej do ich potomków.

Jeśli język składa się wyłącznie z wyrażeń, możesz tworzyć wyrażenia w dowolny sposób. Możesz napisać albo (używając składni Łuk)

(if foo (= x 1) (= x 2))

lub

(= x (if foo 1 2))

7. Typ symbolu. Znaki różnią się od ciągów znaków i w takim przypadku można sprawdzić równość, porównując wskaźniki.

8. Notacja kodu za pomocą drzew symboli.

9. Cały język jest zawsze dostępny. Nie ma oczywistej różnicy między czasem odczytu, czasem kompilacji i czasem wykonania. Możesz kompilować lub uruchamiać kod podczas czytania, lub czytać lub uruchamiać kod podczas kompilowania, lub czytać lub kompilować kod podczas jego działania.

Uruchamianie kodu podczas czytania pozwala użytkownikom przeprogramować składnię Lispa; uruchamianie kodu w czasie kompilacji jest podstawą makr; kompilacja w czasie wykonywania jest podstawą do używania Lispa jako języka rozszerzenia w programach takich jak Emacs; i wreszcie, czytanie w czasie wykonywania pozwala programom komunikować się za pomocą wyrażeń s, co zostało niedawno odkryte na nowo w formacie XML.

wniosek

Kiedy po raz pierwszy wynaleziono Lisp, pomysły te znacznie odbiegały od konwencjonalnych praktyk programistycznych podyktowanych sprzętem dostępnym pod koniec lat pięćdziesiątych.

Z biegiem czasu domyślny język, ucieleśniony sukcesem popularnych języków, stopniowo ewoluował w kierunku Lisp. Punkty 1-5 są obecnie powszechnie akceptowane. Punkt 6 zaczyna pojawiać się w mainstreamie. Python ma klauzulę 7 w jakiejś formie, chociaż nie ma odpowiedniej składni. Pozycja 8, która (wraz z pozycją 9) umożliwia tworzenie makr w Lisp, jest nadal tylko w Lisp, prawdopodobnie dlatego, że (a) wymaga tych nawiasów lub czegoś równie złego i (b) jeśli dodasz ten najnowszy wzrost mocy, możesz nie twierdzi już, że wynalazł nowy język, a jedynie opracował nowy dialekt Lisp; -)

Chociaż jest to przydatne dla współczesnych programistów, dziwnie jest opisywać Lispa w kategoriach jego różnicy w stosunku do przypadkowych technik przyjętych w innych językach. Być może to nie jest to, o czym myślał McCarthy. Lisp nie został zaprojektowany do poprawiania błędów Fortranu; wyglądało to raczej jako produkt uboczny prób aksjomatyzować obliczenia.

Źródło: www.habr.com

Dodaj komentarz