A plataforma Bun, criada como uma alternativa ao Node.js e projetada para executar aplicativos em JavaScript, JSX e TypeScript, agora oferece suporte experimental para a compilação e execução de manipuladores escritos em C. Anteriormente, para invocar código de baixo nível, era necessário criar complementos N-API ou compilar o código para WebAssembly (WASM/WASI), o que aumentava a complexidade e impunha limitações ao desenvolvimento. Com a nova atualização, o código em C pode ser diretamente incorporado ao JavaScript e compilado em tempo real usando o compilador TinyCC, além de possibilitar a conexão de bibliotecas dinâmicas.
O seguinte exemplo demonstra como isso funciona na prática:
import { cc } from "bun:ffi";
export const {
symbols: { hello },
} = cc({
source: "./hello.c",
symbols: {
hello: {
returns: "void",
args: [],
},
},
});
hello();
O Bun utiliza uma camada intermediária chamada bun:ffi
para trabalhar com o código C. Essa camada compila o código-fonte diretamente para instruções de máquina, carrega-o na memória durante a execução e faz a conversão automática de tipos de dados entre JavaScript e C. Segundo os desenvolvedores, a sobrecarga ao chamar funções C compiladas é mínima, resultando em um atraso de apenas cerca de 2 nanossegundos por chamada de função externa.
Um exemplo prático desse recurso é a integração com bibliotecas FFmpeg para converter vídeos curtos. Ao eliminar operações como criação de processos separados e alocação de memória para cada vídeo, o tempo total de execução da tarefa de teste foi reduzido em três vezes ao utilizar bun:ffi
.
Além disso, na versão Bun 1.1.29, foi adicionada a compatibilidade com N-API para código em C, permitindo que manipuladores escritos em C retornem objetos, strings, arrays e outros tipos não primitivos de JavaScript, além de tipos nativos de C, como int
e float
. Este mecanismo também funciona ao carregar dinamicamente qualquer biblioteca compatível com C ABI, independentemente da linguagem original em que foi escrita (C++, Rust, Zig, etc.), possibilitando a chamada de funções dessas bibliotecas a partir do código JavaScript sem a necessidade de recompilação.
Vale lembrar que o projeto Bun foi desenvolvido para garantir compatibilidade com aplicativos Node.js, suportando grande parte das APIs do Node.js. A plataforma inclui um conjunto de ferramentas para criar e executar aplicativos em JavaScript e TypeScript, um runtime para execução sem navegador, um gerenciador de pacotes (compatível com NPM), ferramentas de teste e um sistema de empacotamento. Em termos de desempenho, o Bun supera o Deno e o Node.js, sendo até duas vezes mais rápido que o Deno e cinco vezes mais rápido que o Node.js em testes com o framework React. O código do Bun é escrito em Zig e C++ e está disponível sob a licença MIT. Ele usa o motor JavaScriptCore e componentes do projeto WebKit, com patches adicionais para otimizar a execução.