【问题标题】:Is there a way to use C++ in JavaScript?有没有办法在 JavaScript 中使用 C++?
【发布时间】:2014-11-29 03:06:23
【问题描述】:

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

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

【问题讨论】:

  • “利用”一词的定义非常宽松。这可能意味着很多不同的事情。
  • 并非所有的 Javascript 实现都是用 C++ 编写的。
  • 例如,Microsoft .Net Framework 中有多种 JavaScript 实现(包括从 1.0 开始的框架的一部分) - 因此您可以使用 JavaScript 编写代码并使用任何其他受支持的语言.Net 来实现可从 JS 调用的其他部分...或者用于在 Windows 中编写脚本的 JavaScript 可以使用以任何语言编写的 COM 对象...但我强烈怀疑这不是您所要求的...
  • 我认为如果你坚持使用 C 和 C++,这是一个更好的问题,对任何语言开放似乎对我来说太宽泛了。

标签: javascript c++ cross-platform emcc


【解决方案1】:

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

Emscripten 是一个 LLVM 到 JavaScript 的编译器。它需要 LLVM 位码 - 可以从 C/C++ 生成,使用 llvm-gcc (DragonEgg) 或 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>

【讨论】:

    【解决方案2】:

    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

    【讨论】:

    • 也许你应该提到你维护 WCPP? :)
    • @ConorO'Brien +1,我添加了免责声明。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-21
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      相关资源
      最近更新 更多