No - è certamente possibile compilare linguaggi dinamici.
Ci sono persino alcuni linguaggi dinamici che sono sempre compilati per disegno (ad esempio Clojure).
La domanda tuttavia riguarda un importante punto correlato: sebbene i linguaggi dinamici possano essere compilati, è spesso il caso che langauges dinamici non possano essere compilati in codice che sia efficiente come un linguaggio tipizzato staticamente . Questo perché ci sono alcune caratteristiche intrinseche in linguaggi dinamici che richiedono verifiche di runtime che non sarebbero necessarie in una langauge compilata staticamente.
Un esempio: i linguaggi che consentono il runtime degli oggetti (ad es. Ruby) spesso richiedono che l'oggetto venga ispezionato (con una ricerca hashtable o simile) ogni volta che invochi un metodo sull'oggetto. Anche se è compilato, il compilatore dovrà generare codice per eseguire la ricerca del metodo in fase di runtime. In una certa misura questa ricerca del metodo non è dissimile da ciò che un interprete dovrebbe fare.
Ciò aggiunge un sovraccarico significativo rispetto a una chiamata di metodo in una lingua come Java, in cui il metodo corretto può essere determinato staticamente dal compilatore dalla definizione della classe e ridotto a una semplice chiamata di funzione nel codice nativo.
Credo che questo effetto sia più che altro che si traduce in linguaggi dinamici con prestazioni più lente in media rispetto alle loro controparti compilate staticamente. Come puoi vedere dai benchmarks imperfetti , sono le lingue tipizzate staticamente (C, Java, Fortran ecc.) Che tendono ad essere più veloci con i linguaggi dinamici (Perl, Python, Ruby, PHP ecc.) Nella parte inferiore della classifica.