Песочница

Справочник промежуточной формы

Поля отчётов Core IR, правила кодирования, фиксированные идентификаторы, ресурсные пределы и коды завершения команд.

Полные исходники и команды приведены в руководстве Компиляция правила в промежуточную форму.

Прочитайте результат просмотра

Для примера возврата из руководства отчёт содержит следующие поля. Ниже приведён фрагмент JSON-отчёта.

JSON
{
  "requirements": ["explicit-input"],
  "roots": [
    {
      "column": 1,
      "index": 0,
      "line": 1,
      "normalized_core": "(define decide (lambda (days) (if (<= days (quote 30)) (quote refund) (quote review))))"
    },
    {"column": 1, "index": 1, "line": 4, "normalized_core": "(decide input)"}
  ]
}

Корень — выражение верхнего уровня. Первый корень определяет decide. Второй вызывает его с внешним значением input. normalized_core показывает результат преобразования сокращений в основные формы. line и column задают позицию корня в исходнике. Отсчёт начинается с 1.

Поле отчётаЗначение
artifact.source_sha256Идентификатор точных байтов исходника
artifact.core_ir_sha256Идентификатор всего файла Core IR
artifact.countsЧисло корней, узлов, привязок, функций, глобальных переменных и требований
globalsID глобальных ячеек, имена и начальные ID встроенных процедур
requirementsЯвные входные значения, необходимые программе
rootsЧитаемые нормализованные выражения и позиции в исходнике
execution: "not-run"Команда не выполняла правило
authority: "integrity-only"Отчёт описывает целостность файла

Ячейка хранит значение переменной. Привязка связывает переменную с ячейкой. Компилятор читает файл .lpxir. Отчёт просмотра показывает выбранные сведения для разбора.

Фиксированные идентификаторы

ЭлементИдентификатор
Схема файлаlispex.core-ir/v1
Профиль языкаlispex-profile-1.5
Реестр примитивовlispex.primitive-registry/v1
Модель стоимостиlispex.core-ir-cost/v1
Семейство производителяlispex-rust-core-ir/v1
Домен хеша файлаlispex/core-ir-hash/v1
Домен хеша реестраlispex/primitive-registry-hash/v1

Реестр примитивов назначает стабильные числовые ID 205 исполняемым встроенным именам. Нормализатор преобразует сокращения, сохраняя пользовательские привязки имён. Его внутренние операции ссылаются прямо на ID примитивов. Встроенные процедуры, доступные из исходника, используют обычные изменяемые глобальные ячейки с этими начальными ID. Поэтому локальное затенение и переопределение верхнего уровня сохраняют поведение языка.

Что записано в файле

Компилятор читает точный исходник, преобразует сокращения в формы Core, разрешает привязки и замыкания, затем кодирует Core IR.

СведенияНазначение
ID лексических и глобальных ячеекОпределяют переменную по области видимости или глобальному хранилищу
Фиксированные и остальные параметры, let, letrec, внутренние определенияЗаписывают места создания привязок
Перенаправляющие ячейки определенийСвязывают ссылки с определениями, активированными при выполнении
Захваты замыканийСовместно используют изменяемые внешние ячейки, в том числе нужные вложенным функциям
Обычные и хвостовые вызовыСохраняют позиции вызовов, уже определённые Core IR
Контексты нуля, одного и нескольких значенийЗаписывают, сколько значений принимает контекст
guard, исключения, продолжения и dynamic-windЗаписывают структуры управления
Литеральные данные и позицииСохраняют константы и их расположение
Явные требования к вводуУказывают вызывающей стороне нужные внешние значения
ID реестра и модели стоимостиОпределяют встроенные процедуры и ресурсные правила

Читаемое представление восстанавливает нормализованный Core, использованный перед преобразованием в Core IR. Другие реализации среды выполнения записывают собственные идентификаторы и результаты выполнения.

Кодирование и строгое чтение

Каноническое кодирование задаёт единственное байтовое представление всех записанных сведений. Они включают идентификатор исходника и позиции в нём. Поэтому две программы с одинаковым результатом могут иметь разные байты Core IR.

Формат — JSON в UTF-8 с фиксированным порядком полей и массивами с тегами. Он использует минимальную десятичную запись неотрицательных целых, точные строки Unicode и ровно один завершающий LF. Для глобальных переменных, требований, захватов, привязок и функций заданы порядок и непрерывность ID.

Считыватель отклоняет повторные, отсутствующие, неожиданные или переставленные поля. Также отклоняются альтернативная запись чисел и данных, неизвестные теги или ID, оборванные ссылки, неверные захваты и хвостовые позиции. Позиции в исходнике должны быть допустимыми. Лишние байты в конце и любое отличие после повторного кодирования приводят к отказу.

Пределы и идентификаторы файлов

Пределы проверяются до чтения таблиц и выделения памяти.

ЭлементМаксимум
Входной исходник4 MiB
Файл Core IR16 MiB
Узлы выражений100 000
Привязки100 000
Функции100 000
Глобальные переменные100 000
Структурная глубина1 024

source_sha256 идентифицирует точные байты исходника с существующим доменом хеша исходника. core_ir_sha256 идентифицирует весь канонический файл с отдельным доменом хеша. Домен хеша — фиксированный префикс, различающий виды хешируемых данных. Получатель использует эти поля отчёта напрямую.

Команды и коды завершения

Команды предоставляет Native.

КомандаРезультат при успехе
core-ir build с именованным файломФайл и отчёт lispex.core-ir-build/v1
core-ir build --out -Только байты Core IR в stdout
core-ir inspectОтчёт lispex.core-ir-inspection/v1
core-ir validateОтчёт lispex.core-ir-validation/v1 с valid: true
КодЗначение
0Команда выполнена
1Ошибка исходника или проверки
2Ошибка использования
3Достигнут объявленный ресурсный предел, ошибка ввода-вывода или публикации файла

npm, открытый WASM и Песочница выполняют исходники через эталонную среду выполнения. Различия продуктов описаны в Реализациях среды выполнения.

Meaning Graph и Ваучер Лиспекса

Core IR записывает разрешённые ячейки, захваты и хвостовые позиции нормализованного профиля языка. Native переносит эти сведения в Meaning Graph v1 с сохранением идентификаторов.

КомандаФормат и поведение
lower без выбора версииИменной csk.meaning-graph/v0
diff-receiptСуществующий отчёт сравнения v0
lower --graph-version v1csk.meaning-graph/v1 с разрешёнными ссылками из проверенного Core IR
eval-graphВыбирает v0 или v1 по тегу графа
meaning-diffcsk.meaning-differential-report/v1

Ваучер Лиспекса повторно создаёт Core IR из аутентифицированного точного исходника в процессе компиляции. Аутентификация издателя определяет подписанта. Политика получателя определяет доверие. Привязка исходника и ввода определяет запрос. Повторное выполнение даёт текущий результат, а проверка допуска Ваучера записывает локальное решение. Отдельный скомпилированный контейнер описан в справочнике байткода.