Perché ci sono così tanti linguaggi di programmazione?


130

Sono abbastanza fluente in C / C ++ e posso fare il giro dei vari linguaggi di scripting (awk / sed / perl). Ho iniziato a usare Python molto di più perché combina alcuni degli aspetti eleganti di C ++ con le capacità di scripting di awk / sed / perl.

Ma perché ci sono così tanti linguaggi di programmazione diversi? Immagino che tutte queste lingue possano fare le stesse cose, quindi perché non attenersi a una sola lingua e usarla per programmare i computer? In particolare, c'è qualche motivo per cui dovrei conoscere un linguaggio funzionale come programmatore di computer?

Alcune letture correlate:


2
c'è anche una differenza tra OO e non-OO. Inoltre, alcune lingue sono dotate di bei pacchetti: R, Maple, Matlab, Mathematica che spesso mancano di altre lingue.
Artem Kaznatcheev,



2
Per implementare algoritmi paralleli, la programmazione funzionale è migliore, in generale quando si hanno oggetti mutabili, è meglio usare il paradigma OO, altrimenti (se si desidera gestire oggetti immutabili ) è meglio cambiarlo in modello funzionale. Questo scenario esiste ampiamente nell'elaborazione parallela. Anche alcuni dei modelli OO eccellenti, come l'interfaccia fluente e il concatenamento dei metodi, funzionano come un paradigma funzionale.

4
Perché ci sono così tante macchine? Perché ci sono così tanti aeroplani? E che dire di BARCHE! Voglio dire, davvero! Scendi nell'oceano e ci sono tutti i tipi di cose pericolose! Qual è il punto di tutti quei diversi tipi di cose?!?!? È inefficiente! È dispendioso !! E qual è il punto strano di tutte quelle diverse scelte?!?!? Accidenti - gente saggia! Nessuno potrebbe aver bisogno di nulla tranne uno Yugo, un F-150 e un transatlantico! Oh, sì, gli aerei - MD-80 funzionerà perfettamente per quasi tutto. Là. Ora che è tutto risolto ... :-)
Bob Jarvis,

Risposte:


116

I linguaggi di programmazione si evolvono e vengono migliorati nel tempo (innovazione).

Le persone prendono idee da lingue diverse e le combinano in nuove lingue. Alcune funzionalità sono state migliorate (meccanismi di ereditarietà, sistemi di tipi), altre sono state aggiunte (garbage collection, gestione delle eccezioni), altre sono state rimosse ( gotoistruzioni, manipolazioni di puntatori di basso livello).

I programmatori iniziano a utilizzare un linguaggio in un modo particolare che non è supportato da alcun costrutto di linguaggio. I progettisti linguistici identificano tali modelli di utilizzo e introducono nuove astrazioni / costrutti linguistici per supportare tali modelli di utilizzo. Non c'erano procedure nel linguaggio assembly. Nessuna classe in C. Nessuna gestione delle eccezioni in (inizio) C ++. Nessun modo sicuro per caricare nuovi moduli nelle prime lingue (facile in Java). Nessun thread incorporato (easy-peasy in Java).

I ricercatori pensano a modi alternativi di esprimere i calcoli. Ciò ha portato a Lisp e al ramo del linguaggio funzionale dell'albero del linguaggio, Prolog e il ramo della programmazione logica, Erlang e altri modelli di programmazione basati sull'attore, tra gli altri.

Nel corso del tempo, i progettisti / ricercatori linguistici sono in grado di comprendere meglio tutti questi costrutti, come interagiscono e progettare i linguaggi per includere molti dei costrutti popolari, tutti progettati per funzionare perfettamente insieme. Ciò si traduce in meravigliosi linguaggi come Scala, che ha oggetti e classi (espressi usando tratti anziché ereditarietà singola o multipla), funzionalità di programmazione funzionale, tipi di dati algebrici integrati perfettamente con il sistema di classi e il pattern matching e la concorrenza basata sugli attori.

I ricercatori che credono nei sistemi di tipo statico si sforzano di migliorare la propria espressività, consentendo cose come classi generiche tipizzate in Java (e tutte le cose meravigliose in Haskell), in modo che un programmatore ottenga più garanzie prima di eseguire un programma che le cose non stanno andando andare storto. I sistemi di tipi statici spesso impongono un grosso onere al programmatore (digitando i tipi), quindi la ricerca è andata ad alleviare tale onere. Lingue come Haskell e ML consentono al programmatore di omettere tutte le annotazioni di tipo (a meno che non stiano facendo qualcosa di complicato). Scala consente al programmatore di omettere i tipi all'interno del corpo dei metodi, per semplificare il lavoro del programmatore. Il compilatore rileva tutti i tipi mancanti e informa il programmatore di possibili errori.

Infine, alcune lingue sono progettate per supportare determinati domini. Gli esempi includono SQL, R, Makefile, la lingua di input di Graphviz, Mathmatica, LaTeX. Integrare le funzionalità di queste lingue nelle lingue di uso generale (direttamente) sarebbe piuttosto complicato. Queste lingue si basano su astrazioni specifiche per il loro dominio particolare.

Senza evoluzione nella progettazione del linguaggio di programmazione, utilizzeremmo comunque tutti il ​​linguaggio assembly o C ++.

Per quanto riguarda la conoscenza di un linguaggio di programmazione funzionale : i linguaggi funzionali consentono di esprimere calcoli in modo diverso, spesso in modo più conciso rispetto all'uso di altri linguaggi di programmazione. Considera la differenza tra C ++ e Python e moltiplicalo per 4. Più seriamente, come già accennato in un'altra risposta, la programmazione funzionale ti offre un modo diverso di pensare ai problemi. Questo vale per tutti gli altri paradigmi; alcuni meglio adatti ad alcuni problemi, altri no. Questo è il motivo per cui i linguaggi multi-paradigma stanno diventando sempre più popolari: è possibile utilizzare costrutti da un paradigma diverso se necessario, senza cambiare lingua e, più sfidando, è possibile mescolare paradigmi all'interno di un unico software.


1
Pienamente d'accordo. Sono interessato a dove saranno le lingue multi-paradigma (ad esempio Scala) tra un paio d'anni. Se consentono una facile integrazione DSL, potremmo effettivamente vedere un graduale calo dei numeri di lingua.
Raffaello

2
Risposta molto dettagliata! Potremmo riconoscere che la maggior parte dei linguaggi di programmazione potrebbe essere Turing equivalente, ma ciò non significa che l'astrazione che supportano sia adatta per ogni dominio problematico.
CyberFonic

Mettere assembly e C ++ in una stessa scatola mi fa male al cuore. Il C ++ si è evoluto molto !! Specialmente dal C ++ 11 e successivi.
Peregring-lk,

66

tldr: non esiste un linguaggio proiettile d'argento.

Spero che non mi citino in giudizio, ma ecco una foto di una delle presentazioni di Stanford.

inserisci qui la descrizione dell'immagine

Quando decidi di scegliere una lingua, puoi scegliere solo 2 di queste 3 funzioni .

Ed è per questo che le persone sono tristi e vogliono inventare un linguaggio multilingue che coprirà tutti e tre.

In realtà, esiste un enorme elenco di requisiti (alcuni di questi sono visibili in altre risposte) ma aggiungono solo dettagli alle funzionalità principali. Inoltre, ci sono ragioni storiche e politiche per preferire una lingua a un'altra.

Le combinazioni di tali fattori producono una nuova lingua.

( E ho sentito che ogni buon programmatore dovrebbe creare la propria nuova lingua;) )


11
Nel corso del tempo il triangolo si sta restringendo, nel senso che gli angoli si stanno avvicinando ..... Spero / sogno.
Dave Clarke,

1
Prestazioni e generalità, possono essere paragonate più o meno ma aggiungerò che l' esperienza in una lingua ti dà più produttività di una certa lingua stessa, non è giusto confrontare la "produttività delle lingue" da sola, perché hai bisogno della supposizione di conoscenza ed esperienza tutti, un'ipotesi molto improbabile.
Hernan_eche,

Questa è una dichiarazione interessante e mi ricorda il teorema della PAC. È solo un'argomentazione informale o può essere dimostrato il triangolo?
evnu,

1
@evnu, ecco un argomento quasiformale di una parte: assumere la generalità significa che programmi validi di qualsiasi lunghezza n nella lingua L coprono uno spazio problematico più ampio, ogni sottospazio di problemi è coperto solo da alcune frazioni della lunghezza n programmi. Se i programmi di lunghezza n al di fuori del tuo sottospazio specifico fossero invece all'interno del tuo sottospazio, avresti maggiori probabilità di trovare un programma più breve che risolva il tuo problema (quindi presumibilmente saresti più produttivo), ma la lingua sarebbe meno generale- - risolverebbe i problemi in altri sottospazi meno bene (cioè con programmi più lunghi).
Jonas Kölker,

Questa è una buona argomentazione secondo cui sono necessari almeno due linguaggi di programmazione, nonché un gran numero di linguaggi specifici del dominio, coprendo così tutti e tre i lati del triangolo. Ne abbiamo molti, molti, molti di più. (E metterei c nel vertice superiore del triangolo, ma è un piccolo inconveniente.)
Peter Shor,

25

Il mondo è pieno di cose che hanno molte varianti: elaboratori di testi, automobili, design per la casa, bevande, caramelle, penne, pale, ecc. I motivi per cui ne abbiamo così tanti possono essere ridotti a pochi principi:

  • Qualcuno pensa di poter migliorare i prodotti esistenti
  • Un disegno diverso è richiesto da considerazioni locali (pensa: case su palafitte contro case su lastre di cemento)
  • Una nuova categoria di prodotti soddisfa un'esigenza che prima non esisteva

Entra in qualsiasi negozio di articoli per ufficio e guarda la sezione "strumenti per scrivere": ci sono centinaia di varietà di penne. Fanno tutti all'incirca la stessa cosa: consegnare l'inchiostro su una superficie di scrittura. Ma ogni penna che vedi in vendita è lì perché uno dei tre motivi sopra.

  • Le penne stilografiche a cartuccia sono un miglioramento rispetto alle penne stilografiche intinte, che sono esse stesse un miglioramento delle penne di piume.
  • La NASA aveva bisogno di una penna che potesse scrivere in assenza di gravità, così fu inventata la penna a sfera pressurizzata.
  • La prima penna stessa potrebbe benissimo essere stata un bastoncino appuntito imbevuto di catrame o sangue; prima di allora la gente stava raschiando pietre insieme o spalmando pigmenti sui muri con la pelliccia. (Solo una supposizione.)

L'evoluzione delle penne continuerà poiché nessun prodotto soddisfa le esigenze di tutti gli utenti. Alcune penne sono economiche e usa e getta, altre sono costose e costruite con materiali di alta qualità; alcuni usano gel, altri usano inchiostro, altri usano pigmenti; alcuni hanno tappi twist-off, altri non hanno affatto tappi; botti larghe, botti strette, botti tonde, botti quadrate; corto lungo; rosso, bianco, nero, blu. Ecc. Ecc.

Ma abbastanza per le penne.

La nostra attuale miriade di linguaggi di programmazione può essere fatta risalire ai primissimi: i codici numerici della macchina per i primi computer negli anni '40. Primitivo, difficile da usare e laborioso per entrare nel computer, ma hanno fatto il lavoro. Non passò molto tempo che i programmatori assegnarono parole mnemoniche (come ADD, CALL, LOAD) ai codici macchina, dando vita alla classe di linguaggi chiamati "assembly assembly".

Diverse architetture di processori richiedevano codici mnemonici diversi, a seconda delle caratteristiche specifiche delle macchine sottostanti. Prendere in considerazione queste differenze significava inventare linguaggi di assemblaggio diversi.

(Forse ormai puoi vedere dove sta andando ...)

I programmatori guardavano i loro programmi di linguaggio assembly e vedevano schemi: le stesse sequenze di istruzioni sarebbero state usate per formare loop, condizionali, assegnazione variabile, chiamate di funzione e così via. Pertanto, sono nati i linguaggi di programmazione procedurale. Queste lingue incapsulavano gruppi di istruzioni sotto termini ombrello come "if", "while", "let", ecc.

Da un'analisi matematica della programmazione informatica sono emersi i linguaggi funzionali - un modo completamente nuovo di guardare al calcolo. Non meglio, non peggio, solo diverso.

E poi ci sono orientati agli oggetti, digitati staticamente, tipizzati dinamicamente, associazione tardiva, associazione anticipata, utilizzo di memoria insufficiente, utilizzo di memoria elevata, parallelismo, lingue per usi specifici e così via.

In definitiva, abbiamo linguaggi di programmazione diversi perché vogliamo linguaggi di programmazione diversi. Ogni designer linguistico ha le proprie idee su come apparirà e funzionerà il suo linguaggio "da sogno". La diversità è una buona cosa.


Non vedo alcun motivo convincente fornito qui per il motivo per cui dovremmo avere più lingue oltre a ciò che la gente vuole per qualsiasi motivo.
Raffaello

Esatto. I programmatori sono per natura risolutori di problemi. Per risolvere i problemi, hanno bisogno di strumenti che spesso assumono la forma di linguaggi di programmazione. Se gli strumenti non possono aiutarli a risolvere il loro problema come vogliono, inventano nuovi strumenti. Pensala in questo modo: poiché gli strumenti sono software e il nuovo software è stato scritto per risolvere nuovi problemi, gli strumenti stessi possono essere problemi da risolvere. Questi problemi vengono risolti creando nuovi strumenti.
Barry Brown,

Solo una novità: il ramo funzionale dei linguaggi è una sintesi delle idee del matematico su come esprimere ciò che oggi chiamiamo "informatica", che ha iniziato a essere considerato circa 50 anni prima dei primi computer. Non è per niente che LISP (in qualche modo) è la seconda lingua più antica ancora in circolazione, la prima è FORTRAN.
vonbrand

20

I linguaggi di programmazione funzionale si basano solitamente sul diverso modello di calcolo (ma equivalente in potenza): lambda-calcolo . Ci sono alcuni linguaggi non tipizzati (ha una tipizzazione simile a Python) come LISP, Scheme (usato in libri / corsi di interpretazione e struttura di programmi per computer ampiamente riconoscibili ) e linguaggi tipicamente statici come Haskell, ML, F #.

La SICP è ciò che mi ha portato alla programmazione funzionale, ma altre persone raccomandano questo articolo di John Hughes e questa intervista con lui.

La programmazione funzionale viene ora spinta da Microsoft, ad esempio, che ha incluso F # (il suo linguaggio funzionale per .NET) in VS2010 e 11; impiegano anche alcuni sviluppatori Haskell in MSR, IIRC.

Si noti che esistono anche alcuni linguaggi di programmazione funzionale non lambda-calcolo, come Refal , che si basa sulla corrispondenza e la riscrittura dei modelli.

Poiché il livello di astrazione nei linguaggi funzionali è diverso, la tua attitudine a risolvere i problemi cambia quando usi le tecniche di programmazione funzionale. Alcuni dicono che può renderti un programmatore migliore in generale.


1
Un'altra interessante classe di linguaggi sono i linguaggi di programmazione logica, come Prolog. Ho avuto solo un'esperienza molto limitata con DataLog quindi forse qualcun altro potrebbe scrivere una risposta a riguardo?
Daniil

2
Sono d'accordo che abbiamo bisogno di un linguaggio di programmazione per ciascun paradigma di programmazione: imperativo, OO, dichiarativo, funzionale, ecc. Ma questo non spiega perché abbiamo così tanti, diciamo, linguaggi OO.
Dai

@Dai, bene, davvero? La base teorica non è l'unica caratteristica di una lingua. Ad esempio, si potrebbe dire che una caratteristica chiave di Java o C # è (rispetto al C ++) la macchina virtuale, il che rende Java significativamente differente.
Daniil

Ma se C # e Java usano entrambi il concetto di macchina virtuale, perché non usiamo la sintassi identica per entrambe le lingue? Penso che ogni designer abbia le sue idee forti su come dovrebbe essere il suo linguaggio e abbia la tendenza a creare il proprio standard.
Dai

@Dai, dopo tutto ci sono molte piccole differenze tra C # e Java. Inoltre, penso che ci sia stata qualche controversia legale sulla VM Java per Windows o qualcosa del genere.
Daniil

19

In particolare, c'è qualche motivo per cui dovrei conoscere un linguaggio funzionale come programmatore di computer?

Sì. Perché haskell ha cambiato il mio modo di pensare. Potrebbe cambiare anche il modo di pensare.

Storia: Pensavo di poter imparare qualsiasi linguaggio di programmazione in un giorno. Un giorno ho iniziato Haskell. Ho finito tutto ciò che è venuto prima delle monadi in mezza giornata. Ormai è passato un anno da quel giorno e sono ancora irrimediabilmente bloccato su Monads.

Leggere:

  1. Wiki di lingue e pensiero

  2. Notazione come strumento di pensiero di Kenneth E. Iversion, conferenza del Turing Award

Ma perché ci sono così tanti linguaggi di programmazione diversi?

La notazione è strumento di pensiero. Abbiamo bisogno di diverse notazioni su misura per gestire comodamente pensieri diversi. Quindi creiamo nuove lingue.

Inoltre, leggi . ;-)


5
Recitare è divino!
Pratik Deoghare

4
iterare è umano?
Suresh,

1
Non sono sicuro che fosse una buona pubblicità per Haskell. ;)
Barry Brown,

@Pratik Deoghare. Imparare Haskell in un giorno probabilmente non era una buona idea. Direi, leggi un buon libro di testo sulla programmazione funzionale, come Bird e Wadler, e prenditi il ​​tuo tempo per farlo. Quindi le monadi potrebbero non essere così difficili.
Uday Reddy,

"Ho finito tutto ciò che è venuto prima delle monadi in mezza giornata." Veramente? Hai imparato le macchine da scrivere, i funzione, gli ADT, i tipi ecc. In mezza giornata? È impossibile. LYAH ha monadi nel capitolo 12 su 14. RWH non ha monadi fino al capitolo 6, e sono introdotte molto gradualmente - la definizione completa è nel capitolo 14.
sdcvvc

13

Difficilmente potrebbe esserci un programmatore che a un certo punto non è frustrato dai vincoli del linguaggio che stanno usando e ha deciso di grattarsi il prurito. Così nasce una nuova lingua - o dialetto di una esistente -.

Abadi e Cardelli in "Una teoria degli oggetti" sviluppano un'intera famiglia di linguaggi di programmazione da basi orientate agli oggetti. Dimostrano che la programmazione funzionale è un caso speciale di OO ma non il contrario.

Inventare qualcosa di nuovo è divertente, ecco perché le persone hanno maggiori probabilità di creare ancora un'altra lingua che contribuire a migliorarne una esistente. Certo, ci sono custodi di lingue che non accolgono favorevolmente i cambiamenti della loro visione. Il miglior esempio è l'abisso tra i sostenitori di Common Lisp e Scheme.


3
Una teoria degli oggetti non presenta un'intera famiglia di linguaggi di programmazione utilizzabili. Presenta una base per linguaggi di programmazione orientati agli oggetti, e uno strano a quello, non essendo basato su classi. Non vedo la connessione tra "Una teoria degli oggetti" e la programmazione funzionale. I calcoli dell'oggetto non hanno la nozione di pigrizia, per esempio. Esistono anche ricerche che codificano concetti OO in termini di funzioni e registrazioni, ad esempio il lavoro di Pierce alla fine degli anni '90.
Dave Clarke,


11

Perché ci sono così tanti paesi al mondo? Non sarebbe più facile se avessimo solo 5 o 6 superpoteri o addirittura un regno universale della Terra? È facile sostenere perché non sarebbe meglio --- per cominciare, la concorrenza di diversi paesi può portare a progressi e, dal punto di vista della democrazia, dei diritti umani, ecc., Molti paesi potrebbero essere migliori di uno - - ma questo non spiega perché abbiamo molti paesi. Spiega solo perché molti paesi sarebbero migliori .

Allo stesso modo, puoi chiedere, perché così tante lingue umane diverse? Polacco, arabo, mandarino ... Non sarebbe più facile se ci fosse una sola lingua? Potresti discutere in entrambi i modi, ma quelli sarebbero motivi per cui sarebbe meglio se la vita fosse in un modo o nell'altro. Non spiegherebbe le cause dietro l'esistenza di così tanti linguaggi umani diversi.

Il fatto è che ci sono molte persone sul pianeta e tutti stiamo facendo le nostre cose, tutti abbiamo le nostre opinioni, tutti vogliamo essere responsabili e avere il nostro paese o linguaggio di programmazione e spesso pensiamo di conoscere meglio rispetto ad altri, o almeno non preoccuparti di capire cosa gli altri hanno da offrire.

Leggi questo post sul blog molto illuminante, perché così tanti framework Web Python? Apparentemente, ci sono circa 50 framework web in Python. Questo è semplicemente ridicolo; non c'è assolutamente alcuna ragione razionale ragionevole per questo. Ma l'autore del post risponde: ci sono così tanti framework Web Python perché è così facile crearne uno . Non è necessario un motivo razionale per la presenza di più framework Web Python o più linguaggi di programmazione. Le persone continueranno a crearne di nuove perché non sanno cosa è già disponibile, o perché sperano di poter fare soldi, o semplicemente perché creare nuove cose è divertente!

Lasciami descrivere un esempio personale. Circa 10 anni fa stavo scrivendo del codice C ++ per un'azienda finlandese. Sai, in Finlandia hanno quegli enormi camion che, beh, viaggiano a lunga distanza e trasportano un sacco di roba da un posto all'altro. Sono sicuro che ci sono anche questi camion in America. Quindi un problema tipico è quello di assicurarsi che tutti e 24 i pneumatici stiano bene. Naturalmente, esiste una tecnologia collaudata nel tempo: la pressione e la temperatura possono essere monitorate e cambiamenti drastici indicano che qualcosa è andato storto. Naturalmente, tutta questa tecnologia è proprietaria, brevettata, con tutte le implicazioni. (Ricorda: i brevetti dovrebbero promuovere l'innovazione!) Quindi questa azienda finlandese voleva rilevare lo stato delle gomme con ... il suono. L'idea era di installare microfoni per ascoltare il suono proveniente da tutte le gomme e fare una sorta di magia di elaborazione del segnale su quei suoni per vedere se una delle gomme aveva un problema di qualche tipo, e stavo facendo un prototipo di questa follia. (Avevano persino un laboratorio dedicato per la registrazione di suoni campione; una volta mi hanno inviato una registrazione video impressionante di un'occasione particolare in cui sono riusciti a far esplodere un pneumatico campione dopo averlo sottoposto a 5 o 10 tonnellate di pressione e averlo riscaldato fino a una temperatura ridicola .) Chiaramente, ancora una volta, non c'era una ragione razionale particolare per questo sviluppo, tranne per il fatto che era divertente e alcune persone volevano fare soldi. Quindi anche capire che ci sono così tante ragioni per cui qualcuno dovrebbe iniziare a sviluppare un nuovo linguaggio di programmazione. Non è necessario né possibile apprenderli tutti. (Avevano persino un laboratorio dedicato per la registrazione di suoni campione; una volta mi hanno inviato una registrazione video impressionante di un'occasione particolare in cui sono riusciti a far esplodere un pneumatico campione dopo averlo sottoposto a 5 o 10 tonnellate di pressione e averlo riscaldato fino a una temperatura ridicola .) Chiaramente, ancora una volta, non c'era una ragione razionale particolare per questo sviluppo, tranne per il fatto che era divertente e alcune persone volevano fare soldi. Quindi anche capire che ci sono così tante ragioni per cui qualcuno dovrebbe iniziare a sviluppare un nuovo linguaggio di programmazione. Non è necessario né possibile apprenderli tutti. (Avevano persino un laboratorio dedicato per la registrazione di suoni campione; una volta mi hanno inviato una registrazione video impressionante di un'occasione particolare in cui sono riusciti a far esplodere un pneumatico campione dopo averlo sottoposto a 5 o 10 tonnellate di pressione e averlo riscaldato fino a una temperatura ridicola .) Chiaramente, ancora una volta, non c'era una ragione razionale particolare per questo sviluppo, tranne per il fatto che era divertente e alcune persone volevano fare soldi. Quindi anche capire che ci sono così tante ragioni per cui qualcuno dovrebbe iniziare a sviluppare un nuovo linguaggio di programmazione. Non è necessario né possibile apprenderli tutti. una volta mi hanno inviato un video impressionante di un'occasione particolare in cui sono riusciti a far esplodere un pneumatico campione dopo averlo sottoposto a 5 o 10 tonnellate di pressione e averlo riscaldato fino a una temperatura ridicola.) Chiaramente, di nuovo, non c'era un particolare razionale motivo di questo sviluppo, tranne per il fatto che è stato divertente e alcune persone volevano fare soldi. Quindi anche capire che ci sono così tante ragioni per cui qualcuno dovrebbe iniziare a sviluppare un nuovo linguaggio di programmazione. Non è necessario né possibile apprenderli tutti. una volta mi hanno inviato un video impressionante di un'occasione particolare in cui sono riusciti a far esplodere un pneumatico campione dopo averlo sottoposto a 5 o 10 tonnellate di pressione e averlo riscaldato fino a una temperatura ridicola.) Chiaramente, di nuovo, non c'era un particolare razionale motivo di questo sviluppo, tranne per il fatto che è stato divertente e alcune persone volevano fare soldi. Quindi anche capire che ci sono così tante ragioni per cui qualcuno dovrebbe iniziare a sviluppare un nuovo linguaggio di programmazione. Non è necessario né possibile apprenderli tutti.

Naturalmente, tutto ciò si applica solo se credi nell'evoluzione. Se credi in qualche forma di design intelligente, che Dio ha anche creato tutti i linguaggi di programmazione, allora dovresti trovare uno scopo dietro questa moltitudine. Forse Dio voleva promuovere la competizione tra diversi linguaggi di programmazione in modo che l'arte dello sviluppo del software raggiungesse il suo stato più alto possibile.

In conclusione, ci sono molte persone, molti paesi, molti linguaggi di programmazione. Questa è solo la natura della vita! Siamo grati per questo: questo significa solo che il campo della programmazione / informatica è molto vivo e fiorente.


risposta perfetta, non so perché non sia stato accettato!
Am_I_Helpful

8

Perché ci sono così tanti linguaggi di programmazione diversi?

Perché ci sono scelte da fare:

  • Modalità di specifica: imperativa vs. funzionale
  • Digitazione: digitata staticamente vs. tipizzata dinamicamente
  • Ordine di valutazione: call-by-value vs. call-by-name
  • Modularità: basata sul tipo di classe rispetto al tipo di dati astratto
  • Modello di esecuzione: sequenziale vs. simultaneo

Fortunatamente, le ultime due sono dicotomie inessenziali, vale a dire che si potrebbero mettere entrambe le scelte in un unico linguaggio di programmazione. Ma le prime tre dicotomie danno origine a 8 combinazioni. Quindi, anche in un mondo ideale, ci sarebbero almeno 8 linguaggi di programmazione. Quando si esegue il drill down, ci sarebbero ulteriori scelte di design sfumate all'interno di particolari paradigmi. Ad esempio, se si decide di utilizzare un linguaggio tipicamente statico basato su classi, esistono diversi modi di progettare il sistema di tipi. Non esiste ancora un modo canonico per farlo. Se si decide di usare un linguaggio di programmazione concorrente, ci sono vari modi di rappresentare la concorrenza: semafori, regioni critiche condizionali, monitor, passaggio di messaggi (sincrono vs. asincrono). All'interno del passaggio sincrono dei messaggi,

Parte della ricerca che facciamo nella teoria del linguaggio di programmazione è dedicata alla risoluzione di queste dicotomie. Ad esempio, ho lavorato per risolvere la dicotomia tra programmazione imperativa e funzionale in un documento chiamato " Compiti per linguaggi applicativi " e il nostro metodo è stato ora adottato da Haskell, rendendolo un linguaggio sia funzionale che imperativo. Ciò non significa che la dicotomia sia completamente risolta. Un programmatore Haskell deve ancora scegliere se risolvere il suo problema in modo funzionale o imperativo. Luca Cardelli ha lavorato alla risoluzione della dicotomia di battitura statica vs. dinamica. Paul Levy ha lavorato per risolvere la dicotomia call-by-value vs. call-by-name . Non tutti questi risultati sono stati ancora implementati nei linguaggi di programmazione della vita reale.


Se tutte queste lingue possono fare le stesse cose, perché non limitarsi a utilizzare una sola lingua e utilizzarla per programmare i computer?

Perché per un programmatore nel mondo reale, non è sufficiente fare semplicemente qualcosa. Importa anche come viene fatto. Quando viene eseguito correttamente, il dominio problematico viene rappresentato fedelmente nel programma, la modularità del problema viene mantenuta e i programmi diventano facili da capire, modificare e mantenere. Tutto ciò influisce sul costo dello sviluppo e della manutenzione del programma. Inoltre, influiscono sull'affidabilità e sulla sicurezza del software.

Ad esempio, molte persone usano un programma chiamato " Quicken " per i conti finanziari. Il programma originale è stato sviluppato in alcune versioni interne di Visual Basic ed è stato abbastanza buono. Tuttavia, è stato difficile estenderlo e mantenerlo. Nel corso degli anni, quando l'azienda ha tentato di estenderlo per nuove funzionalità, il programma è diventato sempre più pieno di milioni di clienti insoddisfatti in tutto il mondo. Probabilmente trarranno vantaggio dalla riprogettazione del software in un linguaggio di programmazione orientato agli oggetti fortemente tipizzato.


In particolare, c'è qualche motivo per cui dovrei conoscere un linguaggio funzionale come programmatore di computer?

Storicamente, la "programmazione funzionale" è stata inventata da Godel, Kleene e Church seguendo la pratica matematica standard, e la "programmazione imperativa" è stata inventata da Turing per definire la nozione di calcolo meccanico. Prima di Turing, non ci sono prove che la matematica abbia mai analizzato idee imperative di programmazione. (Mentre tutti gli algoritmi matematici tradizionali erano espressi in uno "stile imperativo", il loro contenuto essenziale era ancora funzionale.) Quindi, la programmazione imperativa è molto nuova per la civiltà umana e la sua matematica non è ancora molto ben compresa. Il primo motivo per cui tutti dovrebbero conoscere qualche programmazione funzionale è capire come la programmazione può essere matematica. (Non sto ammettendo che la programmazione imperativa non è matematica, che è ciò che i programmatori funzionali vorrebbero farti credere. Ma sarei d'accordo sul fatto che, allo stato attuale dell'arte, non sappiamo ancora come programmare matematicamente l'imperativo. Molti di noi stanno lavorando proprio a quel problema.)


1

Potresti vederlo come evoluzione.

All'inizio, i computer erano programmati esclusivamente con codici binari. Successivamente sono stati introdotti i mnemonici e sono stati introdotti i linguaggi di assemblaggio, principalmente a seconda della CPU utilizzata.

Dopo che furono introdotte le lingue di livello superiore (3 ° livello) (Pascal, C, ADA, Cobol), alcune molto generiche (come C), altre più adatte alla gestione dei dati (Cobol), altre per i calcoli (Fortran).

Successivamente sono sorti linguaggi di 4 ° livello, come linguaggi logici (come Prolog). Le lingue più generiche sono successori di lingue di terzo livello; alcuni sono Java, C #.

Vediamo anche lingue specifiche per internet / web, come ASP.NET, PHP.

E le lingue per un dominio specifico (DSL), che lavora principalmente con un linguaggio generico.

Quindi ci sono lingue che i bambini imparano a programmare, come LOGO.

Anche lingue per scrivere velocemente codice, come Python, Ruby ecc., Lingue per la gestione di XML (XSLT).

E probabilmente ho dimenticato molte lingue e persino categorie di lingue.


1
La tua cronologia è confusa. Prolog è del 1972, che è più giovane di Ada (1983). Non so cosa intendi per "successori di lingue di terzo livello"; poche lingue non sono discendenti di Fortran, tra cui C e Pascal (che generarono Ada).
prosfilaes,

1
@prosfilaes, molto confuso. FORTRAN fu la prima lingua ancora in uso, poi arrivò LISP, poi COBOL. Algol è stato definito per la pubblicazione di algoritmi, non per l'uso di macchine (ma i compilatori di una specie sono diventati comunque), con ofshots Pascal e successivamente C. PL / 1 era uno strano mix di FORTRAN e COBOL con strutture di controllo Algol-ish.
vonbrand

1

le altre risposte sono buone, aggiungeranno alcuni nuovi angoli. mentre DC scrive le lingue si evolvono proprio come le vere lingue umane! e prendono in prestito concetti e sintassi l'uno dall'altro come dei veri linguaggi umani. in altre parole c'è anche uno studio abbastanza reale dell'etimologia dei linguaggi informatici.

questo significa anche che c'è stata una lunga storia e una linea temporale iniziata principalmente intorno agli anni '30 con il calcolo lambda .

esiste una forte interazione / sinergia / simbiosi tra teoria e applicazione con linguaggi di programmazione. vengono inventate nuove applicazioni che portano a nuove teorie e viceversa. un linguaggio di programmazione è per molti versi un ponte tra teoria e applicazione .

un caso di studio interessante della storia è Fortran. non è ben noto, ma le versioni precedenti di Fortran (principalmente prima di Fortran77) avevano una grammatica ambigua . ciò significa che il compilatore potrebbe legittimamente "interpretare" lo stesso comando / compilare modi diversi dal compilatore perché c'erano più "interpretazioni" valide (non è lo stesso senso tecnico dei linguaggi "interpretati").

così la teoria delle grammatiche formali si stava sviluppando nel periodo in cui fu inventato Fortran, e fu una piccola crisi quando fu scoperto il problema dell'ambiguità del linguaggio. La sintassi di Fortan è stata riformulata per evitare questa ambiguità e le lingue successive hanno avuto una maggiore sensibilità all'ambiguità grammaticale nella loro progettazione. OOP è anche un esempio molto importante / principale di un concetto teorico / progresso nei linguaggi di programmazione che "impatta" o "increspa" in molti linguaggi esistenti, trasformandoli.

altri casi studio sono l'invenzione di nuove tecnologie. ad esempio, l'invenzione del database relazionale ha avuto un impatto enorme sui linguaggi dei computer, ad esempio con interfacce SQL e linguistiche (ad esempio in Java, "JDBC"). allo stesso modo il world wide web con un impatto ancora più massiccio. sembrava che ci fosse un'esplosione di lingue temporizzate proprio attorno al boom delle dotcom che coincideva in gran parte con la crescita precoce del WWW e poteva essere paragonata alle esplosioni evolutive .

sembra anche che ci sia una lunga tendenza all'aumento di nuovi linguaggi di programmazione in congiunzione con l'enorme potenza di elaborazione esponenziale della legge di Moores che alcuni ritengono possa rallentare.

le attuali tendenze solitarie nei linguaggi di programmazione sembrano riguardare i Big Data e la parallelizzazione, ad esempio con MapReduce . c'è anche un interesse attuale per le chiusure .

un altro aspetto chiave delle lingue è che rappresentano livelli crescenti di astrazione . si basano su astrazioni di livello inferiore per creare astrazioni di livello superiore (simili a una piramide). in questo modo il progresso dell'evoluzione del linguaggio informatico è probabilmente infinito e possiamo essere relativamente sicuri che nuovi importanti continueranno ad essere inventati a lungo nel futuro. questo è probabilmente analogo a un concetto simile in psicologia chiamato " chunking" - affermato in definitiva, costruendo concetti mentali di livello superiore da blocchi di livello inferiore.

chiunque abbia studiato molti linguaggi informatici deve ammettere che una mentalità da gregge può essere osservata in base alla quale alcuni aspetti di questi si rivelano essere mode passate, cioè non così critiche come quelle sostenute, o addirittura si estinguono (in uso) nel tempo! alcune delle idee / modifiche fondamentali rimangono, ma il (over) hype si attenua. in questo senso anche i linguaggi di programmazione cadono di moda . due casi secondo me dell'ultimo mezzo decennio che sono davvero utili ma sono stati sottoposti a overhyping:

sempre più un'auto-somiglianza può essere osservata in molte lingue principali in modo tale che tutte tendano a convergere verso l'implementazione di molte caratteristiche simili a modo loro, cioè come nei grafici di confronto dei prodotti che "spuntano" molte funzionalità in una griglia.


vedi anche modelli di progettazione che spesso attraversano le lingue e sono implementati nelle lingue. un altro aspetto chiave dello studio / funzionalità del linguaggio sono le funzionalità implementate nelle biblioteche
vzn

FORTRAN non ha mai avuto una descrizione formale, tanto meno la complessità dell'espressione che potrebbe portare ad ambiguità grammaticali (sì, ho iniziato a programmare in un abominio chiamato PDQ FORTRAN, e successivamente FORTRAN IV) il linguaggio in cui l'ambiguità (molto imbarazzante) nel la grammatica è venuta alla luce con Algol, la prima lingua definita con una grammatica.
vonbrand

punto preso per originale / inizio FORTRAN ma le versioni successive furono più formalizzate con definizioni grammaticali più rigorose. è un caso di studio che mostra l' evoluzione di una lingua insieme alla teoria della lingua.
vzn

FORTRAN è stato alimentato forzatamente con una grammatica, ma non è mai stato progettato intorno a uno. Algol ha iniziato quella tendenza, che è stata continuata da Pascal, la famiglia Modula, Oberon, C ed è di prima generazione, PL / 1, Ada e simili. Data la tecnologia della grammatica libera dal contesto e la comprensione dell'analisi, oggi definire una grammatica e tradurla in un parser privo di errori è quasi banale, di cui nessuna nuova lingua ne è priva.
vonbrand

addendum, case study in lingue nuove / emergenti: Google go , node.js , Apple swift
vzn

-3

Non lo erano, è solo un espediente di marketing - se si fa sembrare il linguaggio un po '"C", allora questo abbassa l'apparente barriera all'ingresso.

Alcuni che non hanno alcuna influenza C: SQL, Pascal, Delphi, FORTRAN, COBOL, Ada, PowerBuilder, HyperTalk, Lisp, Simula, FOCAL, BASIC, PL / I, Algol, Algol-68, SNOBOL, Modula, Visual BASIC, Tutor, logo, Forth, DIBOL, Helix, AppleScript, Python, Erlang, Ruby, Pick, inglese, RPG, PL / SQL, ASP, Prolog, SmallTalk, Perl, bash, Wand BASIC, REXX, linguaggio batch DOS.

Quelli che un po 'sembrano C, ma hanno ben poco in comune con esso: JavaScript, Java, C #, (probabilmente) Objective-C.

È tutto marketing, Java, C ++ e JavaScript in qualche modo simile a C, ma difficilmente potrebbe essere più diverso sotto le copertine.


5
"Non erano" - cosa non erano cosa? In ogni caso, non vedo come questo risponda alla domanda. È semplicemente un elenco di lingue, insieme a un'affermazione completamente priva di fondamento secondo cui il marketing è in qualche modo coinvolto.
David Richerby,

2
"Alcuni che non hanno alcuna influenza C: ... Algol, Algol-68, ..." - Divertente dovresti dirlo, dato che C è nato da Algol. "se rendi il linguaggio un po 'simile a" C ", allora questo abbassa l'apparente barriera all'ingresso" - Iirc, questo è stato smentito. Gli studenti senza precedente esposizione alla programmazione imparano più velocemente con altre lingue (penso che abbiano usato Haskell in quello studio).
Raffaello
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.