WebAssembly e TypeScript: acelerando a web sem dor

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

WebAssembly e TypeScript: quando o JavaScript não dá conta

\n\n

Você já sentiu que seu site está lento, mesmo tendo escrito tudo em TypeScript moderno? Processamento de vídeo, renderização 3D, cálculos matemáticos complexos — o JavaScript do navegador começa a engasgar. É aqui que entra em cena o WebAssembly (ou simplesmente Wasm) — uma tecnologia que permite executar no navegador código escrito em C++, Rust ou Go, com velocidade quase nativa. Mas como isso se relaciona com o TypeScript? Spoiler: diretamente, de nenhuma forma, mas juntos eles formam uma dupla poderosa.

\n\n

Neste artigo, não vamos apenas dar definições secas. Vamos mostrar como TypeScript e WebAssembly podem trabalhar em equipe, onde cada um cuida da sua parte: TypeScript pela conveniência e tipagem, e Wasm pelo desempenho. Você aprenderá como escrever um módulo Wasm simples e chamá-lo a partir do TypeScript e, principalmente, entenderá se vale a pena o esforço.

\n\n

O que é WebAssembly em palavras simples

\n\n

WebAssembly é um formato binário de instruções que é executado em uma máquina virtual do navegador. Se JavaScript é uma linguagem interpretada, que é analisada e executada "em tempo real", o Wasm é um bytecode já compilado. Ele carrega mais rápido, executa quase como código nativo e não faz o navegador "pensar".

\n\n

Principais características do WebAssembly:

\n
    \n
  • Velocidade — até 10-20 vezes mais rápido que JavaScript em tarefas computacionais.
  • \n
  • Segurança — executa em um ambiente isolado (sandbox), sem acesso direto ao DOM.
  • \n
  • Portabilidade — o mesmo arquivo .wasm funciona no Chrome, Firefox, Safari e Edge.
  • \n
  • Não substitui o JS — é um complemento. DOM, eventos, assincronia permanecem com JavaScript/TypeScript.
  • \n
\n\n

Wasm não foi projetado para escrever lógica de interface. Seu forte são cálculos pesados: criptografia, processamento de imagens, simulações físicas, jogos.

\n\n

E onde entra o TypeScript?

\n\n

O TypeScript em si não é compilado para WebAssembly (embora existam projetos experimentais, mas não são para produção). No entanto, o TypeScript se torna a "cola" ideal entre os módulos Wasm e a interface do usuário. Imagine: você tem um algoritmo rápido em C++, compilado para Wasm. Você escreve um wrapper elegante em TypeScript com tipos, e sua IDE começa a sugerir quais parâmetros a função espera e quais tipos ela retorna. Nada de mágica — apenas rigor de tipos e autocompletar.

\n\n

Aqui está uma arquitetura típica:

\n
    \n
  • Módulo Wasm — uma caixa preta que faz o trabalho pesado.
  • \n
  • Código TypeScript — carrega o módulo, chama suas funções e atualiza a UI.
  • \n
  • Navegador — feliz, porque o trabalho pesado não bloqueia a thread principal.
  • \n
\n\n

Escrevendo um exemplo: geração de números primos com WebAssembly e TypeScript

\n\n

Vamos criar um projeto real. Vamos pegar um algoritmo de busca de números primos (Crivo de Eratóstenes) em C++, compilá-lo para Wasm e depois chamá-lo a partir do TypeScript. Não se assuste com C++ — o código será simples e usaremos o Emscripten para a compilação.

\n\n

Passo 1. Código fonte em C++

\n

Vamos criar o arquivo primes.cpp:

\n
#include <emscripten.h>\n\nextern "C" {\n    EMSCRIPTEN_KEEPALIVE\n    int count_primes(int limit) {\n        if (limit < 2) return 0;\n        bool* sieve = new bool[limit + 1];\n        for (int i = 0; i <= limit; i++) sieve[i] = true;\n        sieve[0] = sieve[1] = false;\n        for (int i = 2; i * i <= limit; i++) {\n            if (sieve[i]) {\n                for (int j = i * i; j <= limit; j += i) {\n                    sieve[j] = false;\n                }\n            }\n        }\n        int count = 0;\n        for (int i = 0; i <= limit; i++) {\n            if (sieve[i]) count++;\n        }\n        delete[] sieve;\n        return count;\n    }\n}
\n

EMSCRIPTEN_KEEPALIVE

Blogs

Book Recommendations