Browsers Agora Mostram Erros de Compilação

Erros de compilação entram no mundo dos Browsers. A mensagem “failed to compile wasm module: CompileError: at offset 8: binary version 0xd does not match expected version 0x1” foi gerada depois de tentar executar um simples programa “Hello World” no Browser Firefox. A mesma mensagem ocorre no Chrome. O que esta mensagem significa?

Eu raramente vejo uma mensagem de erro de compilação que se possa entender e que seja útil, parecem escrita de médico…

webassembly-compilation-error-old-emsdk-version

Mensagem de Erro Muito Específica

Esta mensagem de erro me fez lembrar de uma piada clássica:

Um homem em um balão percebeu que estava perdido. Ele baixou o balão e pediu ajuda a uma mulher: Você sabe onde eu estou?

Ela respondeu: Voce esta em um balão a 10 metros acima da terra.

Você é uma consultora, falou o homem.

Eu sou, como você sabe?

Bem, a informação que voce me deu é correta e inútil, porque eu ainda estou perdido…

Há uma segunda parte desta piada, ela esta depois da conclusão, vamos voltar ao Webassembly.

Espere Um Pouco, Browser compilando Webassembly?

Não é o EMSCRIPTEN o compilador? Eu pensei que a compilação ocorreria no meu computador enquanto eu compilo o código C? Sim, mas o browser tem que traduzir as instruções Webassembly para as instruções do processador em que o código vai rodar. Parece que os browsers estão chamando esta tradução de compilação. O que não parece errado.

Vejamos os passos necessários para rodar o código C quando Webassembly é usado:

Passo Compilador Descrição
1 EMSCRIPTEN C –> webassembly
2 Browser Webassembly –> instruções do processador em que o código vai rodar

E aqui quando Webassembly não é usado:

Passo Compilador Descrição
1 gcc(ou outro compilador) C –> instruções do processador em que o código vai rodar

Outra Razão para (Realmente) Verificar Se o Browser do Usuário Suporta Webassembly

Neste poste eu mostro como (realmente) verificar se o Browser do usuário suporta Webassembly.

Desconstruindo a Mensagem de Erro

CompileError: at offset 8: binary version 0xd does not match expected version 0x1

A Especificação do binário do Webassembly é o documento oficial que nos permite entender as seções de um módulo Webassembly. Um módulo Webassembly sempre começa assim:

Campo Tipo Descrição
número mágico uint32 Magic number 0x6d736100 (i.e., asm)
versão uint32 Version number, 0x1

Isto é como os primeiras bytes de um módulo se parece:

webassembly-helloworld-module-version

Ha! Nós encontramos a parte “version 0xd” da mensagem de erro.

Agora vamos procurar pela parte “version 0x1”.

De acordo com o EMSCRIPTEN change log, apenas a versão 1.37.3 é considerada estável. Versão 1.37.3 gera Webassembly módulos com versão 0x01:


v1.37.3: 2/16/2017
------------------
 - **Updated Binaryen to version 0x01**. First official stable WebAssembly support version. (#4953)
 - Optimized memcpy and memset with unrolling and SIMD, when available.
 - Improved Emscripten toolchain profiler to track more hot code.
 - Added new linker flag -s WEBGL2_BACKWARDS_COMPATIBILITY_EMULATION=1 to allow simultaneously targeting WebGL 1 and WebGL 2.
 - Optimize Emscripten use of multiprocessing pools.
 - More WebGL 2 garbage free optimizations.
 - Full list of changes:
    - Emscripten: https://github.com/kripken/emscripten/compare/1.37.2...1.37.3
    - Emscripten-LLVM: https://github.com/kripken/emscripten-fastcomp/compare/1.37.2...1.37.3
    - Emscripten-Clang: no changes.

Há novamente! Parece que o pessoal do Webassembly decidiu (ou alguém decidiu por eles) quando considerar Webassembly “estável”, e a partir daí, versão 0x01 foi assinalado para os módulos Webassembly. Os browsers de hoje não conseguem compilar Webassembly módulos com versão diferente de 0x1.

Eu consigo entender parte desta decisão. Mas isso significaria que os módulos Webassembly terão versão 0x1 para sempre? Isso é o que os Browsers atualmente esta verifcado. Sem evolução prevista aqui. Vamos esperar que o módulo não precise mudar!

A outra conclusão que temos é a de que usando EMSCRIPTEN mais antigo que 1.37.3 gera código que não consegue ser executado nos browsers correntes.

Como cheguei aqui?

Não tenho certeza como consegui executar EMSCRIPTEN versão 1.37.1!

Talvez porque, quando comecei a olhar o Webassembly, eu não instalei EMSCRIPTEN seguindo Webassembly.org’ get started instructions, eu instalei EMSCRIPTEN seguindo os resultados de uma procura no Google por “emscripten download” e segui estas instruções: sdk installation instructions.

Não Morda Mais Do Que Pode Mastigar(DON’T BYTE OFF MORE THAN YOU CAN CHEW)

Voltando ao tema de mensagens de erro de compiladores, me parece que Intercal é uma linguagem que coloca humor nas mensagens, olhe este Quora post:

Error : DON’T BYTE OFF MORE THAN YOU CAN CHEW Reason : I tried to store a 32 bit integer in a 16 bit variable. In case had I tried to store a 64 bit integer in a 32 bit variable, the error would have been YOU WANT MAYBE WE SHOULD IMPLEMENT 64-BIT VARIABLES?

Pelo menos é claro, o que GCC daria para este erro?

Conclusão

A mensagem de erro aparece porque versões do EMSCRIPTEN mais antigas que 1.37.3 gera módulos Webassembly que não são consideradas “estáveis” pelos browsers atuais. Browsers esperam Webassembly módulo com versão 0x1. Nenhum outro número para um módulo Webassembly! Este erro reforça o ponto em se ter uma verificação mais completa do browser do ponto de vista de suporte de Webassembly.

E Finalmente a Piada Inteira:

Um homem em um balão percebeu que estava perdido. Ele baixou o balão e pediu ajuda a uma mulher: Você sabe onde eu estou?

Ela respondeu: Voce está em um balão a 10 metros acima da terra.

Você é uma consultora, falou o homem.

Eu sou, como você sabe?

Bem, a informação que voce me deu é correta e inútil, porque eu ainda estou perdido…

E a mulher respondeu:

E você deve ser um gerente.

Eu sou, como você adivinhou?

Bem, você não sabe onde esta, ou para onde esta indo, e você quer que pessoas abaixo de você resolvam seus problemas!

Post MindMap


Leave a message below. Webassembly is evolving rapidly, please let me know if this post got outdated.

Enjoyed this post?

Don't miss new posts: Share it with your friends:

Você pode gostar...

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *