Ci sono molte ragioni che possono essere prese in considerazione per scegliere una lingua X piuttosto che una lingua Y. La leggibilità del programma, la facilità di programmazione, la portabilità su molte piattaforme, l'esistenza di buoni ambienti di programmazione possono essere tali ragioni. Tuttavia, prenderò in considerazione solo la velocità di esecuzione richiesta nella domanda. La domanda non sembra considerare, ad esempio, la velocità di sviluppo.
Due lingue possono essere compilate nello stesso bytecode, ma ciò non significa che verrà prodotto lo stesso codice,
In realtà bytecode è solo il codice per una specifica macchina virtuale. Presenta vantaggi ingegneristici, ma non introduce differenze fondamentali con la compilazione diretta per un harware specifico. Quindi potresti anche considerare di confrontare due lingue compilate per l'esecuzione diretta sulla stessa macchina.
Detto questo, il problema della velocità relativa delle lingue è vecchio e risale ai primi compilatori.
Per molti anni, in quei primi tempi, il professionista ha ritenuto che il codice scritto a mano fosse più veloce del codice compilato. In altre parole, il linguaggio macchina era considerato più veloce di linguaggi di alto livello come Cobol o Fortran. Ed era, sia più veloce che solitamente più piccolo. Le lingue di alto livello si sviluppavano ancora perché erano molto più facili da usare per molte persone che non erano scienziati informatici. Il costo dell'utilizzo di linguaggi di alto livello aveva persino un nome: il rapporto di espansione, che poteva riguardare la dimensione del codice generato (un problema molto importante in quei tempi) o il numero di istruzioni effettivamente eseguite. Il concetto era principalmente sperimentale, ma all'inizio il rapporto era maggiore di 1, poiché i compilatori facevano un lavoro abbastanza semplice secondo gli standard odierni.
Quindi il linguaggio macchina era più veloce di quanto dicesse, Fortran.
Naturalmente, questo è cambiato nel corso degli anni, man mano che i compilatori sono diventati più sofisticati, al punto che la programmazione in linguaggio assembly è ora molto rara. Per la maggior parte delle applicazioni, i programmi di linguaggio assembly non competono bene con il codice generato dall'ottimizzazione dei compilatori.
Ciò dimostra che uno dei problemi principali è la qualità dei compilatori disponibili per la lingua considerata, la loro capacità di analizzare il codice sorgente e di ottimizzarlo di conseguenza.
Questa capacità può dipendere in parte dalle caratteristiche del linguaggio per enfatizzare le proprietà strutturali e matematiche della fonte al fine di facilitare il lavoro del compilatore. Ad esempio, un linguaggio potrebbe consentire l'inclusione di dichiarazioni sulle proprietà algebriche delle funzioni definite dall'utente, in modo da consentire al compilatore di utilizzare queste proprietà a fini di ottimizzazione.
Il processo di compilazione può essere più semplice, producendo quindi un codice migliore, quando il paradigma di programmazione del linguaggio è più vicino alle caratteristiche delle macchine che interpreteranno il codice, sia esso reale o virtuale.
Un altro punto è se i paradigmi implementati nella lingua siano chiusi al tipo di problema programmato. È prevedibile che un linguaggio di programmazione specializzato per paradigmi di programmazione specifici compilerà in modo molto efficiente funzionalità correlate a quel paradigma. Quindi la scelta di un linguaggio di programmazione può dipendere, per chiarezza e velocità, dalla scelta di un linguaggio di programmazione adattato al tipo di problema da programmare.
La popolarità di C per la programmazione del sistema è probabilmente dovuta al fatto che C è vicino all'architettura della macchina e che la programmazione del sistema è direttamente correlata a tale architettura.
Alcuni altri problemi verranno programmati più facilmente, con un'esecuzione più rapida utilizzando i linguaggi di programmazione logica e risoluzione dei vincoli .
I sistemi reattivi complessi possono essere programmati in modo molto efficiente con linguaggi di programmazione sincrona specializzati come Esterel che incorpora conoscenze molto specializzate su tali sistemi e genera codice molto veloce.
O per fare un esempio estremo, alcune lingue sono altamente specializzate, come i linguaggi di descrizione della sintassi usati per programmare i parser. Un generatore di parser non è altro che un compilatore per tali lingue. Naturalmente, Turing non è completo, ma questi compilatori sono estremamente utili per la loro specialità: produrre programmi di analisi efficienti. Poiché il dominio della conoscenza è limitato, le tecniche di ottimizzazione possono essere molto specializzate e messe a punto molto finemente. Questi generatori di parser sono di solito molto meglio di ciò che si potrebbe ottenere scrivendo codice in un'altra lingua. Esistono molti linguaggi altamente specializzati con compilatori che producono codice eccellente e veloce per una classe ristretta di problemi.
Pertanto, quando si scrive un sistema di grandi dimensioni, può essere consigliabile non fare affidamento su una sola lingua, ma scegliere la lingua migliore per i diversi componenti del sistema. Ciò, naturalmente, solleva problemi di compatibilità.
Un altro punto che conta spesso è semplicemente l'esistenza di librerie efficienti per gli argomenti programmati.
Infine, la velocità non è l'unico criterio e potrebbe essere in conflitto con altri criteri come la sicurezza del codice (ad esempio in caso di input errato o resilienza agli errori di sistema), uso della memoria, facilità di programmazione (sebbene la compatibilità del paradigma possa effettivamente aiutare ), dimensione del codice oggetto, manutenibilità del programma, ecc.
La velocità non è sempre il parametro più importante. Inoltre, potrebbe essere necessario assumere diverse forme, come la complessità che può essere una complessità media o una complessità peggiore. Inoltre, in un sistema di grandi dimensioni come in un programma più piccolo, ci sono parti in cui la velocità è fondamentale e altre in cui conta poco. E non è sempre facile determinarlo in anticipo.