/dev/random писал(а): ↑21.03.2016 12:36
Проблема в том, что определить истинность большинства упомянутых условий может только jit-компилятор. К примеру, цикл
for i in range(): что если какой-нибудь неизвестный заранее eval'нутый код подменит функцию range()? Причём глобально, в том числе и для скомпилированного кода? Это ведь не ключевое слово, смысл которого фиксирован, а просто идентификатор, которому можно присвоить другое значение. То же с массивами: вы не можете знать заранее, какой код будет с ними работать и какие операции производить. Даже если вы держите список исключительно в локальной переменной и не передаёте его никаким другим функциям (даже len), кто-то может подменить методы класса list. Определить, произошло ли это, можно только в рантайме, а значит, компиляция тоже должна производиться в рантайме.
не согласен
компилятор и должен определять эту ситуацию, когда подменяется код range() или list и генерировать правильный код. а если подмены не происходит, он должен оптимизировать, потому что нерационально компилить в неоптимизированный код без необходимости как это делает cython тот же
наличие в программе eval() можно определить. если есть eval или другой динамический код то должен подключаться рантайм например, если нет то нет
если мы например компилим такой скрипт:
a=[1,2,3,4,5]
print a
здесь заведомо не происходит никакой подмены и это можно это установить путем несложного анализа программы. компилятор создает исполняемый файл либо генерит c++ код из конкретного скрипта
и на выходе если он переводит в c++ должен быть массив типа int и вывод его без подключения рантаймов, jit, питоновских динамических библиотек и прочих костылей
но если с тем же списком в скрипте мы делаем динамические операции вроде вставки элементов, то должен генерироваться уже другой код(динамический список)