Если в Python exec и eval были скомпилированы?
Может ли эквивалент eval и exec существовать в скомпилированном языке? Если так, как они будут составлены (грубо говоря)?
2 ответа
Для начала, python - это скомпилированный язык, он просто выполняет компиляцию во время выполнения. При этом все, что вам нужно сделать для реализации eval
в любом другом скомпилированном языке нужно иметь возможность запускать компилятор (и динамически загружать объектный код) - вы можете легко сделать это на Python (и многих других языках), потому что компилятор является неотъемлемой частью среды выполнения. Технически ничто не мешает программе, написанной на C, запускать компилятор и загружать результат во время выполнения (используя dlopen
), это просто не обычное явление, потому что среда выполнения C не требует компилятора, поэтому у большинства пользователей его нет.
Конечно, различные среды Lisp имели такую возможность десятилетиями. Компилятор Lisp обычно работает для каждой отдельной функции, а компилятор и система времени выполнения работают рука об руку.
Когда попросили eval
Что-то, среда выполнения Lisp передаст список (структуру данных) компилятору для компиляции. Компилятор может генерировать машинный код (или, может быть, байт-код, в зависимости от системы), и тогда функция будет вызываться на уровне машины, как и любая другая функция в программе.