Nella piattaforma Bun, sviluppata come alternativa a Node.js e concepita per l'esecuzione isolata di applicazioni scritte in JavaScript, JSX e TypeScript, è stata implementata una funzionalità sperimentale per compilare ed eseguire gestori scritti in C. In precedenza, per richiamare codice a basso livello era necessario creare aggiunte N-API o compilare il codice nel formato WebAssembly (WASM/WASI), il che complicava lo sviluppo e imponeva determinate limitazioni. Ora, il codice in C può essere integrato direttamente in JavaScript e compilato al volo utilizzando il compilatore TinyCC, e si possono anche collegare librerie condivise dinamicamente. import { cc } from "bun:ffi"; export const { symbols: { hello }, } = cc({ source: "./hello.c", symbols: { hello: { returns: "void", args: [], }, }, }); hello();
Per lavorare con il linguaggio C si utilizza l'interfaccia bun:ffi, che compila il codice sorgente in istruzioni di macchina, lo inserisce in memoria durante l'esecuzione e garantisce la conversione automatica dei tipi di dati tra JavaScript e C. Si osserva che i costi associati alla chiamata di codice C compilato sono ridotti al minimo, con una latenza di circa 2 nanosecondi per ciascuna chiamata a funzioni C esterne. Come esempio, viene mostrato come accedere direttamente alle librerie FFmpeg per la conversione di brevi video: eliminando operazioni come la creazione di un processo separato e l'allocazione di memoria per ciascun video, il tempo totale di esecuzione del compito di test utilizzando bun:ffi è riuscito a essere ridotto di un terzo.
Inoltre, nella versione 1.1.29 di Bun è stata aggiunta la supporto a N-API (napi) per il codice in C, il che consente ai gestori scritti in C di restituire oggetti, stringhe, array e altri valori non primitivi di JavaScript, oltre ai tipi propri del linguaggio C, come int e float. Il meccanismo di chiamata dei gestori in C funziona anche con il caricamento dinamico di qualsiasi libreria con C ABI, indipendentemente dal linguaggio in cui sono state scritte originariamente (C++, Rust, Zig, ecc.), permettendo di chiamare le funzioni fornite da queste librerie direttamente dal codice JavaScript senza una fase separata di ricompilazione. Ad esempio, ora è possibile accedere alle API di sistema da JavaScript.
Ricordiamo che il progetto Bun si sviluppa con attenzione all'interoperabilità con le applicazioni server scritte per Node.js, e supporta la maggior parte delle API di Node.js. La piattaforma include un insieme di strumenti per la creazione e l'esecuzione di applicazioni in JavaScript e TypeScript, oltre a un runtime per l'esecuzione di applicazioni JavaScript senza browser, un gestore di pacchetti (compatibile con NPM), strumenti per eseguire test e un sistema di build per pacchetti autonomi. In termini di prestazioni, Bun supera significativamente Deno e Node.js (nei test basati sul framework React, la piattaforma Bun è due volte più veloce di Deno e quasi cinque volte più veloce di Node.js). Il codice di Bun è scritto in Zig e C++, ed è distribuito sotto licenza MIT. Per l'esecuzione di JavaScript utilizza il motore JavaScript JavaScriptCore e componenti del progetto WebKit con patch aggiuntive.
Fonte: opennet.ru
