zoukankan      html  css  js  c++  java
  • 再次 WebAssembly 技术探讨

    上次说到你可以将C代码编译成web调用的js文件,当时,很兴奋。哈哈,我也误以为是系统级别的C编程呢!

    哎,今天,告诉你一个残酷的事实是,只是C语言级别,不是系统级别。因为WebAssembly目标是跨平台,所以,怎么能有系统API掺和进来呢。当然,哪天等到各个系统厂商都把自己的系统调用揉进了WebAssembly的SDK库里时候,诸位就可以继续做梦了!哈哈哈。

    今天,我们继续WebAssembly下源码C语言教程吧,这次要复杂些了。

    除了基本类型,比如int, 那字符串呢?

    嘿嘿,今天就来回答你。

    *********************************************************************************************************************************

    //call.c

    #include <math.h>
    #include <stdlib.h>
    #include <string.h>

    char *test1(char *instr)
    {
      char *array = malloc(sizeof(char)*(strlen(instr)+1));
      strcpy(array,instr);
      int size = strlen(array);
      for(int n=0;n<size;n++)
      {
        if((array[n] >= 'a') && (array[n] <= 'z')) array[n] -= 'a'-'A';
      }
      return array;
    }


    int *test2(int *in,int size)
    {
      int *array = malloc(sizeof(int)*size);
      for(int n=0;n<size;n++)
      {
        array[n] = in[n]*2;
      }
      return array;
    }

    //compiler

    emcc call.c -o call.js -s EXPORTED_FUNCTIONS="['_test1','_test2']"

    //HTML

    <!DOCTYPE html>
    <html>
    <body>
    <script src="call.js"></script>
    <script>
    function write_1d_int32_array(ptr,array)
    {
      for(i=0;i<array.length;i++)
      {
        Module.setValue(ptr,array[i],'i32');
        ptr += 4;
      }
    }

    function read_1d_int32_array(ptr,length)
    {
      var array = [];
      for(i=0;i<length;i++)
      {
        var value = Module.getValue(ptr+(i*4),'i32');
        array.push(value);
      }
      return array;
    }

    // test1 - a C function that takes, and returns a C style string (char *)
    var mystring = "test";
    var strptr = Module._malloc(mystring.length);
    Module.writeAsciiToMemory(mystring, strptr);
    var retstrptr = Module.ccall('test1', // name of C function
      'number', // return type
      ['number'], // argument types
      [strptr]); // arguments
    // Convert the resulting string to a JS string
    var retstr = Pointer_stringify(retstrptr);
    document.write(retstr);

    // test2 - a C function that takes, and returns a C style int array (int *)
    var myarray = [10,20,30,40,50];
    var arrayptr = Module._malloc(myarray.length*4);
    write_1d_int32_array(arrayptr,myarray);
    var retarrayptr = Module.ccall('test2', // name of C function
      'number', // return type
      ['number'], // argument types
      [arrayptr,myarray.length]); // arguments
    // Convert the resulting pointer to a JS array
    var retarray = read_1d_int32_array(retarrayptr,myarray.length);
    document.write(retarray);
    </script>
    </body>
    </html>

    // 执行

    将call.js, index.html 放置到tomcat服务器universal中,浏览器中输入

    http://localhost:8080/universal/index.html

    请看,如下就是你期待的结果

    这个例程是国外大牛写的,我们在此向英雄致敬!

    *********************************************************************

    Finally:

    不好意思,对WebAssembly的热情,我尽然TMD减低了。

    我觉得还是继续Golang吧,好歹在linux下他能调用系统级的功能,也该着它是服务端的东西,哈哈哈

    Windows上的兄弟姐妹们,你们去找它们闹去吧,不然没奶吃的啦!哈哈哈

    再会!

  • 相关阅读:
    可持久化线段树学习笔记
    GDI+学习之路
    tcpdump——分析tcp关闭4次过程
    nasm过程调用
    ios学习:NSURLConnection 和 Json数据解析
    ios学习:文件简单读写
    JSONP原理及其简单封装
    JSP使用JSTL
    JDBC
    Apache无法正常启动的原因
  • 原文地址:https://www.cnblogs.com/woodzcl/p/7488980.html
Copyright © 2011-2022 走看看