Auf 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 Funktion zur Kompilierung und Ausführung von Handlern in C implementiert. Zuvor war es notwendig, entweder N-API-Erweiterungen zu erstellen oder den Code ins WebAssembly-Format (WASM/WASI) zu kompilieren, was die Entwicklung komplizierte und gewisse Einschränkungen mit sich brachte. Nun kann C-Code direkt in JavaScript integriert und zur Laufzeit mit dem TinyCC-Compiler kompiliert sowie dynamisch gelinkte Bibliotheken eingebunden werden. 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 Programmiersprache C wird die Schicht bun:ffi verwendet, die den Quellcode in Maschinenanweisungen kompiliert, ihn während der Ausführung in den Speicher einfügt und eine automatische Datentypkonvertierung zwischen JavaScript und C ermöglicht. Es wird darauf hingewiesen, dass die Overhead-Kosten beim Aufruf des kompilierten C-Codes auf ein Minimum reduziert sind, was zu einer Verzögerung von etwa 2 Nanosekunden pro Aufruf externer C-Funktionen führt. Als Beispiel wird gezeigt, wie man direkt auf FFmpeg-Bibliotheken zugreifen kann, um kurze Videos zu konvertieren — durch den Ausschluss von Operationen wie dem Starten eines separaten Prozesses und dem Speicherzuweisungsaufwand für jedes Video konnte die Gesamtzeit für die Durchführung des Testauftrags bei Verwendung von bun:ffi um das Dreifache verkürzt werden.
Darüber hinaus wurde in der Version Bun 1.1.29 für C-Code die Unterstützung von N-API (napi) hinzugefügt. Dadurch können in C geschriebene Handler Objekte, Strings, Arrays und andere nicht primitive JavaScript-Werte zurückgeben, zusätzlich zu den für die Programmiersprache C typischen Datentypen wie int und float. Der Mechanismus zum Aufrufen von C-Handlern funktioniert auch bei der dynamischen Lade von Bibliotheken mit C ABI, unabhängig davon, in welcher Sprache sie ursprünglich geschrieben wurden (C++, Rust, Zig usw.). Dies ermöglicht das Aufrufen von Funktionen dieser Bibliotheken direkt aus JavaScript-Code, ohne eine separate Neukompilierung durchzuführen. Zum Beispiel kann nun auf systemnahe APIs aus JavaScript zugegriffen werden.
Wir erinnern daran, dass das Projekt Bun mit Blick auf die Kompatibilität zu Serveranwendungen, die für Node.js geschrieben wurden, entwickelt wird und die meisten APIs von Node.js unterstützt. Die Plattform umfasst eine Sammlung von Tools zur Erstellung und Ausführung von Anwendungen in JavaScript und TypeScript sowie eine Laufzeitumgebung zur Ausführung von JavaScript-Anwendungen ohne Browser, einen Paketmanager (kompatibel mit NPM), Testwerkzeuge und ein System zum Erstellen eigenständiger Pakete. In Bezug auf die Leistung überholt Bun Deno und Node.js erheblich (in Tests mit dem React-Framework übertrifft die Bun-Plattform Deno um das Doppelte und Node.js fast um das Fünffache). Der Code von Bun ist in Zig und C++ geschrieben und wird unter der MIT-Lizenz verbreitet. Für die Ausführung von JavaScript wird die JavaScript-Engine JavaScriptCore und Komponenten des WebKit-Projekts mit zusätzlichen Patches verwendet.
Quelle: opennet.ru
