Как работает Python Runtime?

26

У меня есть некоторые проблемы с пониманием концепции runtime library, особенно Python. Итак, я написал какую-то привет программу на Python и собираюсь ее выполнить, поэтому я пишу python ./hello_world.py.

Какие шаги происходят между нажатием кнопки Enter и машинным кодом, сгенерированным из моего кода Python, выполняемого на моем процессоре? И как это связано с системой времени исполнения Python и / или библиотекой?

hgiesel
источник
Эти два потока дают отличное представление о среде исполнения Python - интерпретируется ли Python или компилируется, или и то, и другое? & Python интерпретируется (как Javascript или PHP)? , Runtime и библиотека времени выполнения не одно и то же. Его отображение в мире .NET, о котором я знаю, - Common Language Runtime (CLR) и Framework / Base Class Library (FCL / BCL) - не одно и то же.
RBT

Ответы:

33

Как бы они ни были разнообразны, существует несколько общих концепций, которые разделяют все серьезные современные языки программирования. Два из них являются основой ответа на ваши вопросы выше.

Какие шаги происходят между нажатием кнопки Enter и машинным кодом, сгенерированным из моего кода Python, выполняемого на моем процессоре?

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

Компилятор начинается с парсера , подпрограммы, которая читает ваш исходный код и применяет к нему синтаксические правила языка, чтобы выяснить, имеет ли он смысл как допустимый код Python (в вашем случае). Если этого не произойдет, синтаксический анализатор выдаст ошибку, и компилятор выйдет из строя, но если это произойдет, синтаксический анализатор выведет то, что известно как Абстрактное синтаксическое дерево, или для краткости AST. AST - это древовидная структура данных, каждый из узлов которой содержит элемент синтаксиса. Например, если вы говорите x = 5, вы можете получить BinaryExpressionузел со operatorзначением =, Leftзначением ReferenceExpression(x)и Rightзначением IntegerLiteralExpression(5). Вся ваша программа может быть представлена ​​таким большим деревом.

Как только синтаксический анализатор создает AST, второй фазой является семантический анализ . На простом английском языке это означает «выяснить, что означает этот AST». Он проверяет AST, чтобы определить, допустили ли вы что-либо незаконное, даже если это допустимый анализ (например, при попытке вызвать функцию с 1 аргументом с 3 аргументами), и выдает ошибки, если вы это делаете. В противном случае он анализирует AST и вносит в него изменения, чтобы сделать его более простым для понимания машиной.

Третий этап - генерация кода. После того, как вы полностью проанализировали, упростили действительный AST, вы подаете его в генератор, который обходит AST и генерирует код на языке вывода. Это ваш готовый продукт.

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

И как это связано с системой времени исполнения Python и / или библиотекой?

Все языки, кроме самых простых, поставляются с набором предопределенных функций, которые важны для большого процента пользователей, и пользователям было бы сложно реализовать их по той или иной причине. Их код может вызывать эти функции без использования сторонних библиотек. (Например, у вас есть Python print, который отправляет вывод stdout. Удачи, реализуя это самостоятельно!) Этот набор функций обычно собирается в разделяемой библиотеке, в которую код может вызываться во время выполнения, поэтому он известен в качестве библиотеки времени выполнения языка, или просто «среда выполнения» для краткости.

Мейсон Уилер
источник
Таким образом, мой код передается другой программе (системе времени исполнения Python), которая делает все это и завершает работу, когда мой код заканчивается (и, конечно, после очистки)?
hgiesel
@hgiesel Я считаю, что в случае с Python интерпретатор является частью среды выполнения. Это не так для каждого языка. конечно, но это довольно распространено среди интерпретируемых языков.
Мейсон Уилер
5

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

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

Килиан Фот
источник