Файл, предназначенный для хранения байт-кода виртуальной машины.
Расширение - mr.
Целые числа хранятся в Little Endian (LE).
Строки в файле хранятся в формате:
- длина строка (uint32, целое без знака 4 байта)
- строка (последовательность байт)
- нулевой байт, входит в длину строки.
Строка не несёт в себе информации о кодировке. За выбор нужной кодировки отвечает работающая со строкой программа.
Каждый массив предваряется его размером - целым числом без знака (uint32). После идут его элементы.
Структура файла представлена в таблице 1.
| Смещение | Тип |
|---|---|
| 0x00 | MAGIC константа |
| 0x04 | Версия |
| 0x06 | Главная функция |
Константа для идентификации типа файла. Имеет значение 0х1B4D5250 (“\x1bMRP”).
Два байта подряд 0x8001. Другие значения не встречались.
Исполнение байт-кода начинается с главной функции. Имя главной функции значения не имеет и обычно совпадает с именем компилируемого файла. Главная функция имеет точно такой же формат что и вложенные в неё.
Функция состоит из следующих секций:
строка - имя функции, для главной функции - имя файла. Может быть пустым.
uint32 - номер строки на которой функция объявлена
uint8 - количество переменных из внешних функций
uint8 - количество аргументов функции
uint8 - не ноль если количество аргументов может изменяться
uint8 - максимальная глубина использования стека
Массив номеров строк на которых были операторы этой функции (тип - uint32)
- Массив локальных переменных
- строка - имя переменной
- uint32 - начало области действия
- uint32 - конец области действия
Массив используемых переменных из внешних функций (тип - строка)
- Массив констант
- тип константы
- 00 - nil, значения нет
- 01 - bool, значение - 1 байт (Истина если не ноль)
- 03 - int32, значение - 4 байта, целое со знаком
- 04 - строка, значение - строка
значение
Массив вложенных функций (тип - функция)
Массив байт-кода (тип - uint32)
Младшие 6 бит используются как код оператора, остальные - аргументы.