Одна из главных проблем - динамическая типизация. Приведу пример, допустим есть некоторая функция:
def some_function(a):
--if (a == 3):
----return a
--else:
----return "ololo"
а потом:
number = random(какой-то диапазон)
result = some_function(number)
print result
Какой тип имеет result? Строка? Число? Как это понять на этапе компиляции?
Ответ - сложно. В этом заключается смысл динамической типизации - тип определяется на этапе исполнения программы, в этом же кроется и проблема - тип неизвестен. Да, в теории можно пытаться вывести тип из того, что написано в программе, но это довольно трудоемкая задача, разработка компилятора будет крайне сложной.
К слову, языки со статической типизацией могут быть интерпретируемыми (Haskell, например).
Более подробно о типизации:
https://habrahabr.ru/post/161205/
Спасибо за ответ. Как я понял, наоборот, создать интерпретатор для компилируемых языков ничто не мешает?