首页 > 解决方案 > 有没有办法用 CodeStubAssembly 编写一个 nodejs 内置函数,它在其中调用一个动态链接的 c++ 库?

问题描述

有没有办法用 CodeStubAssembly 编写一个 nodejs 内置函数,它在其中调用一个动态链接的 c++ 库?所以我可以从javascript调用它。我不想使用插件,因为它引入了我不想要的额外编译。我想使用 CSA 的原因是它是在 Runtime 期间调用的,而我只需要 nodejs Runtime 期间的信息并希望消除开销。

标签: node.jsv8ignition

解决方案


可以使用 CodeStubAssembler 编写内置函数,是的,并且可以从 JavaScript 调用这些内置函数。(这就是 CSA 的用途。)但是,CSA 未在 V8 API 上公开,因此您必须在 V8 本身中执行此操作。换句话说,您必须修改 V8。我不推荐这样做(因为它使更新变得困难,并且意味着您需要构建和部署自己的自定义 Node 二进制文件),但这是可能的。

CSA 内置函数在它们可以调用的 C++ 函数类型方面非常有限。有两种机制:通过 CEntryStub 对 V8 自己的“运行时函数”和 C++“内置函数”的常规调用,以及对“外部引用”的“快速 C 调用”,它们的调用开销较少,但不支持进行堆分配或在 C++ 端抛出异常。无论哪种方式,都必须在编译时知道调用目标。因此,您需要一个作为调用目标的 V8 端 C++ 函数,然后调用您想要的任何外部库函数。从好的方面来说,这个中间函数可以在 V8 内部使用的类型和你的外部库理解/产生的类型之间转换参数和结果。

我想理论上您可以将 CSA 用作通用汇编程序并使用它来生成机器代码,该代码知道如何加载动态链接库并调用其中的函数。不过,那将是全新的功能,因此您必须做很多工作才能完成。

您还可以使用公共 V8 API 创建由任意 C++ 实现(例如外部库)支持的 JavaScript 可调用函数。我认为这将最适合您的目的。不涉及 CSA,也不涉及动态编译,使用 NAPI 甚至在 Node 版本更新方面都非常强大。我建议您探索这种方法。


推荐阅读