如何使用asm.js在浏览器中运行C ++代码?


21

一个asm.js应用程序非常快(接近本地C ++速度):

在此处输入图片说明

http://kripken.github.io/mloc_emscripten_talk/micro4b.png

但是,如何用C ++编写代码,将其转换为LLVM代码,然后使用emscripten / asm.js进行一些技巧呢?我还没有找到关于它的任何教程。

如果我用C ++编写代码,那么如何使用js API-s,例如XMLHttpRequest,WebSockets,Canvas或WebGL?


3
分享您的研究成果对所有人都有帮助。告诉我们您尝试过的内容以及为什么它不能满足您的需求。这表明您已花时间尝试自我帮助,这使我们免于重复显而易见的答案,并且最重要的是,它可以帮助您获得更具体和相关的答案。另请参阅如何提出
蚊蚋

该第三方教程似乎解决了其中一些问题:devosoft.org/an-introduction-to-web-development-with-emscripten
nobar

Answers:


36

我相信您对asm.js的理解是错误的。

首先,从他们的常见问题解答

问:asm.js是一种新语言吗?
答:不,它只是JavaScript的一部分。

然后您要求澄清

但是如何用C ++编写一个[asm.js应用程序]

您无需编写“ asm.js应用程序”,而asm.js是将C ++代码编译到的目标1

John Resig的这篇文章提供了许多细节,可以更好地解释如何使用asm.js。

从这张图片开始:
C ++ =>铛/ LLVM => emscripten => JS引擎

您会看到asm.js是emscripten的翻译目标。Emscripten负责将LLVM字节码转换成JavaScript,而asm.js是JavaScript的子集。留在asm.js的JavaScript受限子集中,可以优化代码并更快地运行。

您还问:

如果我用C ++编写代码,那么如何使用js API-s

同样,您有点漏了点。Asm.js可以将现有的C / C ++应用程序移植到JavaScript中,以便它们可以在浏览器中运行。通常,您将无法在C / C ++代码中使用JS API,并且asm.js允许这样做没有什么神奇之处。

如果您要编写一个需要JS API的新应用程序,则应使用JS编写该应用程序,而不要尝试用C ++编写,然后移植到JavaScript。

回到Resig的文章,您的问题有两个关键引号:

在不久的将来,针对Asm.js的应用程序类型将受益于在浏览器中运行的可移植性,但具有一定程度的复杂性,无法直接移植到JavaScript

正如您可能从上面的代码中看到的那样,Asm.js并非旨在手动编写。...目前,最常见的Asm.js用例是从C / C ++到JavaScript编译的应用程序。除了使用WebGL等之外,几乎所有这些应用程序都没有以有意义的方式与DOM交互。

您可能想要考虑做的是拥有一个JavaScript程序,该程序调用所需的JS API,同时调用已编译为JavaScript的C ++。看一下这个脚本教程,看看如何从JavaScript调用C ++代码。


对于其他研究,emscripten提供了一个教程,可以帮助您开始了解如何获取C ++代码,通过LLVM运行它,然后将asm.js作为目标。

1 严格来说,这是不正确的。C / C ++代码不知道它将被编译成什么,因此我不能真正将asm.js称为目标。另一个工具(脚本)获取LLVM输出,然后转换为与asm.js兼容的JavaScript。但我将其称为目标,因为它更容易理解。


ASM.js是C / C ++的编译目标。因此,请不要在asm.js中编写C ++,而不是在asm.js中编译C ++
Calvin

对于从头开始的应用程序,只有一点提及。就游戏而言,在C ++中拥有代码可能有助于在多个平台上进行部署。
弗拉德·尼古拉(Flad Nicula)

6

是的,您可以使用emscripten编写C ++代码并将其编译为asm.js。我自己还没有尝试过,所以我不确定这在黄金时段是否准备就绪。不过,运行一堆游戏似乎足够好。

这是一个教程:http : //kripken.github.io/emscripten-site/docs/getting_started/Tutorial.html。看一下该教程,似乎很容易编译C ++代码:

// hello.cpp
#include<stdio.h>

int main() {
  printf("hello, world!\n");
  return 1;
}
$ ./emcc tests/hello.cpp -o hello.html

4
那实际上是C代码。C ++编译器的复杂程度大约是两个或三个数量级。幸运的是,emscripten通过编译LLVM避免了这一难题,并且有一个现有的C ++-to-LLVM编译器。
MSalters

3
@MSalters:这也是有效的C ++代码。想象一下!哇!
Thomas Eding 2014年

@ThomasEding:您错过了重点。您必须支持的语言越小,越容易编译该语言。C和C ++的交集不一定大于这两者中的任何一个。
MSalters 2014年

让我们假设这段代码是纯C ++,C编译器无法处理,使用emcc合法吗?
Hamza Ouaghad

@HamzaOuaghad-是的。使用此emcc命令行,使用c ++的cout和string类创建一个简单的hello世界就可以了。使用1.35.0版。
Orion elenzil '16

0

最简单的方法是使用WCPP,该软件包可让您几乎直接将C ++导入到Node项目中。

我们的C ++

// addTwo.cpp 

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

在终端中(用于编译我们的C ++)

$ wcpp

我们的JavaScript

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

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

有关更多信息,请参见NPM软件包Git回购

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.