perché non combinare le migliori caratteristiche di tutti i linguaggi di programmazione esistenti e adattarlo a un linguaggio di programmazione universale?
Per lo stesso motivo per cui non usi un coltellino svizzero per scolpire un pollo ...
The Swiss Army knife generally has a blade, as well as various tools, such as screwdrivers and can openers and many others. These attachments are stowed inside the handle of the knife through a pivot point mechanism...
The design of the knife and its flexibility have both led to worldwide recognition...
Perché
Quello che hai in programmazione è un dominio problematico molto grande. Questo dominio varia estremamente e in molte direzioni.
Ecco perché i controllori di volo incorporati sono scritti in C e i siti web sono scritti in PHP, Java, Rails, .NET e una miriade di altri.
Per il controller di volo incorporato ho circa 128k di memoria su cui lavorare e, se il mio codice ottiene un'eccezione non gestita, l'aereo si blocca, 200 persone muoiono e io vengo denunciato per accordare $ 1B, e devo inviare ingegneri in ogni aeroporto del mondo per riparare gli aerei che sono radicati perdendo i miei clienti $ 10 milioni al giorno. Devo lavorare con un linguaggio molto stretto e con un piccolo numero di parti mobili che potrebbero andare storte.
Per la mia applicazione web ho diversi GB di memoria con cui lavorare, ma la velocità della rete è limitata (in misura minore ogni giorno, ma questo è probabilmente il limite massimo del web). Guarderò un linguaggio che mi dà un sacco di funzioni e produce un output che può essere trasmesso il più velocemente possibile. Non mi interessa davvero se il mio sito va giù, forse perderò un po 'di vendite ($ 100) e dovrò patchare il caso d'uso che ha bombardato, non un grosso problema.
I siti Web non sono stati scritti in C per più di 15 anni (nessuno ha mai fatto script di cgi?) e per quanto ne so i controllori di volo stanno iniziando ora a guardare C ++, ma anche in un modo molto limitato.
Se non hai una cassetta degli attrezzi, o hai solo uno di quei piccoli martelli con i pezzi di cacciavite nell'impugnatura vuota, allora ho molta simpatia per te.
Scherzi a parte. Se vai in un negozio di auto, il tuo meccanico ha un solo strumento fai-da-te nel suo toolchest? Lui (o lei) è un professionista, con strumenti di livello professionale appositamente progettati per eseguire diversi compiti di riparazione automobilistica.
Allo stesso modo, gli sviluppatori di software professionali dovrebbero possedere una serie sufficiente di strumenti per svolgere il proprio mestiere. Se apri la tua casella degli strumenti e vedi solo [l'equivalente software di] un cacciavite Philips, non puoi considerarti un professionista.
Puoi girare un bullone con una chiave inglese, una chiave inglese, una chiave a cricchetto o una chiave inglese regolabile. Puoi anche girare un dardo in un pizzico con le pinze a incastro, goffamente, con danni da lievi a gravi. Ma è abbastanza difficile girare un bullone con una mazza.
Un diverso tipo di risposta agli altri - In realtà penso che sia potenziale perché una lingua diventi "universale", consentendo le caratteristiche e i paradigmi di molti altri linguaggi, sebbene non sia forse un linguaggio rigorosamente progettato a cui stai pensando.
Per utilizzare analogia di brettmjohnson sopra, l'idea che ogni linguaggio di programmazione sia lo strumento all'interno di una scatola (o su un coltellino svizzero) è l'assunzione che tutti stanno facendo, ma è davvero un'ipotesi errata.
E se il linguaggio di programmazione fosse la cassetta degli attrezzi?
Voglio dire, cosa succede se puoi aggiungere e rimuovere funzionalità dalla lingua come preferisci e avere la tua cassetta degli attrezzi con gli strumenti di cui hai bisogno, anche se gli strumenti sono per scopi diversi.
Il concetto esiste già parzialmente. Ad esempio, lingue come Nemerle ti consentono di aggiungere la sintassi a la lingua , e come tale, potresti essere in grado di prendere "la migliore caratteristica dalla lingua X" e aggiungerla a Nemerle (o alla tua). Ciò non significa necessariamente scrivere i tuoi stessi macro in ogni momento - ogni lingua (o paradigma) potrebbe essere definita all'interno di una macro in una libreria standard - in modo tale che potresti import Haskell; import Prolog;
e iniziare a scrivere le due lingue come se fosse facevano parte della tua lingua?
La domanda allora è: come si ottengono le caratteristiche di linguaggi / paradigmi diversi per lavorare tra loro? Mentre non posso rispondere, framework come .Net e JVM offrono alcune soluzioni - le lingue sono almeno parzialmente compatibili a causa del modo in cui sono compilate. Ad esempio, puoi prendere qualsiasi codice scritto in C # e usarlo da F # senza lamentele.
Il "problema" con la soluzione com'è oggi, è che l'uso di questi linguaggi insieme richiede che li crei come progetti separati, che non possono fare riferimenti tra loro: puoi avere solo un riferimento a 1 via. La barriera linguistica è che ogni progetto compila tutti i suoi file separatamente in Common Intermediate Language prima che qualsiasi altro progetto possa accedervi.
Un primo passo verso la rimozione di questa barriera sarebbe quello di consentire il codice di lingue diverse (ad esempio, C # e F #) da compilare all'interno dello stesso progetto. In teoria è possibile compilare ciascun file separatamente (o in gruppi - se hanno tipi parziali o riferimenti circolari) e quindi compilare file di una lingua diversa che può accedere a quelli già compilati (CIL). Dovresti però definire rigorosamente l'ordine di compilazione per farlo funzionare, ma l'ordine di compilazione è già richiesto nel caso di F #.
In ogni caso, non sto dicendo "ci può essere sicuramente un linguaggio universale". Sto suggerendo che esiste il potenziale per un'interoperabilità molto migliore tra le lingue rispetto a ciò che attualmente esiste. In realtà, non è probabile che migliorerà molto presto, proprio per l'enorme mole di lavoro che è necessario implementare una lingua e le librerie, gli strumenti ecc. Necessari per usarlo.
Le migliori funzionalità di alcune lingue sono in conflitto con le migliori funzionalità di altri.
Ad esempio: le riflessioni sensibili al tipo sono una funzionalità davvero piacevole, ma non varrebbe molto in un linguaggio vagamente dattiloscritto, ma anche la digitazione libera può essere un vero vantaggio a volte.
Anche all'interno di una lingua non è sempre possibile utilizzare tutte le migliori funzionalità contemporaneamente perché sono in conflitto tra loro.
"Jack di tutti i mestieri - maestro di nessuno". Mi viene in mente.
Alcuni programmi richiedono velocità, altre grandi quantità di memoria o accesso rapido al disco. Alcune lingue sono buone a una, ma cattive a un'altra - Non penso che ti piacerebbe avere una lingua che fosse buona a tutti.
Quindi, mentre puoi scrivere virtualmente qualsiasi programma in qualsiasi lingua, ciò che ottieni non è sicuramente il miglior programma che potresti scrivere per risolvere quel problema.
C'è. Nessuno strumento è il migliore per tutto, ma alcuni strumenti come molti linguaggi di programmazione servono per tutti gli scopi, non migliori per tutti.
Puoi scegliere lo strumento migliore per il lavoro, ma ci sono linguaggi di programmazione che possono essere utilizzati a tutti gli effetti e puoi sceglierli. Non lo consiglio ma è possibile.
A causa di qualcosa chiamo il "paradosso della generalizzazione / specializzazione", che probabilmente ha un altro nome e in realtà non è un paradosso
The more generalized a programming language the more code it takes to accomplish something. The more specialized the language the less you can accomplish with it.
Le lingue influenzano il modo in cui la gente pensa. Questo è vero per le lingue naturali. Se un bambino conosce solo una lingua con i numeri "uno, due, molti", insegnando che la matematica è difficile ... (Scusa, non ho il link) In inglese parliamo di tempi diversi come se fossero luoghi - da qui il concetto di viaggio nel tempo è possibile immaginare. In alcune altre lingue, l'idea del viaggio nel tempo sarebbe mai per i suoi altoparlanti.
Questo vale anche per i linguaggi di programmazione.
Quindi, se abbiamo un unico linguaggio di programmazione, tutti penseranno esattamente a tutti i compiti computazionali. Quindi non esploreremo alternative e il modo migliore per fare qualcosa rimarrà da scoprire.
La cosa più vicina a un linguaggio universale è che le mappe di C. C sono molto vicine ai concetti hardware sottostanti (come vengono effettivamente fatte le cose nell'hardware) e i programmi in ogni * linguaggio sono convertibili in C. (Vedi come CFront ha usato C compilatori per compiti assembler) Il problema con C è fondamentalmente che le conversioni sopra menzionate non avrebbero senso dal punto di vista dei programmatori C.
"Lambdas" erano sempre possibili in C. La sintassi è disattivata, incluso il codice distribuito su tutto il progetto / file, quindi non era una soluzione preferita. Con una versione no-capture / upvalue / etc, definire una funzione da qualche altra parte e passare un puntatore alla funzione. (vedi qsort () ) Per usare lambda con valori catturati, la quantità e la complessità del codice che devi scrivere aumenta moltissimo - per quanto ne sappia nessuno ha mai scritto il codice da usare questo metodo di programmazione in C. Al contrario delle lingue in cui i lambda fanno parte della lingua e praticamente sono usati ovunque.
La principale differenza tra C e C ++ è come puoi chiedere a C ++ di occuparsi di stuff per te; ma poi non puoi più vedere, da una sola riga di codice, quanto te lo chiedi davvero. La risposta diventa: dipende (su tutto questo altro codice).
Alcuni linguaggi di programmazione sono eccellenti per compiti specifici, ma dove la maggior parte dei programmi correnti in uso in tutto il mondo semplicemente non avrebbe senso se programmati in quella lingua. Cioè, se il linguaggio potrebbe essere usato per implementare quel programma per cominciare, che non è un dato.
L'impossibilità per i meriti tecnici di avere un linguaggio universale? Questa è una sciocchezza totale. potresti avere un linguaggio universale che copre tutte le basi. Il problema è per lo più storico: diverse lingue sono state inventate per fare cose diverse e essere utilizzate in diverse comunità. Molti di loro sono rimasti bloccati. Aggiungete a queste preferenze (vi! Emacs! Wait, intendevo Java! C #, aspettavo che intendessi Microsoft, Open Source, ecc. Ecc. Ecc.) E l'incorporazione generale di incidenti storici ... Guardate le lingue naturali in una piccola terra di massa come alcuni paesi europei per vedere quanto possa diventare pazzo questo argomento. Alcune città hanno il loro orgoglio e la loro gioia, un piccolo dialetto che solo loro parlano. Le nazioni e le comunità di programmazione non sono così diverse, né le comunità di programmazione sono più razionali. Se lo fossero, parleremmo tutti esperanto e programmeremo in Universal qualcosa di "qualcosa" ...
È un errore pensare che "combinare tutte le caratteristiche" creerà un linguaggio migliore.
È più probabile che tu finisca con un casino gonfio, complesso, illeggibile.
Il buon design del linguaggio richiede scelte e compromessi. Probabilmente le lingue migliori / più rivoluzionarie / di maggior successo sono quelle che prendono fuori qualcosa e forniscono un'alternativa migliore invece di aggiungere nuove cose. Ad esempio
C'è un ottimo discorso su questo argomento di Zio Bob Martin - The Last Programming Language
Non c'è nessuno strumento che abbia tutte le migliori caratteristiche. Ad esempio, una buona funzionalità di Javascript e Scheme è che sono piccoli, quindi se inizi a impacchettare le funzionalità, hai già perso su questo.
Ancora Cobra sembra promettente nella direzione di avere tutte le caratteristiche interessanti di altre lingue. : -)
Perché se crei un linguaggio del genere, sarà ancora un altro nuovo linguaggio. Potresti ottenere una grande base di fan, ma tutte le altre lingue continueranno a esistere.
C esiste ancora, anche se molte nuove lingue sono state inventate da allora.
Potresti dire che Python è un linguaggio così universale, ma poi c'è anche ruby.
Il motivo per cui ci sono molte lingue è semplicemente perché ci sono molti programmatori e alcuni di loro amano creare nuove lingue.
Il motivo per cui non esiste un unico linguaggio universale su cui tutti siano d'accordo è che la programmazione come mestiere non è dettata da qualche istituzione che prende tutte le decisioni. Tutti sono liberi di fare quello che vogliono.
Questa è una buona cosa.
Con tutto ciò che è stato scritto finora, è difficile aggiungere molte nuove motivazioni, ma ne inserirò alcune.
Evoluzione: non sono solo i sistemi biologici che vengono introdotti, mutati e sottoposti a una competizione di sopravvivenza per le risorse e una nicchia da chiamare propria. La competizione è buona e spinge le cose avanti.
Maturità: abbiamo fatto linguaggi informatici per probabilmente meno di un secolo. Non possiamo ancora avere la risposta perché non conosciamo ancora tutte le domande.
Genesi separata: non sono sicuro della parola giusta per questo, ma nel mondo ci sono molti sistemi di scrittura che sono iniziati in molte regioni geografiche. Pensa a Cuneiform che è stato dettato in parte dalle esigenze di intaglio in tavolette d'argilla. Pensa al sanscrito, agli alfabeti greco, ebraico, romano e arabo. Geroglifici, il metodo cinese di bella scrittura con oltre 6000 simboli condivisi in molti paesi dell'Asia orientale. Pensa agli alfabeti misti più moderni con basi fonetiche come il cirillico, il katakana e l'Hirigana. Non sono un linguista quindi non infastidisco troppo le imprecisioni, ma quando le culture di tutto il mondo hanno bisogno di qualcosa, la creeranno e le faranno proprie per necessità. I linguaggi informatici arrivarono quando c'erano molte comunicazioni a livello mondiale e, come i sistemi imperiale e metrico, provenivano da luoghi con una potente leadership di idee. Ma i linguaggi di programmazione servono molte culture diverse (alcune delle quali culture aziendali), quindi riflettono le persone che le hanno create. I linguaggi informatici sono dotati di eredità culturali che ne hanno modellato il design e l'uso. Nella cultura del kernel del sistema operativo, è improbabile che C e C ++ siano presto deprecati per Java (o viceversa) perché consentono la generazione di codice nativo, l'accoppiamento ravvicinato / efficiente con l'hardware per la creazione di livelli di astrazione hardware e una base installata considerevole.
Design del design: i linguaggi di programmazione derivano dall'utilizzo di diversi paradigmi organizzativi. COBOL e Ada provenivano da comitati che facevano parte del DOD che aveva molta gerarchia. Se ricordo correttamente C, C ++, Java e probabilmente molti altri provenivano da uno o un piccolo numero di designer. Fred Brooks mette a confronto i risultati del comitato con gli approcci visionari nel suo articolo The Design of Design (http://www.youtube.com/watch?v=pC-DlX-PaF4). Se oggi ci sedessimo per selezionare un Da Vinci o un comitato per definire il linguaggio di programmazione universale, potremmo sapere chi o cosa con quale metodo dovrebbe essere architettato?
Forse un po 'di differenza su tutto questo:
Che cos'è una lingua? Per essere ridicolmente semplice, è un vocabolario, una sintassi e una semantica.
Qual è la prima cosa che fai con un linguaggio di programmazione?
Definisci le cose - classi, variabili, metodi - estendi il vocabolario e la semantica.
Perché? Quindi ora puoi dire cose che non puoi dire prima.
Piaccia o no, hai creato un nuovo linguaggio speciale.
IMHO, la cosa da cercare in un linguaggio generico è se rende facile la creazione di linguaggi speciali.
Oltre all'argomento swiss-army-knife (che ha un punto - è più difficile progettare un buon linguaggio a largo spettro rispetto a un dominio specifico - ma ciò non t significa che un tale linguaggio non sarebbe possibile e sia una buona idea), ci sono problemi con "combinando le migliori caratteristiche":
In breve, la progettazione della lingua è più difficile e complicata di così. Sebbene, potresti voler dare un'occhiata a Scala .
Esiste un linguaggio di programmazione universale. Si chiama "linguaggio macchina" e tutto in qualsiasi altro linguaggio informatico viene infine eseguito come linguaggio macchina.
Che aspetto ha? Una stringa di 0-9 e A-F.
Ma è una cagna da usare. Così Alan inventa un linguaggio che può essere tradotto in linguaggio macchina ed è più appropriato a ciò che Alan vuole fare. Bill inventa un linguaggio diverso per ciò che Bill vuole fare. In poco tempo hai Cobol e Fortran, Lisp e Java. Tutti sono semplicemente delle vesioni semplificate del linguaggio macchina, più facile scrivere certi tipi di programmi ma più difficile, o impossibile, scrivere altri tipi di programmi. Uno è buono per la contabilità, un altro è buono per controllare lo space shuttle.
Solo perché,
non c'è un computer UNIVERSALE.
non una lastra UNIVERSALE.
non un programmatore UNIVERSALE.
e nemmeno un client UNIVERSALE.
:
Quindi semplicemente abbiamo bisogno di uno diverso per uno diverso. ;)
La maggior parte delle risposte qui si concentra sull'utilizzo dello strumento migliore per ogni problema. Non credo che questo sia un buon motivo.
Se guardi alle grandi aziende, solitamente la compagnia tenderà a utilizzare un singolo (o un piccolo numero) di linguaggi e tecnologie, anche se per un progetto specifico esiste un linguaggio migliore.
Questo perché i vantaggi derivanti da una migliore standardizzazione, supporto più semplice, condivisione del codice, ecc. sono (la maggior parte delle volte) più grandi del valore aggiunto di una lingua specifica.
Penso che tutte le risposte "perché non si scolpiscono statue con una matita" mancano il punto.
Chi è qui, VERAMENTE seleziona una lingua prima di ogni nuovo progetto?
La verità è che abbiamo solo bisogno di alcuni linguaggi di programmazione, e il mondo della programmazione sarebbe meglio in questo modo: le persone si concentrerebbero sul rendere il linguaggio di scripting the migliore invece di essere sparsi su python / ruby / perl / younameit ad esempio.
C # è programmato su / per Windows (va bene, c'è Mono, nessuno qui esegue un C # sotto l'app Mono ogni giorno?) e questo fa sì che gli utenti comprano Windows7 / 8 e questo faccia guadagnare denaro a Microsoft.
Altre società fanno lo stesso, quindi l'open source conosce meglio, quindi anche il mister genio ... e abbiamo un sacco di linguaggi di somiglianza, è solo la natura egocentrica dell'umanità.
Dobbiamo guardare all'economia per rispondere a questa domanda. Se risparmiassi denaro aziendale per avere una sola lingua, l'avremmo. Lo standardizzerebbero e richiederebbero a tutti di usarlo. Le altre lingue languirebbero in polverosi edifici accademici e negli scantinati di fanatici dagli occhi selvaggi. Questo non è accaduto, quindi il loro deve essere un incentivo al profitto in un linguaggio di programmazione universale o uno si sarebbe naturalmente evoluto ormai.
Leggi altre domande sui tag programming-languages features