Non - il est certainement possible de compiler des langages dynamiques.
Il existe même des langages dynamiques qui sont toujours compilés par conception (par exemple Clojure).
Cependant, la question touche à un point connexe important: bien que les langages dynamiques puissent être compilés, il arrive souvent que les langages dynamiques ne puissent pas être compilés en un code aussi efficace qu'un langage typé statiquement . Cela est dû au fait que certaines fonctionnalités inhérentes aux langages dynamiques nécessitent des vérifications d'exécution qui ne seraient pas nécessaires dans une jauge de langue compilée statiquement.
Un exemple de ceci: les langages qui autorisent l'application de correctifs au moment de l'exécution d'objets (par exemple Ruby) nécessitent souvent que l'objet soit inspecté (avec une recherche de table de hachage ou similaire) chaque fois que vous appelez une méthode sur l'objet. Même si cela est compilé, le compilateur devra générer du code pour effectuer la recherche de méthode lors de l'exécution. Dans une certaine mesure, cette recherche de méthode n'est pas différente de ce que devrait faire un interprète.
Cela ajoute une surcharge importante par rapport à un appel de méthode dans un langage comme Java, où la bonne méthode peut être déterminée statiquement par le compilateur à partir de la définition de classe et réduite à un simple appel de fonction en code natif.
Je crois que c'est cet effet plus que toute autre chose qui fait que les langages dynamiques ont des performances plus lentes en moyenne que leurs homologues compilés statiquement. Comme vous pouvez le voir sur les benchmarks défectueux , ce sont les langages typés statiquement (C, Java, Fortran, etc.) qui ont tendance à être les plus rapides avec les langages dynamiques (Perl, Python, Ruby, PHP, etc.) en bas du classement.