Из моего понимания:
Интерпретировать язык бег на языке высокого уровня и выполняются переводчиком (программа , которая преобразует язык высокого уровня в машинный код , а затем выполнение) на ходе; он обрабатывает программу постепенно.
Составлен языком является языком высокого уровня, код которого сначала преобразуются в машинный код компилятором (программа , которая преобразует язык высокого уровня в машинный код) , а затем выполняется исполнителем (другая программа для выполнения кода).
Поправь меня, если мои определения неверны.
Возвращаясь к Python, я немного растерялся по этому поводу. Везде вы узнаете, что Python - это интерпретируемый язык, но он интерпретируется как некоторый промежуточный код (например, байт-код или IL), а не как машинный код. Так, какая программа тогда выполняет код IM? Пожалуйста, помогите мне понять, как обрабатывается и выполняется скрипт Python.
источник
Ответы:
Во-первых, интерпретируемый / скомпилированный является не свойством языка, а свойством реализации. Для большинства языков большинство, если не все реализации, попадают в одну категорию, поэтому можно было бы сохранить несколько слов, говоря, что язык также интерпретируется / компилируется, но это по-прежнему важное различие, как потому, что оно помогает пониманию, так и потому, что существует довольно много языков. с полезными реализациями обоих видов (в основном в области функциональных языков, см. 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 .
источник