En la plataforma Bun, desarrollada como una alternativa a Node.js y destinada a la ejecución aislada de aplicaciones escritas en JavaScript, JSX y TypeScript, se ha implementado una capacidad experimental para compilar y ejecutar manejadores escritos en C. Anteriormente, para llamar a código de bajo nivel, era necesario crear complementos de N-API o compilar el código en formato WebAssembly (WASM/WASI), lo que complicaba el desarrollo y imponía ciertas limitaciones. Ahora, el código en C se puede integrar directamente en JavaScript y compilar sobre la marcha usando el compilador TinyCC, además de conectar bibliotecas de enlace dinámico. import { cc } from "bun:ffi"; export const { symbols: { hello }, } = cc({ source: "./hello.c", symbols: { hello: { returns: "void", args: [], }, }, }); hello();
Para trabajar con el lenguaje C se utiliza la capa bun:ffi, que compila el código fuente en instrucciones de máquina, lo inyecta en memoria durante la ejecución y proporciona una conversión automática de tipos de datos entre JavaScript y C. Se señala que los costos al llamar al código compilado en C se han minimizado, resultando en un retraso de aproximadamente 2 nanosegundos por cada llamada a funciones externas de C. Como ejemplo, se muestra cómo se puede acceder directamente a bibliotecas FFmpeg para convertir videos cortos; al eliminar operaciones como la bifurcación de un proceso separado y la asignación de memoria para cada video, el tiempo total de ejecución de la tarea de prueba usando bun:ffi se pudo reducir a una tercera parte.
Además, en la versión 1.1.29 de Bun se ha añadido soporte para N-API (napi) en el código en C, lo que permite a los manejadores escritos en C devolver objetos, cadenas, arreglos y otros valores no primitivos de JavaScript, además de los tipos nativos de C, como int y float. El mecanismo para llamar a manejadores en C también funciona al cargar dinámicamente cualquier biblioteca con C ABI, independientemente de en qué idioma estén originalmente escritas (C++, Rust, Zig, etc.), lo que permite llamar a funciones proporcionadas por esas bibliotecas desde código JavaScript sin una etapa separada de recompilación. Por ejemplo, ahora es posible acceder desde JavaScript a API del sistema.
Recordemos que el proyecto Bun se desarrolla teniendo en cuenta la compatibilidad con aplicaciones de servidor escritas para Node.js y soporta la mayor parte de la API de Node.js. La plataforma incluye un conjunto de herramientas para crear y ejecutar aplicaciones en JavaScript y TypeScript, así como un entorno de ejecución para ejecutar aplicaciones JavaScript sin navegador, un gestor de paquetes (compatible con NPM), herramientas para realizar pruebas y un sistema de construcción de paquetes independientes. En cuanto a rendimiento, Bun supera notablemente a Deno y Node.js (en pruebas basadas en el marco React, la plataforma Bun supera a Deno por 2 veces y casi 5 veces a Node.js). El código de Bun está escrito en los lenguajes Zig y C++, y se distribuye bajo la licencia MIT. Para la ejecución de JavaScript, se utiliza el motor JavaScriptCore y componentes del proyecto WebKit con parches adicionales.
Fuente: opennet.ru
