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

时间:2014-11-29 03:06:23

标签: javascript c++ cross-platform

this开始,我发现JavaScript是用C ++编写的。我还发现/推断出大多数JavaScript都是C ++(例如Math.atan+""Math.atan.toString()产生"function atan() { [native code] }")。 [native code我认为是C ++,否则“隐藏”它的意义是什么?

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

3 个答案:

答案 0 :(得分:3)

emscripten项目允许您从C和C ++生成Javascript:

  

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

并通过像ccall and cwrap这样的方法可以调用C函数:

使用网站上的示例,这个C ++代码使用extern "C"来防止名称错位:

#include <math.h>

extern "C" {

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

}

可以像这样编译:

./emcc tests/hello_function.cpp -o function.html -s EXPORTED_FUNCTIONS="['_int_sqrt']"

并在Javascript中使用:

int_sqrt = Module.cwrap('int_sqrt', 'number', ['number'])
int_sqrt(12)
int_sqrt(28)

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);
}

并编译:

emcc --bind -o quick_example.js quick_example.cpp

并在Javascript中使用:

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

答案 1 :(得分:2)

您可以使用NACL。它是chrome的原生客户端,但它是实验性的。您必须编写C ++代码,然后在JS文件中对它进行引用。

https://developer.chrome.com/native-client/overview

答案 2 :(得分:1)

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

我们的C ++

// addTwo.cpp 

export int addTwo(int a, int b) {
  return a + b;
}

在终端机

$ wcpp

我们的JavaScript

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

console.log(ourModule.addTwo(2, 3))

有关更多信息,请参见NPM PackageGit Repo