Як насправді працює Python Runtime?


26

У мене є деякі проблеми з розумінням поняття a runtime library, особливо з Python. Тож я написав якусь програму привіт світового пітона і маю намір її виконати, тому пишу python ./hello_world.py.

Які дії трапляються між моїм натисканням кнопки Enter і машинним кодом, сформованим з мого коду python, який виконується на моєму процесорі? І як це стосується системи виконання і / або бібліотеки Python?


Ці дві нитки дають чудове уявлення про час виконання Python - Чи інтерпретується Python, чи компілюється, чи обидва? & Чи інтерпретується Python (як Javascript або PHP)? . Бібліотека часу виконання та бібліотека часу не однакові. Зображення його у світі .NET, про який я знаю - Загальна мова виконання (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 інтерпретує байт-код.

Як ваша програма перетворюється в байт-код в першу чергу - це дещо інше питання, але коротка відповідь - "через компіляцію, як і будь-який інший переклад мови".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.