# Виды движков выполнения

> Найдите реализацию, поддерживаемые процедуры и данные сравнения для каждого способа выполнения.

Canonical page: https://www.lispex.com/v1.20/ru/docs/reference/runtime-backends

Version check: this file describes v1.20. Fetch https://www.lispex.com/version.json before treating it as the current manual.

Сравните реализации Лиспекса, чтобы исследовать различия в результатах, выводе и диагностике.
Выберите способ сравнения своей программы по таблице реализаций.

Native 1.20.0 включает интерпретатор на Rust и Rust VM.
Для сравнений с LIL и LIT нужны отдельно установленные исполнители, описанные ниже.
Для обычного запуска правил начните с [Лиспекса в вашем приложении](/ru/docs/guides/choosing-runtime).

## Выберите сравнение

| Задача                                             | Вход                            | Необходимые продукты                           |
| -------------------------------------------------- | ------------------------------- | ---------------------------------------------- |
| Сравнить интерпретаторы исходников через `compare` | Исходник и выбранные реализации | Native и установленные исполнители LIL или LIT |
| Сравнить tree и байт-код через `compare-engines`   | Исходник                        | Native                                         |

[Справочник сравнений](/ru/docs/reference/backend-observation-matrix) поможет выбрать отчёт и прочитать его результат.
Сохранение и выполнение байт-кода описаны в разделе [Байт-код и развёртывание](/ru/docs/guides/verified-bytecode).

## Один исходник и два движка

Сохраните эту полную программу как `answer.lspx`.

```lispex
(+ 20 22)
```

Запустите её стандартным интерпретатором Rust.

```sh
lispex answer.lspx
```

**Вывод**

```text
42
```

Теперь выберите виртуальную машину Rust, или VM.
Виртуальная машина выполняет подготовленные инструкции, называемые байткодом.

```sh
lispex run --backend rust --engine vm answer.lspx
```

**Вывод**

```text
42
```

Обе команды завершаются с кодом `0` и не создают файлов.
При выборе VM продукт Native сначала создаёт и проверяет байткод, затем выполняет его.
Стандартный движок `tree` — это интерпретатор, вычисляющий синтаксическое дерево исходника.

<a id="реализации-интерпретатора" />

## Интерпретаторы исходников

LIL — интерпретатор Лиспекса на Лиспексе.
Он реализует собственные чтение, нормализацию и вычисление, работая поверх интерпретатора на Rust.
Его варианты Native и WASM используют один исходник LIL.

LIT — интерпретатор Лиспекса на Топазе.

| Реализация            | Записи процедур            | Доступность                                                       |
| --------------------- | -------------------------- | ----------------------------------------------------------------- |
| Интерпретатор на Rust | 205/205                    | Входит в Native, npm и обычное выполнение в браузере              |
| LIL                   | 205/205                    | Нужны установленный исполнитель и его запись в реестре реализаций |
| LIT                   | См. записи по версиям ниже | Нужны исполнитель от Топаза и его запись в реестре реализаций     |

Native сообщает об установленных продуктах через `lispex backends --json`.
Отсутствующий исполнитель отмечается как недоступный.
Явный запрос LIL или LIT сохраняет этот выбор и сообщает об ошибке, если продукт нельзя запустить.

### Поддержка LIT по версиям контракта

| Запись                                    | Поддерживаемые записи процедур | Значение                                                            |
| ----------------------------------------- | ------------------------------ | ------------------------------------------------------------------- |
| Начальная запись реализации LIT           | 84/205                         | Для остальных 121 записи сообщался статус отсутствия поддержки      |
| Последующий контракт реализации Топаза v7 | 205/205                        | Счётчик `current` в контракте со `status: complete`                 |
| Контракт потребителя в Лиспексе v2        | 204/205                        | Записанная база потребителя со `status: implementation-in-progress` |

Эти записи относятся к разным этапам и потребителям.
База v7 по-прежнему содержит 84, а текущее число равно 205.
Установка Native, установка исполнителя LIT и синхронизация контрактов выполняются отдельно.
Знаменатель обозначает 205 записей реестра встроенных процедур с меткой `profile-required`.
Для сравнения читайте результат поддержки, который сообщает конкретный установленный исполнитель.

<a id="что-выполняет-каждый-движок" />
<a id="core-ir-и-байткод" />

## Реализации байт-кода

Rust VM (`lispex-rust-vm/v1`) входит в Native.
Она выполняет байт-код, который создают фронтенд исходников и компилятор Core IR на Rust.

Core IR — промежуточное представление с разрешёнными ссылками имён.
Native преобразует полный текущий профиль языка в установленный формат `lispex.core-ir/v1` и проверяет его.
При просмотре доступны ячейки переменных, захваченные переменные, хвостовые позиции, требования, координаты исходника и идентификаторы.

Компилятор преобразует проверенный Core IR в `lispex.bytecode/v1`.
Проверка байткода выполняется до создания состояния VM.
Rust VM реализует все 205 записей встроенных процедур.
Для 18 записей, вызывающих пользовательские процедуры, вызовами управляют итеративные машины состояний VM.

<a id="сравнение-выполнений-и-ваучер" />

## Прочитайте результаты и расход ресурсов

Отчёты сравнения записывают результаты, расход ресурсов, сведения об исходнике и производителе в отдельных полях.
Каждый выбранный способ выполнения сохраняет собственные статусы ошибок и ресурсов.
Отчёты записываются атомарно по новому пути.

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

| Сравниваемые продукты | Сопоставимые наблюдения ресурсов |
| --------------------- | -------------------------------- |
| Rust tree и Rust VM   | Байты вывода и завершённые корни |

Интерпретатор tree использует собственную модель глубины.
Сравнение интерпретаторов исходников проверяет исход по ресурсам и наличие всех пяти полей расхода.
При сравнении исходов значения расхода каждой реализации сохраняются отдельно.
Число поддерживаемых процедур и счётчики расхода ресурсов отвечают на разные вопросы.
Определения счётчиков есть в [справочнике ресурсов](/ru/docs/manual/determinism-resources).

### Как определить продукт в сравнении

| Записанные сведения                   | Что они определяют                                                               |
| ------------------------------------- | -------------------------------------------------------------------------------- |
| Реализация среды выполнения           | Семейство интерпретатора и версионированный способ выполнения                    |
| Вызов                                 | Воспроизводимую команду или протокол запросов с разделением на кадры             |
| Идентификатор артефакта               | Точные байты исполняемого файла, WASM и связующего кода                          |
| Сведения об исходнике и производителе | Объявленный исходник и способ сборки продукта                                    |
| Профиль ресурсов                      | Именованные лимиты и записанные счётчики расхода                                 |
| Сравниваемые случаи                   | Точный набор входов, семейство интерпретатора, целевую платформу и вариант хоста |

Эти поля позволяют узнать, какой продукт и какие условия выполнения дали результат сравнения.
Формат инструкций и подробности выполнения описаны в [байткоде и Rust VM](/ru/docs/reference/bytecode-vm).

## Прочитайте прежние записи сравнений

Историческая запись сравнения охватывает 144 именованных случая.
Она указывает использованные исполняемые файлы Rust, LIL и LIT, их профили ресурсов, результаты и повторные выполнения.
Число случаев описывает выполненные входные программы.
Таблицы процедур описывают охват реализации с другим знаменателем.

Храните исходный отчёт вместе с вводом, каталогом, продуктами и инструментами соответствующей версии.
Область исторической записи описана в [Сравнении результатов движков](/ru/docs/reference/backend-observation-matrix).

## Связанные возможности продуктов

Для вызовов из приложения [справочник вычислителей](/ru/docs/reference/bounded-evaluator) описывает отдельные вычислители профиля решений и полного профиля.
Для вычисления доверенного исходника и заданных сравнений из редактора см. [Native MCP](/ru/docs/reference/mcp).

### Скомпилированный Ваучер Лиспекса

Скомпилированный Ваучер Лиспекса использует Rust VM.
Native создаёт связанный с исходником файл `lispex.vouch-compiled-artifact/v1` и аутентифицирует запрос.
Он заново получает Core IR и байткод из точного исходника, выбранного получателем.
Затем записывает текущее согласие tree и Meaning, сравнивает результат проверенной Rust VM и передаёт его локальной проверке допуска.

## Интерактивный вывод в разных продуктах

Native, npm, публичный WASM и Песочница используют одинаковые правила интерактивного вывода.
До вычисления они читают весь исходник и преобразуют сокращения в основные формы.
Затем по порядку показывают явный вывод и значение каждой успешно выполненной формы.

| Завершение                | Вывод и статус                                               |
| ------------------------- | ------------------------------------------------------------ |
| Успех                     | Вывод и значения, статус `0`                                 |
| Обычная ошибка выполнения | Уже полученный вывод предыдущих форм сохраняется, статус `1` |
| Достигнут лимит ресурсов  | Пустой вывод, одна диагностика ресурсов, статус `2`          |

Результаты в браузере содержат `output`, `diagnostics`, `ok` и `exit_status`.
Примеры приведены в [вводе, выводе и разрешениях](/ru/docs/manual/io-capabilities).

Native также предоставляет форматирование и локальную службу MCP для работы с исходниками.
Расширения VS Code и Open VSX передают форматирование документа установленному исполняемому файлу Native.
Через локальный стандартный ввод и вывод MCP предоставляет справочник языка, реестр процедур, вычисление доверенного исходника, диагностику и заданные сравнения движков.
Вычислитель применяет объявленные лимиты байтов и времени.
Команды и результаты перечислены в [справочнике CLI](/ru/docs/reference/cli).
