Não - certamente é possível compilar linguagens dinâmicas.
Existem até algumas linguagens dinâmicas que são sempre compiladas pelo design (por exemplo, Clojure).
No entanto, a pergunta aborda um ponto relacionado importante: embora as linguagens dinâmicas possam ser compiladas, geralmente é possível que linguagens dinâmicas não possam ser compiladas em códigos que sejam tão eficientes quanto uma linguagem de tipo estaticamente . Isso ocorre porque existem alguns recursos inerentes às linguagens dinâmicas que requerem verificações em tempo de execução que seriam desnecessárias em um idioma compilado estaticamente.
Um exemplo disso: linguagens que permitem a correção de objetos em tempo de execução (por exemplo, Ruby) geralmente exigem que o objeto seja inspecionado (com uma pesquisa de hashtable ou semelhante) sempre que você invocar um método no objeto. Mesmo que isso seja compilado, o compilador precisará gerar código para fazer a pesquisa do método em tempo de execução. Até certo ponto, essa pesquisa de método não é diferente do que um intérprete teria que fazer.
Isso adiciona uma sobrecarga significativa quando comparado a uma chamada de método em uma linguagem como Java, onde o método correto pode ser determinado estaticamente pelo compilador a partir da definição de classe e reduzido a uma simples chamada de função no código nativo.
Acredito que é esse efeito, mais do que qualquer outra coisa, que resulta em linguagens dinâmicas com desempenho mais lento, em média, do que suas contrapartes estaticamente compiladas. Como você pode ver nos benchmarks falhos , são as linguagens estaticamente tipadas (C, Java, Fortran etc.) que tendem a ser mais rápidas com as linguagens dinâmicas (Perl, Python, Ruby, PHP etc.) na parte inferior do ranking.