Na platformi Bun, ki se razvija kot alternativa Node.js in je namenjena izolirani izvedbi aplikacij v jezikih JavaScript, JSX in TypeScript, je bila implementirana eksperimentalna možnost kompilacije in izvrševanja obdelovalcev, napisanih v jeziku C. Prej je bilo za klicanje nizkonivojskega kode potrebno ali ustvariti N-API dodatke ali prevesti kodo v format WebAssembly (WASM/WASI), kar je oteževalo razvoj in nalagalo določene omejitve. Zdaj je mogoče kodo v jeziku C neposredno vključiti v JavaScript in jo on-the-fly kompilirati z uporabo kompilatorja TinyCC ter dinamično povezovati knjižnice. import { cc } from "bun:ffi"; export const { symbols: { hello }, } = cc({ source: "./hello.c", symbols: { hello: { returns: "void", args: [], }, }, }); hello();
Za delo z jezikom C se uporablja plast bun:ffi, ki prevaja izvorno kodo v strojne ukaze, jo vstavi v pomnilnik med izvajanjem in zagotavlja samodejno pretvorbo tipov podatkov med JavaScriptom in C-jem. Opaženo je, da so stroški pri dostopu do prevedenega C-kode minimizirani in povzročajo zamudo na ravni okoli 2 nanosekundi za vsak klic zunanjih C-funkcij. Kot primer je prikazano, kako lahko neposredno dostopamo do knjižnic FFmpeg za pretvorbo kratkih videov — s tem, da se izpusti takšne operacije, kot sta odpiranje ločenega procesa in dodeljevanje pomnilnika za vsak video, je bilo skupno čas izvajanja testne naloge pri uporabi bun:ffi mogoče skrajšati na tretjino.
Poleg tega je v izdaji Bun 1.1.29 za kodo v jeziku C dodana podpora za N-API (napi), ki omogoča, da obdelovalci napisani v jeziku C vračajo objekte, nize, tabele in druge ne-primitivne vrednosti JavaScript, poleg tipov, specifičnih za jezik C, kot sta int in float. Mehanizem klicanja obdelovalcev v jeziku C deluje tudi pri dinamičnem nalaganju vseh knjižnic s C ABI, ne glede na to, v katerem jeziku so prvotno napisane (C++, Rust, Zig itd.), kar omogoča klic funkcij, ki jih ponujajo te knjižnice, iz JavaScript kode brez ločenega koraka ponovne sestave. Na primer, zdaj je mogoče dostopati iz JavaScript do sistemskih API-jev.
O projektu Bun je treba omeniti, da se razvija ob upoštevanju združljivosti s strežnimi aplikacijami, napisanimi za Node.js, in podpira večino API-jev Node.js. Platforma vključuje nabor orodij za ustvarjanje in izvajanje aplikacij v JavaScript in TypeScript, pa tudi runtime za izvajanje JavaScript aplikacij brez brskalnika, upravljalnik paketov (združljiv z NPM), orodja za izvajanje testov in sistem za sestavljanje samostojnih paketov. Po zmogljivosti Bun znatno presega Deno in Node.js (v testih, ki temeljijo na okviru React, platforma Bun dvakrat prehiti Deno in skoraj petkrat Node.js). Koda Bun je napisana v jezikih Zig in C++, distribuira pa se pod licenco MIT. Za izvajanje JavaScript-a se uporablja JavaScript motor JavaScriptCore in komponente projekta WebKit z dodatnimi popravki.
Izvor: opennet.ru
