Python интерпретируется или компилируется, или и то, и другое? - PullRequest
156 голосов
/ 31 июля 2011

Из моего понимания:

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

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

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

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

Ответы [ 8 ]

195 голосов
/ 31 июля 2011

Во-первых, интерпретируемый / скомпилированный является не свойством языка, а свойством реализации.Для большинства языков большинство, если не все реализации, попадают в одну категорию, поэтому можно было бы сохранить несколько слов, говоря, что язык тоже интерпретируется / компилируется, но это по-прежнему важное различие, как потому, что оно помогает пониманию, так и потому, что языков довольно много.с применимыми реализациями обоих видов (в основном в области функциональных языков, см. 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 module и посмотреть, как выглядит реальная сделка.Интерпретация это быстрее, чем интерпретация из представления более высокого уровня.

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

27 голосов
/ 31 июля 2011

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

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

21 голосов
/ 06 сентября 2016

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

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

9 голосов
/ 24 января 2017

Согласно python.org это интерпретатор.

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

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

...

Поскольку нет этапа компиляции ...

...

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

...

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

3 голосов
/ 02 сентября 2018

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

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

} else {

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

}

2 голосов
/ 10 мая 2019

Да, это как скомпилированный, так и интерпретируемый язык. Тогда почему мы обычно называем его интерпретируемым как томный?

посмотрим, как этоскомпилировано и интерпретировано?

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

В Javaисходный код сначала преобразуется в байт-код с помощью компилятора javac , а затем направляется в JVM (отвечающий за генерацию собственного кода для целей выполнения).Теперь я хочу показать вам, что мы называем Java скомпилированным языком, потому что мы видим, что он действительно компилирует исходный код и передает файл .class (только байт-код) через:

javac Hello.java -------> производит Hello.class file

java Hello --------> Направление байт-кода на JVM для целей выполнения

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

python Hello.py -------> непосредственно выполняет код, и мы можем видеть вывод при условии, что код синтаксически правильный

@ python Hello.py похоже, что он выполняется напрямую, но на самом деле он сначала генерирует байт-код, который интерпретируется интерпретатором для создания собственного кода для целей выполнения.

CPython - берет на себя ответственность за обе компиляциии интерпретация.

Посмотрите на строки ниже, если вам нужно больше деталей :

Как я уже говорил, CPython компилирует исходный код, но фактическую компиляциюпроисходит с помощью cython , затем интерпретация происходит с помощью CPython

Теперь давайте немного поговорим о ролиКомпилятор Just-In-Time в Java и Python

В JVM существует интерпретатор Java, который строка за строкой интерпретирует байт-код, чтобы получить собственный машинный код для целей выполнения, но когда байт-код Java выполняется интерпретаторомвыполнение всегда будет медленнее.Так в чем же решение?Решением является Компилятор Just-In-Time , который создает собственный код, который может быть выполнен гораздо быстрее, чем это может быть интерпретировано.Некоторые поставщики JVM используют Java Interpreter , а некоторые используют Компилятор Just-In-Time .Ссылка: нажмите здесь

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

2 голосов
/ 10 апреля 2013

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

0 голосов
/ 08 ноября 2017

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

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

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

...