Зачем Python компилировать исходный код в байт-код перед интерпретацией? - PullRequest
11 голосов
/ 20 мая 2009

Почему Python компилирует исходный код в байт-код перед интерпретацией?

Почему бы не интерпретировать напрямую из источника?

Ответы [ 6 ]

33 голосов
/ 20 мая 2009

Практически ни один интерпретатор действительно не интерпретирует код напрямую , строка за строкой - это просто слишком неэффективно. Почти все интерпретаторы используют некоторое промежуточное представление, которое может быть легко выполнено. Кроме того, небольшая оптимизация может быть выполнена для этого промежуточного кода.

Кроме того, Python хранит этот код, который имеет огромное преимущество для следующего выполнения этого кода: Python больше не должен анализировать код; Парсинг - самая медленная часть процесса компиляции. Таким образом, представление байт-кода существенно снижает накладные расходы на выполнение.

8 голосов
/ 20 мая 2009

Потому что вы можете скомпилировать .pyc один раз и интерпретировать его много раз.

Так что, если вы запускаете скрипт много раз, у вас есть только накладные расходы на разбор исходного кода один раз.

7 голосов
/ 20 мая 2009

Потому что интерпретация из байт-кода напрямую быстрее. Во-первых, это избавляет от необходимости делать лексизм.

6 голосов
/ 20 мая 2009

Повторное лексирование и синтаксический анализ исходного кода снова и снова, вместо того, чтобы делать это только один раз (чаще всего на первом import), очевидно, будет глупой и бессмысленной тратой усилий.

2 голосов
/ 27 июля 2009

Хотя в этом есть небольшой аспект эффективности (вы можете хранить байт-код на диске или в памяти), он в основном инженерный: он позволяет вам отделять синтаксический анализ от интерпретации. Парсеры часто могут быть неприятными существами, полными крайних случаев и вынужденными соответствовать эзотерическим правилам, таким как использование всего необходимого количества просмотров и решение проблем, связанных с уменьшением сдвига. Напротив, интерпретация действительно проста: это просто большой оператор switch, использующий код операции байт-кода.

0 голосов
/ 26 июля 2009

Я очень сомневаюсь, что причина в производительности, хотя это может быть хорошим побочным эффектом. Я бы сказал, что вполне естественно думать, что виртуальная машина, построенная на каком-либо языке ассемблера высокого уровня, будет более практичной, чем поиск и замена текста в некоторой строке исходного кода.

Edit:

Хорошо, ясно, кто когда-либо проголосовал -1 за мой пост, не оставляя разумного комментария для объяснения, очень мало знает о виртуальных машинах (средах выполнения).

http://channel9.msdn.com/shows/Going+Deep/Expert-to-Expert-Erik-Meijer-and-Lars-Bak-Inside-V8-A-Javascript-Virtual-Machine/

...