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

Четверг, 29 марта 2018 года

Распространенный вопрос: “Интерпретируется или компилируется Python?” Обычно спрашивающий имеет в виду простую модель мира. Иэто обычно бывает. Мир оказывается более сложным.
В простой модели мира “компиляция” означает преобразование программы на языке высокого уровня в двоичный исполняемый файл. Полный машинного кода (инструкций процессора). Когда вы компилируете C-программу, это то. Что происходит. Результатом является файл. Который ваша операционная система может запустить для вас.

В простом определении “интерпретируемый”. Выполнение программы означает чтение исходного кода по строке за раз и выполнение того. Что он говорит.

Так работают некоторые оболочки.

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

В Python исходный код компилируется в гораздо более простую форму. Называемую байт-кодом . Эти инструкции похожи по духу на инструкции процессора. Но вместо того. Чтобы выполняться процессором. Они выполняются программным обеспечением. Называемым виртуальной машиной. (Это не виртуальные машины. Которые эмулируют целые операционные системы. А просто упрощенная среда выполнения процессора.)

Вот пример короткой функции Python и ее байт-код:

>>> import dis
>>> def example(x):
...     for i in range(x):
...         print(2 * i)
...
>>> dis.dis(example)
  2           0 SETUP_LOOP              28 (to 30)
              2 LOAD_GLOBAL              0 (range)
              4 LOAD_FAST                0 (x)
              6 CALL_FUNCTION            1
              8 GET_ITER
        >>   10 FOR_ITER                16 (to 28)
             12 STORE_FAST               1 (i)

  3          14 LOAD_GLOBAL              1 (print)
             16 LOAD_CONST               1 (2)
             18 LOAD_FAST                1 (i)
             20 BINARY_MULTIPLY
             22 CALL_FUNCTION            1
             24 POP_TOP
             26 JUMP_ABSOLUTE           10
        >>   28 POP_BLOCK
        >>   30 LOAD_CONST               0 (None)
             32 RETURN_VALUE
>>>

Модуль dis в стандартной библиотеке Python — это дизассемблер. Который может показать вам байт-код Python. Это также лучшая (но не очень хорошая) документация для самого байт-кода.

Если вы хотите узнать больше о том. Как работает байт-код Python. Есть много конференций о байт-коде . Программное обеспечение. Выполняющее байт-код. Может быть написано на любом языке: byterun-это реализация на Python (!). Которая полезна только в качестве учебного упражнения.

Важным аспектом компиляции Python в байт-код является то. Что он полностью неявен. Вы никогда не вызываете компилятор. Вы просто запускаете файл .py. Реализация Python компилирует файлы по мере необходимости. Это отличается. Например, от Java. Где вы должны запустить компилятор Java. Чтобы превратить исходный код Java в скомпилированные файлы классов. По этой причине Java часто называют скомпилированным языком. В то время как Python называют интерпретируемым языком. Но оба компилируются в байт-код. А затем оба выполняют байт-код с программной реализацией виртуальной машины.

Еще одной важной особенностью Python является его интерактивная подсказка. Вы можете ввести операторы Python и немедленно выполнить их. Эта интерактивность обычно отсутствует в “скомпилированных” языках. Но даже в интерактивном приглашении Python ваш Python компилируется в байт-код. А затем байт-код выполняется. Это немедленное выполнение и отсутствие в Python явного шага компиляции-вот почему люди называют исполняемый файл Python “интерпретатором Python

Кстати, даже это упрощенное описание того. Как эти языки могут работать. “Скомпилированные” языки. Такие как Java и C. Могут иметь интерактивные подсказки. Но они не находятся в центре этих миров так же. Как Python. Первоначально Java всегда компилировалась в байт-код. Но затем она впервые применила методы just-in-time (JIT) для компиляции в машинный код во время выполнения. И теперь Java иногда полностью компилируется в машинный код в стиле Си.

Это показывает. Насколько непрочными могут быть слова “интерпретируемый” и “компилируемый”. Как и большинство прилагательных. Применяемых к языкам программирования. Они разбрасываются. Как если бы они были черно-белыми различиями. Но реальность гораздо тоньше и сложнее.

Наконец, то. Как выполняется ваша программа. Вообще не является характеристикой языка: речь идет о языковой реализации. Я говорил здесь о Python. Но это действительно было описание CPython. Обычной реализации Python. Так называемой. Потому что она написана на C. PyPy-это другая реализация. Использующая JIT-компилятор для запуска кода намного быстрее. Чем CPython.

Итак: компилируется ли Python? ДА. Интерпретируется ли Python? ДА. К сожалению. Мир очень сложен…