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

Is there a way to write a nodejs builtins with CodeStubAssembly, which calls a dynamic linked c++ library in it?

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

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

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

的类型之间转换参数和结果。

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

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