In der Bun-Plattform, die als Alternative zu Node.js entwickelt wurde und für die isolierte Ausführung von Anwendungen in JavaScript, JSX und TypeScript gedacht ist, wurde eine experimentelle Möglichkeit zur Kompilierung und Ausführung von in C geschriebenen Handlern implementiert. Zuvor war es erforderlich, entweder N-API-Erweiterungen zu erstellen oder den Code in WebAssembly (WASM/WASI) zu kompilieren, was die Entwicklung erschwerte und bestimmte Einschränkungen auferlegte. Jetzt kann C-Code direkt in JavaScript eingebettet und on-the-fly mit dem TinyCC-Compiler kompiliert werden, ebenso wie dynamisch geladene Bibliotheken verbunden werden können. import { cc } from "bun:ffi"; export const { symbols: { hello }, } = cc({ source: "./hello.c", symbols: { hello: { returns: "void", args: [], }, }, }); hello();
Für die Arbeit mit der Sprache C wird die Schnittstelle bun:ffi verwendet, die den Quellcode in Maschinenanweisungen kompiliert, ihn während der Ausführung in den Speicher einfügt und die automatische Typkonvertierung zwischen JavaScript und C ermöglicht. Es wird festgestellt, dass die Overheadkosten beim Aufruf des kompilierten C-Codes auf ein Minimum reduziert sind und zu einer Verzögerung von etwa 2 Nanosekunden pro Aufruf externer C-Funktionen führen. Als Beispiel wird gezeigt, wie man direkt auf FFmpeg-Bibliotheken zur Umwandlung von kurzen Videos zugreifen kann – durch den Ausschluss von Vorgängen wie dem Starten eines separaten Prozesses und der Zuweisung von Speicher für jedes Video wurde die Gesamtzeit für die Ausführung der Testaufgabe unter Verwendung von bun:ffi um das Dreifache reduziert.
Darüber hinaus wurde in der Ausgabe von Bun 1.1.29 für C-Code die Unterstützung für N-API (napi) hinzugefügt, wodurch in C geschriebene Handler Objekte, Strings, Arrays und andere nicht primitive JavaScript-Werte zurückgeben können, neben den C-spezifischen Typen wie int und float. Der Mechanismus zum Aufrufen von C-Handlern funktioniert auch bei der dynamischen Lade von beliebigen Bibliotheken mit C ABI, unabhängig davon, in welcher Sprache sie ursprünglich geschrieben wurden (C++, Rust, Zig usw.), was es ermöglicht, Funktionen, die von diesen Bibliotheken bereitgestellt werden, direkt aus JavaScript-Code aufzurufen, ohne eine separate Neukompilierung durchzuführen. Zum Beispiel kann jetzt von JavaScript aus auf System-APIs zugegriffen werden.
Wir erinnern daran, dass das Projekt Bun mit dem Ziel der Kompatibilität zu serverseitigen Anwendungen, die für Node.js geschrieben wurden, entwickelt wird und die meisten Node.js APIs unterstützt. Die Plattform umfasst ein Toolkit zur Erstellung und Ausführung von Anwendungen in JavaScript und TypeScript, sowie eine Runtime zum Ausführen von JavaScript-Anwendungen ohne Browser, einen Paketmanager (kompatibel mit NPM), ein Test-Toolkit und ein System zur Erstellung eigenständiger Pakete. In Bezug auf die Performance übertrifft Bun Deno und Node.js deutlich (in Tests mit dem React-Framework übertrifft die Bun-Plattform Deno um das Doppelte und Node.js fast um das Fünfzehnfache). Der Code von Bun ist in Zig und C++ geschrieben und wird unter der MIT-Lizenz verbreitet. Für die Ausführung von JavaScript kommt die JavaScript-Engine JavaScriptCore und Komponenten des WebKit-Projekts mit zusätzlichen Patches zum Einsatz.
Quelle: opennet.ru
