Platforma Bun, vyvíjaná ako alternatíva k Node.js a určená na oddelené spúšťanie aplikácií napísaných v jazykoch JavaScript, JSX a TypeScript, implementuje experimentálnu možnosť kompilácie a spúšťania spracovateľov napísaných v jazyku C. Predtým sa na volanie nízkoúrovňového kódu vyžadovalo buď vytvoriť N-API rozšírenia, alebo skompilovať kód do formátu WebAssembly (WASM/WASI), čo komplikovalo vývoj a ukladalo určité obmedzenia. Teraz je možné kód v jazyku C priamo integrovať do JavaScriptu a naživo kompilovať pomocou kompilátora TinyCC, ako aj pripojiť dynamicky viazané knižnice. import { cc } from "bun:ffi"; export const { symbols: { hello }, } = cc({ source: "./hello.c", symbols: { hello: { returns: "void", args: [], }, }, }); hello();
Na prácu s jazykom C slúži medzivrstva bun:ffi, ktorá kompiluje zdrojový kód na strojové inštrukcie, vkladá ho do pamäte pri vykonávaní a zabezpečuje automatickú konverziu dátových typov medzi JavaScriptom a C. Uvádza sa, že režijné náklady pri volaní skompilovaného C kódu sú minimalizované a vedú k oneskoreniu na úrovni približne 2 nanosekúnd na každý hovor externých C funkcií. Ako príklad je ukázané, ako možno priamo sa obracovať na knižnice FFmpeg pre konverziu krátkych videí — vylúčením takých operácií ako oddelenie samostatného procesu a alokácia pamäte pre každé video, sa celkový čas vykonávania testovacej úlohy pri použití bun:ffi podarilo skrátiť trikrát.
Navyše, vo verzii Bun 1.1.29 bola pre kód napísaný v jazyku C pridaná podpora N-API (napi), vďaka čomu môžu spracovatelia napísaní v jazyku C vracať objekty, reťazce, polia a iné neprimitívne hodnoty JavaScriptu, okrem typov typických pre jazyk C, ako sú int a float. Mechanizmus volania spracovateľov v jazyku C funguje aj pri dynamickom načítaní akýchkoľvek knižníc s C ABI, bez ohľadu na to, v akom jazyku sú pôvodne napísané (C++, Rust, Zig atď.), čo umožňuje volať funkcie poskytované týmito knižnicami z JavaScriptového kódu bez samostatnej fázy prekompilácie. Napríklad teraz je možné obracať sa z JavaScriptu na systémové API.
Pripomíname, že projekt Bun sa vyvíja s ohľadom na zaručenie kompatibility so serverovými aplikáciami, napísanými pre Node.js, a podporuje väčšinu API Node.js. Súčasťou platformy je sada nástrojov na vytváranie a vykonávanie aplikácií v jazykoch JavaScript a TypeScript, ako aj runtime pre vykonávanie JavaScript aplikácií bez prehliadača, balíčkový manažér (kompatibilný s NPM), nástroj na vykonávanie testov a systém na zostavovanie samostatných balíkov. Z hľadiska výkonu Bun výrazne predbehne Deno a Node.js (v testoch založených na frameworku React platforma Bun predčí Deno 2-krát a takmer 5-krát Node.js). Kód Bun je napísaný v jazykoch Zig a C++ a je distribuovaný pod licenciou MIT. Na vykonávanie JavaScriptu je použitý JavaScript engine JavaScriptCore a komponenty projektu WebKit s dodatočnými patchmi.
Zdroj: opennet.ru
