Emscripten将C ++编译为JavaScript& Asm.js

时间:2014-12-05 12:59:20

标签: javascript c++ emscripten asm.js

对于大学的课程,我必须演示asm.js.我找到了一个教程(http://www.sitepoint.com/understanding-asm-js/),这正是我想要的。 所以我创建了给定的C ++ - File并使用Emscripten编译它。 结果是一个近10000行的文件。无处可寻找“使用asm” - 陈述。与手写的JavaScript文件相比,它要慢得多。

我正在使用便携式Emscripten-SDK-package并在使用之前对其进行了更新。

如何让Emscripten生成好的asm-Code?


更新: 我为没有Emscipten的演示找到了不同的解决方案: https://gist.github.com/dherman/3d0b4733303eaf4bae5e。 也许有人需要这个。

2 个答案:

答案 0 :(得分:1)

10k行的javascript非常谦虚,因为它必须包含与系统库(libc等等)相同的功能,当你执行c ++编译源时它们作为单独的文件存在 - 当浏览器执行javascript时它的沙盒并且无法访问目标计算机上的系统库(由于安全性,操作系统中立性...),例如,只是对一些动态链接的c / c ++可执行文件执行ldd命令,以了解大量这些10k行的javascript正在替换的内容: / p>

ldd /bin/ls 


linux-vdso.so.1 =>  (0x00007fff8c865000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f7b82854000)
libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007f7b8264b000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7b82285000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f7b82018000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7b81e14000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7b82aba000)
libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007f7b81c0e000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7b819f0000)

这可能会为您提供有关使用asm.js和emscripten的更多提示: https://hacks.mozilla.org/2014/11/porting-to-emscripten/

答案 1 :(得分:1)

根据我的测试,Emscripten似乎只使用asm.js,并将"use asm";放入优化级别-O1及更高级别的生成的Javascript中。因此,在编译时,您需要将-O1(或比1更高的级别)传递给编译器:

eemcc source.cpp -O1 -o target.js`

如果您没有指定优化级别,或者通过-O0

eemcc source.cpp -O0 -o target.js`

然后"use asm";没有被放入生成的Javascript中。