我可以获得简单的 asm.js 代码吗?当使用 emscripten 编译简单的 c api 代码时

Can I get simple asm.js code? when simple c api code compile using emscripten

首先,检查我的知识

  1. c/c++代码>>编译(emscripten[emcc])>>asm.js代码
    我可以得到 c/c++ 代码到 asm.js 代码,对吗?

  2. asm.js 代码 >> 编译(binaryen [asm2wasm]) >> wasm 代码
    我可以得到 asm.js 代码到 wasm 代码,对吗?

其次,我的主要问题是,如何获得简单的 asm.js 代码?

我尝试按照步骤操作,但我无法获得简单的 asm.js 代码... 使用 emcc 编译时,我总是得到复杂的 asm.js 代码(5000 多行...)...

我的尝试步骤

一个。制作简单的 C api 代码 // my_add.c

#include <stdio.h>
#include <emscripten.h>

EMSCRIPTEN_KEEPALIVE
double my_add(double num1, double num2) {
    return num1 + num2;
}

乙。将 my_add.c 代码编译为 asm.js 代码(使用 emcc)
我正在尝试许多 emcc 选项...

emcc my_add.c

emcc my_add.c -s WASM=1

etc...

我期望的...简单的 asm.js 代码(类似于遵循代码...)

function my_add(num1, num2) {
    "use asm";
    num1 = num1|0;
    num2 = num2|0;
    retrurn (num1 + num2)|0;
}

但是emcc编译结果很复杂asm.js代码

  1 // The Module object: Our interface to the outside world. We import
   2 // and export values on it, and do the work to get that through
   3 // closure compiler if necessary. There are various ways Module can be used:
   4 // 1. Not defined. We create it here
   5 // 2. A function parameter, function(Module) { ..generated code.. }
   6 // 3. pre-run appended it, var Module = {}; ..generated code..
   7 // 4. External script tag defines var Module.
   8 // We need to do an eval in order to handle the closure compiler
   9 // case, where this code here is minified but Module was defined
  10 // elsewhere (e.g. case 4 above). We also need to check if Module
  11 // already exists (e.g. case 3 above).
  12 // Note that if you want to run closure, and also to use Module
  13 // after the generated code, you will need to define   var Module = {};
  14 // before the code. Then that object will be used in the code, and you
  15 // can continue to use Module afterwards as well.
  16 var Module;
  17 if (!Module) Module = (typeof Module !== 'undefined' ? Module : null) || {};
  18 
  19 // Sometimes an existing Module object exists with properties
  20 // meant to overwrite the default module functionality. Here
  21 // we collect those properties and reapply _after_ we configure
  22 // the current environment's defaults to avoid having to be so
  23 // defensive during initialization.
  24 var moduleOverrides = {};
  25 for (var key in Module) {
  26   if (Module.hasOwnProperty(key)) {
  27     moduleOverrides[key] = Module[key];
  28   }
  29 }
  30 
  31 // The environment setup code below is customized to use Module.
  32 // *** Environment setup code ***
  33 var ENVIRONMENT_IS_WEB = false;
  34 var ENVIRONMENT_IS_WORKER = false;
  35 var ENVIRONMENT_IS_NODE = false;
  36 var ENVIRONMENT_IS_SHELL = false;
  37 

  ......
  
  
  2038 function _my_add($num1,$num2) {
2039  $num1 = +$num1;
2040  $num2 = +$num2;
2041  var [=14=] = 0.0,  = 0.0,  = 0.0,  = 0.0,  = 0.0, label = 0, sp = 0;
2042  sp = STACKTOP;
2043  STACKTOP = STACKTOP + 16|0; if ((STACKTOP|0) >= (STACK_MAX|0)) abort();
2044  [=14=] = $num1;
2045   = $num2;
2046   = [=14=];
2047   = ;
2048   =  + ;
2049  STACKTOP = sp;return (+);
2050 }

 .......

我的 C/C++ 代码是 5~6 行..但是编译的 asm.js 代码是 5000~10000 行...
我只想要编译结果中的简单 'asm.js' 代码...
可能吗?
还有...我该怎么做?

IRC 频道。 #emscripten
'pdox' 回答我..

pdox:emcc -O2 -profiling

3601 function _my_add(d1, d2) {
3602  d1 = +d1;
3603  d2 = +d2;
3604  return +(d1 + d2);
3605 }

emcc -O2 -profiling

命令使简单的功能.. 但是..但它仍然会产生很长的代码。(3000行......) (编译结果文件 'a.out.js' 是 3000 行....)

我找到了解决办法!

使用 ONLY_MY_CODE--separate-asm 选项,

emcc my_add.c -O2 -profiling -s ONLY_MY_CODE=1 -g2 --separate-asm -o abc.js

abc.asm.js 文件已创建:

Module["asm"] = (function(global, env, buffer) {
 "use asm";

 function _my_add(d1, d2) {
  d1 = +d1;
  d2 = +d2;
  return +(d1 + d2);
 }
 return {
  _my_add: _my_add
 };
});