Bun现支持“在JavaScript中编译并运行C代码”

图片
在软件开发领域,技术迭代和更新是常态。最近,Node.js社区发生了一些重大变化,这些变化可能会对JavaScript开发者产生深远影响。Node.js计划移除自16.13.0版本以来一直包含的工具Corepack,这一决定在开发者中引起了广泛的讨论。
Corepack是一个简化了管理不同Node.js版本和包管理器(如npm、yarn和pnpm)的工具,它允许开发者在不同项目中轻松切换,同时解决了兼容性问题和手动配置的繁琐。然而,Corepack的命运在经历了一番波折后,最终决定被移除。这一决定背后的故事颇为曲折,原本计划将Corepack默认启用,但后来却出现了180度大转弯,决定将其移除。许多web开发者对此表示失望,因为Corepack曾是他们处理npm问题的一大助力。
与此同时,Bun这个集成了JavaScript运行时、打包器、测试运行器和包管理器的工具,现在提供了一个实验性功能,允许从JavaScript直接编译和运行原生C代码。Bun的这一新特性引发了社区的广泛关注,因为它打开了JavaScript与系统级编程语言C之间的直接通道。
Bun的创建者Jarred Sumner表示,世界上从压缩算法到密码学,再到网络,甚至是你正在阅读这篇文章的web浏览器,几乎都是用C语言编写的。如果它们不是用C语言编写的,那么它们就是使用CABI(例如C++、Rust、Zig等)编写的,并以C库的形式提供。C语言及其ABI是系统编程的过去、现在和未来。
Sumner指出,通过C语言,开发者可以以低门槛的方式使用C库和系统库,这一特性允许运行JavaScript的同一项目也能够运行C代码,而无需单独的构建步骤。他举例说,使用Bun可以通过ffmpeg将短视频转换速度提高三倍,这得益于避免了为每个视频生成新进程和分配大量内存的开销。此外,还可以通过macOSKeychainAPI安全地保存和加载密码。
Bun的这一新特性对于那些希望从JavaScript使用C库或系统API的开发者来说是一个福音。尽管如此,Sumner也提醒说,开发者可能并不需要用这种方式来编译大型项目,如PostgreSQL或SQLite。因为TinyCC编译的C代码虽然性能尚可,但它不会进行像Clang或GCC那样的高级优化,例如自动向量化或非常专业的CPU指令集。
在技术快速迭代的今天,Node.js和Bun的这些变化标志着JavaScript生态系统正在不断进化,以满足开发者日益增长的需求。对于Node.js来说,移除Corepack可能是为了简化其工具链,让开发者更专注于使用npm、yarn或pnpm等成熟的包管理器。而对于Bun,支持原生C代码的运行则展示了其在提升性能和功能性方面的雄心。
这些变化对于JavaScript开发者来说是一个双刃剑。一方面,他们可能需要重新评估自己的工具选择和开发流程,以适应Node.js的新方向;另一方面,Bun的新特性为他们提供了更强大的工具,以构建性能更优和功能更全的应用。