WASM 3.0 Completed 🔥 Горячее 💬 Длинная дискуссия
Завершена работа над Wasm 3.0
Три года назад была завершена версия 2.0 стандарта Wasm, добавившая векторные инструкции, массовые операции с памятью, множественные возвращаемые значения и простые ссылочные типы.
Сегодня мы рады объявить о выпуске Wasm 3.0 как нового действующего стандарта. Это крупное обновление включает несколько важных функций, разрабатывавшихся до восьми лет.
-
64-битное адресное пространство. Память и таблицы теперь могут использовать
i64вместоi32, расширяя доступное пространство с 4 гигабайт до 16 эксабайт (теоретически). На вебе 64-битная память ограничена 16 гигабайтами, но для невеб-экосистем это открывает возможности для работы с огромными приложениями и наборами данных. -
Множественная память. Теперь один модуль может объявлять и напрямую использовать несколько областей памяти, включая копирование данных между ними. Это позволяет инструментам вроде wasm-merge работать со всеми модулями Wasm и открывает новые возможности для безопасности, буферизации и инструментирования.
-
Сборка мусора. Wasm добавляет поддержку автоматически управляемого хранилища через сборщик мусора. Компиляторы могут объявлять layout структур данных через типы struct и array, а также нетипизированные целые числа — всё остальное, включая представление значений исходного языка, остаётся их ответственностью. Wasm предоставляет только базовые строительные блоки, избегая встроенных объектных систем.
-
Типизированные ссылки. Расширение системы типов теперь поддерживает богатые формы ссылок, описывающие форму значения в куче, что избегает дополнительных проверок во время выполнения. Эта система также доступна для ссылок на функции, позволяя безопасные косвенные вызовы без проверок типа или границ через инструкцию
call_ref. -
Хвостовые вызовы. Важный механизм для языковых реализаций, особенно функциональных языков и внутренних техник (например, заглушек). Вызовы полностью общие и работают как для статических, так и для динамических получателей.
-
Обработка исключений. Ранее не было эффективного способа компиляции обработки исключений в Wasm. Теперь исключения определяются через теги с данными, могут быть выброшены и перехвачены обработчиками — новым видом инструкций блока с диспетчеризацией по тегам.
-
Расслабленные векторные инструкции. (Описание сокращено)
Комментарии (427)
- Переход на 64-битную адресацию по умолчанию снимает ограничения для ресурсоёмких веб-приложений, таких как видеоредакторы.
- Добавлена низкоуровневая поддержка сборки мусора (GC), позволяющая компиляторам управлять структурой данных.
- Сообщество выражает разочарование отсутствием прямого доступа к DOM и JS-объектам из WebAssembly.
- Множественные памяти и улучшенная типизация ссылок могут оптимизировать взаимодействие с API (например, WebGPU).
- Разработчики отмечают проблемы с опытом использования (DX) и сложность компиляции в WASM.
- Обсуждаются потенциальные применения новых возможностей для языков C#, Java, Go и Python.
- Остаются нерешённые вопросы, такие как работа на микроконтроллерах и поддержка сокетов.
Things you can do with a debugger but not with print debugging 💬 Длинная дискуссия
- Смотреть весь стек вызовов — мгновенно переходить к родительским фреймам и проверять переменные там.
- Вычислять выражения на лету — вызывать функции и менять состояние без перезапуска.
- Ловить исключения в точке броска — ставить брейкпоинт на
throwи видеть, почему упало. - Менять ход выполнения — подменить URL, флаг или объект прямо в памяти, не трогая код.
- Стандартизировать запуск — закоммитьте
.vscode/launch.json, и новичку хватит одного клика, чтобы запустить сервер или CLI с нужными env и аргументами.
Комментарии (199)
- Отладчики полезны, но часто ограничены: сети, прод-среды, сторонние библиотеки, оптимизация под release.
- Print-отладка универсальна: работает в любом языке, на удалёнке, в многопоточке и в kernel-space, не требует пересборки.
- Условные точки останова тормозят или врут; многие ставят «if (x) print("")» и брякают на неё.
- REPL, time-travel (rr/UndoDB), watch-точки на память и reverse-execution дают сверх-возможности, но доступны не везде.
- Итог: хороший инженер владеет и отладчиком, и логами, и профилировщиком, и выбирает инструмент под задачу.