Utilizzeresti (un dialetto di) LISP per un'applicazione del mondo reale? Dove e perché? [chiuso]


31

LISP (e dialetti come Scheme, Common LISP e Clojure) non hanno guadagnato molto supporto nel settore, anche se sono linguaggi di programmazione abbastanza decenti. (Al momento però sembra che stiano guadagnando una certa trazione).

Ora, questo non è direttamente correlato alla domanda, quale sarebbe un dialetto LISP per un programma di produzione? Che tipo di programma e perché? Sono inclusi anche gli usi del tipo di integrazione in qualche altro codice (ad es. C), ma nota che è ciò che intendi nella tua risposta. Sono preferiti concetti generali ma anche applicazioni specifiche sono okey.


6
Emacs conta come un'applicazione "mondo reale"? gnu.org/software/emacs/emacs-lisp-intro
S.Lott

1
@ S.Lott: Sì. Se usi elisp per creare estensioni per Emacs, va bene e un'applicazione di un dialetto LISP
Anto

GNU Guile è destinato esattamente a questo scopo.

1
Sebbene interessante, non penso che questa domanda sia più adatta a questo sito. Molteplici motivi: 1- troppo ampio, 2- invita un elenco di risposte, 3- nessun modo chiaro per decidere quale sia la risposta "giusta", 4- troppo localizzata nel tempo ("non hanno ottenuto molto supporto nel settore"), 5- invita alla discussione e al dibattito.
Andres F.

Risposte:


18

Utilizzeresti un dialetto LISP per un programma di produzione?

Assolutamente

Che tipo di programma e perché?

Lisp è un linguaggio dinamico generico. Oggi presenta le stesse difficoltà di base di altri linguaggi dinamici di uso generale che non sono pubblicati da Microsoft: thread nativi, integrazione della GUI, funzionamento deterministico del GC e ingombri di memoria ridotti.

I thread nativi sono raggiunti da LispWorks e SBCL, credo. Forse altri? Non ho studiato a fondo.

LispWorks e Franz Common Lisp - prodotti commerciali - si integrano nella GUI con successo. Non avendo i $$ per comprarli, non so quanto funzioni bene. Sospetto che funzionino abbastanza bene ...

Un'operazione GC deterministico può essere fatto (si fa in Java per un certo livello di successo), ma io non so se i sistemi esistenti Lisp (quelli mantenuti) hanno alcun codice per farlo.

L'ingombro di memoria ridotto credo sia ottenuto da alcuni Lisps.

Il mio punto di base è che Common Lisp è tecnicamente pronto per realizzare sistemi di produzione. E lo fa .

La stragrande maggioranza degli sviluppatori viene sconvolta da (scegli una) lingue dinamiche, macro, parentesi, mancanza dell'IDE preferito, brutta esperienza al college, non molti lavori in esso, e quindi non lo usano.

Personalmente salterei a costruire un sistema di produzione a tutti gli effetti in Common Lisp da zero in un ambiente di squadra.

modifica: non ho davvero risposto al motivo per cui Lisp al contrario di altre lingue.

Nella mia esperienza con Lisp - non significativa, ma considerevolmente più di "ciao mondo" - ho trovato la lingua estremamente utilizzabile dopo i primi dolori del "nuovo linguaggio di Argh". La maggior parte della lingua si adatta in modo molto regolare e abbastanza ovvio che non trovo altre lingue in cui operare. Parte di questo è la fusione di espressioni e dichiarazioni. Parte di questo è il tipo di dati dell'elenco principale. Parte di questo è il sistema di tipi. Parte di questo è il sistema macro. Non fraintendetemi, tuttavia, ci sono punti dolenti. Ma non mi prendono a calci in faccia tanto quanto i punti dolenti di altre lingue.

Un esempio semplicistico è la routine di lunghezza dell'elenco di Python. L'approccio Python è chiamare len(mysequence). Ma, se ci pensiamo, una lunghezza è una proprietà di una sequenza. Quindi, mysequence.len()è un'idea più appropriata. Lisp essenzialmente rimuove quella distinzione sintattica. (length thing)è sia la sintassi della chiamata di funzione sia la sintassi del metodo. Certo, alcune persone lo trovano frustrante e vogliono la differenza sintattica. Preferirei avere la regolarità.

edit2: ho convertito la parte della mia tesi di laurea MS che gira sul desktop in Common Lisp ed è stato un piacere lavorare finora.


2
Da quanto ho sentito, LISP viene utilizzato in sistemi di produzione completi, ma di solito solo per determinate elaborazioni logiche che è più facile da codificare in LISP rispetto ad altre lingue. L'intelligenza artificiale dei videogiochi e la pre-elaborazione dei dati statistici erano esempi citati una volta. Una volta ho avuto un manager che aveva un detto "Qualsiasi sistema sufficientemente complesso ha un'implementazione LISP semi-integrata incorporata". Un detto simile era "Qualsiasi sistema sufficientemente gonfio ha un lettore di posta elettronica incorporato".
FrustratedWithFormsDesigner,

4
@Frustrato: Sì, quelli sono l'ennesima legge di Greenspun e la legge di jwz.
Paul Nathan,

2
Molti di questi sono risolti da Clojure, semplicemente in virtù del fatto che sono stati progettati specificamente per essere compatibili e sostituiti con Java. Ma ovviamente, ci sono anche implementazioni di Scheme e CL anche per la JVM (es. Kawa, ABCL).
Jörg W Mittag,

4
Clojure è vagamente fastidioso per me perché è ancora un'altra frammentazione.
Paul Nathan,

la frammentazione non è una cosa negativa. Ciò che è veramente fastidioso in Clojure è la mancanza di coppie punteggiate. Può essere contato come un linguaggio simile al Lisp senza una cosa così fondamentale?
Logica SK

11

Conosco personalmente persone che usano Lisp sotto forma di Clojure in un paio di banche di investimento e startup a Londra. Ho anche scelto Clojure come linguaggio di sviluppo principale per la mia startup, quindi sono disposto a mettere i miei soldi dove è la mia bocca :-)

Ho scoperto che è stata un'esperienza molto illuminante imparare Clojure nell'ultimo anno (dopo molta esperienza con Java e C #). I motivi principali sono:

  • Ha una forte enfasi sulla programmazione funzionale (più della maggior parte degli altri Lisps). L'autore e BDFL Rich Hickey ha spesso citato Haskell come una delle sue ispirazioni per il design del linguaggio, il che significa che ottieni cose come strutture di dati completamente immutabili e sequenze pigre infinite ecc.
  • Metaprogrammazione a macroistruzione : la filosofia del "codice è dato" di Lisp è difficile da capire a meno che tu non l'abbia effettivamente sperimentato, ma è uno dei motivi per cui i Lisps sono così espressivi e produttivi. Fondamentalmente hai il potere di estendere la lingua per abbinare il tuo dominio problematico.
  • Fantastico supporto per la concorrenza multi-core : penso che Clojure sia il miglior linguaggio per la programmazione concorrente in questo momento. Vedi http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey per una presentazione illuminante su questo
  • Lo sviluppo interattivo presso la REPL è un modo eccezionale e produttivo di creare applicazioni. Ti dà una vera sensazione di potere per modificare dinamicamente il codice dell'applicazione in esecuzione e ispezionare programmaticamente le strutture di dati in tempo reale .....

Sembra anche essere una scelta pratica per un uso reale della produzione per i seguenti motivi:

  • L'esecuzione su JVM con un'interoperabilità Java molto semplice ti dà accesso a tutte le librerie e strumenti nell'ecosistema Java
  • Stai utilizzando JVM, una piattaforma collaudata per applicazioni aziendali. Clojure beneficia gratuitamente di tutte le belle funzionalità di JVM come l'eccellente compilation GC e JIT.
  • È un linguaggio dinamico di default, che lo rende molto conveniente per lo sviluppo e la prototipazione rapida con quasi nessuna piastra di caldaia. Tuttavia, è possibile aggiungere suggerimenti di tipo statico per ottenere prestazioni piuttosto buone dove è necessario.
  • È una comunità pragmatica e utile - il tipo di cultura in cui le persone fanno le cose e l'attenzione è focalizzata su soluzioni ben progettate che risolvono problemi reali
  • Esiste il supporto degli strumenti in più IDE . Personalmente uso Eclipse con plug-in antiorario (perché ho bisogno dell'integrazione Java) ma ci sono molte altre opzioni.

8

Userei LISP se fosse la scelta migliore per il lavoro. Solo alcune cose che influenzano la "scelta migliore":

  • supporto del fornitore. L'implementazione LISP che utilizziamo - se qualcosa va storto e interferisce con il nostro sviluppo e quindi le nostre scadenze, il fornitore lavorerà per una soluzione con noi?
  • supporto per la biblioteca. Quali librerie sono disponibili? Manipolazione di stringhe, matematica, accesso ai dati, servlet web (o equivalenti LISP), toolkit per finestre, ecc ... Non voglio scrivere queste cose da zero.
  • strumento di supporto - Quanto è buono l'IDE? Solido / stabile o traballante? Buon supporto per l'editor? Debugger integrato? Se devo eseguire lo sviluppo della GUI in LISP, esiste un IDE visivo o devo codificare manualmente il layout della GUI ( odio farlo).
  • buy-in per sviluppatori (non voglio davvero passare troppo tempo a insegnare ai miei compagni una nuova lingua)

Tutti questi fattori devono essere considerati quando si decide se LISP è appropriato per un progetto. Nel mondo aziendale, non l'ho mai provato.


Concordo con te sul fatto che la produttività è spesso influenzata più dagli strumenti e dalle librerie disponibili che dalla lingua stessa (purché la lingua offra alcune funzionalità di base).
Giorgio,

6

Assolutamente. Paul Graham lo spiega bene .

... Nel 1995, sapevamo qualcosa che non credo capissero dai nostri concorrenti, e pochi lo capiscono anche ora: quando scrivi software che deve essere eseguito solo sui tuoi server, puoi usare qualsiasi lingua tu voglia. ..

Abbiamo scelto Lisp. Per prima cosa, era ovvio che un rapido sviluppo sarebbe stato importante in questo mercato. Stavamo tutti partendo da zero, quindi un'azienda in grado di realizzare nuove funzionalità prima che i suoi concorrenti avrebbero un grande vantaggio. Sapevamo che Lisp era un linguaggio davvero valido per la scrittura rapida di software e le applicazioni basate su server amplificano l'effetto di un rapido sviluppo, poiché è possibile rilasciare software non appena finito.

Se altre aziende non volessero usare Lisp, tanto meglio. Potrebbe darci un vantaggio tecnologico e avevamo bisogno di tutto l'aiuto che potevamo ottenere ...

Quindi potresti dire che usare Lisp è stato un esperimento. La nostra ipotesi era che se avessimo scritto il nostro software in Lisp, saremmo stati in grado di ottenere funzionalità più velocemente dei nostri concorrenti e anche di fare cose nel nostro software che non potevano fare. E poiché Lisp era di così alto livello, non avremmo avuto bisogno di un grande team di sviluppo, quindi i nostri costi sarebbero stati inferiori. Se così fosse, potremmo offrire un prodotto migliore per meno soldi e comunque realizzare un profitto. Avremmo finito per ottenere tutti gli utenti, i nostri concorrenti non ne avrebbero avuto nessuno e alla fine sarebbero andati fuori mercato. Questo era quello che speravamo potesse accadere, comunque.

Quali sono stati i risultati di questo esperimento? Un po 'sorprendentemente, ha funzionato. Alla fine avevamo molti concorrenti, nell'ordine di venti o trenta, ma nessuno dei loro software poteva competere con il nostro. Avevamo un generatore di negozi online wysiwyg che funzionava sul server e tuttavia sembrava un'applicazione desktop. I nostri concorrenti avevano script cgi. E siamo sempre stati molto più avanti di loro nelle funzionalità. A volte, nella disperazione, i concorrenti provavano a introdurre funzionalità che non avevamo. Ma con Lisp il nostro ciclo di sviluppo è stato così veloce che a volte potevamo duplicare una nuova funzionalità entro un giorno o due da un concorrente che la annunciava in un comunicato stampa. Prima che i giornalisti che si occupano del comunicato stampa iniziassero a chiamarci, avremmo avuto anche la nuova funzionalità.

Ai nostri concorrenti deve essere sembrato che avessimo una specie di arma segreta, che stavamo decodificando il loro traffico Enigma o qualcosa del genere. In effetti avevamo un'arma segreta, ma era più semplice di quanto pensassero. Nessuno ci ha fatto trapelare notizie sulle loro caratteristiche. Siamo stati in grado di sviluppare software più velocemente di quanto chiunque pensasse possibile ...


8
"... Paul Graham originariamente scriveva reddit, in lisp, sul retro di un tovagliolo mentre aspettava un caffè. Era così potente che doveva essere riscritto in pitone solo in modo che i normali computer potessero capirlo. Perché fu scritto in lisp, non fu quasi nessuno sforzo di riscrivere l'intera cosa, e la riscrittura fu completata tra due cicli di processori. Paul Graham stesso era completamente scritto in lisp, da una versione precedente di se stesso, anch'essa scritta in lisp, da un versione precedente di lisp. È lisp, paul graham, lisp, paul graham, fino in fondo. "
John Cartwright,

5

Dove: Emacs è un'applicazione del mondo reale che utilizza LISP.

Perché: è stato un ottimo modo per esprimere la mappatura tra battitura e azione. È interpretato ed è veloce ed è ben definito ed è semplice.


Estenderei questa risposta dicendo perché era buono per esprimere la mappatura tra ketstrokes e azioni
Anto

@Anto: Nella mia esperienza, Lisp rende davvero facile creare astrazioni potenti che possono rappresentare in modo trasparente qualsiasi azione che puoi fare in un editor in un modo molto coerente - dopo aver usato Emacs per un po ', puoi indovinare come quasi tutto viene fatto . Ciò rende possibile mappare qualsiasi cosa che si possa fare nell'editor su un tratto chiave, con ogni rilegatura molto simile all'altra che rende più facile la scrittura e la manutenzione.
Tikhon Jelvis,

4

Sia Macsyma che Autocad sono basati su un dialetto di Lisp. Li classificherei come "mondo reale" e Emacs.


Mathematica non si basa su Lisp.
Rainer Joswig

2
AutoCAD offre AutoLISP come API ma è scritto in codice gestito C ++ e .NET.
Bloke CAD

1
@RainerJoswig Macsyma era probabilmente inteso al posto di Mathematica.
user40989

2

Assolutamente lo prenderei in considerazione. Soprattutto per i nuovi lavori di sviluppo che avevano un potenziale di calcolo parallelo. Questo sembra essere un punto debole per questi tipi di linguaggi funzionali.


2

Lisp è una delle migliori scelte per l'implementazione di compilatori. E, poiché l'uso di DSL e eDSL sta aumentando ora, Lisp sta diventando più prezioso. Sto usando un dialetto Lisp per tutte le mie attività relative al DSL.


0

In questo momento sto cercando di usare newLisp come sostituto di Php sul mio sito web personale tramite il framework Dragonfly . Se riesco a capire come far funzionare bene Apache, lo userò (il web server integrato funziona molto bene, ma preferirei molto lavorare su Apache). E una volta che succede, userò newLisp ovunque dovrei usare Php, perché flat non mi piace Php e mi piace newLisp.

Al momento, Clojure non è una buona scelta per le app Android, ma so che ci stanno lavorando. Quindi, se viene capito, sarebbe un altro posto in cui userei un dialetto di Lisp per le applicazioni del mondo reale ... ma ancora una volta, questo è perché non mi piace Java.

Ma onestamente, preferisco Ruby a Lisp ... ma questa è principalmente una questione di comunità e documentazione.


0

Ho implementato un'applicazione commerciale proprietaria in Common Lisp chiamata Tankan che gira su Microsoft Windows come eseguibile nativo.

È un programma per allenarti a memorizzare i caratteri kanji giapponesi.

Il programma funziona come un server HTTP in background. L'esecuzione di questo server e la navigazione verso le sue pagine è coordinata da una minuscola applicazione icona dell'area di notifica del sistema (aka "Tray") che ho sviluppato usando Visual C ++.

La minuscola applicazione icona nella barra delle applicazioni avvia, monitora e arresta il server basato su Lisp e comunica con esso usando le pipe Win32 legate al suo input e output standard. Tramite una pipe, il server Lisp informa l'applicazione dell'icona della barra dell'URL preciso con il numero di porta corretto e quell'applicazione dell'icona della barra delle applicazioni può avviare il browser tramite l'API Shell per navigare quell'URL. L'utente fa semplicemente doppio clic sull'icona per visualizzare l'interfaccia utente.

Il programma Lisp mantiene nella sua memoria uno stato di sessione abbastanza complesso che contiene la cronologia di input dell'utente e varie relazioni tra vari oggetti. La notazione circolare degli oggetti di Lisp (abilitata dalla *print-circle*variabile) e il modo in cui funziona attraverso i print-objectmetodi CLOS personalizzati è di grande aiuto nell'implementazione della persistenza: gli utenti possono salvare lo stato su disco e riprendere da dove si erano interrotti. Tutto viene salvato, incluso lo stato dell'interfaccia utente. C'è molta sottostruttura condivisa nel grafico degli oggetti, oltre ai cicli. Inoltre, è necessario un sacco di cruft statici che non devono essere mantenuti, come i contenuti degli oggetti di entrata nel dizionario. Con i metodi degli oggetti di stampa personalizzati ANSI Common Lisp, è possibile creare rappresentazioni stampate condensate per oggetti che sono comunque leggibili a macchina,

Quasi nessun JavaScript è utilizzato nell'interfaccia utente web. Anche i controlli per nascondere e mostrare parti dell'interfaccia utente vengono eseguiti inviando il modulo e ridistribuendo l'HTML. Ogni dettaglio dello stato dell'interfaccia utente è quindi nel server e persistente quando l'utente salva. La rigenerazione dell'HTML è molto veloce. È fatto da una gigantesca espressione di backquote di Lisp che alimenta una macro generatrice di HTML. Il codice compilato da Clozure Common Lisp (CCL) fa sì che ciò avvenga così velocemente che non si sa quasi che quando si fa clic su un pulsante [+] sull'interfaccia utente per aprire qualcosa, si invia una richiesta a un server che rigenera la intera pagina dannata e non semplicemente eseguendo JavaScript locale per modificare la visibilità di un elemento del documento locale.

Il programma è stato originariamente sviluppato con CLISP. Grazie al fatto che ANSI CL è un linguaggio standard, con implementazioni che si conformano bene e non troppe insidie ​​del linguaggio (comportamento "non definito" o "definito dall'implementazione"), è stato facilmente trasferito su CCL.

CLISP non è stato abbandonato; viene ancora utilizzato per alimentare il back-end delle licenze, utilizzando gran parte della stessa base di codice comune.

Ho sviluppato un sistema di licenze originale per il programma, utilizzando la crittografia a curva ellittica fornita dalla libreria IronClad, che viene utilizzata dal server delle licenze per firmare le licenze per certificarle. (Mi sembra di ricordare che avrei potuto usare il programma da riga di comando di OpenSSL per generare i parametri EC per la chiave del server.)

Le licenze sono rappresentate come oggetti Lisp. È un omaggio alla portabilità di Lisp che un programma Windows compilato da Clozure Common Lisp può generare una licenza basata sull'espressione S, un programma CLISP in esecuzione su un server Debian può compilare il campo mancante della firma digitale in quell'oggetto e inviarlo a il programma Windows che può validare la firma.

Sul server, oltre al servizio di licenze basato su CGI, ho una semplice API della riga di comando per la gestione delle licenze. È possibile elencare le licenze, trovarne di specifiche e modificarne gli attributi: ad esempio modificando la data di scadenza di una licenza temporanea per concedere a un utente un'eccezione. Il back-end delle licenze genera anche e-mail. Non ho usato nessuna libreria per la gestione CGI sul lato server: solo il codice Lisp arrotolato a mano per gestire le variabili di ambiente Apache e gli argomenti della riga di comando. (Sebbene il codice della libreria venga utilizzato per gestire la codifica URL e la generazione HTML.) Nessun database viene utilizzato per l'archiviazione; le licenze sono catenate in un file chiamato licenses.lispe basta .


-1

Se qualcuno mi pagasse, certo.

Probabilmente sarebbero più interessati a pagare qualcuno che conosce la lingua. Ho giocato solo con elisp e schema alcune volte.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.