IA

    scriptc da Vercel: Compilando TypeScript Direto para LLVM e WASI sem Passar pelo V8

    Análise técnica do compilador experimental scriptc da Vercel Labs: compilação AOT de TypeScript para LLVM IR e WASI, modo dinâmico com QuickJS-ng e implicações para sandboxes de agentes.

    2026-08-158 minEquipe MaxVision
    CLIP_001 · DJI O4FPV · 4K · 60FPS
    DESENVOLVIMENTO · 2026.08.15 · FALLBACK-ESTRATEGIA

    A busca por eliminar o overhead de máquinas virtuais na execução de TypeScript avançou para a camada de compilação AOT nativa. Criado pela Vercel Labs, o projeto experimental scriptc propõe uma abordagem arquitetural distinta dos empacotadores tradicionais: em vez de distribuir a máquina virtual V8 completa com o código-fonte empacotado, o compilador traduz construções estáticas de TypeScript diretamente para Representação Intermediária LLVM (LLVM IR) e módulos WASI Preview 1, utilizando um backend C/LLVM.12

    Bancada de desenvolvimento em tons escuros exibindo terminal com código assembly e representação intermediária LLVM

    O modelo de distribuição tradicional vs. Compilação AOT

    No ecossistema JavaScript e TypeScript tradicional, a geração de binários executáveis sempre foi sinônimo de encapsulamento de runtime.5 Para que um arquivo .ts ou .js seja executado como um binário autocontido, ferramentas consolidadas agrupam o interpretador (V8 no Node.js e Deno ou JavaScriptCore no Bun), as bibliotecas base em C++ e um sistema de arquivos virtual (VFS) com o código serializado.734

    Embora esse modelo garanta compatibilidade integral com a semântica dinâmica do ECMAScript, ele impõe restrições estruturais de engenharia:

    1. Inicialização da VM: Toda invocação exige o ciclo de bootstrap do motor JavaScript (como o V8), alocação inicial de heaps de isolamento e configuração do coletor de lixo (garbage collector).18
    2. Footprint do Runtime: A inclusão dos interpretadores e dos componentes de runtime eleva o consumo de memória base e o tamanho final do artefato distribuído.17
    3. Compilação JIT em Ambientes Efêmeros: Em ferramentas de linha de comando (CLIs) ou microsserviços de curta duração, o motor muitas vezes encerra a execução antes que as otimizações do compilador JIT (Just-In-Time) entrem em regime estável.8

    O scriptc investiga a hipótese de que o subconjunto tipado e estático do TypeScript contém informação suficiente para permitir a compilação antecipada direta para linguagens intermediárias de baixo nível.16

    Arquitetura do scriptc: do TypeScript ao LLVM IR

    O projeto reutiliza a API oficial do compilador TypeScript para análise sintática e verificação de tipos, construindo sobre essa árvore sintática abstrata (AST) um gerador de código para a infraestrutura do LLVM:16

    ┌─────────────────────────┐
    │ Código TypeScript (.ts) │
    └────────────┬────────────┘
                 │ Parser & Type Checker Oficial
                 ▼
    ┌─────────────────────────┐
    │   AST Tipada e Estática │
    └────────────┬────────────┘
                 │ scriptc (Emissão AOT)
                 ▼
    ┌─────────────────────────┐
    │   Código C / LLVM IR    │
    └────────────┬────────────┘
                 │ Clang / Zig CC
          ┌──────┴──────┐
          ▼             ▼
    ┌───────────┐ ┌───────────┐
    │  Binário  │ │   WASI    │
    │  Nativo   │ │  Preview 1│
    └───────────┘ └───────────┘
    

    O pipeline de compilação opera através dos seguintes componentes documentados no repositório oficial:1

    1. Análise de Cobertura Estática (scriptc coverage): O utilitário analisa o código-fonte e calcula a proporção de tipos e expressões que podem ser compiladas de forma puramente estática para LLVM, emitindo diagnósticos para construções dinâmicas que não possuem mapeamento AOT direto.1
    2. Geração de Código Intermediário: O compilador emite código C estruturado e representações intermediárias que interagem com um runtime C minimalista (runtime.c), eliminando a infraestrutura de objetos dinâmicos pesados do V8.1
    3. Backend de Compilação Nativa: O código gerado é compilado para código de máquina nativo utilizando o clang instalado no sistema operacional para compilações locais, ou uma toolchain externa como o zig cc (configurado via variável de ambiente SCRIPTC_CC=zigcc) para cross-compilação entre arquiteturas e para o target wasm32-wasi.1

    Diagrama técnico da arquitetura de compilação do TypeScript para LLVM IR e WASI

    Compilação para WebAssembly e o Modelo WASI

    Além da geração de binários nativos para o sistema operacional hospedeiro, o scriptc suporta como target formal a especificação WASI Preview 1 (WebAssembly System Interface).12

    WASI define uma interface de sistema operacional padronizada e baseada em capacidades (capability-based security) para módulos WebAssembly, permitindo que o binário compile para uma arquitetura independente de plataforma com restrições explícitas de acesso a arquivos, rede e variáveis de ambiente.2

    Para compilar para WASI, o procedimento oficial documentado pelo projeto requer a definição explícita do compilador C externo e do target de compilação via variáveis de ambiente:1

    # Compilação de TypeScript para módulo WebAssembly WASI via Zig CC
    SCRIPTC_CC=zigcc SCRIPTC_TARGET=wasm32-wasi scriptc build src/agent-tool.ts --no-keep-c -o dist/agent-tool.wasm
    
    # Execução isolada em host WASI compatível (exemplo: Wasmtime)
    wasmtime run dist/agent-tool.wasm
    

    Diferente do WebAssembly puramente web — que interage com APIs do navegador através do DOM e de bindings JavaScript —, módulos WASI operam sobre uma interface de sistema operacional padronizada e dependem de um host runtime compatível (como Wasmtime ou Wasmer) para fornecer as chamadas de sistema e capacidades autorizadas.2

    O modo híbrido: Fallback dinâmico com QuickJS-ng

    Uma das barreiras clássicas na compilação AOT de código JavaScript e TypeScript reside no uso de recursos dinâmicos da linguagem, como manipulação em tempo de execução de protótipos, eval, reflexão arbitrária e dependências externas do ecossistema npm que dependem de comportamentos não estáticos.

    Para viabilizar a execução de projetos heterogêneos sem limitar o desenvolvedor exclusivamente a um subconjunto restrito, o scriptc implementa a flag experimental --dynamic:1

    • Ramo Estático AOT: Blocos tipados e funções puramente estáticas continuam sendo compilados diretamente para LLVM IR e otimizados pelo compilador de backend.1
    • Avaliação Dinâmica com QuickJS-ng: Trechos de código dinâmicos ou dependências que exigem interpretação flexível são delegados ao motor QuickJS-ng, um interpretador JavaScript ANSI C compacto embutido no binário final.19

    Esse modelo em dois níveis assegura que trechos estáticos obtenham os benefícios de compilação nativa sem que construções dinâmicas impeçam a geração do binário.

    Módulo de processador bare metal com dissipador e conector óptico em iluminação de estúdio

    Comparativo Estrutural de Execução no Ecossistema TypeScript

    A comparação técnica entre as abordagens consolidadas reflete trade-offs entre portabilidade dinâmica e compilação antecipada:

    AbordagemMecanismo de ExecuçãoComponente de Runtime EmbutidoTarget de SaídaModelo de Sandbox
    Node.js (node)Interpretador / JIT (V8)V8 VM completa com libuvExecução de fonte no runtime (sem compilação AOT)Processo de SO (acesso irrestrito ao host) 78
    Deno (deno compile)V8 em bundle autocontidoV8 VM + Deno runtime + VFSBinário executável autocontidoSandbox granular baseado em flags (--allow-net, etc.) 3
    Bun (bun build --compile)JavaScriptCore em bundleJavaScriptCore + Bun runtimeBinário executável autocontidoProcesso de SO 4
    pkg (Vercel)Node.js em bundle VFSNode.js runtime completoBinário executável autocontidoProcesso de SO 5
    TypeScript nativo (scriptc)Compilação AOT diretaRuntime C enxuto (runtime.c)Executável nativo (Mach-O, ELF, PE)Processo de SO 1
    TypeScript WASI (scriptc)Compilação AOT WebAssemblyRuntime C + WASI Preview 1 bindingsMódulo .wasm (WASI)Capability-based (definido pelo host WASI) 12

    Implicações Arquiteturais para Ferramentas de Agentes no MaxVision Code

    Na engenharia de sistemas autônomos e ferramentas operadas por agentes (como os MCPs e utilitários auxiliares do MaxVision Code), o isolamento de código gerado e o tempo de bootstrap de processos efêmeros constituem áreas ativas de exploração arquitetural.

    Hipótese de Sandbox Capability-Based para Agentes

    Na visão de arquitetura do MaxVision Code, a compilação de ferramentas utilitárias para o target wasm32-wasi representa uma hipótese promissora para execução segura de rotinas automatizadas:

    1. Restrição Estrita de Capacidades: Em vez de conceder acesso total ao sistema de arquivos do hospedeiro, o host de execução (como o Wasmtime) concede permissões explícitas apenas aos diretórios necessários para a tarefa do agente.2
    2. Eliminação do Aquecimento de VM: Tarefas efêmeras de verificação sintática ou formatação compiladas como binários AOT não necessitam inicializar a máquina virtual completa do Node.js a cada execução.
    # Experimento de execução com sandbox capability-based restrito
    # 1. Compilação do script de validação para WASI Preview 1
    SCRIPTC_CC=zigcc SCRIPTC_TARGET=wasm32-wasi scriptc build src/agent-tool.ts --no-keep-c -o dist/agent-tool.wasm
    
    # 2. Invocação no host Wasmtime com mapeamento restrito de diretório isolado
    wasmtime run --dir=/tmp/agent-scratch::/workspace dist/agent-tool.wasm
    

    Limitações Técnicas e Requisitos de Ambiente

    O scriptc encontra-se em estágio experimental pela Vercel Labs e possui requisitos e fronteiras técnicas bem delimitados:1

    • Pré-requisitos de Toolchain: Exige Node.js 24 ou superior no ambiente de compilação para execução do CLI, clang para compilações locais do host e zig cc para compilação cruzada ou emissão de artefatos WASI.1
    • Fronteiras de Compatibilidade e Targets: O modo --dynamic embute o interpretador QuickJS-ng para empacotar pacotes npm e trechos dinâmicos com any, sem suporte a leitura de node_modules em tempo de execução.19 Já no target WebAssembly (wasm32-wasi), chamadas de rede/fetch, processos-filhos, captura de sinais e monitoramento de sistema de arquivos falham antes da linkedição devido às fronteiras do modelo WASI Preview 1.12

    À medida que projetos de compilação AOT como o scriptc e iniciativas do ecossistema TypeScript evoluem, o desenvolvimento em TypeScript expande seu alcance de runtimes de interpretação dinâmica para a geração de código nativo e WebAssembly de alta densidade.


    Fontes primárias e referências técnicas

    Footnotes

    1. Vercel Labs — Repositório oficial do scriptc (TypeScript to Native/WASI Compiler). github.com/vercel-labs/scriptc. Consultado em 15 de agosto de 2026. 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

    2. WebAssembly System Interface (WASI) — Especificação técnica oficial da arquitetura WASI Preview 1 e modelo de segurança capability-based. wasi.dev. Consultado em 15 de agosto de 2026. 2 3 4 5 6 7

    3. Deno Manual — Documentação do comando deno compile e modelo de permissões e sandbox. docs.deno.com/runtime/manual/tools/compiler/. Consultado em 15 de agosto de 2026. 2 3

    4. Bun Documentation — Documentação oficial do utilitário bun build --compile para binários autocontidos. bun.sh/docs/bundler/executables. Consultado em 15 de agosto de 2026. 2 3

    5. Vercel pkg — Repositório e documentação do utilitário de empacotamento de runtime Node.js pkg. github.com/vercel/pkg. Consultado em 15 de agosto de 2026. 2 3

    6. The LLVM Project — Documentação da infraestrutura de compilação LLVM IR e backend Clang. llvm.org. Consultado em 15 de agosto de 2026. 2 3

    7. Node.js Foundation — Documentação de arquitetura e APIs do runtime Node.js. nodejs.org/docs/latest/api/. Consultado em 15 de agosto de 2026. 2 3

    8. V8 JavaScript Engine — Documentação de arquitetura de compilação JIT, interpretador Ignition e compilador Turbofan. v8.dev. Consultado em 15 de agosto de 2026. 2 3

    9. QuickJS-ng Project — Implementação e documentação do interpretador JavaScript leve em ANSI C para embutimento. github.com/quickjs-ng/quickjs. Consultado em 15 de agosto de 2026. 2

    TAGS
    • TypeScript
    • Compiladores
    • LLVM
    • WebAssembly
    • WASI
    • Vercel
    • Agentes IA
    Mascote da MaxVision para contato rápido no WhatsAppFale agora pelo WhatsApp