LispOdmiana: M. Lisp, D. Lispu, C. Lispowi, B. Lisp, N. Lispem, M. Lispie. (akronim od ang. LISt Processor) – rodzina języków programowania z długą historią i charakterystyczną składnią. Zaprojektowany przez Johna McCarthy’ego na MIT w 1958 roku. Pierwszym interpreterem języka Lisp była implementacja funkcji eval wykonana przez studenta McCarthy’ego – Steve’a Russella. Lisp jest drugim z kolei pod względem wieku językiem programowania wysokiego poziomu pozostającym w użyciu (starszy jest tylko Fortran). Podobnie jak Fortran, Lisp ulegał na przestrzeni czasu licznym zmianom. Powstało również wiele jego dialektów. Dziś do najpopularniejszych należą trzy: Common Lisp, Scheme i Clojure.
Lisp powstał jako wygodna matematyczna notacja dla programów komputerowych, oparta na rachunku lambda stworzonym przez Alonzo Churcha. Szybko został najchętniej wybieranym językiem do badania i rozwoju sztucznej inteligencji. Wywodzi się z niego wiele technik programistycznych, takich jak struktury drzewiaste, odśmiecanie pamięci, dynamiczne typowanie czy nowe koncepcje w programowaniu obiektowym (Common Lisp Object System).
Nazwa Lisp pochodzi od LISt Processing. Podstawową strukturą danych w Lispie jest lista; kod źródłowy programów w Lispie składa się z list. Dzięki temu język jest homoikoniczny, tzn. programy w Lispie mogą manipulować kodem źródłowym jak zwykłą strukturą danych. Umożliwia to pisanie makr, pozwalających programiście tworzyć nową składnię lub nawet małe, zagnieżdżone w Lispie, języki DSL.
Kod tworzony jako struktura danych sprawia, że Lisp ma charakterystyczną składnię. Cały kod źródłowy ma postać tzw. S-wyrażeń (S-expressions), czyli list otoczonych nawiasami. Wywołanie funkcji, makra lub formy specjalnej ma postać listy, której pierwszym elementem jest nazwa funkcji, makra lub formy specjalnej lub wyrażenie, którego wynikiem jest funkcja, a następnymi elementami – argumenty. Na przykład funkcję o nazwie f z argumentami a, b i c wywołuje się za pomocą kodu , natomiast gdy zwraca funkcje, można użyć .
Historia Lisp został wymyślony przez Johna McCarthy’ego w 1958 podczas jego pobytu na MIT. W roku 1960 McCarthy opublikował swój projekt w Communications of the ACM, w artykule pod tytułem „Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I”Transkrypcja AIM-8 Johna McCarthy’ego. (Rekursywne funkcje wyrażeń symbolicznych i ich maszynowe obliczanie, część I; części II nigdy nie opublikowano). Pokazał, że za pomocą kilku operatorów i notacji dla funkcji można zbudować język implementujący maszynę Turinga.
Pierwszą implementację Lispu opracował Steve Russell na komputerze IBM 704 za pomocą kart dziurkowanych. Russell przeczytał artykuł McCarthy’ego i doszedł (ku zdziwieniu McCarthy’ego) do wniosku, że funkcję eval można zaimplementować jako interpreter LispuPaul Graham w książce Hackers & Painters na stronie 185 przytacza wypowiedź McCarthy’ego: Steve Russell said, look, why don’t I program this eval..., and I said to him, ho, ho, you’re confusing theory with practice, this eval is intended for reading, not for computing. But he went ahead and did it. That is, he compiled the eval in my paper into IBM 704 machine code, fixing bug, and then advertised this as a Lisp interpreter, which it certainly was. So at that point Lisp had essentially the form that it has today....
Pierwszy kompletny kompilator Lispu stworzony w Lispie napisali w 1962 Tim Hart i Mike Levin na MIT. W kompilatorze tym wprowadzono model kompilacji przyrostowej (ang. incremental compilation), dzięki czemu funkcje kompilowane i interpretowane nie były rozróżniane. Język użyty przez Harta i Levina był dużo bliższy nowoczesnemu stylowi Lispu niż wcześniejszy kod McCarthy’ego.
Wczesna historia Information Processing Language był pierwszym językiem zaprojektowanym do tworzenia sztucznej inteligencji i już zawierał kilka pomysłów, które później zostały użyte w Lispie, jak na przykład przetwarzanie list czy rekurencja.
Oryginalna notacja McCarthy’ego używała M-wyrażeń, które potem były przetwarzane na S-wyrażenia, na przykład M-wyrażenie car[cons[A,B]] jest równoznaczne z S-wyrażeniem (car (cons A B)). Gdy tylko Lisp został zaimplementowany, programiści szybko porzucili M-wyrażenia na rzecz S-wyrażeń. M-wyrażenia powróciły na chwilę w MLISPie autorstwa Horace’a Enea i CGOLu autorstwa Vaughana Pratta.
Dwa makra asemblera na maszynie IBM 704 stały się podstawowymi operacjami do przetwarzania list: car () i cdr (). Różne dialekty Lispu wciąż używają nazw car i cdr dla funkcji zwracających odpowiednio pierwszy element i resztę listy.
Genealogia i odmiany Przez ponad 50 lat powstało wiele różnorakich dialektów Lispu – języka ze składnią złożoną z S-wyrażeń. Co więcej, część dialektów miało kilka implementacji – Common Lisp, na przykład, posiada ich ponad tuzin.
Różnice między poszczególnymi dialektami mogą być znaczące – Common Lisp i Scheme używają na przykład różnych słów kluczowych do definiowania funkcji. Jednak wewnątrz dialektu takie różnice nie występują, każda zgodna implementacja obsługuje ten sam zestaw funkcji, poza którym często oferuje dodatkowe rozszerzenia i biblioteki.
Ważne historycznie dialekty LISP 1.5 http://web.cse.ohio-state.edu/~rountev.1/6341/pdf/Manual.pdf – Pierwsza szeroko rozprzestrzeniona wersja, stworzona przez McCarthy’ego i innych pracowników MIT. Zawierała trochę ulepszeń w stosunku do oryginalnego interpretera „LISP 1”, nie była jednak całkowicie nowa, jaka miała być wersja „LISP 2”, zatem zdecydowano się na taki właśnie numer wersji. Stanford LISP 1.6 http://www.softwarepreservation.net/projects/LISP/stanford/SAILON-28.6.pdf – Wersja następna po LISP 1.5 stworzona w Stanford AI Lab i szeroko rozprzestrzeniona pod systemem na maszynach PDP-10. Została zastąpiona przez Maclisp i InterLisp. MACLISPhttps://web.archive.org/web/20080420150707/http://zane.brouhaha.com/~healyzh/doc/lisp.doc.txt – stworzony dla „Projektu MAC” w MIT (bez związku z Apple Macintosh ani z McCarthym), bezpośredni spadkobierca LISP 1.5. Działał na PDP-10 pod Multicsem. (MACLISP później został przemianowany na Maclisp, często bywa również nazywany MacLispem). InterLisphttp://www.softwarepreservation.org/projects/LISP/interlisp-d/3100186-Interlisp_Oct83.pdf – stworzony w BBN Technologies na komputery PDP-10 działające z systemem Tenex, później zaadaptowany dla maszyn Lispu Xeroxa. Mała wersja zwana „InterLISP 65” została wydana dla komputerów marki Atari bazujących na procesorze MOS 6502. Przez pewien czas Maclisp i InterLisp były w równie szerokim użyciu. – początkowo projekt Berkeley, później zaimplementowany przez Franz Inc. Nazwa jest żartobliwą deformacją imienia „Franz Liszt”. Nazwa „Franz Lisp” nie odnosi się do Allegro Common Lisp, odmiany Common Lispu sprzedawanej przez Franz Inc. w ostatnim czasie. ZetaLisp – używany na maszynach Lispowych, bezpośredni następca Maclispu. Emacs Lisp – używany jako język rozszerzeń edytora Emacs. Common Lisp (1984), opisany w Common Lisp: The Language – połączenie kilku różnych podejść (ZetaLisp, Spice Lisp, NIL i S-1 Lisp) do stworzenia następcy Maclispu z pewnymi wpływami ze Scheme. Ta wersja Common Lispu była dostępna na wiele platform i uznawana za standard do czasu pojawienia się specyfikacji ANSI Common Lisp (ANSI X3.226-1994). – próba stworzenia nowego, wydajnego i oczyszczonego z historycznego bagażu dialektu Lispu. – jw. UstandaryzowanyStandardy ISLispu. jako ISO/IEC 13816:1997 i później skorygowany w ISO/IEC 13816:2007 – Information technology – Programming languages, their environments and system software interfaces – Programming language ISLISP. IEEE Scheme – standard IEEE, 1178-1990 (R1995). ANSI Common Lisp – specyfikacja American National Standards Institute (ANSI) Common Lispu, stworzona przez podkomisję , która rozpoczęła pracęhttp://www.nhplace.com/kent/CL/x3j13-86-020.html wychodząc od Common Lisp: The Language jako dokumentu bazowego i działała na zasadzie publicznego konsensusu co do zagadnień przenośności i kompatybilności implementacji Common Lispu. Pomimo iż formalnie jest to standard ANSI, implementacje, sprzedaż, wykorzystanie i wpływ ANSI Common Lispu było i jest widoczne na całym świecie.
Powiązania ze sztuczną inteligencją Od swoich początków Lisp był blisko powiązany ze społecznością badającą i rozwijającą sztuczną inteligencję, szczególnie na PDP-1036-bitowy rozmiar słowa na PDP-6/PDP-10 został wprowadzony ze względu na użyteczność trzymania dwóch 18-bitowych Lispowych wskaźników w jednym słowie. „The PDP-6 project started in early 1963, as a 24-bit machine. It grew to 36 bits for LISP, a design goal.” („Projekt PDP-6 został rozpoczęty w 1963 jako maszyna 24-bitowa. Urosła do 36 bitów dla LISPu, celu projektowego.”) .. Lisp został użyty w implementacji języka programowania Micro Planner, który był podstawą znanego systemu SI SHRDLU. W latach 70., gdy badania nad AI rozwinęły się również po stronie komercyjnej, wydajność istniejących systemów Lispu stawała się coraz ważniejszym problemem.
Lisp był trudny do implementacji na zwykłych kompilatorach i sprzęcie dostępnym w 1970. Garbage collection, stworzone przez Daniela Edwardsa, wpłynęło na użyteczność Lispu na sprzęcie obliczeniowym ogólnego przeznaczenia, ale wydajność wciąż była problemem. Doprowadziło to do stworzenia maszyn lispowych: dedykowanego sprzętu do uruchamiania środowisk i programów w Lispie. Postęp w dziedzinie sprzętu komputerowego, jak również w kompilatorach wkrótce sprawił, że maszyny lispowe stały się przestarzałe, co zaszkodziło rynkowi Lispu.
W latach 80. i 90. włożono duży wysiłek w zunifikowanie wielu dialektów Lispu (szczególnie dialektów InterLisp, Maclisp, ZetaLisp, i Franz Lisp) w pojedynczy język. Nowy język, Common Lisp był istotnie kompatybilnym podzbiorem dialektów, które zastępował. W 1994, ANSI opublikowało specyfikację Common Lispu, „ANSI X3.226-1994 Information Technology Programming Language Common Lisp”. W tamtym czasie światowy rynek Lispu był dużo mniejszy niż obecnie.
Od 2000 Większość aktywności skupia się wokół stworzenia open source’owych implementacji Common Lispu i zawiera rozwój nowych przenośnych bibliotek i aplikacji. Zainteresowanie to można częściowo zmierzyć przez sprzedaż papierowej wersji książki Practical Common Lisp autorstwa Petera Seibela, wstępu do CL dla nowych programistów Lispu, opublikowanej w 2004 roku. Była ona drugą co do popularności książką o programowaniu na Amazon. Aktualnie dostępna jest za darmo w interneciePractical Common Lisp.. Można również zauważyć zwiększoną frekwencję na związanych z Lispem konferencjachKeeping Lisp alive and practical | Reg Developer. i aktywność na powiązanych grupachProgramming language popularity..
Wielu nowych programistów Lispu zostało zainspirowanych przez wypowiedzi takich postaci jak Paul Graham czy Eric S. Raymond by spopularyzować język uznawany za przestarzały. Nowi programiści zwykle opisują język jako dający nowe spojrzenie na programowanie i twierdzą, że dzięki temu stali się dużo bardziej wydajni niż w innych językach. Wpływ na odzyskiwanie popularności przez Lisp mógł mieć również komentarz Petera NorvigaA Retrospective on PAIP., autora książek Paradigms of AI Programming: Case Studies in Common Lisp i Artificial Intelligence: A Modern Approach lub Phillip Greenspun, który odniósł sukces biznesowy, używając Lispu.
Dialekty Dwoma głównymi dialektami Lispu ogólnego przeznaczenia aktualnie są Common Lisp i Scheme. Języki te reprezentują znacząco różne podejścia projektowe.
Common Lisp, bazujący głównie na Maclispie, InterLisp i dialektach z maszyn lispowych, jest poszerzonym nadzbiorem wcześniejszych dialektów, z szeroką specyfikacją, obejmującą wiele wbudowanych typów danych i form syntaktycznych, jak również system obiektowy.