Pular para o conteúdo

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 WASMRodar em WASM
o que éproduzir um .wasm com as funções da sua linguagemrodar o interpretador dentro de um runtime WASM
quem fazRust, C, Zig, Go, AssemblyScriptCPython pelo Pyodide, e portanto o DataForge junto
no DataForgenão existefunciona, e não é uma porta desta linguagem
custoo interpretador inteiro vai junto: alguns megabytes antes da primeira linha

O que o item do documento pede, item por item#

ItemResposta
WASM targetnã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
WASInã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 memorynão se aplica diretamente: a memória linear é do runtime WASM que hospeda o CPython, e nenhum objeto do DataForge a alcança
imports / exportsnã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 bindingso análogo existe e é real: a ponte para o Python e o FFI com C — dois jeitos de chamar o que está fora
SIMDnão se aplica — ver o mapa de hardware
threadsnã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 modelnã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