Które z tych starych zarzutów dotyczących wspólnej seplenienie obowiązują do dziś?

29

W A Critique of Common Lisp napisanym przez Rodneya A. Brooksa i Richarda P. Gabriela ze Stanforda w 1984 roku omówiono niektóre decyzje projektowe zachowane przez komitet normalizacyjny Common Lisp. Chociaż większość dyskusji pozostaje aktualna, istnieją dwa stwierdzenia odnoszące się do technologii dostępnej w tym czasie i mogą być dziś fałszywe.

Te dwa stwierdzenia to:

Zbyt wiele kosztów języka zostało odrzuconych z napomnieniem, że „każdy dobry kompilator” może się nimi zająć. Nikt jeszcze nie napisał - i prawdopodobnie nie będzie bez ogromnego wysiłku - kompilatora, który wykonuje ułamek oczekiwanych sztuczek.

Ponieważ jestem nowicjuszem Common Lisp, a nawet uczniem, nie jestem w stanie być bardziej szczegółowy niż autorzy. Wydaje się, że twierdzą, że w kilku aspektach języka wbudowana jest duża ogólność i elastyczność, co sprawia, że ​​pisanie dobrego kompilatora jest dość trudne.

We WSPÓLNYM LISPie nieco za dużo kontroli nad arytmetyką zmiennoprzecinkową. I z pewnością, chociaż można uzyskać prawidłowe zachowanie programu intensywnie zmiennoprzecinkowego, wydajność może się znacznie różnić.

O ile rozumiem, wydaje się, że pisanie wydajnego kodu numerycznego we wspólnym Lisp jest możliwe, ale trudniejsze niż musi być.

To było trzydzieści lat temu. Jak powinienem dziś traktować to stwierdzenie, jeśli chcę pisać programy Common Lisp dla jednej ze wspólnych implementacji wolnego oprogramowania (CLISP, SBCL i in.)?

użytkownik40989
źródło
Świetne pytanie! Chciałbym usłyszeć od kogoś znającego się na Common Lisp na ten temat. Obawiam się, że nadal mają zastosowanie, w oparciu o pozorną względną popularność Common Lisp w dzisiejszych czasach.
1
Zmiennoprzecinkowy jest trudny do osiągnięcia. Niektóre języki określają ścisły model i mają obniżoną wydajność, inne używają luźnego modelu i trudno jest je uzasadnić. Na przykład rozumowanie na temat nawet prostych programów zmiennoprzecinkowych w języku C # jest dla mnie zbyt trudne. Dlatego mam tendencję do współpracy z projektantami języków, którzy są surowi ze zmiennoprzecinkową, nawet jeśli kosztuje to wydajność.
CodesInChaos
2
Z drugiej strony, nowoczesny sprzęt generalnie implementuje zmiennoprzecinkowy IEEE, więc jego zachowanie jest prawdopodobnie znacznie bardziej przewidywalne niż implementacje dostępne w 1984 r.
microtherion

Odpowiedzi:

31

Artykuł jest interesujący na wiele sposobów.

Najciekawsze jest to, że autorzy sfałszowali artykuł z 1984 r. Zaledwie dwa lata później w 1986 r. Brooks i Gabriel opracowali wysoce optymalizujący kompilator Lisp i sprzedawali go od wielu lat z sukcesem: Lucid Common Lisp (PDF).

Obsługa tego kompilatora Lisp jest nadal dostępna z LispWorks : teraz nazywa się Liquid Common Lisp .

Optymalizacje kompilatora Liquid CL są udokumentowane w Rozdziale 3 Zaawansowanego Podręcznika Użytkownika : Optymalizacja programów Lisp .

Kilka aplikacji komercyjnych zostało napisanych i wdrożonych w Lucid CL. Na przykład w moim rodzinnym mieście pierwszy system informacji o transporcie publicznym dla HVV (Hamburger Verkehrsverbund) został wdrożony przy użyciu Lucid CL na stacji SUN SPARC. Był dostępny publicznie na dworcach kolejowych za pomocą dużego ekranu dotykowego oraz w call center.

Lucid CL odniósł sukces, ponieważ jego kompilator w trybie produkcyjnym stworzył szybkie aplikacje Common Lisp, głównie na platformy Unix / RISC.

Brooks i Gabriel piszą o Lucid Common Lisp w 1986 roku:

Wykazano, że kompilator z dynamicznym ponownym ukierunkowaniem jest środkiem umożliwiającym łatwość kompilacji dla różnych implementacji Lisp; sposób przeniesienia systemów Lisp na różne komputery; oraz narzędzie do tworzenia wysokiej jakości, wysokowydajnego kodu dla różnych komputerów ze wspólnego źródła.

W ten sposób właśnie wdrożyli to, co Krytyka wspólnej Lisp uważała za trudne lub niemożliwe.

Obecnie bardziej zaawansowane wdrożenia przeprowadzają wiele optymalizacji, ale sprzęt jest także ponad 1000 razy szybszy niż w 1984 roku. VAX 11/780 miał wtedy jeden MIPS (milion instrukcji na sekundę), a maszyna Lisp była również w ten zakres. Motorola 68000 miała częstotliwość taktowania 8 MHz.

Krytyka dotycząca wydajności zmiennoprzecinkowej i ogólnie różnej wydajności jest nadal aktualna, ale odzwierciedla to wybór implementatorów. Niektóre implementacje nie są opracowywane jako kompilatory o wysokiej wydajności. Ich głównym celem może być przenośność, kompaktowość lub coś innego, a zatem mają one różne cele wdrożenia.

Jako użytkownik / programista nie trzeba pisać przenośnego kodu i używać wszystkich dziesięciu obecnie obsługiwanych systemów Common Lisp. Użyj implementacji, która najlepiej odpowiada problemowi z aplikacją.

Rainer Joswig
źródło
Twoja odpowiedź jest bardzo precyzyjna i szczegółowa, zdecydowanie zasługuje na nagrodę!
user40989,
1
„Wysoce zoptymalizowany” niekoniecznie oznacza, że ​​kompilator jest „wystarczająco sprytny”. Słowa „wystarczająco sprytne” rodzą pytanie „w jakim celu?”. Nadal istnieją aplikacje (głównie dla bardzo ograniczonych platform wbudowanych), których nie pisałbyś we Common Lisp, ponieważ optymalizacja nadal nie może wyeliminować wszystkich kosztów działania związanych z dynamicznym pisaniem, alokacją sterty i wyrzucaniem elementów bezużytecznych. Oczywiście Common Lisp nie jest w żaden sposób wyjątkowy w tym „zawodzeniu”. Na wolności nie zaobserwowano jeszcze języka, który byłby naprawdę odpowiedni dla absolutnie wszystkiego.
Steve314,
@ Steve314: Lucid CL stanowiły rynek dla dużych systemów AI opartych na Lisp, systemów CAD itp. Na stacjach roboczych i serwerach Unix. Świadomy cel CL nie był systemem osadzonym. Lucid CL zajmuje się narzutami związanymi z dynamicznym pisaniem, alokacją sterty i wieloma innymi obszarami optymalizacji - w tym wydajnym śmieciarzem. Mimo to GC jest najbardziej potrzebny. Zwykle aplikacje używają specjalnych technik, aby uniknąć zużycia, a tym samym zmniejszyć współczynnik GC, takich jak pule „zasobów”.
Rainer Joswig,
21

Kiedy ten artykuł został napisany w 1984 r., Komputer z 1 megabajtem pamięci RAM i 20 megabajtowym dyskiem twardym, zdolny do siedzenia na twoim biurku, był wielkim problemem. Oczywiście powstają spory dotyczące praktyczności języka tak wysokiego poziomu, jak Lisp na sprzęcie, który spartan. Postępy w technologii sprzętowej i kompilatorowej, które nastąpiły od tego czasu, znacznie ułatwiły pisanie i uruchamianie programów Lisp, niezależnie od jakichkolwiek nieefektywności liczbowych, które mogą występować w języku.

Programiści często handlują wydajnością obliczeniową w celu zwiększenia wydajności programowania. Lisp może być wolnym językiem (w niektórych implementacjach, ale także w innych językach), ale ma również zasłużoną reputację do szybkiego rozwoju, a wiele programów nie wymaga wysoce zoptymalizowanej infrastruktury do wykazywania odpowiedniej wydajności.

Wybór implementacji Lisp może znacznie wpłynąć na profil wydajności twoich programów. Na przykład CLISP chętnie przyznaje, że „Jeśli twój kod jest silnie numeryczny, możesz preferować CMUCL”. Kilka nowoczesnych implementacji Lisp (i schematu) pozwala określić podpowiedzi typu numerycznego, co zwiększy wydajność numeryczną.

Krótko mówiąc, sytuacja jest dziś znacznie lepsza niż wtedy.

Robert Harvey
źródło