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

时间:2016-12-22 01:08:06

标签: javascript asm.js

首先,检查我的知识

  1. c / c ++代码>>编译(emscripten [emcc])>> asm.js代码
    我可以获得asm.js代码的c / c ++代码,是不是?

  2. asm.js code>>编译(binaryen [asm2wasm])>> wasm代码
    我可以将asm.js代码输入到代码中,是不是?

  3. 其次,我的主要问题是,如何获得简单的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;
    }

    B中。将my_add.c代码编译为asm.js代码(使用emcc)
    我尝试了很多emcc选项...

      

    emcc my_add.c

         

    emcc my_add.c -s WASM = 1

         

    等...

    我的预期...简单的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 $0 = 0.0, $1 = 0.0, $2 = 0.0, $3 = 0.0, $4 = 0.0, label = 0, sp = 0;
    2042  sp = STACKTOP;
    2043  STACKTOP = STACKTOP + 16|0; if ((STACKTOP|0) >= (STACK_MAX|0)) abort();
    2044  $0 = $num1;
    2045  $1 = $num2;
    2046  $2 = $0;
    2047  $3 = $1;
    2048  $4 = $2 + $3;
    2049  STACKTOP = sp;return (+$4);
    2050 }
    
     .......

    我的C / C ++代码是5~6行..但是编译asm.js代码是5000~10000行...
    我只是想在编译结果中使用简单的'asm.js'代码...
    有可能吗?
    而且......我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

我找到了解决方案!

使用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
 };
});

答案 1 :(得分:0)

IRC ch。 #emscripten
&#39; pdox&#39;回答我..

pdox:emcc -O2 -profiling

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

emcc -O2 -profiling

命令make simple function .. 但..但它仍然产生一个长代码。(3000线...) (complie结果文件&#39; a.out.js&#39;是3000行....)