Scelta di un linguaggio di programmazione funzionale [chiuso]

Chiusa. Questa domanda è fuori tema . Attualmente non accetta risposte.

Commenti

  • Qualunque cosa tu scelga, scrivi un lotto di codice che usi per qualcosa al suo interno.
  • Didn ' per pensare a Scala ?
  • @ykombinator: I ' ve sentito parlare, ma non ho cercato oltre. Non ' non so se avrebbe qualcosa da offrire rispetto a quelli che ho elencato, o forse porterebbe una combinazione di opzioni interessanti da ciascuno di essi … Don ' da sapere. Mi sembra un linguaggio di basso profilo, anche se sembra che stia guadagnando popolarità.
  • Non ' non so dove hai sentito dire che il mondo Java è " ai margini " – ' sta attualmente attraversando una grande rinascita, in gran parte grazie a) OpenJDK che diventa limplementazione standard b) nuovi linguaggi JVM come Scala e Clojure ec) Il fatto che i progetti big data / cloud stanno aumentando scegliendo la JVM come piattaforma di destinazione ed) Android. Allinizio del 2012, ' è probabilmente la piattaforma più eccitante su cui trovarsi …..
  • @mikera: daccordo. Questo ha più di un anno, subito dopo che Oracle ha acquisito Sun Microsystems e cerano tutte quelle preoccupazioni e speculazioni sul futuro di Java compromesso da una società più controllata che prende il controllo … La JVM sembra abbastanza sicura al momento, fortunatamente!

Risposta

Dal momento che vuoi un pratico   lingua:

testo alternativo

Si noti che Haskell e Lisp sono usati più degli altri nellindustria, sebbene ci è stato un certo interesse recente per Clojure e F #.

Ma guarda cosa succede quando aggiungiamo Scheme al mix:

alt text

Hmm, non assomiglia molto a una lingua accademica ora, vero?

In realtà, il grafico sopra è probabilmente una bugia; la parola “schema” può apparire in aiuto desiderava annunci in altri contesti oltre ai linguaggi di programmazione. 🙂

Quindi ecco un altro grafico che è probabilmente (un po ) più rappresentativo:

testo alternativo

Se vuoi esplorare un dialetto davvero efficace di Scheme, dai unocchiata a Racket.

Commenti

  • Wow, bel post. Racket è esattamente ciò che ' sto usando … PLT-Scheme era il suo nome quando ho iniziato ad impararlo. Quella linea rossa nellultima grafica mi turba. Non avrei mai pensato che Scheme potesse essere usato così tanto. E Clojure sembra stia decollando. Hmm …
  • @M. Joanis: prendi gli ultimi due grafici con un pizzico di sale; laspetto semplice e la volatilità dellultimo grafico suggeriscono che non ci sono molti punti dati nel grafico, anche se indica che qualcuno pensa che valga la pena pagare per le lingue.
  • @Robert Harvey, cosa cambiato dal secondo al terzo grafico?
  • @Geoffrey: Guarda le didascalie; Ho aggiunto la parola " sviluppatore " ai termini di ricerca.
  • Tieni presente che Haskell e Lisp sono anche omonimi e che i dati di Indeed ' non si generalizzano al resto del mondo. ITJobsWatch elenca 79 lavori Scala, 55 F #, 47 Haskell, 30 Lisp e 7 lavori Clojure.

Risposta

Se vuoi imparare la programmazione funzionale, potresti essere meglio servito per imparare prima Haskell, quindi utilizzare la lingua che desideri. Puoi imparare la programmazione funzionale utilizzando gli altri linguaggi, ma consentono comunque il codice imperativo e orientato agli oggetti. Se scrivi un programma reale in Haskell, imparerai la programmazione funzionale più velocemente perché gli altri paradigmi non saranno disponibili su cui ripiegare.

Dopo aver scritto il tuo programma Haskell, avrai strumenti come monadi e tecniche come la codifica point-free da portare alla lingua di tua scelta. I concetti sembrano mappare particolarmente bene a Scheme.

Commenti

  • Penso che tu ' ho ragione a scegliere prima un linguaggio funzionale puro. Sarei molto interessato a vedere un ordinamento dei linguaggi funzionali per purezza.
  • @M. Joanis: of le lingue elencate nella tua domanda, direi che Haskell è il più puro, seguito da Clojure, F # e Lisp.

Risposta

In realtà, se tu fossi in grado di implementare un sistema ragionevolmente complesso in Scheme, “saresti abbastanza desiderabile nelle aziende in cui probabilmente vorresti lavorare. Allinizio della mia carriera mi sono imbattuto in alcuni studenti che avevano svolto una discreta quantità di lavoro in Scheme, e lunica volta che era uno svantaggio è stato quando non erano in grado di spiegare il loro lavoro o non lo capivano abbastanza bene da implementare i dati di base strutture e algoritmi in un lasso di tempo ragionevole. Lascio sempre che i candidati rispondano a tali domande nella loro lingua preferita; mi sono imbattuto in alcune persone che pensavano di essere le migliori in Scheme che sono riuscite a lottare un po con cose che dovrebbero essere facili, come aggiungere un elemento a un elenco collegato, cosa che mi ha sconcertato.

Ma se tu fossi in grado di “ottenere” Scheme abbastanza bene da scrivere anche unapp Web media, sarebbe un ottimo punto di forza al massimo società di software serie.

Se stavi intervistando in un negozio “blub” e gli sviluppatori pensavano che fossi strano a causa della tua competenza in Scheme o Haskell o F #, probabilmente non vorresti lavorare lì. Nella maggior parte dei casi, gli sviluppatori competenti possono scegliere i lavori, quindi non preoccuparti della “praticità” a meno che le uniche opzioni che puoi immaginare nel tuo futuro siano aziendali. Lavora per essere competente, flessibile e risolvere i problemi.

Luniversità non è questione di praticità. Si tratta di creare un ambiente sicuro per esplorare e apprendere. Questo è, in effetti, utile, anche se finisci per scrivere software ordinario per il resto della tua carriera.

Detto questo, non lo faccio ” Non capisco perché vorresti limitarti a una sola di queste scelte così presto. Potresti facilmente avere unidea di tutte e quattro le lingue in circa 4 settimane, quindi sceglierne una per concentrarti su quella che si adatta meglio ai tuoi capricci attuali. Quindi torna a unaltra delle tue opzioni e prova a implementare qualcosa di simile. Passa a qualcosa di più complesso e considera di nuovo le tue opzioni. La sperimentazione è buona. A meno che tu non stia cercando di guadagnarti da vivere il mese prossimo, non è necessario diventare ancora uno specialista.

Ne ho scritti alcuni in Scheme, F #, Emacs Lisp e Common Lisp, e ho letto almeno un po di Haskell, almeno occasionalmente negli ultimi anni. Non posso dire di essere un esperto in nessuno di loro, ma ogni escursione in quei linguaggi mi ha avvantaggiato in tutti gli altri linguaggi in cui lavoro professionalmente (C #, Java, Ruby e occasionalmente Boo, Perl e Python). La curiosità ti costruirà una carriera più duratura e appagante di qualsiasi altra cosa.

Commenti

  • " Curiosità ti costruirà una carriera più duratura e appagante di qualsiasi altra cosa. " Questa affermazione è molto stimolante. Hai ' hai ragione. ' sono troppo frettoloso. Sento sempre che ci vorrà troppo tempo per imparare … Se potessi tornare indietro di 12 anni, quando ho iniziato, ' saprei non sprecare tutto il mio tempo su VB e C ++. Mi sento come se questi anni fossero stati davvero sprecati. Non ero ' abbastanza curioso. Volevo scrivere del codice. Usare le lingue che conoscevo era sufficiente. A quel tempo pensavo di conoscerne un bel po , ma ' così orribilmente non era affatto il caso.

Risposta

Mi sono tuffato in Haskell per un po , ma la conclusione a cui sono arrivato è stato che era un po troppo accademico. È stato molto difficile fare qualcosa di pratico. In un linguaggio puramente funzionale, cose come IO non si adattano del tutto al modello, quindi devi avere a che fare con le monadi. Ho deciso che avrei dovuto dedicare una quantità enorme di tempo per essere appena competente, quindi sono andato avanti .

Ho fatto Scheme al college. Potrebbe sembrare banale, ma tutti i genitori sono davvero fonte di distrazione / fastidio. Difficile tornare a questo dopo aver usato linguaggi come Python.

Recentemente ho ho esplorato F #. È funzionale, ma può anche essere imperativo e orientato agli oggetti quando lo desideri. Questo, oltre alla possibilità di utilizzare qualsiasi libreria .NET, rende possibile combinare facilmente le tue parti funzionali pure con cose più pratiche come GUI, IO e networking. Puoi ottenere una versione autonoma di F #.

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

Commenti

  • Il fatto che F # e Clojure non siano puramente funzionali gioca un ruolo importante a loro favore. Forse F # potrebbe essere il mio punto di ingresso nel .Netta famiglia un giorno …
  • @MJoanis, hai dichiarato il costo come punto contro F #, ma come sottolinea Erik, puoi ottenerlo completamente gratuito.
  • Se ho letto bene i termini, sostanzialmente lo ottieni gratuitamente a condizione di non usarlo (o acquistare licenze). Ma capisco che può ancora essere una cosa molto buona da imparare nel caso in cui finisco in unazienda che utilizza Visual Studio.' proverò probabilmente una volta ' funzionante con un linguaggio di programmazione funzionale più libero.
  • @M. Joanis: No, F # è anche open source e puoi provare a eseguire Mono su altre piattaforme.
  • Forse i tempi sono cambiati dal 2010, ma come qualcuno che ha iniziato a imparare haskell negli ultimi mesi, io don ' Non pensare che fare IO in haskell sia affatto difficile. Per le cose di base devi solo imparare un po di nuova sintassi. Ottenere la vera comprensione dei fondamentali richiede al massimo alcune settimane, ma non ' vedo cosa sia il fuzz delle monadi. Non ' penso che fossero più difficili da imparare rispetto a classi, istanze, membri statici e tutto il jazz legato allo stato in OOP.

Risposta

Ho valutato tutti i principali linguaggi funzionali uno o due anni fa, dal punto di vista di volere un linguaggio di programmazione funzionale pratico e generico.

Alla fine ho scelto Clojure , che in seguito si è rivelato unottima scelta.

In linea di massima i motivi principali sono stati:

  • Ecosistema di biblioteche – affinché una lingua sia utile, devi accedere a buone biblioteche. Essere sulla JVM significa avere un facile accesso alla più grande libreria open source e allecosistema di strumenti, quindi scegliere un linguaggio JVM è stato un gioco da ragazzi da una prospettiva pragmatica. Scala ha ottenuto ottimi risultati anche qui.

  • Macro-metaprogrammazione – Questo aspetto di Lisp mi ha sempre affascinato, soprattutto perché avevo previsto di fare un bel po di generazione di codice. “Ho molto apprezzato gli argomenti contenuti nel” saggio breve “di Paul Graham Beating The Averages “. I vari Lisp hanno tutti ottenuto ottimi risultati qui.

  • Le prestazioni erano “buone abbastanza “- Clojure è sempre compilato e ottiene i vantaggi dellottimizzatore JVM JIT e delleccellente GC. Come sempre, luso di un linguaggio funzionale comporta un certo sovraccarico, ma con Clojure era chiaro che ciascuno di essi può avvicinarsi alla velocità di Java con un po di sforzo (Clojure supporta le primitive Java e la digitazione statica opzionale per quelle situazioni in cui ne hai bisogno). La mia stima è che Clojure è 2-5 volte più lento di quello che potresti ottenere con il codice Java o C ++ ottimizzato, il che è coerente con quello che vedi nei benchmark difettosi e nel tempo mi aspetto che tale divario si riduca ulteriormente. Inoltre, è abbastanza facile scrivere codice particolarmente sensibile alle prestazioni in puro Java e chiamarlo da Clojure.

  • Concorrenza – Clojure ha un approccio abbastanza unico e potente alla concorrenza, in particolare per la concorrenza altamente multi-core. È “un po difficile da spiegare, ma questo video è eccellente per dare un assaggio dei principi. Penso che Clojure attualmente abbia la migliore risposta alla difficile domanda “come dovresti gestire lo stato condiviso, concorrente e mutevole in un linguaggio di programmazione funzionale?”.

  • Design del linguaggio – Clojure è IMO un design del linguaggio molto ben congegnato. Esempi sono i letterali vettoriali [] e map {} oltre alle normali parentesi Lisp, luso di strutture di dati persistenti immutabili, il supporto della pigrizia in tutto il linguaggio tramite lastrazione della sequenza e la fornitura al programmatore di una varietà di caratteristiche ortogonali per risolvere diversi problemi . Scopri larte dellastrazione e semplice reso facile .

  • Community – sempre soggettiva, ma mi è piaciuto quello che ho visto nella comunità Clojure. Latteggiamento è stato molto utile, costruttivo e pragmatico. Cè una forte enfasi sul “portare a termine le cose”, che probabilmente riflette il fatto che molte persone di Clojure (incluso lo stesso Rich Hickey) provengono da un background di costruzione di sistemi aziendali complessi. Il fatto che anche la comunità Clojure abbia forti legami con la comunità Java è stato importante per convincermi che Clojure non correrebbe il rischio di rimanere bloccato in una “nicchia”.

Se dovessi citare un paio di piccoli svantaggi di Clojure, questi sarebbero:

  • Digitazione dinamica – spesso questo è un vantaggio in termini di produttività, ma in media penso che lo scambierei con un controllo del tipo e inferenza più forti. Per lo più questo viene mitigato dallavere una buona suite di test automatizzata, ma se ti piacciono i tuoi tipi convalidati staticamente dal compilatore, Haskell o Scala potrebbero essere più la tua tazza di tè.

  • Avanguardia – Clojure si sta sviluppando molto velocemente e non cè “sa molte innovazioni in corso: il rovescio della medaglia è che cè molta sperimentazione, alcune librerie e strumenti sono ancora immaturi e ci sono occasionali cambiamenti tra le versioni principali di Clojure che devi tenere docchio.

Nel complesso, però, non credo che tu possa sbagliare con Clojure se vuoi un linguaggio funzionale moderno eccellente e pragmatico!

Commenti

  • Grazie! Ottimo post! In questi giorni stavo solo considerando di usarlo per un progetto interno allazienda che sarà fortemente basato su alberi e ricorsività. Inoltre abbiamo un bel po di codice Java qui intorno che possiamo riutilizzare con Clojure.

Answer

It sembra che tu abbia fatto i compiti, quindi probabilmente lo sai già, ma Scheme è un dialetto del Lisp proprio come lo è Common Lisp. Se ti piacciono molte cose di Scheme, ma non ti piace la sua natura accademica, prova Common Lisp. Secondo l indice TIOBE , è la tredicesima lingua più popolare rispetto a Scheme alla posizione 26.

Poche delle lingue che hai menzionato compaiono nelle descrizioni dei lavori che ho visto di recente, anche se questo potrebbe essere solo il mio piccolo campione. Personalmente imparerò Haskell, anche se non mi aspetto di usare quella lingua direttamente nel mio lavoro. I concetti di programmazione funzionale sono più preziosi per me per la progettazione di programmi futuri rispetto alla commerciabilità diretta del linguaggio stesso.

Commenti

  • Grazie per TIOBE link, questo è un riferimento interessante. Immagino tu stia scegliendo Haskell per la sua purezza in termini di programmazione funzionale?
  • @ M.Joanis: Più o meno, anche se ' sto pensando di riprendere in seguito Anche Lisp. Vedi programmers.stackexchange.com/questions/18838/…
  • La risposta scelta fa molto buon senso. La purezza sembra essere la strada da percorrere fino a quando non ho veramente afferrato lintera faccenda del paradigma funzionale.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *