Песочница

Среды выполнения и интерпретаторы

Rust остаётся эталоном с tree и явным VM-движком, а Rust, LIL и LIT остаются fail-closed семействами на своих заявленных поверхностях.

Три семейства

  • Rust — операционный эталон языка с 205 из 205 отслеживаемых строк примитивных возможностей. Native, npm, открытый WASM и Песочница — разные поверхности поставки одной реализации.
  • LIL — интерпретатор, написанный на самом Лиспексе. Он поддерживает все 205 строк текущих примитивных возможностей.
  • LIT — транслитерация интерпретатора на Топаз. Она отдельно поддерживает 84 из 205 строк и отвергает 121. Независимость исходного кода не заявляется.

Вычислитель использует явные исходы, сигналы и трамплин вместо раскрутки исключений среды. После точного восстановления изображения обычные чтение и вычисление не меняются; выбор LIL или LIT остаётся обычным выбором интерпретатора.

Требование языка и поддержка интерпретатора — не одно и то же

Текущий контракт языка содержит 205 обязательных строк возможностей. Все они имеют нормативную пометку profile-required. Она описывает цель полного интерпретатора, а не выдаёт частичную реализацию за готовую.

СемействоПоддерживается сейчасЗа границей поддержки
эталон Rust205/205весь текущий профиль
LIL205/205весь текущий знаменатель возможностей
LIT84/205остальные 121 строка отвергается явно

Форматирование исходника — инструмент Native

lispex fmt, fmt --check и fmt --write доступны в Native CLI. Расширение VS Code/Open VSX передаёт Format Document установленному бинарнику. npm, публичный WASM и Песочница форматирование не предоставляют, а расширение не скрывает отсутствие Native через fallback. Форматтер меняет только пробельное окружение исходника; это не вычислитель, семейство бэкенда, семантический профиль или источник evidence.

Core IR, байткод и семейство бэкенда — разные оси

Native может понизить весь текущий нормализованный профиль в канонический lispex.core-ir/v1, строго проверить эти байты и показать разрешённые ячейки, захваты, хвостовые позиции, requirements, координаты исходника и идентификаторы. Команды core-ir build, validate и inspect всегда указывают, что выполнение не производилось, а граница равна integrity-only.

Затем Native компилирует строгий Core IR в канонический lispex.bytecode/v1, проверяет бинарный артефакт до создания состояния и исполняет его в lispex-rust-vm/v1. VM непосредственно охватывает текущий профиль: все 205 строк примитивов и 18 строк с вызовом гостевых процедур. Стандартным Rust-движком остаётся tree; --engine vm выбирается явно и не имеет fallback.

Native macOS ARM64 может передать те же проверенные байты точному отдельно установленному lispex-topaz-vm/v1. У маршрута собственные reader, verifier и машина явного управления на Topaz. Допускается только фиксированный продукт Topaz 5.11 с закрытыми request/result, полным счётчиком u64, ограниченным запуском и пятью нулевыми fallback. compare-vms записывает обе VM, не делая Topaz стандартным движком или движком Vouch.

В Native для macOS ARM64 можно также сгенерировать читаемый статический граф Topaz, скомпилировать его только точной установленной цепочкой Topaz 5.11 и установить закрытый AOT-продукт без исходников. aot inspect и validate ничего не выполняют, а aot run ничего не компилирует. Продукт, source map, артефакт, исполняемый файл, вход, полноразрядные ресурсы u64, наблюдения и пять нулевых fallback связаны; маршрут исключён из всех конструкторов Vouch.

compare-routes помещает эти явные маршруты в один суд, не смешивая identity. Он один раз выводит исходник, Core IR и байткод, проверяет соответствие AOT, затем без повторов запускает tree, Rust VM, Topaz VM и AOT. Неперезаписываемая квитанция сравнивает семантику и только действительно сопоставимые ресурсы; отсутствующие у tree счётчики остаются отсутствующими. Это локальная диагностика, а не новое семейство бэкенда или вход Vouch.

ПоверхностьCore IRБайткод и VMCompiled Vouch
Nativebuild, строгий validate, inspectвстроенная Rust VM на всех платформах; точная Topaz VM, source-free AOT build/inspect/validate/run и явный суд четырёх маршрутов на macOS ARM64build/inspect/validate .lpxvca, tree/Meaning/Rust-VM re-execution и gate; Topaz VM, AOT и квитанция сравнения исключены
npm CLIнет reader и команднет reader, verifier и VMнет команды, флага или повышения отчёта
открытый WASMнет API Core IRнет API байткода и VMнет API
Песочницанет импорта и inspection Core IRнет импорта байткода и VMнет UI или API

Core IR — невыполняемый материал смысла, а проверенный байткод — исполняемый артефакт VM. Tree и Rust VM разделяют значения и листья примитивов. Исходник Topaz VM структурно отделён, но скомпилирован Topaz Rust Stage 0, поэтому линия VM указывается явно и не увеличивает молча число семейств исторической квитанции. Там остаются Rust, LIL и LIT. Meaning Graph остаётся отдельным путём проверяемого подмножества.

Compiled Vouch не добавляет семейство бэкенда. Только специальный контейнер, точно заново выведенный из закреплённого потребителем исходника после аутентификации, допускается к сравнению с текущей Rust VM. Обычный байткод и отчёты остаются вне пути полномочий.

Явный выбор LIL или LIT строг: неподдерживаемая операция не передаётся скрыто в Rust или удобную функцию host. Поэтому частичные интерпретаторы полезны для проверки, но не маскируются под полные.

LIL сам выполняет всё семейство составных селекторов пар от caar до cddddr. Например, (caddr x) равнозначно (car (cdr (cdr x))). Композиция вычисляется внутри LIL, а не передаётся callback-функции host.

LIL также составляет abs, square, три предиката знака/нуля и типизированные boolean=? и symbol=? из уже допущенных числовых, сравнительных и типовых операций. Например, (abs -3/2) возвращает 3/2, а (boolean=? #t #t #f)#f. Проверка операндов и ошибки совпадают с эталоном Rust.

В текущем профиле конечных вещественных чисел complex?, rational? и real? сводятся к общему вопросу number? для любого значения. LIL также сам выполняет структурный !=, основанный на eqv поиск memv, структурный assoc и основанные на eqv assq/assv. Например, (memv 2 '(1 2 3)) возвращает хвост (2 3), а (assoc '(a b) '(((a b) . ok))) — найденную пару.

LIL реализует char<?, char<=?, char>?, char>=? по Unicode scalar value, а string<?, string<=?, string>?, string>=? — лексикографически по этим значениям. Поэтому (char<? #\a #\b) и (string<? "a" "aa" "b") истинны. Это детерминированный порядок code point, а не locale collation, нормализация или сравнение без учёта регистра.

LIL также сам выполняет повседневную навигацию по агрегатам и преобразования. list-copy создаёт новый неглубокий каркас пар, list-ref и nth выбирают элемент, а list-tail возвращает хвост с общей структурой. make-list по умолчанию заполняет список значением 0, а make-string — пробелом. Диапазоны string->vector и vector->string считаются в символах, а не в байтах, поэтому (vector->string (string->vector "aλ🙂")) возвращает тот же текст. Полученный вектор новый и изменяемый.

Операции регистра Unicode используют явно записанное ядро символов и строк host. Оно покрывает char-ci<? и остальные сравнения char-ci, char-lower-case?, char-upper-case?, char-whitespace?, char-upcase, char-downcase, char-foldcase, string-ci<? и остальные порядковые сравнения string-ci, string-upcase, string-downcase и string-foldcase. Преобразование символа применяет simple mapping и возвращает один символ; строка использует full mapping и может изменить длину, например (string-upcase "Straße") даёт "STRASSE". Сравнение без учёта регистра сначала проверяет всю цепочку. В текущем профиле foldcase — это приближение через lowercase: simple для символов и full для строк, а не полная таблица Unicode CaseFolding. Locale collation и нормализация не выполняются.

В LIL также доступны повседневные скалярные числовые операции. floor, ceiling и truncate округляют в указанном направлении, а round отправляет точную половину к ближайшему чётному целому. Exactness входа сохраняется: (floor 1.8) даёт 1.0, а (floor 9/5)1. exact и inexact->exact восстанавливают точное двоичное значение конечного inexact числа, поэтому (exact 0.5) даёт точное dyadic-значение 1/2, а не результат разбора десятичного текста. inexact и exact->inexact выполняют обратное преобразование. even? и odd? требуют целое. min и max точно сравнивают смешанные exact/inexact значения, при равенстве сохраняют первый операнд и возвращают inexact-результат, если хотя бы один вход был inexact. Проверка аргументов и свёртки min/max принадлежат LIL; округление, преобразование exactness и чётность используют явно записанное числовое ядро host, а не скрытый fallback или независимую реализацию.

Семейство точных целочисленных операций не переводит смешанную пару целых в binary64 до вычисления результата. quotient/remainder усекают к нулю, а floor-quotient/floor-remainder округляют к минус бесконечности. Поэтому (remainder -7 3) даёт -1, а (modulo -7 3)2. floor/ и truncate-quotient/truncate-remainder явно выбирают два компонента усечённого деления, а floor/ и truncate/ возвращают частное и остаток как два значения: (call-with-values (lambda () (floor/ -7 3)) list) даёт (-3 2). gcd и lcm — неотрицательные вариативные свёртки с единицами 0 и 1; любой inexact-операнд делает итог inexact. expt разрешает только точный целый показатель, поэтому общее трансцендентное возведение в степень остаётся вне профиля. exact-integer-sqrt возвращает нижний корень и остаток как два точных значения. Деление и евклидовы свёртки написаны на Лиспексе; только expt и exact-integer-sqrt используют объявленное расширенное числовое ядро host.

Поверхность процедур высшего порядка для коллекций теперь полностью доступна в LIL. all? и any? используют строгий boolean и короткое замыкание; map, filter, reduce, fold-left и fold-right требуют ровно одно значение callback. for-each, string-for-each и vector-for-each отбрасывают любое число значений и возвращают ноль. string-map и vector-map сохраняют вид коллекции. Строки и векторы копируются до первого вызова. Каждый callback проходит через гостевой кадр продолжения, поэтому обработчики, одноразовые выходы и учёт ресурсов остаются в машине LIL, а не в callback среды.

Четыре процедуры вывода LIL — display, write, newline и println — используют те же канонические гостевые renderer и ограниченный private effect sink. Явный вывод и автопечать CLI сохраняют общий порядок stdout, но проекция корневых значений записывается отдельно, поэтому произвольный текст display нельзя принять за результат. Вывод не попадает в stdout host, а последующая ошибка не стирает уже записанные байты.

Три устаревающих совместимых имени реализованы без расширения профиля. % передаёт работу modulo, а list-first и list-restcar и cdr. LIL записывает W330/W331 так же, как Rust: один раз на место вызова, в порядке первого появления. Перекрытое имя не предупреждает; предупреждение сохраняется и при последующей ошибке канонической операции. Этот упорядоченный канал отделён от stdout, значений и диагностики ошибки.

Что обязан объявить исполнитель

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

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

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

Native предоставляет полный путь Vouch: идентификаторы, политику, выдачу, аутентификацию, повторное выполнение, локальный gate и явное согласие VM с артефактом из точного исходника. npm использует общий Rust для идентификаторов, политики и аутентификации, но не читает compiled artifact, не выдаёт и не применяет решение. WASM и Песочница выполняют Лиспекс и работают с точными изображениями без инструментов доверия Vouch.

Частая ошибка

Сгенерированный Rust, Python, веб-маршрут или другая упаковка одного исходника не становится новой реализацией. Четыре маршрута LIT могут подтвердить согласие поставки на своей поверхности, но не являются четырьмя свидетелями.

Куда дальше

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

Байткод и Rust VM · Матрица наблюдений · Выбор среды