Формат MR

Файл, предназначенный для хранения байт-кода виртуальной машины.

Расширение - mr.

Типы данных

Целые числа хранятся в Little Endian (LE).

Строки в файле хранятся в формате:

  • длина строка (uint32, целое без знака 4 байта)
  • строка (последовательность байт)
  • нулевой байт, входит в длину строки.

Строка не несёт в себе информации о кодировке. За выбор нужной кодировки отвечает работающая со строкой программа.

Каждый массив предваряется его размером - целым числом без знака (uint32). После идут его элементы.

Структура файла

Структура файла представлена в таблице 1.

Таблица 1

Смещение Тип
0x00 MAGIC константа
0x04 Версия
0x06 Главная функция

MAGIC

Константа для идентификации типа файла. Имеет значение 0х1B4D5250 (“\x1bMRP”).

Версия

Два байта подряд 0x8001. Другие значения не встречались.

Функции

Исполнение байт-кода начинается с главной функции. Имя главной функции значения не имеет и обычно совпадает с именем компилируемого файла. Главная функция имеет точно такой же формат что и вложенные в неё.

Функция состоит из следующих секций:

  • строка - имя функции, для главной функции - имя файла. Может быть пустым.

  • uint32 - номер строки на которой функция объявлена

  • uint8 - количество переменных из внешних функций

  • uint8 - количество аргументов функции

  • uint8 - не ноль если количество аргументов может изменяться

  • uint8 - максимальная глубина использования стека

  • Массив номеров строк на которых были операторы этой функции (тип - uint32)

  • Массив локальных переменных
    • строка - имя переменной
    • uint32 - начало области действия
    • uint32 - конец области действия
  • Массив используемых переменных из внешних функций (тип - строка)

  • Массив констант
    • тип константы
      • 00 - nil, значения нет
      • 01 - bool, значение - 1 байт (Истина если не ноль)
      • 03 - int32, значение - 4 байта, целое со знаком
      • 04 - строка, значение - строка
    • значение

  • Массив вложенных функций (тип - функция)

  • Массив байт-кода (тип - uint32)

Байт-код

Младшие 6 бит используются как код оператора, остальные - аргументы.