Czy użyłbyś (dialekt) LISP do aplikacji w świecie rzeczywistym? Gdzie i dlaczego? [Zamknięte]

31

LISP (i dialekty, takie jak Scheme, Common LISP i Clojure) nie zyskały dużego wsparcia branży, mimo że są całkiem przyzwoitymi językami programowania. (W tej chwili wydaje się, że zyskują one przyczepność).

To nie jest bezpośrednio związane z pytaniem, czy użyłbyś dialektu LISP dla programu produkcyjnego? Jaki program i dlaczego? Uwzględniono również zastosowania tego rodzaju integracji z jakimś innym kodem (np. C), ale pamiętaj, że to właśnie masz na myśli w swojej odpowiedzi. Preferowane są ogólne koncepcje, ale określone aplikacje również są w porządku.

Anto
źródło
6
Czy emacs liczy się jako aplikacja „w prawdziwym świecie”? gnu.org/software/emacs/emacs-lisp-intro
S.Lott
1
@ S.Lott: Tak. Jeśli używasz elisp do tworzenia rozszerzeń dla Emacsa, to w porządku i zastosowanie dialektu LISP
Anto
GNU Guile jest przeznaczony właśnie do tego celu.
1
Chociaż interesujące, nie sądzę, aby to pytanie było odpowiednie dla tej witryny. Wiele powodów: 1 - zbyt szeroki, 2 - zachęca do listy odpowiedzi, 3 - nie ma jasnego sposobu na wybranie, która jest „właściwa”, 4 - zbyt zlokalizowana w czasie („nie zyskała dużego wsparcia branży”), 5 - zaprasza do dyskusji i debaty.
Andres F.

Odpowiedzi:

18

Czy użyłbyś dialektu LISP dla programu produkcyjnego?

Absolutnie

Jaki program i dlaczego?

Lisp to dynamiczny język ogólnego przeznaczenia. Dziś ma te same podstawowe trudności, co inne dynamiczne języki ogólnego przeznaczenia, które nie są publikowane przez Microsoft: natywne wątki, integracja GUI, deterministyczne działanie GC i małe ślady pamięci.

Wierzę, że rodzime wątki są osiągane przez LispWorks i SBCL. Być może inni? Nie zbadałem w pełni.

LispWorks i Franz Common Lisp - produkty komercyjne - integrują się z GUI w stopniu sukcesu. Nie mając $$ na ich zakup, nie wiem jak dobrze to działa. Podejrzewam, że działają całkiem dobrze ...

Deterministycznego działanie GC można zrobić (jest to zrobione w Java do pewnego poziomu sukcesu), ale ja nie wiem, czy istniejące systemy Lisp (obsługuje nich) mają żadnego kodu, aby to zrobić.

Mały ślad pamięci, jak sądzę, jest osiągany przez niektórych Lisps.

Chodzi mi o to, że Common Lisp jest technicznie gotowy do produkcji systemów produkcyjnych. I tak jest .

Zdecydowana większość programistów jest przerażona (wybierz jeden) dynamicznymi językami, makrami, nawiasami, brakiem ulubionego IDE, złym doświadczeniem na studiach, niewielką liczbą miejsc pracy, a następnie nie korzysta z nich.

Osobiście skoczyłbym do budowania pełnoprawnego systemu produkcyjnego w Common Lisp od podstaw w środowisku zespołowym.

edycja: Naprawdę nie odpowiedziałem, dlaczego Lisp w przeciwieństwie do innych języków.

Z mojego doświadczenia Lisp - nieistotnego, ale znacznie bardziej niż „witaj świecie” - stwierdziłem, że jest on niezwykle użyteczny po pierwszych bólach związanych z „nowym językiem Argh”. Większość języka pasuje do siebie w bardzo regularny i dość oczywisty sposób, że tak naprawdę nie znajduję innych języków do obsługi. Częścią tego jest połączenie wyrażeń i instrukcji. Częścią tego jest typ danych listy podstawowej. Częścią tego jest system typów. Częścią tego jest system makr. Nie zrozumcie mnie źle, punkty bólu. Ale nie kopią mnie w twarz tak bardzo, jak bolą inne języki.

Jednym uproszczonym przykładem jest procedura długości listy Pythona. Podejście Python polega na wywołaniu len(mysequence). Ale jeśli się nad tym zastanowić, długość jest właściwością sekwencji. Tak, mysequence.len()jest bardziej odpowiedni pomysł. Lisp zasadniczo usuwa to rozróżnienie składniowe. (length thing)jest zarówno składnią wywołania funkcji, jak i składnią metody. Oczywiście niektórzy uważają to za frustrujące i chcą różnicy składniowej. Wolałbym mieć regularność.

edit2: Przekształciłem część mojej pracy magisterskiej, która działa na pulpicie, na Common Lisp i do tej pory miałem przyjemność pracować z nią.

Paul Nathan
źródło
2
Z tego, co słyszę, LISP jest wykorzystywany w pełnoprawnych systemach produkcyjnych, ale zwykle tylko w niektórych procesach logicznych, które są łatwiejsze do kodowania w LISP niż w innych językach. Sztuczna inteligencja gier wideo i wstępne przetwarzanie danych statystycznych były kiedyś cytowanymi przeze mnie przykładami. Kiedyś miałem menedżera, który powiedział: „Każdy wystarczająco złożony system ma wbudowaną implementację LISP w połowie ocenianą”. Podobne powiedzenie brzmiało: „Każdy wystarczająco rozdęty system ma wbudowany czytnik wiadomości e-mail”.
FrustratedWithFormsDesigner
4
@ Frustrated: Tak, są to n-te prawo Greenspun i prawo jwz.
Paul Nathan
2
Wiele z nich zostało rozwiązanych przez Clojure, po prostu dlatego, że są specjalnie zaprojektowane, aby być kompatybilnym i zastępować Javę. Ale oczywiście istnieją również implementacje schematu i CL dla JVM (np. Kawa, ABCL).
Jörg W Mittag
4
Clojure jest dla mnie niejasno irytujący, ponieważ jest to kolejna fragmentacja.
Paul Nathan
fragmentacja nie jest złą rzeczą. W Clojure naprawdę denerwuje brak kropkowanych par. Czy można go uznać za język podobny do Lisp bez tak fundamentalnej rzeczy?
SK-logika
11

Osobiście znam osoby używające Lisp w postaci Clojure w kilku bankach inwestycyjnych i startupach w Londynie. Wybrałem również Clojure jako podstawowy język programowania dla mojego startupu, więc chętnie wkładam pieniądze tam, gdzie są moje usta :-)

Odkryłem, że nauka języka Clojure w ciągu ostatniego roku była bardzo pouczająca (po wielu doświadczeniach z Javą i C #). Głównymi przyczynami tego są:

  • Kładzie duży nacisk na programowanie funkcjonalne (bardziej niż większość innych Lisps). Autor i BDFL Rich Hickey często cytowali Haskella jako jedną z jego inspiracji do projektowania języka, co oznacza, że ​​otrzymujesz takie rzeczy, jak w pełni niezmienne struktury danych i leniwe nieskończone sekwencje itp.
  • Metaprogramowanie makr - filozofia Lisp „kod to dane” jest trudna do zrozumienia, chyba że faktycznie jej doświadczyłeś, ale jest to jeden z powodów, dla których Lisps jest tak wyrazisty i produktywny. Zasadniczo masz możliwość rozszerzenia języka, aby dopasować go do domeny problemu.
  • Fantastyczne wsparcie dla wielordzeniowej współbieżności - tak naprawdę uważam, że Clojure jest obecnie najlepszym językiem do programowania współbieżnego. Zobacz http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey, aby uzyskać pouczającą prezentację na ten temat
  • Interaktywny rozwój w REPL to świetny, produktywny sposób budowania aplikacji. Daje to prawdziwe poczucie siły, aby dynamicznie modyfikować działający kod aplikacji i programowo sprawdzać struktury danych na żywo .....

Wydaje się również, że jest praktycznym wyborem do rzeczywistego wykorzystania produkcyjnego z następujących powodów:

  • Uruchamianie JVM z bardzo łatwą interoperacyjnością Java daje dostęp do wszystkich bibliotek i narzędzi w ekosystemie Java
  • Używasz JVM, która jest sprawdzoną platformą dla aplikacji korporacyjnych. Clojure korzysta ze wszystkich fajnych funkcji JVM, takich jak doskonała kompilacja GC i JIT za darmo.
  • Domyślnie jest to język dynamiczny , co czyni go bardzo wygodnym do programowania i szybkiego prototypowania przy użyciu praktycznie żadnej płyty kotłowej. Możesz jednak dodać wskazówki typu statycznego, aby uzyskać całkiem dobrą wydajność tam, gdzie jest to potrzebne.
  • Jest to pragmatyczna i pomocna społeczność - rodzaj kultury, w której ludzie wykonują swoje zadania, a nacisk kładziony jest na dobrze zaprojektowane rozwiązania, które rozwiązują prawdziwe problemy
  • Istnieje narzędzie wsparcia w wielu IDE . Osobiście używam Eclipse z wtyczką przeciwnie do ruchu wskazówek zegara (ponieważ potrzebuję integracji Java), ale istnieje wiele innych opcji.
mikera
źródło
8

Użyłbym LISP, gdyby był to najlepszy wybór do pracy. Tylko niektóre rzeczy, które wpływają na „najlepszy wybór”:

  • wsparcie dostawcy. Wdrożenie LISP, którego używamy - jeśli coś pójdzie nie tak i zakłóci nasz rozwój, a tym samym nasze terminy, czy sprzedawca będzie dążył do rozwiązania z nami?
  • obsługa bibliotek. Jakie biblioteki są dostępne? Manipulowanie ciągami, matematyka, dostęp do danych, serwlety internetowe (lub odpowiedniki LISP), zestaw narzędzi do okienkowania itp. Nie chcę pisać tego od zera.
  • wsparcie narzędzi - jak dobre jest IDE? Solidny / stabilny czy łuszczący się? Dobra obsługa edytora? Zintegrowany debugger? Jeśli potrzebuję wykonać GUI w LISP, czy istnieje wizualne IDE, czy też muszę ręcznie kodować układ GUI ( nienawidzę tego robić).
  • wpisowe dla programistów (naprawdę nie chcę spędzać zbyt wiele czasu na uczeniu kolegów z zespołu zupełnie nowego języka)

Wszystkie te czynniki należy wziąć pod uwagę przy podejmowaniu decyzji, czy LISP jest odpowiedni dla projektu. W świecie korporacyjnym nigdy tego nie doświadczyłem.

FrustratedWithFormsDesigner
źródło
Zgadzam się z Tobą, że na narzędzia często wpływają bardziej dostępne narzędzia i biblioteki niż sam język (pod warunkiem, że język oferuje pewne podstawowe funkcje).
Giorgio
6

Absolutnie. Paul Graham wyjaśnia to dobrze .

... W 1995 roku wiedzieliśmy coś, czego nie sądzę, że nasi konkurenci rozumieją, a niewielu rozumie nawet teraz: kiedy piszesz oprogramowanie, które musi działać tylko na twoich serwerach, możesz używać dowolnego języka. ..

Wybraliśmy Lisp. Po pierwsze, było oczywiste, że szybki rozwój będzie ważny na tym rynku. Wszyscy zaczynaliśmy od zera, więc firma, która mogłaby wprowadzić nowe funkcje, zanim konkurenci mieliby dużą przewagę. Wiedzieliśmy, że Lisp jest naprawdę dobrym językiem do szybkiego pisania oprogramowania, a aplikacje serwerowe zwiększają efekt szybkiego rozwoju, ponieważ możesz wydać oprogramowanie natychmiast po jego ukończeniu.

Jeśli inne firmy nie chcą korzystać z Lisp, tym lepiej. Może dać nam przewagę technologiczną i potrzebowaliśmy całej pomocy, jaką możemy uzyskać ...

Można więc powiedzieć, że użycie Lisp było eksperymentem. Nasza hipoteza była taka, że ​​gdybyśmy napisali nasze oprogramowanie w Lisp, bylibyśmy w stanie uzyskać funkcje wykonywane szybciej niż nasi konkurenci, a także robić rzeczy w naszym oprogramowaniu, których nie mogliby zrobić. A ponieważ Lisp był na tak wysokim poziomie, nie potrzebowalibyśmy dużego zespołu programistów, więc nasze koszty byłyby niższe. Gdyby tak było, moglibyśmy zaoferować lepszy produkt za mniej pieniędzy i nadal osiągać zyski. Ostatecznie pozyskalibyśmy wszystkich użytkowników, a nasi konkurenci nie otrzymaliby żadnego, i ostatecznie przestaliby działać. W każdym razie mieliśmy nadzieję, że tak się stanie.

Jakie były wyniki tego eksperymentu? Nieoczekiwanie zadziałało. W końcu mieliśmy wielu konkurentów, rzędu od dwudziestu do trzydziestu, ale żadne z ich programów nie mogło konkurować z naszym. Mieliśmy wysiwygowego konstruktora sklepu internetowego, który działał na serwerze, a mimo to czuł się jak aplikacja komputerowa. Nasi konkurenci mieli skrypty cgi. I zawsze byliśmy daleko przed nimi pod względem funkcji. Czasami w desperacji konkurenci próbują wprowadzić funkcje, których nie mieliśmy. Ale z Lisp nasz cykl rozwoju był tak szybki, że mogliśmy czasami powielić nową funkcję w ciągu jednego lub dwóch konkurentów ogłaszających ją w komunikacie prasowym. Zanim dziennikarze opisujący komunikat prasowy zaczną do nas dzwonić, będziemy mieli również nową funkcję.

Naszym konkurentom musiało się wydawać, że mamy jakąś tajną broń - odkodujemy ich ruch Enigmy czy coś w tym rodzaju. W rzeczywistości mieliśmy tajną broń, ale było to prostsze, niż sobie uświadomili. Nikt nie przekazywał nam wiadomości o ich funkcjach. Po prostu byliśmy w stanie opracować oprogramowanie szybciej niż ktokolwiek myślał, że to możliwe ...

Kevin Cline
źródło
8
„... Paul Graham pierwotnie napisał reddit, na seplenienie, na odwrocie serwetki, gdy czekał na kawę. Był tak potężny, że trzeba go było przepisać w pythonie, aby zwykłe komputery mogły to zrozumieć. został napisany w seplenienie, prawie nie było żadnego wysiłku, aby przepisać całość, a przepisanie zostało zakończone pomiędzy dwoma cyklami procesora. Sam Paul Graham został całkowicie napisany w seplenieniu, przez wcześniejszą wersję siebie, również napisaną w seplenienie wcześniejsza wersja lisp. To seplenienie, paul graham, seplenienie, paul graham, aż do samego końca ”.
John Cartwright,
5

Gdzie: Emacs to aplikacja w świecie rzeczywistym, która korzysta z LISP.

Dlaczego: To był świetny sposób na wyrażenie mapowania między naciśnięciem klawisza a akcją. Jest interpretowany i szybki, dobrze zdefiniowany i prosty.

S.Lott
źródło
Chciałbym rozszerzyć tę odpowiedź, mówiąc, dlaczego to jest dobre do wyrażania mapowania między uderzeniami ketstrokesa a działaniami
Anto
@Anto: Z mojego doświadczenia wynika, że ​​Lisp bardzo ułatwia tworzenie potężnych abstrakcji, które mogą w przejrzysty sposób reprezentować każdą akcję, którą możesz wykonać w edytorze w bardzo spójny sposób - po pewnym czasie korzystania z Emacsa możesz zgadywać, jak prawie wszystko zostało zrobione . Umożliwia to mapowanie wszystkiego, co można zrobić w edytorze, na naciśnięcie klawisza, a każde wiązanie wygląda bardzo podobnie do drugiego, co ułatwia pisanie i utrzymanie.
Tikhon Jelvis
4

Zarówno Macsyma, jak i Autocad oparte są na dialekcie Lisp. Sklasyfikowałbym je jako „prawdziwy świat”, jak również Emacsa.

Joris Geer
źródło
Mathematica nie jest oparta na Lisp.
Rainer Joswig
2
AutoCAD oferuje AutoLISP jako interfejs API, ale jest napisany w kodzie zarządzanym w C ++ i .NET.
CAD bloke
1
@RainerJoswig Macsyma prawdopodobnie miał na myśli zamiast Mathematica.
user40989
2

Absolutnie bym to rozważył. Zwłaszcza w przypadku nowych prac rozwojowych, które miały pewien potencjał przetwarzania równoległego. To wydaje się być miłym miejscem dla tego rodzaju funkcjonalnych języków.

Dave Kincaid
źródło
2

Lisp jest jednym z najlepszych wyborów do wdrażania kompilatorów. Wraz ze wzrostem wykorzystania DSL i eDSL, Lisp staje się coraz bardziej wartościowy. Używam dialektu Lisp do wszystkich moich zadań związanych z DSL.

Logika SK
źródło
0

Obecnie próbuję użyć newLisp jako zamiennika Php na mojej osobistej stronie internetowej za pośrednictwem platformy Dragonfly . Jeśli uda mi się wymyślić, jak sprawić, by Apache dobrze grał, skorzystam z niego (wbudowany serwer internetowy działa bardzo dobrze, ale wolałbym pracować za pośrednictwem Apache). A kiedy to się stanie, użyję newLisp wszędzie, gdzie użyłbym Php, ponieważ nie lubię Php i lubię newLisp.

W tej chwili Clojure nie jest dobrym wyborem dla aplikacji na Androida, ale wiem, że ludzie nad tym pracują. Więc jeśli to się wymyśli, to byłoby inne miejsce, w którym używałbym dialektu Lisp do aplikacji w świecie rzeczywistym ... ale znowu, to dlatego, że po prostu nie lubię Javy.

Ale szczerze, wolę Ruby niż Lisp ... ale to głównie kwestia społeczności i dokumentacji.

filozofodad
źródło
0

Zaimplementowałem zastrzeżoną, komercyjną aplikację w Common Lisp o nazwie Tankan, która działa w systemie Microsoft Windows jako natywny plik wykonywalny.

Jest to program służący do zapamiętywania japońskich znaków kanji.

Program działa jako serwer HTTP w tle. Wykonywanie tego serwera i przechodzenie do jego stron jest koordynowane przez niewielką aplikację w obszarze powiadomień systemowych (znaną również jako „Tray”), którą opracowałem przy użyciu Visual C ++.

Uruchamia się aplikacja ikony małej tacy, monitoruje i zatrzymuje serwer oparty na Lisp i komunikuje się z nim za pomocą potoków Win32 powiązanych ze standardowym wejściem i wyjściem. Za pomocą potoku serwer Lisp informuje aplikację ikony zasobnika o dokładnym adresie URL z odpowiednim numerem portu, a ta aplikacja ikony zasobnika może uruchomić przeglądarkę za pośrednictwem interfejsu API powłoki, aby przeglądać ten adres URL. Użytkownik wystarczy dwukrotnie kliknąć ikonę, aby wyświetlić interfejs użytkownika.

Program Lisp utrzymuje w pamięci dość złożony stan sesji, który zawiera historię danych wejściowych użytkownika i różne relacje między różnymi obiektami. Okrągła notacja obiektowa Lispa (włączana przez *print-circle*zmienną) i sposób jej działania w niestandardowych print-objectmetodach CLOS stanowi ogromną pomoc w implementacji trwałości: użytkownicy mogą zapisać stan na dysk i wznowić od miejsca, w którym przerwali. Wszystko jest zapisywane, w tym stan interfejsu użytkownika. Na wykresie obiektowym jest wiele współużytkowanych podkonstrukcji, a także cykli. Plus, wiele statycznych cruft, które nie muszą być utrwalane, jak zawartość obiektów wejściowych słownika. Za pomocą niestandardowych metod drukowania obiektów ANSI Common Lisp można tworzyć skondensowane reprezentacje drukowane dla obiektów, które mimo to można odczytać maszynowo,

Prawie nie JavaScript jest używany w interfejsie internetowym. Nawet kontrole ukrywania i pokazywania części interfejsu użytkownika są wykonywane przez przesłanie formularza i ponowne renderowanie HTML. Każdy szczegół stanu interfejsu użytkownika znajduje się zatem na serwerze i jest zapisywany, gdy użytkownik zapisuje dane. Ponowna generacja kodu HTML jest bardzo szybka. Robi to gigantyczne wyrażenie zwrotne Lisp, które zasila makro generujące HTML. Kod skompilowany przez Clozure Common Lisp (CCL) sprawia, że ​​dzieje się to tak szybko, że prawie nie zdajesz sobie sprawy, że kiedy klikniesz przycisk [+] w interfejsie użytkownika, aby coś otworzyć, przesyłasz żądanie do serwera, który regeneruje cała cholerna strona, a nie po prostu uruchomienie lokalnego JavaScript w celu zmiany widoczności lokalnego elementu dokumentu.

Program został pierwotnie opracowany z CLISP. Dzięki temu, że ANSI CL jest językiem standardowym, a implementacje są dobrze zgodne i nie ma zbyt wielu podstępnych pułapek w języku (zachowanie „niezdefiniowane” lub „zdefiniowane w ramach implementacji”) dość łatwo można je przenieść do CCL.

CLISP nie został porzucony; jest nadal używany do zasilania zaplecza licencyjnego, wykorzystując większość tej samej wspólnej bazy kodu.

Opracowałem oryginalny system licencjonowania programu, używając kryptografii krzywej eliptycznej dostarczonej przez bibliotekę IronClad, która jest używana przez serwer licencyjny do podpisywania licencji w celu ich certyfikacji. (Wydaje mi się, że pamiętam, że mogłem użyć programu wiersza poleceń OpenSSL do wygenerowania parametrów EC klucza serwera).

Licencje są reprezentowane jako obiekty Lisp. W hołdzie przenośności Lisp program Windows skompilowany przez Clozure Common Lisp może wygenerować licencję opartą na wyrażeniu S, program CLISP działający na serwerze Debian może wypełnić brakujące pole podpisu cyfrowego w tym obiekcie i odesłać go z powrotem do program Windows, który może sprawdzić poprawność podpisu.

Na serwerze, oprócz usługi licencjonowania opartej na CGI, mam prosty interfejs API wiersza poleceń do zarządzania licencjami. Możesz wyświetlić listę licencji, znaleźć określone i edytować ich atrybuty: na przykład edytować datę wygaśnięcia licencji tymczasowej, aby udzielić użytkownikowi wyjątku. Back-end licencjonowania generuje również e-maile. Nie korzystałem z żadnej biblioteki do obsługi CGI po stronie serwera: po prostu ręcznie zwinięty kod Lisp do obsługi zmiennych środowiskowych Apache i argumentów wiersza poleceń. (Chociaż kod biblioteki jest używany do kodowania adresów URL i generowania HTML.) Żadna baza danych nie jest używana do przechowywania; licencje są catenated do pliku o nazwie licenses.lispi to wszystko.

Kaz
źródło
-1

Jeśli ktoś mi zapłacił, to na pewno.

Prawdopodobnie byliby bardziej zainteresowani płaceniem komuś, kto zna język. Grałem tylko z elisp i planowałem kilka razy.

Edward Strange
źródło