Подтвердить что ты не робот

Является ли Python интерпретированным или скомпилированным или тем и другим?

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

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

...

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

...

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

...

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

Ответ 5

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

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

} еще {

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

}

Ответ 6

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

Посмотрите, как это both- компилируется и интерпретируется?

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

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

javac Hello.java ---→ создает файл Hello.class

Здравствуйте, Java ----→ Направление байт-кода в 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.

Ответ 7

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

Ответ 8

С сайта Python: "Python - это понятный и мощный объектно-ориентированный язык программирования, сравнимый с Perl, Ruby, Scheme или Java". Удачи! https://wiki.python.org/moin/BeginnersGuide/Overview

Ответ 9

Python как язык программирования не говорит о том, является ли он скомпилированным или интерпретируемым языком программирования, только о его реализации. Интерпретируемые или скомпилированные термины являются не свойством языка, а свойством реализации. Программа Python запускается непосредственно из исходного кода. Итак, Python попадет под интерпретируемый байт-код. Исходный код .py сначала компилируется в байтовый код как .pyc. Этот байт-код может быть интерпретирован (официальный CPython) или скомпилирован JIT (PyPy). Исходный код Python (.py) может быть скомпилирован с другим байтовым кодом, например, IronPython (.Net) или Jython (JVM). Существует несколько реализаций языка Python. Официальный - интерпретируемый байт-код. Существуют также скомпилированные JIT-реализации байт-кода.

- Python компилируется или интерпретируется?

Ответ 10

Для новичков

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

Запуск скрипта не считается импортом, и .pyc не будет создан.

Например, если у вас есть файл сценария abc.py, который импортирует другой модуль xyz.py, при запуске abc.py будет создан файл xyz.pyc, поскольку xyz импортирован, но файл abc.pyc не будет создан, так как abc. пи не импортируется.

Ответ 11

Python (интерпретатор) скомпилирован.

Доказательство: он даже не скомпилирует ваш код, если он содержит синтаксическую ошибку.

Пример 1:

print("This should print") 
a = 9/0 

Выход:

This should print
Traceback (most recent call last):
  File "p.py", line 2, in <module>
    a = 9/0
ZeroDivisionError: integer division or modulo by zero

Код успешно скомпилирован. Выполняется первая строка (print), броски второй строки ZeroDivisionError (ошибка времени выполнения).

Пример 2:

print("This should not print")
/0         

Вывод:

  File "p.py", line 2
    /0
    ^
SyntaxError: invalid syntax

Заключение: если ваш файл кода содержит SyntaxError, то ничего не будет выполнено, поскольку компиляция не удалась.

Ответ 12

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

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

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