perché non combinare le migliori caratteristiche di tutti i linguaggi di programmazione esistenti e inserirle in un linguaggio di programmazione universale?
perché non combinare le migliori caratteristiche di tutti i linguaggi di programmazione esistenti e inserirle in un linguaggio di programmazione universale?
Risposte:
Per lo stesso motivo non devi usare un coltellino svizzero per intagliare un pollo ...
Il coltellino svizzero ha generalmente una lama, oltre a vari strumenti, come cacciaviti e apriscatole e molti altri. Questi accessori sono riposti all'interno del manico del coltello attraverso un meccanismo a perno ...
Il design del coltello e la sua flessibilità hanno portato entrambi al riconoscimento mondiale ...
Perché
Quello che hai in programmazione è un dominio problematico molto grande. Questo dominio spazia estremamente e in molte direzioni.
Questo è il motivo per cui i controllori di volo integrati sono scritti in C e i siti Web sono scritti in PHP, Java, Rails, .NET e molti altri.
Per il controllore di volo incorporato ho circa 128k di memoria con cui lavorare e per di più se il mio codice riceve un'eccezione non gestita, l'aereo si arresta in modo anomalo, 200 persone muoiono e vengo citato in giudizio per $ 1 miliardi e devo inviare ingegneri a tutti aeroporto nel mondo per riparare aeromobili a terra perdendo i miei clienti $ 10 milioni al giorno. Devo lavorare con un linguaggio molto stretto e con un numero limitato 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 più grande del web). Guarderò una lingua che mi offre moltissime funzionalità e produce output che possono essere trasmessi il più velocemente possibile. Non mi interessa davvero se il mio sito si arresta, forse perderò alcune vendite ($ 100) e dovrò riparare il caso d'uso che ha bombardato, un grosso problema.
I siti Web non sono stati scritti in C da oltre 15 anni (qualcuno fa qualche script cgi?) E per quanto ne so i controller di volo stanno iniziando a guardare C ++, ma anche in un modo molto limitato.
Se non hai la cassetta degli attrezzi o hai solo uno di quei martelletti con le punte del cacciavite nella maniglia cava, allora ho una grande simpatia per te.
Sul serio. 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 varie attività di riparazione di automobili.
Allo stesso modo, gli sviluppatori di software professionali dovrebbero possedere un set sufficiente di strumenti per svolgere le proprie attività. Se apri la tua cassetta degli attrezzi e vedi solo [l'equivalente del software di] un cacciavite Philips, non puoi considerarti un professionista.
È possibile ruotare un bullone con una chiave a forchetta, una chiave a forchetta, una chiave a cricchetto o una chiave regolabile. Puoi persino trasformare un bullone in un pizzico con pinze a giunto scorrevole, 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 ci sia il potenziale per una lingua di diventare "universale", consentendo le caratteristiche e i paradigmi di molte altre lingue, anche se forse non un linguaggio strettamente progettato a cui potresti pensare.
Per usare l'analogia di Brettmjohnson sopra, l'idea che ogni linguaggio di programmazione sia lo strumento all'interno di una scatola (o su un coltellino svizzero) è il presupposto che tutti stanno facendo, ma è davvero un presupposto imperfetto.
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à in parte. Ad esempio, lingue come Nemerle ti consentono di aggiungere la sintassi alla lingua e, come tale, potresti essere in grado di prendere "la migliore funzionalità dalla lingua X" e aggiungerla a Nemerle (o alla tua). Ciò non significa necessariamente che tu scriva sempre le tue macro: ogni lingua (o paradigma) potrebbe essere definita all'interno di una macro in una libreria standard, in modo tale che tu possa import Haskell; import Prolog;
, e iniziare a scrivere le due lingue come se facesse parte di la tua lingua?
La domanda allora è: come si fa a far funzionare le funzionalità di linguaggi / paradigmi diversi? Anche se non posso rispondere, framework come .Net e JVM offrono alcune soluzioni: i linguaggi sono almeno parzialmente compatibili a causa del modo in cui sono compilati. Puoi prendere qualsiasi codice scritto in C # per esempio e usarlo da F # senza lamentele.
Il "problema" con la soluzione come è oggi, è che l'utilizzo di queste lingue insieme richiede di crearle come progetti separati, che non possono fare riferimento a vicenda - è possibile 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 trampolino di lancio verso la rimozione di quella barriera sarebbe quello di consentire la compilazione di codice di lingue diverse (ad esempio, C # e F #) all'interno dello stesso progetto. In teoria potresti compilare ogni file separatamente (o in gruppi - se hanno tipi parziali o riferimenti circolari), e quindi compilare file di una lingua diversa che possono accedere a quegli oggetti già compilati (CIL). Dovresti definire rigorosamente l'ordine di compilazione per farlo funzionare, ma l'ordine di compilazione è già richiesto nel caso di F #.
Ad ogni modo, non sto dicendo "sicuramente può esserci un linguaggio universale". Sto suggerendo che esiste il potenziale per una migliore interoperabilità tra le lingue rispetto a ciò che esiste attualmente. In realtà, è probabile che non migliorerà molto molto presto, solo a causa dell'enorme quantità di lavoro che serve per implementare un linguaggio e le librerie, gli strumenti ecc. Necessari per usarlo.
Le migliori funzionalità di alcune lingue sono in conflitto con le migliori funzionalità di altre.
Ad esempio: i riflessi consapevoli del tipo sono una caratteristica davvero interessante, ma non varrebbero molto in un linguaggio tipicamente impreciso, ma a volte la digitazione libera può essere un vero vantaggio.
Anche all'interno di una lingua non è sempre possibile utilizzare tutte le migliori funzionalità contemporaneamente perché sono in conflitto tra loro.
"Tuttofare, maestro di nessuno." viene in mente.
Alcuni programmi richiedono velocità, altri grandi quantità di memoria o un rapido accesso al disco. Alcune lingue sono buone in una, ma cattive in un'altra - non credo che avresti una lingua che fosse affatto buona.
Quindi, mentre puoi scrivere praticamente qualsiasi programma in qualsiasi lingua, quello che ottieni non è garantito per essere il "migliore" programma che potresti scrivere per risolvere quel problema.
C'è. Nessuno strumento è il migliore a tutto, ma alcuni strumenti come molti linguaggi di programmazione servono a tutti gli effetti, non migliore a tutti.
Puoi scegliere lo strumento migliore per il lavoro ma ci sono linguaggi di programmazione che possono essere utilizzati a tutti gli scopi e puoi sceglierli. Non lo consiglio ma è possibile.
A causa di qualcosa che chiamo "paradosso di generalizzazione / specializzazione", che probabilmente ha un altro nome e in realtà non è un paradosso
Più un linguaggio di programmazione è generalizzato, più codice ci vuole per realizzare qualcosa. Più la lingua è specializzata, meno puoi farcela.
Le lingue modellano il modo in cui le persone pensano. Questo è vero per le lingue naturali. Se un bambino conosce solo una lingua con i numeri "uno, due, molti", insegnare che la matematica dei bambini è ... difficile. (Mi dispiace, non ho il link) In inglese parliamo di tempi diversi come se fossero luoghi - quindi è possibile immaginare il concetto di viaggio nel tempo. In alcune altre lingue, l'idea del viaggio nel tempo non verrebbe mai in mente ai suoi parlanti.
Questo vale anche per i linguaggi di programmazione.
Quindi se abbiamo un solo linguaggio di programmazione, tutti penseranno esattamente a tutti i compiti di calcolo. Quindi non esploreremo le alternative e il modo migliore per fare qualcosa rimarrà da scoprire.
La cosa più vicina a un linguaggio universale è C. C è molto vicino ai concetti hardware sottostanti (come le cose vengono effettivamente eseguite nell'hardware) e i programmi in ogni linguaggio * sono convertibili in C. (Vedi come CFront ha usato i compilatori C per assemblatore compiti) Il problema con C è fondamentalmente che le conversioni di cui sopra non avrebbero senso dal punto di vista dei programmatori C.
"Lambdas" sono sempre stati possibili in C. La sintassi è disattivata, incluso il codice distribuito su tutto il progetto / file, quindi non è stata una soluzione preferita. Con una versione no-capture / upvalue / etc, definire una funzione altrove e passare un puntatore alla funzione. (vedi qsort () ) Per usare lambdas con valori acquisiti, la quantità e la complessità del codice che devi scrivere aumenta molto - per quanto ne so nessuno ha mai effettivamente scritto il codice per usare questo metodo di programmazione in C. A differenza delle lingue in cui i lambda fanno parte della lingua e sostanzialmente utilizzati ovunque.
La differenza principale tra C e C ++ è il modo in cui puoi chiedere a C ++ di occuparti delle cose per te; ma poi non puoi più vedere, da una sola riga di codice, quanto ti stai chiedendo davvero. La risposta diventa: dipende (da tutto questo altro codice).
Alcuni linguaggi di programmazione sono eccellenti per compiti specifici, ma dove la maggior parte degli attuali programmi in uso nel mondo semplicemente non avrebbe senso se programmati in quel linguaggio. Cioè, se la lingua potesse essere utilizzata per implementare quel programma all'inizio, il che non è un dato di fatto.
L'impossibilità per motivi tecnici di avere un linguaggio universale? Questa è una totale assurdità. si potrebbehanno un linguaggio universale che copre tutte le basi. Il problema è per lo più storico: sono state inventate lingue diverse per fare cose diverse ed essere utilizzate in comunità diverse. Molti di loro sono bloccati. Aggiungi a quelle preferenze (vi! Emacs! Aspetta, volevo dire Java! C #, aspetta intendevo Microsoft, Open Source, ecc. Ecc. Ecc.) E l'incorporamento generale di incidenti storici ... Guarda le lingue naturali in una terra minuscola massa come alcuni paesi europei per vedere quanto può diventare folle questo argomento. Alcune città hanno il loro orgoglio e gioia, un piccolo dialetto di cui 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 "qualcosa" ...
È un errore pensare che "combinare tutte le funzionalità" renderà un linguaggio migliore.
È più probabile che finisca con un casino gonfio, complesso, illeggibile.
Una buona progettazione del linguaggio richiede scelte e compromessi. Probabilmente le lingue migliori / più rivoluzionarie / di maggior successo sono quelle che tirano fuori qualcosa e forniscono un'alternativa migliore piuttosto che aggiungere nuove cose.
Su questo piano si parla molto bene di zio Bob Martin - L'ultimo linguaggio di programmazione
goto
. Ma mi piace il resto della risposta. La cosa principale che fa C è non farti preoccupare esattamente di dove si trovi tutto in memoria e cosa c'è in quale registro in che momento, e nasconde il contatore del programma (in termini di indirizzo preciso in cui si trova, di nuovo. Puoi spostarlo a quasi un livello di assemblaggio di precisione con un goto).
Non esiste uno strumento che abbia tutte le migliori caratteristiche. Ad esempio, una bella funzionalità di Javascript e Scheme è che sono piccole, quindi se inizi a imballare funzionalità, hai già perso questa.
Ancora Cobra sembra promettente nella direzione di avere tutte le belle funzionalità di altre lingue. :-)
Perché se crei una tale lingua, sarà ancora un'altra nuova lingua. Potresti ottenere una vasta base di fan, ma tutte le altre lingue continueranno a esistere.
C esiste ancora anche se molte nuove lingue sono state inventate da allora.
Si potrebbe dire che python è un linguaggio così universale, ma poi c'è anche ruby.
La ragione per cui ci sono molte lingue è semplicemente perché ci sono molti programmatori e alcuni di loro amano creare nuove lingue.
La ragione per cui non esiste un unico linguaggio universale su cui tutti concordano è che la programmazione come arte non è dettata da qualche istituzione che prende tutte le decisioni. Tutti sono liberi di fare ciò che vogliono.
È una buona cosa.
Con tutto ciò che è scritto finora, è difficile aggiungere molte nuove motivazioni, ma ne aggiungerò alcune.
Evoluzione: non sono solo i sistemi biologici che vengono introdotti, mutati e sottoposti a una competizione di sopravvivenza delle risorse più adatta e una nicchia da chiamare propria. La competizione è buona e fa avanzare le cose.
Maturità: creiamo linguaggi informatici probabilmente da 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 Cuneiforme dettato in parte dalle esigenze di intagliare le tavolette d'argilla. Pensa agli alfabeti sanscrito, greco, ebraico, romano e arabo. Geroglifici, il metodo cinese di bella scrittura con oltre 6000 simboli che è condiviso in molti paesi dell'Asia orientale. Pensa a alfabeti misti più moderni con basi fonetiche come cirillico, Katakana e Hirigana. Non sono un linguista, quindi non infiammare le imprecisioni troppo duramente, ma quando le culture di tutto il mondo hanno bisogno di qualcosa, lo creeranno e lo faranno per necessità. I linguaggi informatici arrivarono quando c'erano molte comunicazioni in tutto il mondo e come i sistemi imperiale e metrico, proveniva 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 ++ vengano presto deprecati per Java (o viceversa) perché consentono la generazione di codice nativo, l'accoppiamento stretto / efficiente con l'hardware per la creazione di livelli di astrazione hardware e hanno una base installata considerevole.
Design del design: i linguaggi di programmazione nascono utilizzando paradigmi organizzativi diversi. COBOL e Ada provenivano da comitati che facevano parte del DOD e che avevano molta gerarchia. Se ricordo bene C, C ++, Java, e probabilmente molti altri, provenivano da uno o un numero limitato di designer. Fred Brooks confronta i risultati del comitato con gli approcci basati sul visionario nel suo documento, il 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, sapremmo chi o cosa con quale metodo dovrebbe essere progettato?
Forse un po 'diverso su tutto questo:
Che cos'è una lingua? Per essere ridicolmente semplice, è vocabolario, sintassi e semantica.
Qual è la prima cosa che fai con un linguaggio di programmazione?
Definisci cose - classi, variabili, metodi - estendi il vocabolario e la semantica.
Perché? Quindi ora puoi dire cose che non potresti dire prima.
Piaccia o no, hai creato un nuovo linguaggio per scopi speciali.
IMHO, la cosa da cercare in una lingua per scopi generici è se è facile creare lingue per scopi speciali.
A parte l'argomento coltellino svizzero (che ha un punto - è più difficile progettare un buon linguaggio ad ampio spettro rispetto a un linguaggio specifico del dominio - ma ciò non significa che un tale linguaggio non sia entrambi possibile e una buona idea), ci sono problemi con la "combinazione delle migliori caratteristiche":
In breve, il design del linguaggio è più difficile e più complicato di così. Tuttavia, potresti voler dare un'occhiata a Scala .
Visual Batch è un tentativo di linguaggio di programmazione personalizzabile. Il link seguente mostra come questa interfaccia di programmazione può essere adattata per soddisfare le esigenze di un linguaggio di programmazione universale.
http://sourceforge.net/apps/phpbb/visualbatch/viewtopic.php?f=4&t=4
Esiste un linguaggio di programmazione universale. Si chiama "linguaggio macchina" e tutto in qualsiasi altro linguaggio informatico viene infine eseguito come linguaggio macchina.
Che cosa sembra? Una stringa di 0-9 e AF.
Ma è una cagna da usare. Quindi Alan inventa una lingua che può essere tradotta in linguaggio macchina ed è più adatta a ciò che Alan vuole fare. Bill inventa una lingua diversa per ciò che Bill vuole fare. In poco tempo hai Cobol e Fortran e Lisp e Java. Tutti sono vesioni semplificate del linguaggio macchina, più facili da scrivere su determinati tipi di programmi ma più difficili o impossibili da scrivere su altri tipi di programmi. Uno è buono per la contabilità, un altro è buono per controllare la navetta spaziale.
La maggior parte delle risposte qui si concentra sull'uso dello strumento migliore per ogni problema. Non credo che questo sia un motivo abbastanza buono.
Se guardi alle grandi aziende, di solito l'azienda tenderà a usare un singolo (o un piccolo numero) di lingue e tecnologie, anche se per un progetto specifico c'è un linguaggio migliore.
Questo perché i vantaggi derivanti da una migliore standardizzazione, un supporto più semplice, la condivisione del codice, ecc. Sono (la maggior parte delle volte) maggiori del valore aggiunto di una lingua specifica.
Penso che tutte le risposte "perché non scolpisci statue con una matita" non abbiano ragione.
Chi qui, VERAMENTE seleziona una lingua prima di ogni nuovo progetto?
La verità è che abbiamo solo bisogno di un paio di linguaggi di programmazione, e il mondo della programmazione sarebbe meglio in questo modo: la gente avrebbe concentrarsi sul rendere il linguaggio di scripting meglio, invece di essere sparsi in python / ruby / perl / younameit per esempio.
C # è programmato su / per Windows (va bene, c'è Mono, qualcuno qui esegue un C # sotto l'app Mono ogni giorno?) E questo fa sì che gli utenti acquistino Windows7 / 8, e questo fa soldi per Microsoft.
Altre aziende fanno lo stesso, quindi l'open source lo sa meglio, quindi anche il signor genio ... e abbiamo un sacco di linguaggi simili, è solo la natura egocentrica dell'umanità.
Dobbiamo guardare all'economia per rispondere a questa domanda. Se risparmiasse denaro per avere solo una lingua, l'avremmo. Lo standardizzerebbero e richiederebbero a tutti di usarlo. Le altre lingue languirebbero in polverosi edifici accademici e nei sotterranei di appassionati con gli occhi selvaggi. Ciò non è accaduto, quindi il loro non deve essere un incentivo al profitto in un linguaggio di programmazione universale o uno si sarebbe naturalmente evoluto ormai.