在 JavaScript 中编译和运行 C

主要观点:世界基于 C 语言运行,Bun v1.1.28 引入从 JavaScript 编译和运行原生 C 的实验性支持,传统使用 N-API 和编译为 WebAssembly 存在诸多问题,而新方式可快速编译和低开销运行原生 C 并与 JavaScript 交互。
关键信息

  • N-API 构建复杂、性能差,每次 Node.js 更新 V8 可能导致原生插件更改,且在 CI 中需安装 Python 和 C++编译器,维护多个构建目标也复杂,JavaScript 到 N-API 函数调用开销大。
  • WebAssembly 隔离内存模型有严重权衡,无法直接访问系统调用,默认传递数据需克隆,对于系统库性能提升不明显。
  • bun:ffi使用 TinyCC 快速编译 C 程序,生成内联函数包装器自动转换类型,开销低,如示例中编译随机数生成器和转换视频、使用 macOS Keychain API 等,可用于粘合 C 或类似库与 JavaScript,但不适合编译大型 C 项目。
    重要细节
  • hello.chello.ts示例展示从 JavaScript 调用 C 函数hello
  • 测量bun:ffi编译时间约 5.16ms,与 C++基准测试对比,bun:ffi函数调用开销约 2ns 等。
  • ffmpeg.jsmp4.c示例展示快速转换视频,keychain.jskeychain.c示例展示使用 macOS Keychain API 保存和加载密码。
阅读 30
0 条评论