0

Пытаюсь разобраться в структуре скомпилированного байт-кода CPython.
Допустим, у меня есть файл foo.py следующего содержания:

def hello(name):
    print("Hello, %s" % name)

Скомпилированный __pycache__\foo.cpython-35.pyc выглядит так:

байткод

Дальше что я понял:

  • 16 0d 0d 0a — это магическое число
  • 06 e2 7f 57 — дата последнего изменения
  • 31 00 00 00 — размер файла (должен быть — хотя в файле 216 байт, так что я не знаю, что это за размер на самом деле)
  • следующие 22 байта (e3 00 00 00 ... 00 00 00 73) — не знаю для чего
  • 10 00 00 00 — видимо размер кода модуля (но тогда получается что предыдущий символ должен быть типом, а это 73 — код строкового типа)
  • 64 00 00, 64 01 00LOAD_CONST(0); LOAD_CONST(1),
    где константа 0 — code object функции, константа 1 — её имя ("hello")
  • 84 00 00MAKE_FUNCTION(0), только я так и не понял, зачем нужен аргумент этого опкода
  • 5a 00 00STORE_NAME(0), где имя 0 — имя функции ("hello")
  • 64 02 00 53LOAD_CONST(2); RETURN_VALUE, где константа 2 — None (правда не совсем понятно зачем модулю возвращать что-то)
  • 29 03 — кортеж констант модуля: (, "hello", None)
  • следующие 18 байт (74 00 00 64 ... 64 00 00 53) - код функции hello (тот который hello.__code__.co_code)
  • 29 02 - кортеж констант функции: (None, "Hello, %s")
  • 4e - тип константы NONE
  • 7a 09 - тип строковой константы (SHORT_ASCII) и длина строки "Hello, %s" (9 символов)
  • 48 65 6c 6c 6f 2c 20 25 73 - строка "Hello, %s"
  • 29 01 - кортеж имён функции: ("print",)
  • da 05 - здесь вроде должен быть один из строковых типов, но вместо него несуществующий тип da; 05 - длина строка
  • 70 72 69 6e 74 - имя функции print
  • 29 01 - кортеж имён локальных переменных: ("name",)
  • da 04 - опять неизвестный тип da и длина строки 04
  • 6e 61 6d 65 - имя переменной name
  • a9 00 72 03 00 00 00 - не понял
  • fa 06 - ещё один непонятный тип fa и длина строки 06
  • 66 6f 6f 2e 70 79 - имя файла модуля (foo.py)
  • da 05 - непонятный тип da и длина строки 05
  • 68 65 6c 6c 6f - имя функции hello (правда нет объявления кортежа имён модуля или вроде того)
  • следующие 17 байт (01 00 00 00 ... 00 00 00 4e) - не понял
  • 29 01 - какой-то кортеж длиной в один элемент
  • 72 ... - константа типа ref (что это за тип?)
  • da 08 - снова загадочный типа da и длина строки 08
  • 3c 6d 6f 64 75 6c 65 3e - строка "" (зачем?)
  • 01 ... - дальше не знаю что

Помогите восполнить пробелы. Если бы мне надо было просто узнать значение какой-нибудь константы, то мне бы имеющихся знаний хватило. Но я пытаюсь написать интерпретатор байт-кода Python, так что мне надо полностью разобраться со структурой .pyc-файлов.


Добавить комментарий