У меня есть некоторые проблемы с пониманием концепции runtime library
, особенно Python. Итак, я написал какую-то привет программу на Python и собираюсь ее выполнить, поэтому я пишу python ./hello_world.py
.
Какие шаги происходят между нажатием кнопки Enter и машинным кодом, сгенерированным из моего кода Python, выполняемого на моем процессоре? И как это связано с системой времени исполнения Python и / или библиотекой?
Ответы:
Как бы они ни были разнообразны, существует несколько общих концепций, которые разделяют все серьезные современные языки программирования. Два из них являются основой ответа на ваши вопросы выше.
Код анализируется, анализируется и подается в интерпретатор. Это все об очень важной области информатики, известной как теория компиляторов . Компилятор - это программа, которая переводит код с одного языка (ваш исходный код) на другой язык (обычно это машинный код, хотя существуют «транспортеры», которые переводят с одного языка высокого уровня на другой). Это действительно масштабная тема, которую вы могли бы потратить на исследования годами, но вот основная версия:
Компилятор начинается с парсера , подпрограммы, которая читает ваш исходный код и применяет к нему синтаксические правила языка, чтобы выяснить, имеет ли он смысл как допустимый код Python (в вашем случае). Если этого не произойдет, синтаксический анализатор выдаст ошибку, и компилятор выйдет из строя, но если это произойдет, синтаксический анализатор выведет то, что известно как Абстрактное синтаксическое дерево, или для краткости AST. AST - это древовидная структура данных, каждый из узлов которой содержит элемент синтаксиса. Например, если вы говорите
x = 5
, вы можете получитьBinaryExpression
узел соoperator
значением=
,Left
значениемReferenceExpression(x)
иRight
значениемIntegerLiteralExpression(5)
. Вся ваша программа может быть представлена таким большим деревом.Как только синтаксический анализатор создает AST, второй фазой является семантический анализ . На простом английском языке это означает «выяснить, что означает этот AST». Он проверяет AST, чтобы определить, допустили ли вы что-либо незаконное, даже если это допустимый анализ (например, при попытке вызвать функцию с 1 аргументом с 3 аргументами), и выдает ошибки, если вы это делаете. В противном случае он анализирует AST и вносит в него изменения, чтобы сделать его более простым для понимания машиной.
Третий этап - генерация кода. После того, как вы полностью проанализировали, упростили действительный AST, вы подаете его в генератор, который обходит AST и генерирует код на языке вывода. Это ваш готовый продукт.
В Python он использует интерпретатор, а не компилятор. Интерпретатор работает точно так же, как и компилятор, с одним отличием: вместо генерации кода он загружает вывод в память и выполняет его непосредственно в вашей системе. (Точные детали того, как это происходит, могут сильно отличаться в зависимости от языка и разных переводчиков.)
Все языки, кроме самых простых, поставляются с набором предопределенных функций, которые важны для большого процента пользователей, и пользователям было бы сложно реализовать их по той или иной причине. Их код может вызывать эти функции без использования сторонних библиотек. (Например, у вас есть Python
print
, который отправляет выводstdout
. Удачи, реализуя это самостоятельно!) Этот набор функций обычно собирается в разделяемой библиотеке, в которую код может вызываться во время выполнения, поэтому он известен в качестве библиотеки времени выполнения языка, или просто «среда выполнения» для краткости.источник
Стандартная реализация Python - это виртуальная машина с байт-кодом. Это означает, что машинный код (коды операций из набора кодов операций вашего процессора) не генерируется из вашей программы. В опкодах только выбраны из опкодов, которые уже скомпилированы в виртуальную машину , пока VM интерпретирует байты - код.
Как ваша программа в первую очередь превращается в байт-код, это немного другой вопрос, но краткий ответ «через компиляцию, как и любой другой перевод на нисходящий язык».
источник