Innanzitutto, un chiarimento, Java non è completamente compilato staticamente e collegato nel modo C ++. Viene compilato in bytecode, che viene quindi interpretato da una JVM. JVM può eseguire compilazioni just-in-time nel linguaggio macchina nativo, ma non è necessario.
Più precisamente: penso che l'interattività sia la principale differenza pratica. Poiché tutto viene interpretato, puoi prendere un piccolo estratto di codice, analizzarlo ed eseguirlo sullo stato corrente dell'ambiente. Pertanto, se avessi già eseguito codice che inizializzava una variabile, avresti accesso a quella variabile, ecc. Si presta davvero modo a cose come lo stile funzionale.
L'interpretazione, tuttavia, costa molto, specialmente quando si dispone di un sistema di grandi dimensioni con molti riferimenti e contesto. Per definizione, è dispendioso perché potrebbe essere necessario interpretare e ottimizzare due volte lo stesso codice (anche se la maggior parte dei runtime ha una certa memorizzazione nella cache e ottimizzazioni). Tuttavia, si paga un costo di runtime e spesso è necessario un ambiente di runtime. È anche meno probabile vedere complesse ottimizzazioni interprocedurali perché attualmente le loro prestazioni non sono sufficientemente interattive.
Pertanto, per i sistemi di grandi dimensioni che non cambieranno molto, e per alcune lingue, ha più senso precompilare e prelink tutto, fare tutte le ottimizzazioni che puoi fare. Ciò si traduce in un runtime molto snello che è già ottimizzato per la macchina target.
Per quanto riguarda la generazione di eseguibili, questo ha poco a che fare con questo, IMHO. È spesso possibile creare un eseguibile da una lingua compilata. Ma puoi anche creare un eseguibile da un linguaggio interpretato, tranne per il fatto che l'interprete e il runtime sono già impacchettati nell'esecuibile e nascosti da te. Ciò significa che generalmente pagherai comunque i costi di runtime (anche se sono sicuro che per alcune lingue ci sono modi per tradurre tutto in un eseguibile ad albero).
Non sono d'accordo sul fatto che tutte le lingue possano essere rese interattive. Alcuni linguaggi, come C, sono così legati alla macchina e all'intera struttura dei collegamenti che non sono sicuro che tu possa costruire una versione interattiva a pieno titolo significativa