it-swarm.it

Perché non può esistere un linguaggio di programmazione "universale" a tutti gli effetti?

perché non combinare le migliori caratteristiche di tutti i linguaggi di programmazione esistenti e inserirle in un linguaggio di programmazione universale?

60
killown

Per lo stesso motivo non usi un coltellino svizzero per intagliare un pollo ...

http://upload.wikimedia.org/wikipedia/commons/thumb/4/48/My_swiss_army_knife.JPG/800px-My_swiss_army_knife.JPG

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 ...

116
David_001

Perché

  1. nessuno vuole riscrivere tutto il codice legacy.
  2. È difficile concordare tutti gli scopi
  3. Una volta messo insieme un elenco completo di scopi, cambieranno prima che tu possa costruirlo.
  4. Qualcuno avrebbe iniziato una lingua completamente diversa a causa di un nuovo scopo.
  5. Microsoft
  6. Apple
  7. Open Source
  8. Cosa faremmo con tutti i pesci Babel?
  9. Non è nemmeno possibile rendere SQL universale.
80
JeffO

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 un host di 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 $ 1B, e devo inviare ingegneri a ogni 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, nessun 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 controllori di volo stanno iniziando a guardare C++, ma anche in un modo molto limitato.

38
Bill Leeper
  1. Vai nel tuo garage (o nel garage dei tuoi genitori).
  2. Apri la cassetta degli attrezzi.
  3. Se vedi più di uno strumento, pensa a come si applica alla tua domanda.

Se non hai una 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 una pinza a giunto scorrevole, goffamente, con danni da lievi a gravi. Ma è abbastanza difficile girare un bullone con una mazza.

24
brettmjohnson

Un diverso tipo di risposta agli altri - Penso davvero che lì sia potenziale che una lingua diventi una "universale", che consenta le caratteristiche e i paradigmi di molte altre lingue, anche se forse non una lingua strettamente progettata a cui potresti pensare.

Per usare 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, se potessi 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 aggiungere a Nemerle (o al tuo). 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 potresti import Haskell; import Prolog; e iniziare a scrivere le due lingue come se fosse parte della 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: le lingue sono almeno parzialmente compatibili a causa del modo in cui sono compilate. 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 l'eliminazione di tale 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.

20
Mark H

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 piacevole, 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 puoi sempre utilizzare tutte le migliori funzionalità contemporaneamente perché sono in conflitto tra loro.

10
Bill

"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 programma "migliore" che potresti scrivere per risolvere quel problema.

7
ChrisF

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 sarebbe mai capita 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 simile 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" erano sempre 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 lambda 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 da usare questo metodo di programmazione in C. A differenza delle lingue in cui i lambda fanno parte del linguaggio e sostanzialmente utilizzati ovunque.

La differenza principale tra C e C++ è come puoi chiedere a C++ di occuparti di 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.

5
MaHuJa

C'è. Nessuno strumento è il migliore per tutto, ma alcuni strumenti come molti linguaggi di programmazione servono a tutti gli effetti, non migliori 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.

4
Maniero

È 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.

  • Linguaggi di programmazione strutturati (C, Pascal) - elimina "goto", sostituisce con procedure e cicli strutturati ecc.
  • Java: elimina la "gestione manuale della memoria", sostituisce con GC/memoria gestita
  • Haskell/Clojure - elimina "stato mutabile incontrollato"
  • LISP: elimina la maggior parte della "sintassi del linguaggio", sostituisce con un albero omoiconico flessibile di espressioni s

Su questo piano si parla molto bene di zio Bob Martin - The Last Programming Language

4
mikera

L'impossibilità per motivi tecnici di avere un linguaggio universale? Questa è una totale assurdità. potrebbe avere 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, intendevo 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" ...

4
Dan Rosenstark

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.

4
Homde

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, 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++ vengano presto deprecati per Java (o viceversa) perché consentono la generazione di codice nativo, un accoppiamento stretto/efficiente con l'hardware per creare l'astrazione dell'hardware livelli 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 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?

0
DeveloperDon

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 le 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.

0
Mike Dunlavey

Non esiste uno strumento che abbia tutte le migliori caratteristiche. Ad esempio, una bella funzionalità di Javascript e Schema è che sono piccole, quindi se inizi a impacchettare le funzionalità, hai già perso questa.

Comunque Cobra sembra promettente nella direzione di avere tutte le funzionalità di Nizza da altre lingue. :-)

0
Andrea

A parte l'argomento coltellino svizzero (che ha un punto - è più difficile progettare un buon linguaggio ad ampio spettro che un dominio- uno specifico - ma ciò non significa che un tale linguaggio non sarebbe sia possibile sia una buona idea), ci sono problemi con "la combinazione delle migliori caratteristiche":

  • Per le caratteristiche del linguaggio, "migliore" è soggettivo, o almeno (interminabile) discutibile.
  • Alcune funzionalità non sono compatibili; una buona caratteristica di una lingua può esplodere se combinata con una buona caratteristica di un'altra.
  • Non abbiamo ancora finito con nuove funzionalità.

In breve, il design del linguaggio è più difficile e più complicato di così. Tuttavia, potresti voler dare un'occhiata a Scala .

0
comingstorm

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.

0
hasen