Архитектура
Обзор архитектуры и основных концепций Крестьянство Среда Волнового Фронта.
Живое демо: wavefront.krestianstvo.org
Исходный код: github.com/NikolaySuslov/krestianstvo-wavefront-evaluator
Введение
Заголовок раздела «Введение»Эвалюатор волнового фронта — не просто умный способ синхронизировать аватары; он глубоко укоренён в вычислительной физике и аппаратной архитектуре. Он имитирует то, как информация естественно распространяется через пространство-время.
Связь с физикой
Заголовок раздела «Связь с физикой»Эвалюатор волнового фронта — это по сути «физический движок для информации». Он заменяет «линейный список» стандартного программирования законами классической механики и распространения волн.
Распространение волнового фронта. Каждая точка волнового фронта действует как источник вторичных волн. Каждый узел, получающий сообщение, становится «источником», который может генерировать новые сообщения (волны) для других узлов.
Причинность и световой конус. Каждый узел имеет локальную очередь. Сообщение может влиять только на будущее состояние. Это сохраняет причинность — эффект никогда не происходит до причины.
| Концепция | Физический эквивалент | Реализация волнового фронта |
|---|---|---|
| Пульс | Универсальное время | Сердцебиение рефлектора |
| Очередь узла | Состояние локальной частицы | W.reduce локальный _Q |
| Микротик | Взаимодействие частиц | «Дренаж» / Цикл обратной связи |
| Стабильность | Тепловое равновесие | Когда все очереди пусты |
Формула системы:
S(t+1) = Стабильность ( Дренаж ( Пульс(t) + S(t) ) )Где S = Состояние Вселенной, Пульс = «Энергия», инжектированная рефлектором, Дренаж = «Работа», выполняемая узлами, Стабильность = «Состояние наименьшей энергии».
От виртуальной машины к эвалюатору волнового фронта
Заголовок раздела «От виртуальной машины к эвалюатору волнового фронта»| Измерение | Krestianstvo VM | Крестьянство Среда Волнового Фронта |
|---|---|---|
| Очередь сообщений | Централизованная — одна общая очередь | Децентрализованная — каждый узел имеет свою локальную очередь |
| Авторитет времени | Часы VM управляют всеми узлами равномерно | Двухслойное время: общий логический пульс + локальный микротик |
| Причинность | Обеспечивается упорядочением очереди на уровне VM | Возникает из распространения волнового фронта |
| Обнаружение стабильности | Флаг на уровне VM | W.stable() проверяется после каждого вызова evaluate |
| Автономная работа | Требует рефлектора | Локальные резервные часы через makeMeta.startAutonomous() |
Основной словарь
Заголовок раздела «Основной словарь»Чистое логическое время
Заголовок раздела «Чистое логическое время»Всё время логическое — нет Date.now(), нет зависимости от настенных часов в модели. Рефлектор штампует каждый пульс:
logicalTime = lt (счётчик тиков, увеличивается на 1 за пульс)wallTime = lt (чистый счётчик тиков — 1 логическая единица за тик)Планирование будущих событий
Заголовок раздела «Планирование будущих событий»ctx.future(delay, msg, payload) планирует msg, когда wallTime >= currentWallTime + delay:
future(1) → следующий тик рефлектораfuture(0.5) → субтик: срабатывает в текущем дренажном проходеfuture(0.001) → субтик: срабатывает немедленно в дренажеfuture(60) → через 60 тиковПульс — фундаментальная единица общего времени, производимая внешним рефлектором и доставляемая всем участникам.
Волна — полный жизненный цикл вычислений, запущенных одним логическим пульсом. Волна начинается, когда пульс приходит в мир, и заканчивается, когда мир достигает стабильности.
Волновой фронт
Заголовок раздела «Волновой фронт»Волновой фронт — распространяющаяся граница устоявшихся вычислений внутри волны.
Варп (Warp)
Заголовок раздела «Варп (Warp)»Warp обрабатывает случай, когда новый общий пульс приходит с logicalTime > lastLT + 1 — участник пропустил один или несколько пульсов.
Дренаж исчерпывает все готовые записи очереди внутри микрофазы.
Стабильность
Заголовок раздела «Стабильность»Мир стабилен, когда выполняются три условия:
- Все очереди узлов содержат только записи с
fireAt > wallTime - Ни один узел не находится в середине цикла обратной связи
- Общий исходящий ящик пуст
Слои архитектуры
Заголовок раздела «Слои архитектуры»┌─────────────────────────────────────────────────────┐│ Рефлектор ││ Штампует пульс один раз. Доставляет всем. │└────────────────────┬────────────────────────────────┘ │ pulse { lt, wallTime=lt }┌────────────────────▼────────────────────────────────┐│ Мета-программа ││ Оркестрирует миры. Управляет волновым фронтом. ││ Warp · Дренаж · Проверка стабильности · UI-синхр. │└────────────────────┬────────────────────────────────┘ │ registerEvent / evaluate┌────────────────────▼────────────────────────────────┐│ Мир (ProgramState) ││ Хостит W-узлы: Behaviors.collect + W.reduce │└────────────────────┬────────────────────────────────┘ │ handler(state, payload, ctx)┌────────────────────▼────────────────────────────────┐│ W.reduce(state, pulse, nodeId, handlers) ││ ctx: future · send · feedback · futureInf ││ localReflector │└─────────────────────────────────────────────────────┘Мета-программа
Заголовок раздела «Мета-программа»META_PROGRAM — программа Renkon, работающая выше программ мира. Для каждого пульса × мира по порядку:
- WARP — срабатывает только когда участник пропустил тики и предыдущий тик не устоялся
- MACRO — срабатывает на каждом новом пульсе
- DRAIN — цикл пока
!world.isStable. Предохранитель: 10000 итераций - Очистка исходящего ящика — одна дополнительная evaluate, если
world._outboxнепуст после дренажа
W — среда выполнения узла
Заголовок раздела «W — среда выполнения узла»W — функциональное ядро каждого узла. Его функция reduce принимает (state, pulse, nodeId, handlers) и возвращает новое состояние.
const counter = Behaviors.collect( { count: 0, started: false }, reflector, (state, pulse) => W.reduce(state, pulse, "counter", { __macro: (s, p, ctx) => { ... }, // срабатывает один раз за logicalTime newCycle: (s, p, ctx) => { ... }, // срабатывает когда приходит future }));Двухслойное время
Заголовок раздела «Двухслойное время»Логическое время T ──────────────────────────────────────▶ │ │ │ pulse(lt=1) pulse(lt=2) pulse(lt=3) общее, дискретное │ ├── субтик 0 (макрофаза) ├── субтик 0.5 (шаг Зенона) ├── субтик 0.75 ├── ... └── стабильно (все fireAt ≥ wallTime+1, глубины 0, исходящий ящик пуст)Инварианты распределённого детерминизма
Заголовок раздела «Инварианты распределённого детерминизма»Эти инварианты должны выполняться, чтобы два участника оставались синхронизированными:
wallTime = lt— чистый счётчик логических тиков. НикакогоDate.now()в модели.- Канонический пульс заморожен и доставляется без изменений.
- Warp использует
wallTime, производный от очереди. - Никаких замыканий в полезных нагрузках очереди.
- Стабильность определяется локально.
- Очередной приёмник пульсов — используется
{queued: true}. __macroсрабатывает не более одного раза заlogicalTime.
Автономный режим
Заголовок раздела «Автономный режим»На отключении. meta.startAutonomous() запускает локальный setInterval(REFLECTOR_MS), инжектирующий пульсы. Все миры продолжают анимироваться, используя чисто логические тики.
На переподключении. Анимация возобновляется плавно. Если какой-либо мир разошёлся, warp срабатывает и воспроизводит авторитетное состояние.
Ключевые архитектурные решения
Заголовок раздела «Ключевые архитектурные решения»| Решение | Обоснование |
|---|---|
wallTime = lt, а не Date.now() | Чистый детерминизм — устойчив к джиттеру реального времени |
| Единый рефлектор для всех миров | Одни часы, все участники |
| Задержки будущих событий в логических тиках | Нет путаницы единиц, независимость от масштаба |
Граница SUBTICK_MS = 1 | Чистые двухуровневые часы без дополнительного механизма |
Начало работы
Заголовок раздела «Начало работы»npm installnpm startОткройте браузер: http://localhost:3000 — список демо-приложений.
URL-параметры для демо-страницы: ?app=appName&k=seloID
Запуск в Renkon Pad
Заголовок раздела «Запуск в Renkon Pad»Загрузите kwe-index.renkon в локально/удалённо запущенный экземпляр Renkon Pad. Эвалюатор работает непосредственно в Renkon Pad без шага сборки.