Emscripten 将C++编译为 JavaScript 和 Asm 的不良结果.js
Bad results with Emscripten compiling C++ to JavaScript & Asm.js
对于大学的课程,我必须证明asm.js。我找到了一个教程(http://www.sitepoint.com/understanding-asm-js/),这正是我想要的。所以我创建了给定的C++文件并使用Emscripten编译它。结果是一个近 10000 行长的文件。无处可寻"use asm"语句。与手写的JavaScript文件相比,它要慢得多。
我正在使用一个可移植的Emscripten-SDK包,并在使用它之前对其进行了更新。
如何让 Emscripten 生成好的 asm 代码?
更新:我在没有Emscipten的情况下为我的演示找到了不同的解决方案:https://gist.github.com/dherman/3d0b4733303eaf4bae5e。也许有人需要这个。
根据我的测试,Emscripten 似乎只使用 asm.js,并在优化级别 -O1
及以上"use asm";
放入生成的 Javascript 中。所以在编译时,你需要传递-O1
(或比1
更高的级别)给编译器:
EEMCC来源.cpp-O1 -o 目标.js'
如果您没有指定优化级别,或者没有通过-O0
:
EEMCC来源.cpp -O0 -o 目标.js'
然后"use asm";
不会被放入生成的 Javascript 中。
> 10k 行 JavaScript 是相当适中的,因为它必须包含与系统库(libc 等)等效的功能,当您执行 C++ 编译源代码时,它们作为单独的文件存在 - 当浏览器执行 JavaScript 时,它的沙盒化并且无法访问目标计算机上的此类系统库(由于安全性、操作系统中立性...... 例如,只需对一些动态链接的C/C ++可执行文件执行ldd命令即可了解其中的大部分内容10k行JavaScript正在取代:
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/
- 使用C++获取程序的 ASM
- 为什么"using System;"不被视为不良做法?
- 在 c++ 中使用 x86 DIV 的这个 asm 块有什么用?
- g++ -O3 为 loop 创建了奇怪的指令 - 两个具有相同 asm 的版本
- 提升不良词法强制转换:将字符串转换为无符号长整型时,无法将源类型值解释为目标
- Extern "C"错误在'int'之前'asm'或'__attribute__'
- 了解 C/C++ 中 Windows / MSVC 的一些反调试内联 asm
- 尝试使用 x86 asm SSSE3 将大端转换为小端序
- 如何使用"asm volatile"编写 btr 指令
- objdump 不显示机器代码,但显示 ASM
- 未使用的 asm() 在不受支持的体系结构上的行为
- 内联asm编译器屏障(内存阻塞器)是算作外部函数,还是算作静态函数调用
- std::mutex::lock() 产生奇怪(和不必要的)ASM 代码
- 删除复制构造函数的 Intel 13.1.2 中不良C++行为的解决方法
- 为什么发出空asm命令会交换变量
- C++-更改另一个文件的ASM指令
- 尝试用纯 c 编程 arduino,得到以下错误:预期的"="、""、";",'asm'或"打印"之前的'__attribute__'|
- 如果 constexpr 和依赖假static_assert形成不良?
- C++/ASM:按值传递使用 xmm0,但按引用使用 rdi
- Emscripten 将C++编译为 JavaScript 和 Asm 的不良结果.js