Mój stopień licencjata był w dziedzinie kognitywistyki i sztucznej inteligencji. Od tego czasu miałem jednodaniowe wprowadzenie do Lisp. Myślałem, że ten język jest interesujący (jak w „eleganckim”), ale tak naprawdę nie zastanawiałem się długo, dopóki nie natknąłem się na dziesiątą zasadę Greenspun znacznie później:
Każdy wystarczająco skomplikowany program C lub Fortran zawiera ad hoc, nieformalnie określone, wolne od błędów, powolne wdrożenie połowy Common Lisp.
Punkt Greenspun był (częściowo) taki, że wiele złożonych programów ma wbudowanych tłumaczy. Sugerował, że zamiast budowania interpretera na język, lepiej byłoby użyć takiego języka jak Lisp, który ma już wbudowany interpreter (lub kompilator).
W tym czasie pracowałem nad dość dużą aplikacją, która wykonywała obliczenia zdefiniowane przez użytkownika przy użyciu niestandardowego interpretera dla niestandardowego języka. Postanowiłem spróbować przepisać jego rdzeń w Lisp jako eksperyment na dużą skalę.
Zajęło to około sześciu tygodni. Oryginalny kod zawierał ~ 100 000 wierszy Delphi (wariant Pascal). W Lisp zostało to zredukowane do ~ 10.000 linii. Jeszcze bardziej zaskakujący był fakt, że silnik Lisp był 3-6 razy szybszy. I pamiętaj, że było to dzieło neofity z Lisp! Całe to doświadczenie było dla mnie dość odkrywcze; po raz pierwszy zobaczyłem możliwość połączenia wydajności i ekspresji w jednym języku.
Jakiś czas później, kiedy zacząłem pracować nad projektem internetowym, przesłuchałem wiele języków. Włączyłem Lisp i Scheme do miksu. Na koniec wybrałem implementację programu - schemat Cheza . Byłem bardzo zadowolony z wyników.
Projekt internetowy to wysokowydajny „silnik selekcyjny” . Korzystamy ze Schematu na wiele różnych sposobów, od przetwarzania danych, wysyłania zapytań po generowanie stron. W wielu miejscach zaczęliśmy od innego języka, ale ostatecznie przeprowadziliśmy się do programu z powodów, które opiszę poniżej.
Teraz mogę odpowiedzieć na twoje pytanie (przynajmniej częściowo).
Podczas przesłuchania przyjrzeliśmy się różnorodnym implementacjom Lisp i Scheme. Po stronie Lisp przyjrzeliśmy się (sądzę) Allegro CL, CMUCL, SBCL i LispWorks. Po stronie programu obejrzeliśmy (jak sądzę) Bigloo, kurczaka, Cheza, Gambita. (Wybór języka był dawno temu; dlatego jestem trochę zamglony. Mogę wykopać notatki, jeśli to ważne.)
Od samego początku szukaliśmy a) rodzimych wątków oraz b) Linux, Mac i Windows. Te dwa warunki łącznie znokautowały wszystkich oprócz (chyba) Allegro i Cheza - więc aby kontynuować ocenę, musieliśmy poluzować wymóg wielowątkowości.
Zebraliśmy zestaw małych programów i wykorzystaliśmy je do oceny i testowania. To ujawniło wiele problemów. Na przykład: niektóre implementacje miały wady, które uniemożliwiały uruchomienie niektórych testów do ukończenia; niektóre implementacje nie mogły skompilować kodu w czasie wykonywania; niektóre implementacje nie mogły łatwo zintegrować skompilowanego kodu w czasie wykonywania ze wstępnie skompilowanym kodem; niektóre implementacje miały śmieciarze, które były wyraźnie lepsze (lub wyraźnie gorsze) niż inne ”; itp.
Na nasze potrzeby tylko trzy komercyjne wdrożenia - Allegro, Chez i Lispworks - przeszły nasze podstawowe testy. Z trzech tylko Chez przeszedł wszystkie testy z latającymi kolorami. Wtedy myślę, że Lispworks nie miał natywnych wątków na żadnej platformie (myślę, że teraz) i myślę, że Allegro miało tylko natywne wątki na niektórych platformach. Ponadto Allegro miało opłatę licencyjną za „zadzwoń do nas”, co nie bardzo mi się podobało. Uważam, że Lispworks nie pobierał opłaty za uruchomienie, a Chez miał prosty (i bardzo rozsądny) układ (i uruchomił się tylko wtedy, gdy korzystałeś z kompilatora w czasie wykonywania).
Po wygenerowaniu dość znacznych fragmentów kodu zarówno w Lisp, jak i Scheme, oto kilka punktów porównawczych i kontrastowych:
Środowiska Lisp są znacznie bardziej dojrzałe. Dostajesz o wiele więcej za grosze. (Powiedziawszy to, więcej kodu oznacza również więcej błędów).
Środowiska Lisp są znacznie trudniejsze do nauczenia się. Potrzebujesz dużo więcej czasu, aby stać się biegłym; Common Lisp to ogromny język - i to zanim przejdziesz do bibliotek dodanych przez komercyjne implementacje. (Powiedziawszy to, składnia Scheme jest znacznie bardziej subtelna i skomplikowana niż jakakolwiek inna rzecz w Lisp.)
Środowiska Lisp mogą być nieco trudniejsze do wytworzenia plików binarnych. Musisz „potrząsnąć” obrazem, aby usunąć niepotrzebne bity, a jeśli nie wykonasz poprawnie programu podczas tego procesu, możesz później popełnić błędy w czasie wykonywania . Z kolei w Chez kompilujemy plik najwyższego poziomu, który zawiera wszystkie inne potrzebne pliki i gotowe.
Powiedziałem wcześniej, że w wielu miejscach nie zamierzaliśmy używać Scheme. Dlaczego? Mogę wymyślić trzy powody, dla których nie mam pojęcia.
Po pierwsze, nauczyliśmy się ufać Chezowi (i jego twórcy, Cadence). Poprosiliśmy dużo o narzędzie, które konsekwentnie dostarczało. Na przykład Chez miał historycznie niewielką liczbę wad, a jego menedżer pamięci był bardzo, bardzo dobry.
Po drugie, nauczyliśmy się kochać występ, który otrzymaliśmy od Cheza. Używaliśmy czegoś, co przypominało język skryptowy - i uzyskiwaliśmy z tego szybkość natywnego kodu. Dla niektórych rzeczy, które nie miały znaczenia - ale nigdy nie bolało, a czasem bardzo pomogło.
Po trzecie, nauczyliśmy się kochać abstrakcję, którą może zapewnić Schemat. Nawiasem mówiąc, nie mam na myśli tylko makr; Mam na myśli rzeczy takie jak zamknięcia, lambdas, wezwania do ogona itp. Kiedy zaczniesz myśleć w tych terminach, inne języki wydają się raczej ograniczone w porównaniu.
Czy program jest idealny? Nie; to jest kompromis. Po pierwsze, pozwala to indywidualnym programistom na większą efektywność - ale programiści mają trudność z wzajemnym sprawdzaniem kodu, ponieważ brakuje znaków w większości języków (np. Pętli) w schemacie (np. Istnieje milion sposobów na zrobienie tego pętla for). Po drugie, istnieje znacznie mniejsza grupa programistów, z którymi można rozmawiać, wypożyczać, wypożyczać itp.
Podsumowując, myślę, że powiedziałbym: Lisp i Scheme oferują niektóre funkcje, które nie są powszechnie dostępne nigdzie indziej. Ta zdolność jest kompromisem, więc lepiej, aby była to taka, która ma sens w twoim konkretnym przypadku. W naszym przypadku czynniki decydujące o tym, czy wybrać Lisp czy Scheme, miały więcej wspólnego z bardzo podstawowymi funkcjami (obsługa platformy, wątki platformy, kompilacja w czasie wykonywania, licencjonowanie w czasie wykonywania) niż z funkcjami języka lub biblioteki. Ponownie, w naszym przypadku było to również kompromis: dzięki Chez otrzymaliśmy podstawowe funkcje, których chcieliśmy, ale straciliśmy obszerne biblioteki, które miały komercyjne środowiska Lisp.
Powtórzę też: dawno temu patrzyliśmy na różne Lisps i Schematy; od tego czasu wszystkie ewoluowały i poprawiały się.