Почему Python компилирует исходный код в байт-код перед интерпретацией?
Почему бы не интерпретировать напрямую из источника?
Почему Python компилирует исходный код в байт-код перед интерпретацией?
Почему бы не интерпретировать напрямую из источника?
Практически ни один интерпретатор не интерпретирует код напрямую, строка за строкой - это просто слишком неэффективно. Почти все интерпретаторы используют какое-то промежуточное представление, которое может быть легко выполнено. Кроме того, в этом промежуточном коде можно выполнить небольшую оптимизацию.
Python, кроме того, сохраняет этот код, что дает огромное преимущество для следующего выполнения этого кода: Python больше не нужно анализировать код; синтаксический анализ - самая медленная часть процесса компиляции. Таким образом, представление байт-кода значительно снижает накладные расходы на выполнение.
Потому что вы можете скомпилировать .pyc
один раз и много раз интерпретировать из него.
Так что, если вы запускаете сценарий много раз, у вас есть только накладные расходы на разбор исходного кода.
Потому что интерпретация напрямую из байт-кода выполняется быстрее. Во-первых, это позволяет избежать лексирования.
Повторная лексика и синтаксический анализ исходного кода снова и снова, вместо того, чтобы делать это только один раз (чаще всего в первый import
), очевидно, были бы глупой и бессмысленной тратой усилий.
Хотя в нем есть небольшой аспект эффективности (вы можете хранить байт-код на диске или в памяти), это в основном инженерный: он позволяет вам отделить синтаксический анализ от интерпретации. Синтаксические анализаторы часто могут быть отвратительными созданиями, полными крайних случаев и вынужденными подчиняться эзотерическим правилам, таким как использование только правильного количества предвидения и решение проблем с уменьшением сдвига. Напротив, интерпретация действительно проста: это просто большой оператор switch, использующий код операции байт-кода.
Я очень сомневаюсь, что причина в производительности, хотя это и приятный побочный эффект. Я бы сказал, что вполне естественно думать, что виртуальная машина, построенная на каком-то высокоуровневом языке ассемблера, будет более практичной, чем поиск и замена текста в некоторой строке исходного кода.
Редактировать:
Хорошо, ясно, кто когда-либо голосовал за мой пост, не оставляя разумного комментария для объяснения, очень мало знает о виртуальных машинах (средах выполнения).