Взгляните на детскую игру, написанную в системе Scratch: персонаж появляется в центре экрана, затем мгновенно перепрыгивает в угол. Первое перемещение никто не видел — оно исчезло между кадрами. Убрать его — значит ничего не сломать для игрока, но как гарантировать это автоматически? Сегодняшние инструменты оптимизации для таких визуальных языков полагаются на анализ и тестирование, не давая формальных гарантий. Между тем, в репозитории Scratch лежат десятки миллионов проектов, написанных детьми и любителями, — аудиторией, которая не в состоянии заметить или исправить ошибку, внесённую автоматическим улучшателем. Доверие здесь обретает первостепенную роль: оптимизатор, молча меняющий игру ребёнка, хуже, чем никакой. Классический подход из мира верифицированных компиляторов — доказать корректность преобразований раз и навсегда — наталкивается на кооперативную многопоточность, событийную модель и рендеринг, присущие Scratch. Возникает разрыв: формальные методы умеют работать с последовательным C, а живой, дышащий код школьной анимации требует новых оснований.
Разработчики CertiBlock разделили систему на две неравные части: непроверяемый оптимизатор и доверенный контролёр. Оптимизатор сканирует проект, строит граф зависимостей и выдвигает предложение об удалении, скажем, мёртвой команды или неиспользуемого костюма. К предложению прилагается «сертификат» — манифест, где указаны тип правки, контрольная сумма исходной и изменённой программ и линза наблюдения. Линза — это параметризованное понятие, определяющее, что именно видит игрок: кадры, звуки, значения переменных на экране, а не внутренние комментарии. Контролёр, словно дотошный таможенный инспектор, заново разбирает обе версии программы, сверяет контрольные суммы и пересчитывает каждое условие, от которого зависит безопасность изменения. Ни одному утверждению оптимизатора он не верит, даже если тот честно указал свои выкладки. Центральный механизм — кооперативная теорема о фрейме, механизированная в помощнике доказательств Lean. Она гласит: запись в ресурс, которая перезаписывается в том же потоке без передачи управления планировщику и без наблюдения извне, может быть удалена. Теорема параметризована типом ресурса и границей наблюдения; одно доказательство покрывает и удаление мёртвых переменных, и удаление невидимых перемещений спрайтов. Контролёр на Python реализует два ключевых решающих алгоритма, эталонные версии которых были верифицированы в Lean и скомпилированы в исполняемый код. Дополнительная страховка — дифференциальный оракул: после принятия правки он прогоняет обе версии на реальной виртуальной машине Scratch в одинаковых детерминированных условиях и сравнивает видимую игроку трассу.
Эксперимент на 300 случайно выбранных проектах из публичного репозитория показал, что контролёр принял хотя бы одну правку, сохраняющую поведение, в 94.3% случаев (283 из 300). В основном это была чистка неиспользуемых ресурсов и комментариев, но более глубокие семантические оптимизации — удаление визуальных мёртвых записей — прошли на 17 проектах. Среднее время проверки одного проекта составило десятки миллисекунд, а размер сэкономленных данных достигал сотен килобайт. Ключевой результат касается безопасности: независимый аудит интегрированной системы выявил восемь ложных принятий, которые не были обнаружены тестами отдельных семейств. Все они проистекали из пропущенных каналов наблюдения — например, индекс костюма считывался другим спрайтом, и удаление сдвигало его. Ошибки были исправлены, и теперь каждая закрыта регрессионным тестом. Межсемейная состязательная кампания из 4278 возмущённых правок — с добавлением лишних изменений — не дала ни одного ложного пропуска. Абляция, в которой семантические условия были отброшены, привела бы к принятию десятков небезопасных замен, но полный контролёр отверг их все. Дифференциальный оракул на виртуальной машине не зафиксировал ни одного поведенческого расхождения среди принятых правок.
Полученный результат означает, что для параллельного событийно-ориентированного языка впервые построена система переписывания, где каждое изменение несёт сертификат, проверяемый компактным доверенным ядром. Это переносит дисциплину верифицированных компиляторов в область конечного пользователя, где цена ошибки особенно высока. Таможенная метафора работает на практике: контролёр не обязан понимать, как оптимизатор нашёл кандидата на удаление; он лишь сверяет «груз» с «декларацией», и грузом выступает сама программа. Параметризация линзой наблюдения позволяет единообразно обрабатывать правки, безопасные для игрока, но не для редактора. Механизированная теорема о кооперативном фрейме опирается только на две модельно-машинные гипотезы соответствия и не зависит от конкретного семейства правок, что делает её одновременно строгой и расширяемой. Доверенный базис составляет около десяти тысяч строк Python и около шести тысяч строк Lean — объём, посильный для аудита небольшой командой.
Рамка, вероятно, перенесется на другие событийные языки с кооперативной многопоточностью, поскольку кооперативная теорема требует лишь планировщика, явно фиксирующего наблюдения. Ближайшая цель — замкнуть разрыв между верифицированным эталоном на Lean и развёрнутым контролёром на Python через автоматическое извлечение кода, а также распространить подход на вытесняющую многопоточность. Интеграция в реальный редактор Scratch позволила бы в реальном времени показывать автору безопасные упрощения, не нарушающие замысел игры. В перспективе — гибридные системы, где большая языковая модель предлагает правки, а контролёр беспристрастно рецензирует их так же, как сейчас он рецензирует машинные оптимизации.
Методология затрагивает разработку образовательных сред программирования, инструментов для рефакторинга и верифицированных компиляторов. Она также предлагает образец для построения доверенных AI-ассистентов, генерирующих код: непроверенный генератор выдаёт вариант, а компактный формальный контролёр принимает или отвергает его.
Необходимо завершить верификационный мост между доказанной моделью на Lean и промышленным контролёром на Python, а также расширить охват семейств правок, например, на слияние скриптов. Параллельно следует изучить поведение системы на сверхбольших проектах с тысячами спрайтов.
Работа напрямую связана с проблемой гарантоспособной автоматической обработки программ, написанных неспециалистами, — давним вызовом на стыке формальных методов и человеко-компьютерного взаимодействия. Она также иллюстрирует, как параметризованные доказательства могут снижать стоимость верификации для целого класса оптимизаций, апеллируя к фундаментальным вопросам информационной полноты условий корректности.
Этот раздел адресован автору работы и его коллегам. Соседние работы нашёл смысловой поиск по нашему архиву — не по совпадению слов, а по смыслу. Мы не рецензируем: мы показываем поле вокруг.
Что сделано в работе
В работе представлена система CertiBlock для безопасной оптимизации Scratch-проектов: непроверяемый оптимизатор предлагает удаление мёртвого кода, а доверенный контролёр верифицирует каждую правку, опираясь на механизированную в Lean теорему о фрейме. Эксперименты на 300 случайных проектах показали, что контролёр принял хотя бы одну сохраняющую поведение правку в 94.3% случаев.
В чём сила
Сильная сторона — формальная гарантия сохранения наблюдаемого поведения при оптимизации, адаптированная к кооперативной многопоточности и событийной модели Scratch, что закрывает разрыв между классической верификацией компиляторов и реальными визуальными языками.
Куда можно двигаться
Что можно попробовать
Работы рядом в нашем архиве
Вокруг этой работы в архиве пусто: ближайший разбор всего на 0.57, при обычных 0.64. Похоже, рядом почти не бурили.
как её написали авторы, на английском arXiv:2607.00563
Block-based end-user languages such as Scratch run tens of millions of programs. Existing tools establish behavior preservation through program analysis and testing without a checked guarantee. We turn optimization into certificate-carrying source-to-source rewriting. An untrusted optimizer proposes a rewrite; a trusted, fail-closed checker accepts it only after recomputing every side condition that the rewrite's behavior preservation depends on under an explicit observation lens. The checker is the sole authority: given a correct checker and a small, explicitly stated set of model-to-VM assumptions, an optimizer bug cannot mint an unsound acceptance. The observation lens is a parameter, and the central soundness argument is a cooperative-frame refinement theorem: a write overwritten before any thread observes it, within a window in which no thread yields, can be removed. We mechanize this theorem in Lean and show that one parametric statement covers two concrete rewrite families instantiated to variable state and renderer state. We build a checker for six rewrite families and evaluate it on 300 real Scratch projects. The checker accepts a behavior-preserving rewrite on 94.3% of projects (283 of 300); certification costs under one tenth of a second per project; and a cross-family adversarial campaign of 4,278 perturbed rewrites produces zero false accepts. An audit found eight false accepts the per-family test suites missed; each is now rejected. An ablation that strips the semantic side conditions, leaving analysis and testing alone, ships rewrites the virtual machine confirms change behavior; the full checker rejects every one. The result shows how to provide behavior-preservation guarantees for a concurrent, event-driven, end-user language. The checker recomputes every required condition instead of trusting optimizer claims, keeping the trusted base small.
Аудит системы, проведённый независимым специалистом, выявил восемь ложных принятий, которые пропустили традиционные тесты на каждое семейство правок. Все они были связаны с тем, что один спрайт подглядывал за другим через неожиданные каналы — например, считывая номер костюма, который менялся при удалении неиспользуемого ресурса. После исправления ошибки были навсегда зафиксированы регрессионными тестами.