Quali sono le lingue importanti da imparare per comprendere approcci e concetti diversi? [chiuso]


172

Quando tutto ciò che hai è un paio di tronchesi e una bottiglia di vodka, tutto sembra la serratura della porta della darsena di Wolf Blitzer. (Sostituiscilo con un martello e un chiodo se non leggi xkcd)

Attualmente programma Clojure, Python, Java e PHP, quindi ho familiarità con la sintassi C e LISP e con gli spazi bianchi. Conosco sistemi imperativi, funzionali, immutabili, OOP e di tipo paio e altre cose. Ora voglio di più!

Quali sono le lingue che adottano un approccio diverso e sarebbero utili per la scelta dello strumento pratico o per la comprensione teorica?

Non ho voglia di imparare un altro linguaggio funzionale (Haskell) o un altro linguaggio OOP imperativo (Ruby), né voglio praticare linguaggi divertenti poco pratici come Brainfuck.

Una cosa molto interessante che mi sono ritrovato sono linguaggi monoiconici basati su stack come Factor.

Solo quando sento di comprendere la maggior parte dei concetti e di avere risposte a tutte le mie domande, voglio iniziare a pensare al mio linguaggio giocattolo per contenere tutte le mie preferenze personali.


3
Farei +1 per il solo riferimento xkcd, ma anche la domanda è interessante.

63
Sembri un programmatore di successo, il resto è incrementale. Non cercare di essere un coglione, ma ... come va la tua vita in termini di finanza, relazioni, salute, divertimento, hobby? Forse ora è il momento di perseguire alcune di queste cose. Non credo che tu debba conoscere più di una dozzina di lingue contemporaneamente. Se vieni pagato per usarne uno, imparalo. Se vuoi scrivere un libro su di esso - impara. A parte questo, hai una buona base di programmazione. Perché imparare qualcosa (come J - la mia opinione subj :)) che non userai seriamente (leggi make $) da nessuna parte? Non essere un hacker più cool in un cimitero.
Hamish Grubijan,

6
Sì, sono un programmatore di successo secondo i miei standard. Al momento non faccio molti soldi, ma ehi, ho 19 anni. Investo tempo in tutti questi punti e altro, ma trovo sia hobby che divertimento nella programmazione. Voglio anche dire che c'è una differenza tra comprendere una lingua e padroneggiarla. Padroneggiare Python e Clojure è abbastanza per me. Voglio capire le altre opzioni che ci sono, perché migliorerà il mio codice, mi aiuterà a capire il mio computer e mi aiuterà a definire il mio linguaggio di programmazione.
Pepijn,

5
Hai visto Programmers.SE ? Questo rientra nel tipo di domanda che è meglio porre qui.

Risposte:


287

Le questioni di praticità sono altamente soggettive, quindi dirò semplicemente che l'apprendimento di paradigmi linguistici diversi servirà solo a renderti un programmatore migliore. Cosa c'è di più pratico di quello?

Funzionale, Haskell - So che hai detto che non volevi, ma dovresti davvero riconsiderare. Hai ottenuto un'esposizione funzionale con Clojure e persino Python, ma non l'hai sperimentata al massimo senza Haskell. Se sei davvero contro Haskell, allora i buoni compromessi sono ML o OCaml.

Dichiarativo, Datalog - Molte persone raccomanderebbero Prolog in questo slot, ma penso che Datalog sia un esempio più chiaro di un linguaggio dichiarativo.

Array, J - Ho appena scoperto J, ma trovo che sia un linguaggio straordinario. Trasformerà la tua mente in un pretzel. Ringrazierai J per questo.

Stack, Factor / Forth - Il fattore è molto potente e ho intenzione di scavare al più presto. Forth è il nonno delle lingue Stack e, come bonus aggiuntivo, è semplice implementare te stesso. C'è qualcosa da dire sull'apprendimento attraverso l'implementazione.

Flusso di dati, Oz - Penso che l'influenza di Oz sia in crescita e continuerà a crescere solo in futuro.

Basato su prototipi, JavaScript / Io / Self - Il sé è il nonno e ha una grande influenza su ogni linguaggio basato sui prototipi. Questo non è lo stesso di OOP di classe e non dovrebbe essere trattato come tale. Molte persone imparano un linguaggio prototipo e creano un sistema di classe ad hoc, ma se il tuo obiettivo è espandere la tua mente, penso che sia un errore. Usa la lingua al massimo delle sue capacità. Leggi Organizzare programmi senza lezioni per idee.

Sistema esperto, CLIP - Lo consiglio sempre. Se conosci Prolog, avrai probabilmente il sopravvento per essere veloce, ma è una lingua molto diversa.

Frink - Frink è un linguaggio generico, ma è famoso per il suo sistema di conversioni di unità. Trovo che questa lingua sia molto stimolante nella sua spinta incessante per essere la migliore in ciò che fa. Inoltre ... è davvero divertente!

Tipi funzionali + opzionali, Qi - Dici di avere esperienza con alcuni sistemi di tipi, ma hai esperienza con sistemi di tipo "skinnable *? Nessuno ha ... ma dovrebbero. Qi è come Lisp in molti modi, ma è tipo di sistema ti lascerà a bocca aperta.

Attori + Tolleranza agli errori, Erlang - Il modello di processo di Erlang ottiene molto rumore, ma i suoi meccanismi di tolleranza agli errori e scambio di codice a caldo stanno cambiando il gioco. Non imparerai molto su FP che non impareresti con Clojure, ma le sue funzionalità FT ti faranno domandare perché più lingue non riescano a farlo bene.

Godere!


8
+1 - un'ottima risposta.
duffymo,

2
Grazie per avermi indicato così tante lingue da imparare.

2
Aggiungerei Erlang per la programmazione basata sugli attori e Fortress per la programmazione parallela.
Nickik,

2
+1 per l'hot swap di Erlang e il riconoscimento della tolleranza agli errori
Mic

14
Nessuna assemblea? È utile avere una comprensione di come funzionano i processori per apprendere quale tipo di codice preferiscono.
Nick T

33

Che dire di Prolog (per l'unificazione / backtracking ecc.), Smalltalk (per "tutto è un messaggio"), Forth (reverse polish, threaded interpreter etc), Scheme (continuazioni)?

Non una lingua, ma l' arte del protocollo Metaobject è roba da capogiro


Correggimi se sbaglio, ma penso che Python sortof faccia già delle continuazioni. E da quello che ho letto, preferirei imparare Factor e Objective-C piuttosto che Forth e Smalltalk, ma potrei tagliare gli angoli lì.
Pepijn,

1
@pepijn, python non ha continuazioni di prima classe (anche se sto lavorando a un hack bytecode per falsificarlo)
aaronasterling

1
Objective-C attinge da Smalltalk, ma penso che il vero take away di ST sia il dinamismo dell'ambiente stesso.
John Cromartie,

33

Io secondo Haskell. Non pensare "Conosco un Lisp, quindi conosco la programmazione funzionale". Hai mai sentito parlare di classi di tipo? Tipi di dati algebrici? Monadi? I linguaggi funzionali "moderni" (più o meno - almeno non di 50 anni;)), in particolare Haskell, hanno esplorato una pletora di potenti nuovi concetti utili. Le classi di tipi aggiungono polimorfismo ad hoc, ma l'inferenza di tipo (ancora un'altra cosa che le lingue che già conosci non hanno) funziona come un fascino. I tipi di dati algebrici sono semplicemente fantastici, specialmente per la modellazione di strutture di dati simili ad alberi, ma funzionano bene anche per enumerazioni o record semplici. E monadi ... beh, diciamo solo che le persone li usano per fare eccezioni, I / O, parser, comprensione delle liste e molto altro - in modi puramente funzionali!

Inoltre, l'intero argomento è abbastanza approfondito da tenerne uno occupato per anni;)


"Inoltre, l'intero argomento è abbastanza approfondito da tenerne uno occupato per anni;)" - Mi chiedo, perché sarebbe una buona cosa? Dopo tutto, le nostre vite sono finite.
Vegai,

1
@vegai: Perché sarebbe una brutta cosa? Ci sono modi peggiori per passare una vita oltre all'apprendimento. E nessuno ha detto che devi studiare per anni solo per usare correttamente la lingua - solo che l'argomento non è esaurito dopo poco tempo. (Nota anche lo smiley - quella parte non è del tutto seria.)

32

Attualmente programma Clojure, Python, Java e PHP [...] Quali sono i linguaggi che adottano un approccio diverso e sarebbero utili sia per la scelta degli strumenti pratici che per la comprensione teorica?

C

C'è un sacco di codice C in giro --- è sicuramente pratico. Se impari anche il C ++, c'è un sacco di altro codice in giro (e il salto è breve quando conosci C e Java).

Ti dà anche (o ti obbliga ad avere) una grande comprensione di alcune questioni teoriche; ad esempio, ogni programma in esecuzione vive in un array di byte da 4 GB, in un certo senso. I puntatori in C sono in realtà solo indici di questo array --- sono solo un diverso tipo di numero intero. Non è diverso in Java, Python, PHP, tranne nascosto sotto uno strato di superficie.

Inoltre, puoi scrivere codice orientato agli oggetti in C, devi solo essere un po 'manuale su vtables e simili. La Portable Puzzle Collection di Simon Tatham è un ottimo esempio di codice C orientato agli oggetti abbastanza accessibile; è anche abbastanza ben progettato e merita una lettura per un programmatore C principiante / intermedio. Questo è ciò che accade anche in Haskell --- le classi di tipo sono in un certo senso "solo un'altra vtable".

Un'altra cosa grandiosa di C: impegnarsi in domande e risposte con programmatori C esperti ti darà molte risposte che spiegano C in termini di costrutti di livello inferiore, che costruiscono la tua base di conoscenza più vicina al ferro.

Potrei mancare il punto dell'OP --- penso di esserlo, a giudicare dalle altre risposte --- ma penso che potrebbe essere una risposta utile ad altre persone che hanno una domanda simile e leggono questa discussione.


1
Ciò richiede più voti. C è la lingua numero uno quando è necessario o si vuole arrivare al bare metal e comprendere il funzionamento della macchina - o linguaggi di programmazione di livello superiore - da zero. Inoltre, è anche un compilatore C molto universale per (quasi) ogni architettura CPU mai concepita.
Dietr,

27

Dal sito di Peter Norvig:

"Impara almeno una mezza dozzina di linguaggi di programmazione. Includi un linguaggio che supporti le astrazioni di classe (come Java o C ++), uno che supporti l'astrazione funzionale (come Lisp o ML), uno che supporti l'astrazione sintattica (come Lisp), uno che supporti dichiarativo specifiche (come i modelli Prolog o C ++), uno che supporta le coroutine (come Icona o Schema) e uno che supporta il parallelismo (come Sisal). "

http://norvig.com/21-days.html



10

Nei tipi come teoremi / sistemi di tipo avanzati: Coq (penso che anche Agda rientri in questa categoria).

Coq è un assistente di prova incorporato in un linguaggio di programmazione funzionale.

Puoi scrivere prove matematiche e Coq aiuta a costruire una soluzione. È possibile scrivere funzioni e dimostrarne le proprietà.

Ha tipi dipendenti, che da solo mi hanno fatto impazzire. Un semplice esempio:

concatenate: forall (A:Set)(n m:nat), (array A m)->(array A n)->(array A (n+m))

è la firma di una funzione che concatena due matrici di dimensioni n e m di elementi di A e restituisce una matrice di dimensioni (n + m). Non verrà compilato se la funzione non lo restituisce!

Si basa sul calcolo delle costruzioni induttive e ha una solida teoria alle spalle. Non sono abbastanza intelligente da capire tutto, ma penso che valga la pena dare un'occhiata, specialmente se tendi alla teoria dei tipi.

EDIT: Devo menzionare: scrivi una funzione in Coq e poi puoi PROVARE che è corretta per qualsiasi input, è fantastico!


Io secondo coq. Quando impari la maggior parte delle lingue puoi ancora usare le tue vecchie tecniche, ma coq ti costringe a scrivere programmi totali che funzionano sempre.
Bruno Martinez,

Ho cercato di imparare Coq la scorsa estate ma ho rinunciato perché ho trovato difficile trovare una buona documentazione sull'apprendimento e sull'uso . Eventuali suggerimenti?

Ho imparato da un corso presso la mia università e poi ho letto "Coq'Art: Il calcolo delle costruzioni induttive" Non è sufficiente per dominarlo davvero, ma è sufficiente per apprezzarlo.
Bruno Martinez,

6

Una delle lingue che mi interessa per avere un punto molto diverso di vista (tra cui un nuovo vocabolario per definire gli elementi di linguaggio e una sintassi diff radicale) è J . Haskell sarebbe la scelta ovvia per me, sebbene sia un linguaggio funzionale, perché il suo sistema di tipi e altre caratteristiche uniche ti aprono la mente e ti fanno ripensare le tue conoscenze precedenti nella programmazione (funzionale).


5

Proprio come fogus te lo ha suggerito nella sua lista, ti consiglio anche di guardare il linguaggio OzML / Mozart Molti paradigmi, rivolti principalmente alla concorrenza / programmazione multi-agente.

Per quanto riguarda la concorrenza e il calcolo distribuito, l'equivalente del calcolo Lambda (che è alla base della programmazione funzionale) è chiamato Pi Calculus.

Ho solo iniziato a esaminare alcune implementazioni del calcolo Pi. Ma hanno già ampliato le mie concezioni dell'informatica.


5

La programmazione del flusso di dati, nota anche come programmazione basata sul flusso, è un buon passo avanti sulla strada. Alcune parole d'ordine: elaborazione parallela, prototipazione rapida, programmazione visiva (non male come i suoni prima).

Gli articoli di Wikipedia sono buoni:

Nell'informatica, la programmazione basata sul flusso (FBP) è un paradigma di programmazione che definisce le applicazioni come reti di processi "scatola nera", che scambiano dati attraverso connessioni predefinite attraverso il passaggio di messaggi, dove le connessioni sono specificate esternamente ai processi. Questi processi di scatola nera possono essere ricollegati all'infinito per formare diverse applicazioni senza dover essere cambiati internamente. L'FBP è quindi naturalmente orientato ai componenti.

Leggi il libro di JPM: http://jpaulmorrison.com/fbp/

(Abbiamo scritto una semplice implementazione in C ++ per scopi di automazione domestica e ne siamo molto soddisfatti. La documentazione è in costruzione.)


+1, credo che il flusso di dati e la programmazione basata sul flusso (possibilmente anche la programmazione funzionale-reattiva) diventeranno una parte importante del nostro futuro multicore.

5

Hai imparato molte lingue. Ora è il momento di concentrarsi su una lingua e padroneggiarla.


3

forse potresti voler provare LabView per la sua programmazione visiva, anche se è per scopi ingegneristici.

tuttavia, sembri piuttosto interessato a tutto ciò che è là fuori, da cui il suggerimento

inoltre, potresti provare l'appinventor Android per creare oggetti visivamente


LabView ha una 'sintassi' divertente ma è un vero dolore fare clic e trascinare tutto il codice. Non lo consiglierei a un programmatore.
Ishtar,

Questo è ciò che viene fornito con il Lego NXT, giusto? Totalmente non ha funzionato per me. Grazie per il suggerimento però.
Pepijn,

viene da National Instruments. LabVIEW è un ambiente di sviluppo grafico che rende gli scienziati e gli ingegneri più produttivi
Belun,

2

Bruce A. Tate, prendendo una pagina da The Pragmatic Programmer ha scritto un libro su questo: Sette lingue in sette settimane: una guida pragmatica all'apprendimento dei linguaggi di programmazione

Nel libro copre Clojure, Haskell, Io, Prolog, Scala, Erlang e Ruby.


2
Tieni presente che il libro è pieno zeppo di riferimenti a film che apparentemente sono diventati parte della cultura pop americana. Se non hai visto i film, ti chiederai di cosa parla Tate. Se hai visto i film, potresti essere ancora scoraggiato dalla costante antropomorfizzazione dei linguaggi di programmazione o semplicemente non mi piacciono i personaggi in questione (non mi piace Mary Poppins; per coincidenza, anche a me non piace Ruby, quindi l'analogia potrebbe essere su qualcosa).
Alan Plum

2

Mercurio : http://www.mercury.csse.unimelb.edu.au/

È un Prolog tipizzato, con tipi e modalità di unicità (cioè specificando che il append(X,Y,Z)significato del predicato X aggiunto a Y è Z produce una Z dato una X e Y, ma può produrre più X / Y per una data Z). Inoltre, nessun taglio o altri predicati extra-logici.

Se vuoi, è per Prolog come Haskell è per Lisp.


1
  1. La programmazione non copre l'attività dei programmatori.
  2. Le cose nuove sono sempre interessanti, ma ci sono alcune cose vecchie molto interessanti.

Il primo sistema di database era dBaseIII per me, stavo spendendo circa un mese per scrivere piccoli esempi (dBase / FoxPro / Clipper è un db basato su tabella con indici). Poi, nel mio primo posto di lavoro, ho incontrato MUMPS e ho avuto mal di testa. Ero giovane e intelligente, ma ci sono volute 2 settimane per capire il modello di database MUMPS. C'è stato un momento, come nei fumetti: dopo 2 settimane è stato acceso un pulsante e la lampadina si è appena illuminata nella mia mente. MUMPS è naturale, di basso livello e molto, molto veloce. (È un btree sbilanciato, non formalizzato senza tipi.) Le tendenze di oggi ci mostrano la via del ritorno: NoSQL, valore-chiave db, multidimensionale db - quindi restano solo alcuni passaggi e raggiungiamo Mumps.

Ecco una presentazione dei vantaggi di MUMPS: http://www.slideshare.net/george.james/mumps-the-internet-scale-database-presentation

Un breve documento sul db gerarchico: http://www.cs.pitt.edu/~chang/156/14hier.html

Un'introduzione ai globi MUMPS (in MUMPS, variabili locali, abbreviato: i locali sono le variabili di memoria e le variabili globali, abbreviato: i globali sono le "variabili db", l'impostazione di una variabile globale va immediatamente sul disco): http: // gradvs1.mgateway.com/download/extreme1.pdf (PDF)


1

Di 'che vuoi scrivere una poesia d'amore ...

Invece di usare un martello solo perché ce n'è già uno in mano, impara gli strumenti adeguati per il compito: impara a parlare francese.

Una volta raggiunto il livello di madrelingua, sei pronto per iniziare la tua poesia.


4
Certo, sarà una poesia della spazzatura, perché per scrivere poesie devi parlare ben al di sopra del normale livello nativo. E la tua ragazza dovrà imparare il francese per leggerlo. A meno che non sia già francese, nel qual caso probabilmente lo troverà imbarazzante.
John Lawrence Aspden,

Deliziosa ironia, John, mi piace (sono francese, a proposito)
Vinzz,

1

Mentre apprendere nuove lingue a livello accademico è un hobby interessante, IMHO non puoi davvero imparare ad usarne uno finché non provi ad applicarlo a un problema del mondo reale. Quindi, piuttosto che cercare una nuova lingua da imparare, al posto suo vorrei prima cercare nuove cose da costruire, e solo allora avrei cercato la lingua giusta da usare per quel progetto specifico. Prima scegli il problema, quindi lo strumento, non viceversa.


1

Per chiunque non sia in giro dalla metà degli anni '80, suggerirei di imparare BASIC a 8 bit. È di livello molto basso, molto primitivo ed è un esercizio interessante da programmare attorno ai suoi buchi.

Sulla stessa linea, sceglierei una calcolatrice della serie HP-41C (o emulatore, anche se nulla batte l'hardware reale). È difficile avvolgerci il cervello, ma ne vale la pena. Una TI-57 farà, ma sarà un'esperienza completamente diversa. Se riesci a risolvere le equazioni di secondo grado su una TI-55, verrai considerato un maestro (non aveva condizionali e rami tranne un RST, che ha riportato il programma al passaggio 0).

E infine, sceglierei FORTH (è stato menzionato prima). Ha un bel Lisp-ish "costruisci la tua lingua", ma è molto più semplice. Ti insegnerà perché Rails è interessante e quando le DSL hanno un senso e avrai un rallentamento su ciò che la tua calcolatrice non RPN sta pensando mentre digiti.


1

PostScript. È un linguaggio piuttosto interessante in quanto basato su stack, ed è abbastanza pratico quando vuoi mettere le cose su carta e vuoi o farlo o risolvere i problemi perché non viene fatto.

Erlang. Il parallelismo intrinseco gli conferisce una sensazione piuttosto insolita e puoi di nuovo imparare cose utili da quello. Non sono così sicuro della praticità, ma può essere utile per alcune attività di prototipazione rapida e sistemi altamente ridondanti.

Prova a programmare GPU - CUDA o OpenCL. Sono solo estensioni C / C ++, ma il modello mentale dell'architettura è di nuovo completamente diverso dall'approccio classico, e diventa sicuramente pratico una volta che hai bisogno di fare un vero scricchiolio di numeri.


1

Erlang, Forth e alcuni lavori integrati con linguaggio assembly. Veramente; acquista un kit Arduino o qualcosa di simile e crea un bip polifonico in assemblea. Imparerai davvero qualcosa.


1

C'è anche anic :

https://code.google.com/p/anic/

Dal suo sito:

Più veloce di C, più sicuro di Java, più semplice di * sh

anic è il compilatore di implementazione di riferimento per il linguaggio di programmazione del flusso di dati per scopi generici sperimentale, ad alte prestazioni, implicitamente parallelo, senza deadlock.

Non sembra più essere in fase di sviluppo attivo, ma sembra avere alcuni concetti interessanti (e questo, dopo tutto, è quello che sembra essere dopo).


1

Pur non soddisfacendo il tuo requisito di "diverso" - scommetto che Fantom è una lingua che un programmatore professionista dovrebbe guardare. Per loro stessa ammissione, gli autori di fantom lo definiscono un linguaggio noioso. Rileva semplicemente i casi d'uso più comuni di Java e C #, con una sintassi di chiusura presa in prestito da ruby ​​e simili linguaggi più recenti.

Eppure riesce ad avere il proprio compilatore bootstrap, fornire una piattaforma che ha un calo dell'installazione senza dipendenze esterne, ottiene i pacchetti giusti - e funziona su Java, C # e ora sul Web (tramite js).

Potrebbe non allargare i tuoi orizzonti in termini di nuovi modi di programmare, ma ti mostrerà sicuramente modi migliori di programmare.


1

Una cosa che vedo mancare dalle altre risposte: le lingue basate sulla riscrittura dei termini.

Puoi dare un'occhiata a Pure - http://code.google.com/p/pure-lang/ .

Mathematica si basa anche sulla riscrittura, anche se non è così facile capire cosa sta succedendo, poiché è piuttosto chiuso.


0

APL, Forth e Assembly.

Divertirsi un po. Prendi un kit robot Lego Mindstorm e il RobotC della CMU e scrivi un codice di robotica. Le cose accadono quando scrivi un codice che deve "sporcarsi" e interagire con il mondo reale che non puoi imparare in nessun altro modo. Sì, stessa lingua, ma una prospettiva molto diversa.

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.