WebAssembly уже давно зарекомендовал себя как мощный стандарт для запуска высокопроизводительного кода в браузерах и не только. Однако, несмотря на все преимущества, у него существуют определённые ограничения, которые с течением времени стали вызывать вопросы у разработчиков и экспертов в области компиляции. Microwasm, появившийся в 2019 году, представляет собой попытку преодолеть эти ограничения, предложив новый формат, сохраняющий совместимость с существующим WebAssembly, но при этом значительно упрощающий создание эффективных рантаймов и бэкендов для компиляторов. Microwasm не просто очередное улучшение WebAssembly, это видение более гибкого и оптимального будущего для технологий виртуальных машин и компиляции, охватывающее как упрощение архитектуры, так и расширение возможностей оптимизации. Ключевая идея Microwasm — максимизировать передачу полезной информации от компилятора к рантайму, сохраняя при этом все гарантии безопасности и детерминированности, что является краеугольным камнем спецификации WebAssembly.
В отличие от традиционного Wasm, Microwasm отходит от иерархической структуры блоков и локальных переменных, предлагая вместо них простую и понятную модель управления потоком на основе графов потока управления (CFG). Отсутствие локальных переменных и переход к стековой передаче аргументов при входе в функции делает взаимодействие с виртуальным стеком более прозрачным и гибким. Благодаря введению инструкций типа pick и swap, эмуляция локальных переменных осуществляется без накладных расходов, а команды set_local, get_local и tee_local превращаются в операции, влияющие лишь на виртуальный стек, не создавая дополнительных вычислительных затрат во время выполнения. Такой подход упрощает внутренние механизмы без жертвования возможностями оптимизации. Одним из важных отличий Microwasm является отказ от возвратов из блоков через их же метки и переход к возможности просто вызывать новые блоки с помощью переходов.
Это отражает идеи, вдохновленные концепцией Funclets и в значительной степени приближает формат к стиль программирования на основе продолжений, хотя и без полного перехода к продолжениям, что позволяет добиться баланса между простотой кода и выразительностью управления потоком. Ещё одной перспективной идеей становится явная передача среды исполнения (environment) как аргумента для инструкций, которые обращаются к линейной памяти или таблице. Это позволяет более эффективно управлять ресурсами, освобождая регистры, используемые для хранения окружения, в тех частях кода, где эти ресурсы не нужны, что особенно ценно для оптимизации под архитектуры с ограниченным числом регистров. Важным преимуществом Microwasm является возможность потоковой компиляции — преобразования Wasm в Microwasm можно выполнять, не дожидаясь полной загрузки функций. Это существенно снижает задержки и увеличивает общую производительность систем рантайма, что невозможно при классическом подходе, который часто требует предварительной обработки всего кода.
Демонстрация эффективности Microwasm на конкретном примере из тестов стандарта WebAssembly показывает существенные улучшения. Исходный Wasm-код функции преобразуется в упрощённый Microwasm, где отсутствуют локальные переменные и иерархические блоки, а управление осуществляется через переходы и инструкции работы со стеком. При генерации ассемблера под Lightbeam прежде код был сложнее, многоуровневые контрол-флоу создавали излишнюю нагрузку, а используются регистры недостаточно эффективно. С Microwasm код становится компактнее и читабельнее, контрол-флоу становится проще, что снижает накладные расходы и улучшает использование регистров, хотя и проявляются некоторые избыточные дублирования, вызванные ограничениями потоковой компиляции. Тем не менее эта модель позволяет достигать производительности, сопоставимой с оптимизирующими компиляторами Firefox и конкурентоспособной с лучшими существующими решениями.
В сравнении с традиционными представлениями промежуточного кода (MIR) Microwasm предлагает особое преимущество – сочетание высокой абстракции с сохранением гарантированного безопасности исполнения, что зачастую теряется при использовании классических MIR. При этом он сохраняет совместимость с существующими спецификациями и системами, что облегчает внедрение и адаптацию в промышленности. Однако внедрение такого формата в основной стандарт WebAssembly сопряжено со значительными трудностями. Главным препятствием является отказ V8 – движка Chrome – поддерживать произвольный CFG, используемый в Microwasm, а переход на новую модель потребовал бы серьезных архитектурных изменений внутри их компилятора. Это ставит под угрозу принятие подобных улучшений в эко-системе браузеров, учитывая влияние команды V8 и их роль в формировании спецификаций.
Firefox, напротив, демонстрирует большее понимание и готовность к изменениям, что можно наблюдать по развитию IonMonkey и его оптимизационным возможностям. Возможно, именно такие инициативы, как Microwasm, создают возможность для экспериментального развития и постепенного перехода к более совершенным решениям в рамках WebAssembly. Microwasm представляет уникальное промежуточное звено, позволяющее компиляторам LLVM и другим источникам генерировать код, легко перевариваемый рантаймами, без необходимости полностью перерабатывать сложные бэкенды под WebAssembly. Такой подход значительно снижает затраты на разработку новых средств и открывает путь к более быстрой эволюции систем исполнения. В итоге Microwasm сочетает в себе надежность и безопасность современного WebAssembly с более гибкой, производительной и простой моделью, способной раскрыть потенциальные возможности компиляции и оптимизации, которые сегодня остаются на стадии концепции.
Несмотря на то, что у Microwasm пока нет статуса стандарта и его внедрение ограничивается экспериментальными проектами и исследовательскими ветками, его принципы и архитектура способны стать фундаментом для следующих этапов развития виртуальных машин и браузерных технологий. В мире, где эффективное исполнение и быстрое развертывание кода становятся критически важными, Microwasm предлагает свежий взгляд на то, как можно улучшить существующие технологии, не разрушая их ядро. В итоге, Microwasm, с его упрощённой структурой, совместимостью и продуманной моделью компиляции, может стать ключом к следующему поколению систем исполнения кода, помогая решать проблемы, которые WebAssembly пока не в силах преодолеть самостоятельно. Этот опыт демонстрирует, что инновации в области виртуальных машин требуют не только изменений в базовых форматах, но и комплексного подхода, включающего баланс между производительностью, безопасностью и возможностями оптимизации на всех уровнях экосистемы.