Emscripten 4.0 está disponível, um compilador C/C++ para WebAssembly

O lançamento do kit de ferramentas Emscripten 4.0 foi publicado, permitindo compilar código em C/C++ e outras linguagens para as quais front-ends baseados em LLVM estão disponíveis em código intermediário universal de baixo nível WebAssembly. O resultado resultante pode ser usado para integração com projetos JavaScript, execução em um navegador da web, uso em Node.js ou criação de aplicativos multiplataforma independentes iniciados usando o tempo de execução wasm. O código do projeto é distribuído sob a licença do MIT. O compilador utiliza desenvolvimentos do projeto LLVM, e a biblioteca Binaryen é utilizada para gerar WebAssembly e otimização.

O principal objetivo do Emscripten é criar uma ferramenta que permita executar código na Web, independente da linguagem de programação em que esse código foi originalmente escrito. Aplicativos compilados podem usar chamadas para bibliotecas C e C++ padrão (libc, libcxx), extensões C++, multithreading baseado em pthreads, APIs POSIX e muitas bibliotecas multimídia. APIs para integração com API Web e código JavaScript são fornecidas separadamente.

Emscripten suporta a transmissão da saída da biblioteca SDL2 através do Canvas, e também implementa suporte para OpenGL e EGL através da API WebGL, que permite converter aplicativos gráficos e jogos para WebAssembly (por exemplo, há uma porta do kit de ferramentas Qt, o os motores de jogo Unreal Engine e Unit são suportados, bem como os processos do mecanismo de simulação física Bullet).

Além de compilar código C/C++, projetos estão sendo desenvolvidos separadamente para executar interpretadores em navegadores e máquinas virtuais para Lua, C#, Python, Ruby e Perl. Também é possível usar front-ends LLVM diferentes do Clang, como front-ends para Swift, Rust, D e Fortran.

A atribuição do número de versão 4.0 se deve à introdução de alterações que quebram a compatibilidade no nível ABI (ao reconstruir o projeto no Emscripten 4.0, será necessário reconstruir arquivos-objeto e bibliotecas compiladas por versões anteriores do Emscripten). Principais mudanças no Emscripten 4.0:

  • Adicionada opção "-sWASM_LEAGCY_EXCEPTIONS" para selecionar entre mecanismos de tratamento de exceções antigos e novos. Por padrão, o mecanismo antigo continua a ser usado, pois nem todos os navegadores implementaram recursos do WebAssembly para lidar com os novos manipuladores de exceções.
  • Os componentes Compiler-rt, libcxx, libcxxabi e libunwind foram atualizados para o branch LLVM 19.
  • A versão mínima do navegador Safari suportada em assemblies (a configuração MIN_SAFARI_VERSION) foi aumentada de 14.1 para 15.0, o que possibilitou o uso de vários recursos avançados do WebAssembly por padrão:
    • Habilitado o uso de novas instruções de conversão float para int (nontrapping-fptoint), que ao invés de lançar uma exceção quando o resultado estourar, retorna o valor mínimo ou máximo possível (necessário para SIMD).
    • A opção WASM_BIGINT está habilitada, que usa o tipo BigInt para trocar valores inteiros de 64 bits entre WebAssembly e código JavaScript.
    • A opção BULK_MEMORY está habilitada, que usa as instruções WebAssembly memory.copy e memory.fill para implementar as funções C memcpy e memset.
  • A normalização do caminho está desabilitada na função PATH.basename() (PATH.normalize()), ou seja, chamar 'PATH.basename("a/.")' agora retornará "." em vez de "a", e 'PATH.basename("a/b/..")' retornará ".." em vez de "a".
  • Ao usar a opção -sMODULARIZE, as funções de fábrica que criam e retornam instâncias de módulos e objetos WebAssembly para JavaScript agora são sinalizadas como "assíncronas" quando compiladas no modo WASM_ASYNC_COMPILATION padrão.
  • Adicionada a capacidade de especificar bibliotecas JavaScript usando a opção "-lfoo.js". Ao contrário da opção “--js-library”, a biblioteca é pesquisada em todos os caminhos especificados através da opção “-L”.
  • Ao vincular no modo de depuração (-O0 ou -sASSERTIONS), a versão de depuração padrão da função malloc é habilitada, com verificações de afirmação habilitadas para detectar erros, como chamar free() duas vezes.

Fonte: opennet.ru

Adicionar um comentário