Нет - конечно, возможно компилировать динамические языки.
Есть даже некоторые динамические языки, которые всегда компилируются по проекту (например, Clojure).
Однако этот вопрос касается важного связанного вопроса: хотя динамические языки могут быть скомпилированы, часто бывает так, что динамические языки не могут быть скомпилированы в код, который является столь же эффективным, как язык со статической типизацией . Это связано с тем, что в динамических языках есть некоторые присущие функции, требующие проверки во время выполнения, которые не нужны в статически скомпилированном языке.
Пример этого: языки, которые допускают исправление объектов во время выполнения (например, Ruby), часто требуют, чтобы объект проверялся (с поиском по хеш-таблице или подобным) всякий раз, когда вы вызываете метод объекта. Даже если это скомпилировано, компилятор должен будет сгенерировать код для поиска метода во время выполнения. В некоторой степени этот метод поиска не отличается от того, что должен делать интерпретатор.
Это добавляет значительную нагрузку по сравнению с вызовом метода в языке, подобном Java, где корректный метод может быть статически определен компилятором из определения класса и сведен к простому вызову функции в нативном коде.
Я полагаю, что этот эффект больше, чем что-либо еще, приводит к тому, что динамические языки в среднем работают медленнее, чем их статически скомпилированные аналоги. Как вы можете видеть из ошибочных тестов , именно статически типизированные языки (C, Java, Fortran и т. Д.), Как правило, быстрее всего работают с динамическими языками (Perl, Python, Ruby, PHP и т. Д.) В нижней части рейтинга.