一个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?
一个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?
Answers:
我相信您对asm.js的理解是错误的。
首先,从他们的常见问题解答
问:asm.js是一种新语言吗?
答:不,它只是JavaScript的一部分。
然后您要求澄清:
但是如何用C ++编写一个[asm.js应用程序]
您无需编写“ asm.js应用程序”,而asm.js是将C ++代码编译到的目标1。
John Resig的这篇文章提供了许多细节,可以更好地解释如何使用asm.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。但我将其称为目标,因为它更容易理解。
是的,您可以使用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
emcc
合法吗?