I Bun-platformen, der udvikles som et alternativ til Node.js og er designet til isoleret udførelse af applikationer skrevet i JavaScript, JSX og TypeScript, er en eksperimentel mulighed blevet implementeret for at kompilere og udføre håndterere skrevet i C. Tidligere krævede kald af lavniveau kode at man enten skulle oprette N-API-udvidelser eller kompilere koden til WebAssembly (WASM/WASI)-format, hvilket besværliggjorde udviklingen og pålagde visse begrænsninger. Nu er det muligt at integrere C-kode direkte i JavaScript og kompilere den i realtid ved hjælp af compilers som TinyCC, samt forbinde dynamisk linker biblioteker. import { cc } from "bun:ffi"; export const { symbols: { hello }, } = cc({ source: "./hello.c", symbols: { hello: { returns: "void", args: [], }, }, }); hello();
For at arbejde med C-sproget bruges lagret bun:ffi, som kompilere kildekoden til maskininstruktioner, indsætter den i hukommelsen under udførelsen og tilvejebringer automatisk typekonvertering mellem JavaScript og C. Det bemærkes, at overheaden ved at tilgå kompilert C-kode er minimalt og medfører en forsinkelse på omkring 2 nanosekunder pr. kald af eksterne C-funktioner. Som et eksempel vises, hvordan man kan tilgå FFmpeg-biblioteker direkte til konvertering af korte videoer — ved at ekskludere operationer som at forkaste en separat proces og allokere hukommelse for hver video, er den samlede tid til udførelse af testopgaven med brug af bun:ffi blevet reduceret med tre gange.
Desuden er der i Bun 1.1.29 tilføjet support til N-API (napi) for C-kode, hvilket tillader håndterere skrevet i C at returnere objekter, strenge, arrays og andre ikke-primitive JavaScript-værdier, udover de C-typiske typer som int og float. Mekanismen til at kalde håndterere skrevet i C fungerer også ved dynamisk indlæsning af enhver biblioteker med C ABI, uanset hvilket sprog de oprindeligt er skrevet i (C++, Rust, Zig osv.), hvilket muliggør kald af funktioner fra disse biblioteker i JavaScript-koden uden et separat rebuild-trin. For eksempel kan man nu tilgå system API'er fra JavaScript.
Det skal bemærkes, at projektet Bun udvikles med henblik på at sikre kompatibilitet med serverapplikationer skrevet i Node.js og understøtter det meste af Node.js API. Platformen inkluderer et sæt værktøjer til oprettelse og udførelse af applikationer i JavaScript og TypeScript samt et runtime til at køre JavaScript-applikationer uden en browser, en pakket manager (kompatibel med NPM), værktøjer til testudførelse og et system til opbygning af selvstændige pakker. I ydelse overgår Bun markant Deno og Node.js (ifølge tests baseret på React-frameworket overgår Bun platformen Deno med det dobbelte og næsten fem gange Node.js). Koden for Bun er skrevet i Zig og C++ og distribueres under MIT-licensen. JavaScript udføres ved hjælp af JavaScript-motoren JavaScriptCore og komponenter fra WebKit-projektet med yderligere patches.
Kilde: opennet.ru
