Lisp (język programowania)
Wprowadzenie
Lisp (skrót od LISt Processing) jest rodziną języków programowania opartych na przetwarzaniu list. Po raz pierwszy został zaprojektowany w latach 1960 przez Johna McCarthya w MIT jako język do badań w dziedzinie sztucznej inteligencji. Lisp jest jednym z najstarszych języków wciąż używanych i wywarł znaczący wpływ na rozwój teorii języków programowania, kompilatorów oraz środowisk interaktywnych.
Historia
- 1958–1960 – McCarthy opracowuje koncepcję języka przetwarzającego listy, publikując artykuł „Recursive Functions of Symbolic Expressions and Their Computation by Machine”.
- 1960 – powstaje pierwsza implementacja Lisp 1.5 na komputerach IBM 704.
- 1970–1980 – rozwój dialektów Common Lisp i Scheme, które wprowadzają standaryzację i nowe możliwości językowe.
- 1990–2000 – powstaje Emacs Lisp jako język rozszerzeń edytora Emacs, a także Clojure, łączący cechy Lispa z platformą JVM.
- 2010–2020 – odrodzenie popularności Lispa dzięki projektom Racket i Clojure, a także rosnącemu zainteresowaniu językami funkcyjnymi.
Charakterystyczne cechy
- Pełna symboliczna reprezentacja kodu – w Lispie kod i dane mają tę samą strukturę (listy), co umożliwia metaprogramowanie i łatwe operacje na własnym kodzie.
- Makra – potężny mechanizm transformacji kodu w czasie kompilacji, pozwalający definiować nowe konstrukcje językowe.
- Dynamiczne typowanie – zmienne nie mają przypisanego typu statycznie; typy są sprawdzane w czasie wykonywania.
- Garbage collection – automatyczne zarządzanie pamięcią, wprowadzone już w pierwszych implementacjach Lispa.
- Rekurencja i funkcje wyższego rzędu – język kładzie duży nacisk na rekursję i operacje na funkcjach jako wartościach pierwszej klasy.
Składnia
Podstawowy element składni Lispa to wyrażenie S‑wyrażeniowe (S‑expression), zapisywane w postaci listy ograniczonej nawiasami okrągłymi:
(operator argument1 argument2 …)
Przykładowe wyrażenia:
(+ 1 2 3)– suma trzech liczb, wynik6;(defun faktorial (n) (if (<= n 1) 1 (* n (faktorial (- n 1)))))– definicja funkcji obliczającej silnię.
Dialekty i standardy
| Dialekt | Rok powstania | Opis |
|---|---|---|
| Common Lisp | 1984 | Standardowy, wieloparadygmatyczny język, łączący elementy proceduralne, funkcyjne i obiektowe (CLOS). |
| Scheme | 1975 | Lekka odmiana Lispa, skupiająca się na prostocie i minimalizmie, z silnym wsparciem dla continuations. |
| Emacs Lisp | 1985 | Dialekt używany do rozszerzania edytora Emacs. |
| Clojure | 2007 | Funkcyjny język na platformie JVM, korzystający z niezmiennych struktur danych. |
| Racket | 1995 | Rozszerzenie Scheme, oferujące bogate środowisko do tworzenia języków domenowych. |
Implementacje
Do najważniejszych implementacji Lispa należą:
- SBCL (Steel Bank Common Lisp) – wysokowydajny kompilator do kodu natywnego.
- CLISP – interpreter/kompilator zgodny z Common Lisp, działający na wielu platformach.
- Chez Scheme – szybka implementacja Scheme z wbudowanym kompilatorem JIT.
- GNU Emacs – zawiera własną maszynę wirtualną dla Emacs Lisp.
- Clojure – uruchamiany na JVM oraz w środowisku JavaScript (ClojureScript).
Wykorzystanie
Lisp jest wykorzystywany w różnych dziedzinach, m.in.:
- Sztuczna inteligencja – historycznie podstawowy język w badaniach AI, np. w Stanford AI Lab.
- Edytory i środowiska programistyczne – Emacs, Vim (poprzez wtyczki), a także Racket jako platforma edukacyjna.
- Systemy wbudowane – Lisp w wersji Scheme jest używany w mikrokontrolerach (np. Chipcon).
- Finanse i analiza danych – Clojure i ClojureScript w aplikacjach przetwarzających duże zbiory danych.
Wpływ i dziedzictwo
Lisp miał ogromny wpływ na rozwój teorii języków programowania. Jego koncepcje, takie jak garbage collection, dynamic typing, first‑class functions i makra, stały się fundamentem nowoczesnych języków, w tym Python, Ruby oraz JavaScript. Ponadto, Lisp wprowadził pojęcie REPL (Read‑Eval‑Print Loop), które stało się standardowym interaktywnym środowiskiem w wielu językach.
Kontrowersje i krytyka
Mimo swoich zalet, Lisp bywa krytykowany za:
- Skąpą popularność w przemyśle komercyjnym, co utrudnia rekrutację programistów.
- Nietypową składnię (wykraczającą poza tradycyjne notacje infiksowe), co może odstraszać nowicjuszy.
- Brak jednorodnego standardu wśród licznych dialektów, co prowadzi do fragmentacji społeczności.
Zobacz także
Literatura
- John McCarthy, “Recursive Functions of Symbolic Expressions and Their Computation by Machine”, MIT, 1960.
- Guy L. Steele Jr., “Common Lisp: The Language”, Digital Press, 1990.
- Harold Abelson, Gerald Jay Sussman, „Structure and Interpretation of Computer Programs”, MIT Press, 1996.
- R. Kent Dybvig, „The Scheme Programming Language”, MIT Press, 1998.
- Rich Hickey, „Clojure”, O'Reilly Media, 2009.
Zewnętrzne zasoby
Po więcej szczegółów zapraszamy do przeglądania powiązanych artykułów w ramach tej encyklopedii.