从nodejs运行c / c ++代码

时间:2018-03-04 20:51:47

标签: c++ c node.js requirejs

假设我在c ++或c中有一个简单的hello world文件(无论是什么都可以帮助我在node.js中更容易使用它,更喜欢c)并希望从node.js文件中运行它。考虑到该文件将用于提高性能(从node.js更改为c / c ++的CPU密集型函数),最有效的方法是什么。

我遇到了addons,但在我看来,为了使用它,我必须转换大量代码才能将其转换为该格式。有更简单的方法吗?

2 个答案:

答案 0 :(得分:1)

对于我在C++中编写的图像分割算法,我需要帮助全栈开发人员包装node.js的共享库。据我所知,从谷歌的一天到黑客入侵node.js,对我来说这是一个有点陌生的世界,有两个主要选择:

  1. 使用node-ffi,或
  2. addons正如您已经说过的那样。
  3. 对于上面的1.你不需要做太多。您只需要ffi中的refref-arraynode.js个包/插件,就可以调用应用程序代码的C API。我遵循了一些nice tutorial,这帮助我在15分钟内开始行动。

    但是,我最终需要为我们的项目选择2.以上。这是因为我们的全栈开发人员依赖于需要最新版node.js的其他一些插件。显然,当我们检查node-ffi的问题解答时,截至此回答的发布时间,它确实支持v9.x node.js个系列。因此,我采用原生插件的方式。我花了大约4个小时来理解和编写代码。我不确定它是否是最方便/最有效的方式,但我做的是

    1. 使用buffersnode.js
    2. 中分配内存
    3. 使用nan中的node.js编写一个简单的插件reinterpret_cast char* node.js binding.gyp缓冲区,并调用我们共享库的相同C API ,最后,
    4. 链接我们使用nan创建的共享库。
    5. 显然,Node.js的Native Abstractions(aka v8)应该被用户使用,以避免处理node-ffi中引入的重大更改的需要。我找到了另一个nice tutorial,这有助于我轻松解决我的问题。

      最后,Scott Frees'对于那些想要更深入的人来说,博客网站似乎有很多自成一体的文章/例子。他还argues在哪种情况下你应该更喜欢一种方法而不是另一种方法(例如,node-ffi优于本地插件)。基本上,我理解的是,编写本机插件会更有效,即使对于我们的应用程序来说也没那么重要。 nan也提供了令人满意的行为,因为我们正在解决图像分割问题(​​无论如何都需要比调用开销更多的时间)。

      所以,简而言之,

        

      我遇到了插件,但在我看来,为了使用它,我必须转换大量代码才能将其转换为该格式。

      嗯,不一定!这取决于你愿意实现的目标。它可以像为特定的C-API共享库编译C ++代码一样简单,然后在reinterpret_cast中编写一个20行的包装器,基本上为就地内存操作执行一些binding.gyp,最后在node-ffi中链接到库。

        

      有更简单的方法吗?

      是的,有。 v9.x可以帮助您在半小时内解决问题。但是,可能对您的方案来说不是最有效的,或者可能对您来说不是一个可行的选项,因为它目前不构建{{1} node.js的家人。

答案 1 :(得分:1)

我不明白为什么使用child_process比其他选项要慢, 我建议:

// myCFile.c
#include <stdio.h>
int main(void){

    // processor intensive computations
    int x = 1+2+3;

    // send to node via stdout
    printf("%d", x);

    //terminate the process
    return 0;
}

编译:

$ gcc -o myExecutable myCFile.c

并像这样使用child_process:

//myNodeFile.js
const { exec } = require("child_process");
exec("./myExecutable", (error, stdout, stderr) => console.log(stdout));