No, ciertamente es posible compilar lenguajes dinámicos.
Incluso hay algunos lenguajes dinámicos que siempre se compilan por diseño (por ejemplo, Clojure).
Sin embargo, la pregunta toca un punto relacionado importante: aunque los lenguajes dinámicos se pueden compilar, a menudo se da el caso de que los idiomas dinámicos no se pueden compilar en un código que sea tan eficiente como un lenguaje tipado estáticamente . Esto se debe a que hay algunas características inherentes a los lenguajes dinámicos que requieren verificaciones de tiempo de ejecución que serían innecesarias en un lenguaje compilado estáticamente.
Un ejemplo de esto: los lenguajes que permiten el parcheo de objetos en tiempo de ejecución (por ejemplo, Ruby) a menudo requieren que el objeto sea inspeccionado (con una búsqueda de tabla hash o similar) cada vez que invocas un método en el objeto. Incluso si esto se compila, el compilador tendrá que generar código para realizar la búsqueda del método en tiempo de ejecución. Hasta cierto punto, esta búsqueda de métodos no es diferente de lo que un intérprete tendría que hacer.
Esto agrega una sobrecarga significativa en comparación con una llamada a un método en un lenguaje como Java, donde el compilador puede determinar estáticamente el método correcto a partir de la definición de clase y reducirlo a una simple llamada a función en código nativo.
Creo que es este efecto, más que cualquier otra cosa, lo que hace que los lenguajes dinámicos tengan un rendimiento más lento en promedio que sus homólogos compilados estáticamente. Como puede ver en los puntos de referencia defectuosos , son los lenguajes estáticamente escritos (C, Java, Fortran, etc.) los que tienden a ser más rápidos con los lenguajes dinámicos (Perl, Python, Ruby, PHP, etc.) en la parte inferior de la clasificación.