Domanda

Ho letto un sacco di discussioni circa linguaggi di programmazione funzionale ultimamente (quasi l'anno scorso, in effetti). Mi piacerebbe davvero a sceglierne uno e imparare a fondo.

Ultimo [ovviamente] semestre, sono state introdotte per Scheme. Lo amavo. Mi è piaciuta la semplicità della sintassi, il homoiconicity principio , le macro ( igienico e non igienica), il n-arità delle procedure, ecc.

Il problema con Scheme è si tratta di un linguaggio accademico. Io non credo che sia davvero usato in ambienti di produzione. Non credo neanche che sia particolarmente bene avere sul nostro curriculum. Così, ho cercato in giro per le alternative. Ci sono molti di loro e in qualche modo tutti sembrano avere un livello simile di popolarità.

Alcuni pensieri su alcuni altri linguaggi funzionali ho considerato ancora:

  • Clojure: Sembra grande, perché può accedere al mondo Java, è orientata verso la scalabilità e la concorrenza, ma non è il mondo Java su un bordo in questo momento? So già Java abbastanza bene, ma sarebbe saggio per aggiungere ancora più energia a seconda della JVM?
  • Haskell:. Si presenta come un linguaggio molto apprezzato, ma da quello che ho letto, è anche più di un linguaggio accademico
  • Lisp: E 'stato intorno da sempre. Sembra avere la maggior parte di ciò che mi piace da Scheme. Ha una grande comunità. Per quello che ho [credo] so, probabilmente è il linguaggio di programmazione funzionale, più ampiamente usato nell'industria (?).
  • F #: non ha davvero prendere in considerazione. Io non sono un grande fan di MS roba. Non ho i soldi per pagare per i loro software (avrei potuto liberarli dai alleanze universitari, ma io sono più propenso ad andare con soluzioni community-driven). Anche se ... credo che sarebbe la migliore scelta di carriera-oriented.

Questa sera, sto sporgendosi verso Lisp. Una settimana fa, era Haskell. Prima che fosse Clojure. L'anno scorso, stavo facendo qualche schema per divertimento, non spingendolo per la ragione che sai. Ora vorrei fare sul serio (imparare uno, di fare progetti reali con esso, circa forse alla fine professionalmente lavorando con esso). Il mio problema è che avrei avuto bisogno di imparare tutti a fondo prima di poter scegliere uno.

È stato utile?

Soluzione

Dal momento che si desidera un pratica lingua:

alt text

Si noti che Haskell e Lisp sono usati più di altri nel settore, anche se c'è stato un certo interesse recente Clojure e F #.

Ma guarda cosa succede quando aggiungiamo Scheme al mix:

alt text

Hmm, non sembra così molto simile a un linguaggio accademico ora, vero?

In realtà, il grafico di cui sopra è probabilmente una menzogna; lo "schema" parola può apparire in aiuto voluto annunci in altri contesti oltre linguaggi di programmazione. :)

Così qui è un altro grafico che è probabilmente (un po ') più rappresentativo:

alt text

Se si desidera esplorare un dialetto davvero kick-ass dello Schema, dare un'occhiata alla Racket.

Altri suggerimenti

Se volete imparare la programmazione funzionale, potrebbe essere meglio servita per imparare Haskell, quindi utilizzare qualsiasi lingua che si desidera. Si può imparare la programmazione funzionale utilizzando le altre lingue, ma ancora consentire il codice imperativo e orientato agli oggetti. Se si scrive un vero e proprio programma in Haskell, imparerete programmazione funzionale più veloce perché gli altri paradigmi non saranno disponibili a ripiegare su.

Dopo aver scritto il programma di Haskell, si avrà strumenti come monadi e tecniche come-point gratuito codifica per portare alla lingua di vostra scelta. I concetti sembrano mappare particolarmente bene a Scheme.

In realtà, se tu fossi in grado di implementare un sistema ragionevolmente complesso nello Schema, si sarebbe piuttosto auspicabile in aziende in cui si sarebbe probabilmente desidera lavorare. All'inizio della mia carriera ho incontrato alcuni studenti che avevano fatto una buona dose di lavoro in Scheme, e l'unica volta che era uno svantaggio stato quando sono stati in grado di spiegare il loro lavoro o in realtà non capisco abbastanza bene per implementare i dati di base strutture e algoritmi entro un periodo di tempo ragionevole. Ho sempre lasciato i candidati rispondere a queste domande nella loro lingua preferita; Ho incontrato alcune persone che pensavano che erano meglio a Scheme che è riuscito a lottare un po 'con le cose che dovrebbero essere facili, come l'aggiunta di un elemento a una lista collegata, che mi ha disorientato.

Ma se tu fossi in grado di "ottenere" Schema abbastanza bene di scrivere anche un app web media, che sarebbe un buon punto di vendita piuttosto alla maggior parte delle aziende di software gravi.

Se stavi intervistando in un negozio "blub" e gli sviluppatori solo pensato che fossi strano perché della vostra competenza in Scheme o Haskell o F #, probabilmente non vogliono lavorare lì. Nella maggior parte dei casi, gli sviluppatori competenti ottengono la loro scelta di concerti, in modo da non sudare "praticità" a meno che le uniche opzioni che si possa immaginare nel futuro sono aziendale. I lavori per essere competenti, flessibili, e abbattendo i problemi.

College non si tratta di praticità. Si tratta di creare un ambiente sicuro per esplorare e imparare. Questo è, infatti, utile, anche se si finisce per scrivere software ordinaria per il resto della tua carriera.

Detto questo, non vedo perché ci si vuole limitare a solo una di quelle scelte così presto. Si potrebbe facilmente ottenere un senso di tutte e quattro le lingue in circa 4 settimane, poi sceglierne uno di concentrarsi su che ingrana migliori con i vostri capricci attuali. Poi tornare a un altro dei tuoi opzioni e cercare di implementare qualcosa di simile. Passare a qualcosa di più complesso, e considerare nuovamente le opzioni. La sperimentazione è buona. A meno che non si sta cercando di fare un prossimo mese di vita, non è necessario per diventare uno specialista ancora.

ho scritto un po 'nello Schema, F #, Emacs Lisp e Common Lisp, e leggere almeno un po' di Haskell, almeno di tanto in tanto nel corso degli ultimi anni. Non posso dire che sono un esperto in nessuno di essi, ma ogni escursione in quelle lingue mi ha beneficiato in tutte le altre lingue che io lavoro in modo professionale (C #, Java, Ruby, e, occasionalmente, Boo, Perl e Python). Curiosità costruirà un più duraturo, appagante carriera di ogni altra cosa.

Mi tuffai in Haskell per un po ', ma la conclusione sono venuto a era che era un po' troppo accademico. E 'stato molto difficile fare qualcosa di pratico. In un linguaggio funzionale puro, le cose come IO proprio non abbastanza inserirsi nel modello, in modo da avere a che fare con monadi. Ho deciso che avrei dovuto mettere in una enorme quantità di tempo per essere appena competente, così sono passato.

ho fatto Scheme in un college. Potrebbe sembrare banale, ma tutte le parentesi sono davvero distrarre / fastidioso. Difficile tornare a che dopo utilizzando linguaggi come Python.

Recentemente ho esplorato F #. E 'funzionale, ma può anche essere un imperativo e orientato agli oggetti quando si desidera. Questo, oltre ad essere in grado di utilizzare tutte le librerie .NET, permette di mescolare facilmente le parti funzionali pure con le cose più pratiche come la GUI, IO e networking. È possibile ottenere una versione autonoma di F #.

http://www.microsoft.com /downloads/en/details.aspx?FamilyID=effc5bc4-c3df-4172-ad1c-bc62935861c5&displaylang=en

Ho valutato tutte le principali lingue funzionali di un anno o due indietro, dal punto di vista di volere un pratico, general purpose linguaggio di programmazione funzionale.

Ho finito per raccogliere Clojure , che si è poi rivelata una scelta eccellente.

In linea di massima le ragioni principali sono stati:

  • Libreria ecosistema - per un linguaggio per essere utile, è necessario accedere a buone biblioteche. Essere sui mezzi JVM che si ha facile accesso al più grande libreria open source e l'ecosistema strumento, in modo da andare per un linguaggio JVM è stato un gioco da ragazzi dal punto di vista pragmatico. Scala anche segnato fortemente qui.

  • Macro-metaprogrammazione - Questo aspetto della Lisp sempre affascinato per me, soprattutto perché ho anticipato a fare un po 'di generazione del codice. Ho molto apprezzato le argomentazioni fatte nel breve saggio di Paul Graham " Battere le medie ". I vari Lisps tutti segnati fortemente qui.

  • Performance è stato "abbastanza buono" - Clojure è sempre compilato e ottiene i benefici del ottimizzatore JVM JIT ed eccellente GC. Come sempre, v'è un certo overhead in utilizzando un linguaggio funzionale, ma con Clojure era chiaro che si può ogni vicino alla velocità di Java con un po 'di sforzo (Clojure supporta primitive Java e tipizzazione statica facoltativa per quelle situazioni in cui avete bisogno). La mia stima è che Clojure è ballpark 2-5x più lento di quello che si potrebbe ottenere con ottimizzato Java o codice C ++, che è coerente con quello che si vede nel flawed , e col tempo mi aspetto che gap da restringere ulteriormente. Inoltre, è abbastanza facile basta scrivere il codice particolarmente sensibili alle prestazioni in puro Java e lo chiamano da Clojure.

  • concorrenza - Clojure ha un approccio abbastanza unico e potente per la concorrenza, in particolare per la concorrenza altamente multi-core. E 'un po' difficile da spiegare, ma questo video è eccellente per dare un assaggio della i principi. Penso che Clojure attualmente ha la migliore risposta alla domanda difficile "come si dovrebbe gestire condiviso, lo stato concomitante e mutevole in un linguaggio di programmazione funzionale?".

  • Design Lingua - Clojure è IMO un disegno linguaggio molto ben congegnato. Esempi stanno avendo vettore [] e cartina {} letterali in aggiunta alle normali parentesi Lisp, l'uso di strutture dati persistenti immutabili, sostenendo pigrizia tutta la lingua tramite l'astrazione sequenza, e fornendo il programmatore con una varietà di caratteristiche ortogonali per risolvere diversi problemi . Vedere l'arte di astrazione e semplice semplice .

  • Comunità - sempre soggettivo, ma mi è piaciuto quello che ho visto nella comunità Clojure. L'atteggiamento è stato molto utile, costruttivo e pragmatico. C'è un accento forte "fare le cose", forse in conseguenza del fatto che un sacco di Clojure persone (tra cui lo stesso Rich Hickey) provengono da uno sfondo di costruzione sistemi aziendali complessi. Il fatto che la comunità Clojure ha forti legami nella comunità Java così è stato importante nel convincermi che Clojure non correre il rischio di rimanere bloccati in una "nicchia".

Se dovessi nominare un paio di piccoli aspetti negativi di Clojure, questi sarebbero:

  • Dinamico tipizzazione - spesso questo è un vantaggio in termini di produttività, ma in media penso che avrei commercio per questo tipo di controllo e l'inferenza più forte. Per lo più questo viene mitigato da avere un buon automatizzato suite di test, ma seti piace i tipi di staticamente validati dal compilatore allora Haskell o Scala può essere più vostra tazza di tè.

  • Tagliente - Clojure sta sviluppando molto velocemente e c'è un sacco di innovazione in corso - il rovescio della medaglia è che c'è un sacco di sperimentazione, alcune librerie e strumenti sono ancora immaturi , e ci sono cambiamenti rottura occasionali tra Clojure le versioni importanti che è necessario tenere d'occhio.

Nel complesso, però, non credo che si può andare male con Clojure, se si desidera un linguaggio moderno e funzionale eccellente e pragmatico!

Sembra che tu hai fatto i compiti a casa, quindi probabilmente già lo sanno, ma Scheme è un dialetto del Lisp proprio come Common Lisp è. Se non è come un sacco di cose su Scheme, ma fate come il suo carattere accademico, provare Common Lisp. Secondo il indice TIOBE , è il 13 ° linguaggio più popolare vs Scheme alla posizione 26.

Alcune delle lingue che hai citato appaiono sulle descrizioni del lavoro che ho visto di recente, anche se questo potrebbe essere proprio il mio piccolo campionario. Io personalmente sarò imparando Haskell, anche se non mi aspetto di usare quel linguaggio direttamente nel mio lavoro. I concetti di programmazione funzionale sono più importanti per me per i disegni di programma futuro che la commerciabilità diretta del linguaggio stesso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
scroll top