Korzenie Lisp

Maj 2001

(Napisałem ten artykuł, aby pomóc sobie zrozumieć, co dokładnie odkrył McCarthy. Nie musisz znać tych rzeczy, aby programować w Lispie, ale powinno to być pomocne dla każdego, kto chce zrozumieć istotę Lisp — zarówno w sensie jego pochodzenia, jak i rdzenia semantycznego. Fakt, że posiada taki rdzeń, jest jedną z cech wyróżniających Lisp i powodem, dla którego, w przeciwieństwie do innych języków, Lisp ma dialekty.)

W 1960 roku John McCarthy opublikował niezwykły artykuł, w którym zrobił dla programowania coś podobnego do tego, co Euklides zrobił dla geometrii. Pokazał, jak, mając garść prostych operatorów i notację dla funkcji, można zbudować cały język programowania. Nazwał ten język Lisp, od „List Processing” (Przetwarzanie List), ponieważ jednym z jego kluczowych pomysłów było użycie prostej struktury danych zwanej listą zarówno dla kodu, jak i danych.

Warto zrozumieć, co odkrył McCarthy, nie tylko jako kamień milowy w historii komputerów, ale jako model tego, czym programowanie staje się w naszych czasach. Wydaje mi się, że do tej pory istniały dwa naprawdę czyste, spójne modele programowania: model C i model Lisp. Te dwa wydają się punktami wysokiego terenu, z bagnistymi nizinami pomiędzy nimi. W miarę jak komputery stawały się coraz potężniejsze, nowe języki programowania stopniowo przesuwały się w kierunku modelu Lisp. Popularnym przepisem na nowe języki programowania w ciągu ostatnich 20 lat było wzięcie modelu obliczeń C i dodawanie do niego, fragmentarycznie, części zaczerpniętych z modelu Lisp, takich jak typowanie w czasie wykonania i zbieranie śmieci.

W tym artykule postaram się wyjaśnić w najprostszych możliwych terminach, co odkrył McCarthy. Chodzi nie tylko o poznanie interesującego wyniku teoretycznego, który ktoś wymyślił czterdzieści lat temu, ale o pokazanie, dokąd zmierzają języki. Nietypową cechą Lisp — w rzeczywistości definiującą cechą Lisp — jest to, że można go napisać w sobie. Aby zrozumieć, co McCarthy przez to rozumiał, cofniemy się do jego kroków, z jego matematyczną notacją przetłumaczoną na działający kod Common Lisp.