Nella piattaforma Bun, sviluppata come alternativa a Node.js e progettata per l'esecuzione isolata di applicazioni scritte in JavaScript, JSX e TypeScript, è stata implementata una funzionalità sperimentale per la compilazione e l'esecuzione di gestori scritti in linguaggio C. In precedenza, per richiamare codice a basso livello era necessario creare estensioni N-API o compilare il codice nel formato WebAssembly (WASM/WASI), il che complicava lo sviluppo e imponeva alcune limitazioni. Ora il codice scritto in C può essere incorporato direttamente in JavaScript e compilato in tempo reale utilizzando il compilatore TinyCC, oltre a permettere l'integrazione di librerie collegate 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 viene utilizzato uno strato 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 segnala che il sovraccarico per l'accesso al codice C compilato è ridotto al minimo, comportando un ritardo di circa 2 nanosecondi per ogni chiamata a funzioni C esterne. Come esempio, viene mostrato come si possano richiamare direttamente le librerie FFmpeg per la conversione di brevi video; eliminando operazioni come l'avvio di un processo separato e l'allocazione di memoria per ogni video, il tempo totale di esecuzione del compito di test utilizzando bun:ffi è stato ridotto di tre volte.
Inoltre, nella release Bun 1.1.29 è stata aggiunta la supporto per N-API (napi) nel codice scritto in C, grazie al quale i gestori scritti in C possono 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 originale in cui sono scritte (C++, Rust, Zig, ecc.), permettendo di chiamare funzioni fornite da queste librerie direttamente dal codice JavaScript senza una fase separata di ricompilazione. Ad esempio, ora è possibile accedere dalle API di sistema da JavaScript.
Ricordiamo che il progetto Bun si sviluppa tenendo conto della compatibilità 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 eseguire applicazioni JavaScript senza browser, un gestore pacchetti (compatibile con NPM), strumenti di esecuzione dei test e un sistema di build di pacchetti autonomi. Per quanto riguarda le prestazioni, Bun supera nettamente Deno e Node.js (nei test basati sul framework React, la piattaforma Bun supera Deno di 2 volte e quasi 5 volte Node.js). Il codice Bun è scritto nei linguaggi Zig e C++, ed è distribuito con licenza MIT. Per eseguire JavaScript viene utilizzato il motore JavaScript JavaScriptCore e componenti del progetto WebKit con patch aggiuntive.
Fonte: opennet.ru
