Как бы они ни были разнообразны, существует несколько общих концепций, которые разделяют все серьезные современные языки программирования. Два из них являются основой ответа на ваши вопросы выше.
Какие шаги происходят между нажатием кнопки 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
. Удачи, реализуя это самостоятельно!) Этот набор функций обычно собирается в разделяемой библиотеке, в которую код может вызываться во время выполнения, поэтому он известен в качестве библиотеки времени выполнения языка, или просто «среда выполнения» для краткости.