有没有办法在JavaScript中使用C ++?

Con*_*ien 4 javascript c++ cross-platform

这个,我发现JavaScript是用C ++编写。我还发现/推断出大多数JavaScript是C ++(例如Math.atan+""Math.atan.toString()yield "function atan() { [native code] }")。在[native code我认为是C ++,还有什么是“隐藏”了点?

我的问题是有没有办法在JavaScript中利用C ++?要在函数中还是在JavaScript平台中使用它?

Bra*_*yer 7

WCPP是一个包,可让您几乎直接将 C++ 导入到 Node 项目中。免责声明:我是这个项目的维护者。

我们的C++

// addTwo.cpp 

export int addTwo(int a, int b) {
  return a + b;
}
Run Code Online (Sandbox Code Playgroud)

在航站楼

$ wcpp
Run Code Online (Sandbox Code Playgroud)

我们的 JavaScript

const ourModule = await require('wcpp')('./addTwo.cpp')

console.log(ourModule.addTwo(2, 3))
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅NPM 包Git 存储库

  • 也许你应该提到你维护 WCPP?:) (4认同)

Sha*_*our 5

emscripten项目可以让你从C和C ++生成JavaScript:

Emscripten是LLVM到JavaScript的编译器。它需要LLVM位代码-可以使用llvm-gcc(DragonEgg)或clang或任何其他可以转换为LLVM的语言从C / C ++生成-并将其编译为JavaScript,可以在网络上运行(或其他可以运行JavaScript的地方)。

通过ccall和cwrap之类的方法您可以调用C函数:

使用站点中的示例,此C ++代码用于extern "C"防止名称篡改:

#include <math.h>

extern "C" {

int int_sqrt(int x) {
  return sqrt(x);
}

}
Run Code Online (Sandbox Code Playgroud)

可以这样编译:

./emcc tests/hello_function.cpp -o function.html -s EXPORTED_FUNCTIONS="['_int_sqrt']"
Run Code Online (Sandbox Code Playgroud)

并在Javascript中使用:

int_sqrt = Module.cwrap('int_sqrt', 'number', ['number'])
int_sqrt(12)
int_sqrt(28)
Run Code Online (Sandbox Code Playgroud)

embind可用于C ++函数和类。该站点的快速示例如下:

// quick_example.cpp
#include <emscripten/bind.h>

using namespace emscripten;

float lerp(float a, float b, float t) {
    return (1 - t) * a + t * b;
}

EMSCRIPTEN_BINDINGS(my_module) {
    function("lerp", &lerp);
}
Run Code Online (Sandbox Code Playgroud)

并编译:

emcc --bind -o quick_example.js quick_example.cpp
Run Code Online (Sandbox Code Playgroud)

并在Javascript中使用:

<!doctype html>
<html>
  <script src="quick_example.js"></script>
  <script>
    console.log('lerp result: ' + Module.lerp(1, 2, 0.5));
  </script>
</html>
Run Code Online (Sandbox Code Playgroud)