Результат. Вы сможете назвать четыре маршрута, представляющие собой четыре движка для выполнения одной программы. Вы объясните, каким из них пользовались всё это время, и предскажете, что произойдёт, если запрошенный маршрут недоступен.
Что нужно знать сначала. Вам пригодится умение запускать файл .lspx.
Этот материал вы проходили в уроке Первая программа,
а для этой страницы ничего нового устанавливать не требуется.
Вы уже пользовались одним из маршрутов
Каждый раз, когда вы запускали программу вот так
lispex rule.lspxвы задействовали маршрут дерева. Этот встроенный интерпретатор написан на Rust и читает ваш исходный текст напрямую. Он поставляется внутри обычного продукта Лиспекс в качестве выбора по умолчанию. Он служит эталоном смысла языка, и к нему всегда можно вернуться. Если вы не попробуете ни одного другого маршрута, вы ничего не потеряете. На одном этом маршруте язык полон.
Четыре маршрута
Маршрут не входит в число трёх мест, названных на главной странице. Те три места представляют собой продукты для работы с Лиспексом, и это браузерная Песочница, пакет npm и загружаемая программа. Маршрут обозначает движок, выполняющий вашу программу после того, как вы оказались внутри одного из них. В Песочнице и в пакете npm нет ни виртуальной машины, ни сборки заранее, поэтому они работают на первом маршруте из списка ниже. Загружаемая программа способна использовать любой из четырёх.
Одну и ту же программу могут выполнить четыре движка.
-
Дерево. Встроенный интерпретатор, который читает исходный текст напрямую и сразу вычисляет его. Всегда доступен, подготовка не нужна.
-
Виртуальная машина Rust. Тоже встроена. Виртуальной машиной называют программу, исполняющую заранее подготовленные инструкции вместо исходного текста. Native создаёт такие инструкции из вашего исходного текста, каждый раз записывая их одинаково, и проверяет их перед запуском. Этот маршрут запрашивается явно с помощью
--engine vm. Топаз это отдельный от Лиспекса язык со своим компилятором. Два маршрута ниже заимствуют эти инструменты. Правило Лиспекса записывается на Топазе, а затем выполняется или компилируется стороной Топаза, поэтому здесь заимствуется набор инструментов, а не смешиваются языки. -
Виртуальная машина Топаза. Точная, отдельно установленная виртуальная машина Топаза 5.11 на macOS ARM64. Она не встроена в Native-бинарник. Вы устанавливаете её отдельно и передаёте точный абсолютный путь к продукту нужной команде.
-
Сборка заранее, или AOT. Исполняемый файл, собранный из вашей программы заранее, которому потом не нужны исходники. Для сборки нужны точный установленный компилятор Топаза и каталог инструментов Rust. Готовый продукт затем работает без всякого дерева исходников.
Каждый маршрут реализует один и тот же язык Лиспекс, а не отдельный диалект. Маршруты проектируются так, чтобы сохранять один смысл. Команды сравнения проверяют совпадение наблюдений для одного точного запроса. Одно совпадение не доказывает одинаковое поведение всех программ повсюду.
Два правила честности
Доверие к маршрутам обеспечивают два правила, которые просто сформулировать.
Никакого поиска во время выполнения. Команды выполнения, инвентаризации,
диагностики и сравнения не ищут маршрут в PATH, рабочей копии, переменных
окружения или сети. Внешний маршрут участвует, только когда вы передали его
точное расположение. Отдельная команда routes fetch может получить один
точный официальный сопутствующий продукт, но не выбирает и не запускает его.
Никакой подмены. Если запрошенный маршрут отказал или отсутствует, запуск останавливается с ошибкой. Он никогда не переключается тихо на другой маршрут. Результат с подписью VM Топаза либо создан виртуальной машиной Топаза, либо не создан вовсе.
Оба правила защищают одно и то же. Если запуск удался, вы точно знаете, какой маршрут дал ответ.
Проверка согласия маршрутов
После установки точной виртуальной машины Топаза и сборки соответствующего заранее собранного продукта Native может выполнить один точный запрос на всех четырёх маршрутах и сформировать один диагностический отчёт, который никогда не записывается поверх уже существующего файла.
lispex compare-routes \
--topaz-vm /absolute/tools/lispex-topaz-vm/product \
--aot-product /absolute/products/rule-aot \
--receipt route-comparison.json \
rule.lspxДля работы этой команды необходимы оба точных внешних продукта. Если продукт отсутствует или не соответствует исходнику, сравнение завершается ошибкой, а не сокращается до случайно доступных маршрутов. Отчёт фиксирует наблюдения четырёх маршрутов. Совпадение результатов служит свидетельством только для этих исходника, входа, продуктов и границы ресурсов, а не доказательством эквивалентности повсюду.
Попробуйте сами
Допустим, скрипт коллеги запрашивает маршрут виртуальной машины Топаза, а на машине, где он выполняется, эта машина не установлена. Предскажите, что произойдёт, прежде чем открыть ответ.
Показать ответ
Запуск завершится ошибкой с именем отсутствующего маршрута. Подмены на встроенный интерпретатор не будет, поэтому ответ с неверной подписью появиться не может. Исправление тоже явное. Либо установите точный сопутствующий продукт и передайте его расположение, либо измените скрипт так, чтобы он запрашивал маршрут, который на этой машине действительно есть.
Когда можно двигаться дальше
Вы освоили тему, если можете назвать четыре маршрута, сказать, какой из них работает без подготовки, и сформулировать оба правила честности своими словами.
Когда захотите выбрать маршрут для настоящей работы, продолжите со страницы Выбор способа запуска. Когда захотите установить сопутствующий продукт, следуйте руководству Установка дополнительного движка.