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


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

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

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

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

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

7 133

7 ответов:

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

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

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

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

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

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

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

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

по данным python.org он является переводчиком.

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

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

...

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

...

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

...

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

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

Если ( вы знаете Java ) {

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

} else {

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

}

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

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

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