Интерпретируется ли Python или компилируется, или и то и другое?

в моем понимании:

An понял язык-это язык высокого уровня, который запускается и выполняется интерпретатором (программа, которая преобразует язык высокого уровня в машинный код, а затем выполняется) на ходу; он обрабатывает программу немного за раз.

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

исправьте меня, если мои определения неверны.

теперь, возвращаясь к Python, я немного смущен этим. Везде вы узнаете, что Python является интерпретируемым языком, но он интерпретируется в некоторый промежуточный код (например, байт-код или IL) и не к машинному коду. Так что программа выполняет код чата? Пожалуйста, помогите мне понять, как обрабатывается и запускается скрипт Python.

7 ответов


во-первых, интерпретируется/компилируется не свойство языка, а свойство реализации. Для большинства языков большинство, если не все реализации попадают в одну категорию, поэтому можно сохранить несколько слов о том, что язык интерпретируется/компилируется, но это все еще важное различие, как потому, что это помогает пониманию, так и потому, что существует довольно много языков с полезными реализациями обоих видов (в основном в области функциональных языков, см. Haskell и ML). В кроме того, существуют интерпретаторы и проекты C, которые пытаются скомпилировать подмножество Python в код C или C++ (а затем в машинный код).

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

но чтобы прекратить придираться и ответить на вопрос, который вы хотели задать: практически (читай: используя несколько популярную и зрелую реализацию), Python-это составлен. Не компилируется в машинный код раньше время (т. е. "скомпилировано "ограниченным и неправильным, но, увы, общим определением)," только " скомпилировано в код, но это все еще компиляция, по крайней мере, с некоторыми преимуществами. Например, утверждение a = b.c() компилируется в байтовый поток, который при "разборке" выглядит как load 0 (b); load_str 'c'; get_attr; call_function 0; store 1 (a). Это упрощение, оно на самом деле менее читабельно и немного более низкоуровнево-можно поэкспериментировать со стандартной библиотекой dis модуль и посмотреть, что реально похоже на сделку. Интерпретация этого быстрее, чем интерпретация из представления более высокого уровня.

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


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

интерпретатор Python сначала прочитал человеческий код и оптимизировал его до некоторого непосредственного кода, прежде чем интерпретировать его в машинный код. Вот почему вам всегда нужна другая программа для запуска Python скрипт в отличие от C++ вы можете запускать исполняемый файл напрямую. Например c:\Python27\python - ... exe или / usr/bin / python.


ответ зависит от того, какая реализация python используется. Если вы используете скажем CPython (стандартная реализация python) или языка Jython (предназначен для интеграции с языком программирования java) сначала переводится на код, и в зависимости от реализации python, который вы используете, это bycode направляется на соответствующую виртуальную машину для интерпретации. PVM (Виртуальный Python Машина) для CPython и JVM (виртуальная машина Java) для Jython.

но допустим, вы используете PyPy что является еще одной стандартной реализацией CPython. Он будет использовать Компилятор Just-In-Time.


согласно python.org это переводчик.

https://www.python.org/doc/essays/blurb/

Python-это интерпретируемый, объектно-ориентированный язык программирования высокого уровня...

...

Так как нет шага компиляции ...

...

интерпретатор Python и обширная стандартная библиотека доступный...

...

вместо этого, когда интерпретатор обнаруживает ошибку, он вызывает исключение. Когда программа не перехватывает исключение, интерпретатор печатает трассировку стека.


почти, Мы можем сказать, что Python интерпретируется языком. Но мы используем некоторую часть процесса компиляции one time в python для преобразования полного исходного кода в байт-код, такой как язык java.


If (вы знаете Java ) {

Код Python преобразуется в байт-код, как это делает java.
Этот байт-код выполняется снова каждый раз, когда вы пытаетесь получить к нему доступ.

} else {

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

}


код python, который вы пишете, компилируется в байт-код python, который создает файл с расширением .пыць. Если компилируется, снова возникает вопрос, почему не компилируется язык.

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

вернуться к процесс выполнения, ваш байт-код, присутствующий в файле pyc, созданный на шаге компиляции, затем выполняется соответствующими виртуальными машинами, в нашем случае CPython VM Отметка времени (называемая магическим числом )используется для проверки.файл py изменяется или нет, в зависимости от того, что новый файл pyc создается. Если pyc имеет текущий код, он просто пропускает шаг компиляции.