WebAssembly, com precisão
O DataForge não compila para WASM — e o que existe no lugar funciona. A diferença entre as duas frases importa.
A resposta curta: o DataForge não compila para WebAssembly, e não há um alvo wasm32 para o qual gerar módulo.
A resposta útil é mais longa, e ela começa por separar duas coisas que costumam ser confundidas.
Compilar PARA WebAssembly · rodar EM WebAssembly#
| Compilar para WASM | Rodar em WASM | |
|---|---|---|
| o que é | produzir um .wasm com as funções da sua linguagem | rodar o interpretador dentro de um runtime WASM |
| quem faz | Rust, C, Zig, Go, AssemblyScript | CPython pelo Pyodide, e portanto o DataForge junto |
| no DataForge | não existe | funciona, e não é uma porta desta linguagem |
| custo | — | o interpretador inteiro vai junto: alguns megabytes antes da primeira linha |
O que o item do documento pede, item por item#
| Item | Resposta |
|---|---|
| WASM target | não existe. Emitir WASM exigiria um backend de geração de código — e a parte 8 explica por que ele não existe nem para código de máquina nativo |
| WASI | não como alvo de compilação. O wasi em Arcane.Alvo é o perfil de restrições de rodar ali dentro, não um formato de saída |
| linear memory | não se aplica diretamente: a memória linear é do runtime WASM que hospeda o CPython, e nenhum objeto do DataForge a alcança |
| imports / exports | não se aplica no sentido do módulo WASM. O análogo da linguagem é adopt e relay, e o contrato deles tem ferramenta própria |
| host bindings | o análogo existe e é real: a ponte para o Python e o FFI com C — dois jeitos de chamar o que está fora |
| SIMD | não se aplica — ver o mapa de hardware |
| threads | não no navegador: dependem de SharedArrayBuffer e de isolamento de origem, e o Pyodide as desliga por padrão. É por isso que threads está fora do perfil navegador |
| component model | não se aplica: sem módulo WASM, não há componente a compor |
Se você quer isso hoje#
O caminho que funciona é o de qualquer projeto Python no navegador: carregar o Pyodide, instalar o pacote e rodar. O que o Arcane.Alvo acrescenta é dizer antes quais linhas do seu programa não vão sobreviver ali.
dataforge
adopt Arcane.Alvo as Alvo
// antes de tentar: o que nao roda numa aba?
// r := Alvo.conferir("app.df", "navegador")
// cycle p in r["problemas"]:
// out $"linha {p['linha']}: {p['modulo']} precisa de {p['capacidade']}"
assert "navegador" in keys(Alvo.alvos())
assert len(Alvo.limites()) bigger_eq 3