it-swarm.it

Perché è utile LISP?

LISP ovviamente è un vantaggio per AI roba, ma non appare per me che LISP è più veloce di Java, C # o persino C. Non sono un maestro di LISP, ma trovo incredibilmente difficile capire il vantaggio che si otterrebbe dalla scrittura di software aziendale in LISP.

Tuttavia è considerato come un linguaggio da hacker.

Perché Paul Graham difende Lisp? Perché Software ITA ha scelto LISP rispetto ad altre lingue di alto livello? Che valore ha su queste lingue?

64
Geek

Ci sono alcuni motivi per cui sto lavorando per diventare competente con Common LISP.

  1. Codice omoiconico. Ciò consente un codice strutturato di auto-modifica.
  2. Macro consapevoli della sintassi. Consentono la riscrittura del codice del boilerplate.
  3. Pragmatismo. LISP comune è progettato per eseguire attività da professionisti che lavorano. La maggior parte dei linguaggi funzionali non lo sono, di regola.
  4. Flessibilità. Può fare molte cose diverse, tutte a velocità ragionevoli.
  5. Wartiness. Il mondo reale è disordinato. La codifica pragmatica finisce per dover usare o inventare costrutti disordinati. Il LISP comune ha sufficiente verrucosità da poter svolgere attività.

Probabilmente le uniche ragioni reali per scegliere contro Common LISP è che le librerie standard sono datate.

Esco da un arto e dirò che, nel caso generale, la sintassi non dovrebbe essere un problema per un professionista del software.

78
Paul Nathan

Mi piace LISP per il suo

  • modo unificato, semplice ed elegante di rappresentare sia il codice che i dati.
  • punto di vista unico, che mi dà gli 80 punti bonus QI cruciali sulla risoluzione di problemi difficili (con la punta del cappello ad Alan Kay)
  • ambiente di sviluppo estremamente agile, interattivo e conversazionale
  • potere senza precedenti di creare e manipolare le astrazioni

La programmazione sta combattendo la complessità. Le astrazioni sono l'unico strumento efficace per combattere la complessità sempre crescente (con le nostre dimensioni del cranio molto limitate e costanti). Gestire le astrazioni con LISP è come avere un genio con n + 1 desideri.

24
Maglob

Credo che la risposta LISP corretta sia più gnomica. Qualcosa del tipo: "Se devi chiedere, non sei pronto."

Quindi, se qualcuno pone ulteriori domande, la risposta corretta è "sì" se è una/o domanda o "Non sei pronto."

21
glenatron

Penso che il vantaggio LISP nel campo intelligenza artificiale (AI) che tutti menzionino sia in qualche modo un incidente storico ... LISP ha iniziato per/in AI, ma è un linguaggio generico.

Credo che la velocità di esecuzione non sia l'unico aspetto importante di una lingua (l'ho fatto una volta, però). Tuttavia, uno degli aspetti che mi piace di LISP è che per me combina Python e C. in uno. Posso iniziare a programmare senza dichiarazioni e prototipo immediatamente e molto rapidamente (il runtime e REPL sono molto importanti per questo.) Dopo aver eseguito qualcosa, aggiungo dichiarazioni di tipo e "ottimizzo" il mio codice, a poco a poco. mi chiedo di premere un tasto in SLIME e guardare il linguaggio macchina generato per la funzione che mi interessa. In Python non ci sono dichiarazioni di tipo, quindi io non può ottenere più velocità, ma in C, fare qualcosa in fretta è molto più doloroso. LISP è molto utile in questo caso.

Detto questo, mi piace LISP principalmente a causa di macro . Quando finalmente capisci cosa possono ottenere le macro, penso che puoi sopportare facilmente le parentesi. Inoltre, editor come Emacs gestiscono le parentesi in modo da non doverlo fare. Ammetto, tuttavia, che all'inizio non ho trovato le parentesi così brutte e so che alcune persone non le sopportano. Ma poiché lo scopo delle macro è generare codice al momento della compilazione, il codice in LISP utilizza una struttura di dati standard e le parentesi sono semplicemente una rappresentazione del codice come elenchi, che è necessario per rendere le macro semplici da scrivere.

Non conosco nessun'altra lingua in cui puoi scrivere piccole lingue per descrivere meglio il tuo problema con la facilità di LISP. Questo è il vantaggio di cui parla Paul Graham in Beating the Averages. È estrema modularità e concisione. In Java Devo scrivere un sacco di testo non elaborato per esprimere una singola idea. In LISP potrei scrivere alcune macro che generano quel codice automaticamente, e successivamente usarle. Comunque, devi capire alcuni esempi di questo e poi giudicare da soli. Quando l'ho "visto", sono stato spazzato via, e penso ancora che LISP sia la lingua più grande solo per questo motivo. Cerco sempre macro nei linguaggi tradizionali per vedere se corrispondono la potenza delle macro LISP, ma fino ad oggi non ne ho trovata nessuna. Avanti è un secondo vicino.

Concluderò con un paio di critiche, in relazione al software aziendale:

  1. Il software aziendale ha bisogno di librerie e buone, e LISP non è bravo in questo. Di solito non ne ho bisogno, ma quando lo faccio, devo scegliere da una piccola selezione di software incompleto che alcune persone usano. Dovrei contribuire a risolvere questo problema, immagino ...

  2. Il software aziendale è in genere creato da grandi gruppi di persone e penso che la comunicazione possa essere impedita con le macro, poiché sostanzialmente cambiano la lingua. Molti programmatori sono più a loro agio nel rilevare determinati schemi nel codice, anche se il testo del programma è più lungo e ripetitivo. Suppongo che in ITA abbiano alcune regole per quanto riguarda le macro o abbiano un'enorme libreria di macro che semplifica la collaborazione (o, più semplicemente, tutti i programmatori sono esperti LISP).

18
Pau Fernández

Non mi piace LISP.

(Mi piacciono molti dei concetti che utilizza, il modo in cui rende disponibili potenti tecniche nativamente e così via.

Ma non sono mai stato convinto di usarlo effettivamente ((anche se diverse persone hanno provato ) perché i vantaggi della lingua possono essere raggiunto con altri linguaggi di programmazione (alcuni direttamente, altri indirettamente), quindi non ci sono abbastanza benefici da farmi passare il tempo ad apprenderlo e a sopportare l'orribile sintassi.)))

Ma sì, per motivi che piacciono ad alcune persone, controlla queste domande Stack Overflow:

Probabilmente ce ne sono alcune nelle domande correlate anche per quelle.

13
Peter Boughton

Interpreterò "LISP" come " Common LISP "; Non ho dubbi che altre risposte diranno " Schema ". (Suggerimento: LISP è una famiglia di lingue.)

Cosa significa "più veloce"? In termini di tempo impiegato per eseguire un benchmark, no, non è più veloce di C ( ma può essere ).

"Veloce" in termini di quanto tempo impiega Joe Random Hacker per scrivere un programma funzionante o correggere un bug in un sistema software di grandi dimensioni? Quasi certamente.

Per quanto riguarda questo hacker, lo uso perché voglio scrivere codice, non boilerplate. Voglio scrivere qualcosa una volta e non ripetermi continuamente. E voglio interagire con il programma mentre lo scrivo.

9
Frank Shearar

Mi piace LISP perché è un mezzo eccellente per esprimere i miei pensieri. Il predicato della mia lingua preferita è "Se potessi scegliere qualcosa per esprimere idee, quale sarebbe?". Attualmente è LISP * ( Schema per essere specifico), al punto che mi ritrovo a scrivere delle note di programmazione in esso. Come IRL , note su carta e penna. Anche quando sto pensando ai programmi che devo implementare in PHP o Ruby o Python.

Questo non è un trucco che ho insegnato a me stesso, o qualcosa che faccio per la credibilità dei nerd (nessuno riesce comunque a vedere l'interno del mio notebook); è solo che LISP è molto più naturale per me in cui pensare rispetto a qualsiasi altra alternativa, e qualsiasi linguaggio che risuoni con te che sia profondamente tu Tesoro.

* Proprio come una nota a piè di pagina, Haskell sta colmando il divario abbastanza rapidamente mentre ne apprendo di più.

7
Inaimathi

Paul Graham risponde a questa domanda in Cosa ha reso LISP diverso.

Tieni presente che l'ha usato per la sua startup a metà degli anni '90, quindi Python e Ruby non erano davvero maturi a quel punto (o forse non erano nemmeno nati).

LISP ha fondamentalmente tutti i vantaggi dei linguaggi dinamici, e penso che per la maggior parte delle applicazioni web di oggi, Python e Ruby sono piuttosto fantastici e hanno il vantaggio di quadri e documentazione e comunità vibranti.

La caratteristica killer è probabilmente che l'intero programma è fatto di espressioni. Ciò significa che è possibile passare da blocchi di codice a funzioni (o macro ...), perché un blocco di codice non è altro che un'espressione.

Python non ha esattamente questa funzione; dovresti definire le funzioni e passarle in giro. Ruby sembra avere blocchi, forse è un po 'limitato rispetto a ciò che LISP può fare (non ne sono sicuro).

6
hasen

Ho avuto una reazione istintiva a Schema in passato, ma ora sono pronto a dare una possibilità a LISP ( Clojure , in realtà).

Vedete, nel corso degli anni ho imparato alcune lingue come Java, C #, C++, Python e le cose non sono più difficili.

Clojure ha molte promesse, sembra essere molto pulito e può risolvere molti problemi del mondo reale. Un caso forte per un linguaggio pulito come Clojure è l'avvento dei computer multi-core.

Yay LISP!

EDIT: ITA Software è stato fondato da MIT grads e Scheme/LISP era l'unica lingua che molti dei MIT grads hanno imparato. Ad essere onesti, uno può scambiare algoritmi LISP a caldo su un sistema di produzione in esecuzione, il che è un grande vantaggio.

6
Job

La cosa che mi piace di LISP è che trascende i paradigmi. Alcune persone diranno che LISP è funzionale, altri diranno che è dichiarativo e altri diranno che è multiparadigma. Penso che a tutti questi manchi il punto. Quando usi LISP, il paradigma non è più un vincolo.

Vuoi oggetti? Puoi averli. Vuoi una programmazione funzionale? Puoi averlo. Vuoi Prolog - programmazione logica di stile? Scrivi alcune macro. Desideri una programmazione dichiarativa in stile SQL? Fallo. Vuoi usare un paradigma che non è stato ancora inventato? Sono sicuro che si possa fare in LISP.

A parte Forth - come le lingue, devo ancora vedere un'altra lingua offrire questo livello di flessibilità.

6
Jason Baker

Il problema è il potere. Potenza = Lavoro (funzionalità del programma)/Tempo

"Non eravamo pronti a conquistare i programmatori LISP; stavamo inseguendo i programmatori C++. Siamo riusciti a trascinarne molti a metà strada verso LISP."

- Guy Steele, Java coautore

Traccia una sorta di curva tra C++ e Java. Continua, e ad un certo punto lungo la linea troverai LISP.

6
compman

Sto imparando LISP ( newLisp ) per un paio di ragioni.

Motivo numero uno: LISP mi fa pensare diversamente, il che mi rende un codificatore migliore Ruby.

Sembra molto imbarazzante fare le cose in determinati modi in LISP, ad esempio l'iterazione annidata per passare attraverso più elenchi. Quindi mi costringe a usare altre cose, come map. La mia lingua preferita, Ruby, ha lo stesso metodo cartografico, ma non lo uso sempre, perché non mi è familiare: ho imparato a fare le cose usando una tecnica scadente e quando la lingua supporta quella tecnica, continuo a usarla.

Motivo numero due: LISP è pratico e ha buone librerie moderne.

C'è un framework Web molto bello e leggero per newLisp chiamato libellula . Questo mi permette di usare il codice newLisp invece di PHP per alcune attività. Non mi piace molto PHP, e newLisp sembra più divertente per questo compito specifico rispetto a Ruby.

Motivo numero tre: LISP è sintatticamente e concettualmente coerente.

Per me, questa è la grande differenza tra Ruby e Python, coerenza.

5
philosodad

"Più veloce" non è una cosa semplice da misurare, dipende davvero da quale aspetto stai confrontando. A seconda dell'attività e dell'implementazione LISP, la velocità può avvicinarsi a C. Guarda Great Benchmarking Shoot-Out per immergerti per i dettagli. L'implementazione SBCL di LISP è alla pari di Java 6 Server ed è significativamente più veloce di Ruby o Python.

Ma la pura velocità non è il motivo principale per scegliere un linguaggio di programmazione - se lo fosse, tutti programmeremmo in linguaggio assembly ancora, giusto? Per me, la gioia quotidiana di LISP è che il codice viene compilato, ma non devo smontare l'applicazione, ricompilare tutto e quindi iniziare a correre da zero. Invece, posso cambiare una singola funzione e tale modifica avrà effetto ovunque, e vedrò immediatamente l'effetto nella mia applicazione. Inoltre, quell'approccio molto veloce di "scrittura, test, scrittura di più, test di più" rende molto più semplice testare immediatamente durante la scrittura del codice (e quindi è possibile trasformare quelle sonde interattive in unit test in seguito).

Immagina di scrivere e-mail dove dopo ogni riga, devi premere un pulsante per compilare l'output della tua e-mail sullo schermo prima di continuare a pensare. Questo è ciò che scrivere in Java o un'altra lingua simile è per me. A volte c'è un motivo per farlo, e mi piace Java bene, ma LISP è solo più reattivo ed è più facile svolgere il lavoro.

5
Michael H.

Puoi dire "Brand Loyalty"?

Ho iniziato a Fortran. Lo amavo.

Sono passato a LISP. All'inizio l'ho odiato. Poi ho imparato ad amarlo e odio Fortran.

Più tardi Pascal, C, C++, vari assemblatori, C #. (In realtà non amo C #.)

Immagino di essere volubile?

4
Mike Dunlavey

Quando LISP è stato creato, sono partiti dalla matematica, non dall'informatica (che in realtà non esisteva ancora). E il team LISP ha ottenuto alcune cose DAVVERO giuste. LISP ebbe la raccolta dei rifiuti nel 1960 o giù di lì! Hanno fatto davvero un ottimo lavoro.

Penso che la canzone The Eternal Flame lo copra.

4
Zachary K

Un grande pareggio è la comunità. LISP ha attirato l'attenzione degli sviluppatori più ambiziosi e brillanti da quando il linguaggio è stato inventato. Ovunque i ricercatori stiano tentando di risolvere problemi che non sono mai stati risolti, è probabile che tu possa trovare LISP, come nella ricerca intelligenza artificiale (AI), visione artificiale, pianificazione, rappresentazione della conoscenza e complessa ottimizzazione euristica. Il linguaggio si presta a risolvere i problemi sia dal basso verso l'alto che dall'alto verso il basso allo stesso tempo, il che sembra aiutare ad affrontare le sfide più pelose.

La sintassi estensibile tramite macro significa che raramente è necessario estendere la definizione della lingua. Gran parte di ciò che richiederebbe un'estensione della lingua in una lingua più limitata è solo una macro di distanza con LISP. Quindi i programmatori LISP sono liberi di utilizzare i concetti linguistici appena inventati senza un nuovo standard linguistico e senza necessariamente una vera penalità di velocità. A livello base, risme del codice del boilerplate sono rese superflue da piccole estensioni. Intere nuove idee nel flusso di controllo, come l'unificazione in stile Prolog, vengono implementate in modo efficiente e compatto come estensioni.

Il sistema OOP, CLOS , è in una classe a sé stante in termini di flessibilità. È molto difficile andare torna al rudimentale C++/Java/C # OOP dopo un assaggio. GoF 5 modelli di design diventano superflui in quanto possono essere espressi in modo semplice e diretto.

Il linguaggio non ha un singolo proprietario aziendale e nessuna singola implementazione definitiva, sebbene abbia uno standard ANSI con molte implementazioni conformi. Nuove importanti implementazioni arrivano ogni decennio e quelle vecchie sono ancora abbastanza attive. Gli esperti possono pianificare di utilizzare le loro conoscenze specializzate per molto tempo a venire. Ciò provoca un certo attrito anarchico e frammentazione della comunità, ma significa anche che il tappeto non può essere estratto e il linguaggio non può diventare moribondo per motivi politici aziendali o di progetto. Ci sono sempre più implementazioni commerciali e open source su cui si sta lavorando. Quelli più focalizzati sulle prestazioni fanno regolarmente riferimento a un fattore 2 rispetto alle implementazioni linguistiche imperative molto più veloci e fortemente finanziate.

Il tallone d'Achille della prima commercializzazione di LISP era l'impronta della memoria per adattarsi sia alle caratteristiche di sicurezza del tipo della lingua sia agli ambienti avanzati di sviluppo software che includevano, con incredibili funzionalità come la documentazione online completa, compresa la grafica. Un 64 MB Symbolics LISP Machine non era fattibile dal punto di vista dei costi rispetto a una workstation Sun da 8 MB. Oggi, RAM sono crollati e c'è un enorme interesse per le lingue LISP, specialmente considerando che le lingue Java, C #, PHP oggi sono avanzate solo minimamente quelli di 30 anni fa.

Ci sono linguaggi moderni ora in competizione con LISP per la condivisione mentale con sviluppatori intelligenti: Python, Lua , Erlang , Haskell e OCaml . Ma nessuno offre lo stesso mix di maturità, adattabilità, molteplici implementazioni conformi agli standard e velocità.

2
bcaulf

In realtà non faccio LISP. Ma il posto in cui lavoro fa elementi finiti con milioni di righe principalmente di Fortran. Il ragazzo qui che più rispetto per le cose informatiche (codici meccanica dei fluidi computazionali ) pensa che la combinazione ideale sia LISP all'esterno (principalmente perché eviti problemi disordinati con la gestione della memoria) e Fortran per il livello basso algoritmi (Fortran è il migliore per sfruttare le capacità vettoriali di SSE / AVX , e riteniamo improbabile che questo vantaggio si chiuda).

1
Omega Centauri