În platforma Bun, care se dezvoltă ca o alternativă la Node.js și este destinată execuției izolate a aplicațiilor scrise în JavaScript, JSX și TypeScript, a fost implementată o funcționalitate experimentală de compilare și execuție a handlerelor scrise în C. Anterior, pentru a apela cod de nivel inferior, era necesar ori să se creeze extensii N-API, ori să se compileze codul în format WebAssembly (WASM/WASI), ceea ce complica dezvoltarea și impunea anumite restricții. Acum codul în C poate fi încorporat direct în JavaScript și compilat la scară cu ajutorul compilatorului TinyCC, precum și să se conecteze biblioteci dinamic legate. import { cc } from "bun:ffi"; export const { symbols: { hello }, } = cc({ source: "./hello.c", symbols: { hello: { returns: "void", args: [], }, }, }); hello();
Pentru a lucra cu limbajul C, se utilizează un strat bun:ffi, care compilează codul sursă în instrucțiuni mașină, îl înlocuiește în memorie în timpul execuției și asigură conversia automată a tipurilor de date între JavaScript și C. Se observă că cheltuielile generale la apelarea codului C compilat sunt minime și conduc la o întârziere de aproximativ 2 nanosecunde pentru fiecare apel de funcții externe C. Ca exemplu, este arătat cum se poate apela direct bibliotecile FFmpeg pentru a converti videoclipuri scurte — prin eliminarea unor operațiuni cum ar fi bifurcarea unui proces separat și alocarea memoriei pentru fiecare videoclip, timpul total de execuție al task-ului de testare utilizând bun:ffi a reușit să fie redus de trei ori.
În plus, în versiunea Bun 1.1.29, pentru codul scris în C a fost adăugată suportul pentru N-API (napi), care permite handlerelor scrise în C să returneze obiecte, șiruri de caractere, aranjamente și alte valori non-primitive JavaScript, în afară de tipurile specifice limbajului C, cum ar fi int și float. Mecanismul de apelare a handlerelor în C funcționează și în timpul încărcării dinamice a oricăror biblioteci cu C ABI, indiferent de limbajul în care au fost scrise inițial (C++, Rust, Zig etc.), ceea ce permite apelarea din codul JavaScript a funcțiilor furnizate de aceste biblioteci fără o etapă separată de recompilare. De exemplu, acum se poate apela din JavaScript API-urile sistemului.
Amintim că proiectul Bun se dezvoltă cu scopul de a asigura compatibilitatea cu aplicațiile server, scrise pentru Node.js, și suportă cea mai mare parte a API-ului Node.js. Platforma include un set de unelte pentru crearea și rularea aplicațiilor scrise în limbajele JavaScript și TypeScript, precum și un runtime pentru executarea aplicațiilor JavaScript fără browser, un manager de pachete (compatibil cu NPM), un instrumentar pentru rularea testelor și un sistem de construire a pachetelor autonome. În ceea ce privește performanța, Bun depășește semnificativ Deno și Node.js (în teste bazate pe frameworkul React, platforma Bun este de 2 ori mai rapidă decât Deno și aproape de 5 ori mai rapidă decât Node.js). Codul Bun este scris în limbajele Zig și C++ și este distribuit sub licența MIT. Pentru executarea JavaScript-ului este utilizat motorul JavaScriptJavaScriptCore și componentele proiectului WebKit cu patchuri suplimentare.
Sursa: opennet.ro
