Работа Python изнутри
@Pycoders
Для успешного программирование этого всего знать не обязательно, но иногда полезно понимать, что и как работает.
Различие компиляторов и интерпретаторов
Сейчас не будем вникать в особенности разных языков, просто поймем основную разницу между ними.
Компиляторы принимают на вход код на каком-либо языке программирования и выдают уже машинный код, который уже можно непосредственно запускать.
Интерпретаторы в свою очередь выполняют программный код сразу на ходу, поочередено.
Байт-код и машинный код
Для начала стоит знать, что реализаций пайтона огромное количество, но мы разберем эталонную - CPython. Скорее всего, именно она у вас и установлена.
CPython является интерпретатором байт-кода на C (Си - язык программирования).
Допустим, мы запсукаем обычную программу. В это время CPython прверащает код в так называемый байт-код, который он сам же потом исполняет, давая команды процессору.
Важно понимать, машинный код и байт-код - разные понятия. Машинный код исполняет сам компьютер, а байт-код виртуальная машина. ВМ работает как процессор компьютера, но понимает только свой язык. По факту, виртуальная машина - посредник между байт-кодом и процессором вашего компьютера.
Машинный код работает быстрее за счет того, что нет посредника в виде абстракции процессора. Плюсом байт-кода является кроссплатформенность.
В принципе, это всё, что следует знать о работе пайтона. Дальше - дебри.
Суть работы CPython
При выполнении программы запускается бинарник Пайтона, инициализируется стандартная библиотека C (это происходит при запуске практически любого процесса), вызывается main-функция (смотрите исходники ./Modules/python.c: main, из которой вызывается ./Modules/main.c: Py_Main). После некоторых подготовительных шагов (разбор аргументов, учёт переменных окружения, оценка ситуации со стандартными потоками и т.д.), вызывается ./Python/pythonrun.c: Py_Initialize.
По большому счёту, в этой функции «создаются» и собираются части, необходимые для запуска CPython-машины, и просто «процесс» превращается в «процесс с интерпретатором Питона внутри». Помимо этого, создаются две очень важные структуры: состояния интерпретатора и состояния потока. Также, инициализируется встроенный модуль sys и модуль, в котором содержатся все встроенные функции и переменные.
Не вижу смысла подробно всё описывать здесь, поэтому оставлю ссылки на статьи, где всё описывается макимально подробно:
https://habr.com/company/buruki/blog/189972/
https://habr.com/company/buruki/blog/189986/
https://habr.com/company/buruki/blog/190336/
https://habr.com/company/buruki/blog/191032/