再次 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上的兄弟姐妹们,你们去找它们闹去吧,不然没奶吃的啦!哈哈哈

再会!

时间: 2024-11-07 18:50:18

再次 WebAssembly 技术探讨的相关文章

虚拟化及云环境下数据库审计技术探讨(下)

在上篇文章也介绍到大部分的虚拟化及云环境下的数据审计技术探讨 接下来我们来进入更深的层次研究 场景三:应用和数据库分别托管部署在完全独立的第三方云计算平台 场景四是场景三的一种延伸与扩大,场景四主要指目前主流的第三方云平台提供商如阿里云.亚马逊.腾讯云.华为云.百度云等等,底层的硬件.存储.网络等等都对用户不透明,上层的虚拟机具体在哪个物理硬件服务器上,连接哪个物理交换机,用户一概不知道,如下图所示: 因此要用传统方式配置镜像,基本上没有可能,云平台提供商并不会提供底层资源的控制权给云主机租户,

移动开发 - 移动支付技术探讨

移动开发 - 移动支付技术探讨 当下最火的[微信开发]在线课:在家上网就能学,预约还能 赠送猿代码 JS教程,主要内容涉及微信的各种开发课程.需要的同学直接 call赵老师 V|芯 152-10463-729/ 扣|扣13054-33272,想了解课程和内容详情点这里:http://www.lampbrother.net/weixin/index.php?id=6 随着银行卡芯片化全面推进.移动通讯网络的蓬勃发展以及智能手机的快速普及,以移动支付为基础的移动金融已逐渐进入金融服务民生领域.现对

HTTP服务七层架构技术探讨

原文链接http://kb.cnblogs.com/page/158568/ 1. 为什么分层? 计算机领域的体系结构普遍采用了分层的方式. 从整体结构来看: 从最底层的硬件往高层依次有: 操作系统 -> 驱动程序 -> 运行库 -> 系统程序 -> 应用程序等等. 从网络分层模型OSI来讲,由上至下为: 应用层 -> 表示层 -> 会话层 -> 传输层 -> 网络层 -> 数据链路层 -> 物理层 当然实际应用的TCP/IP协议的分层就没OSI

网络分流器-网络分流器IP网络路由交换测试技术探讨

网络分流器1 . 与流量相关的L2-3层高级测试技术探讨戎腾网络分流器: 对于一个L2-3层网络设备,最基本.最重要的测试是流量转发性能测试.作为一个网络转发设备,首先要保证可以高速.低时延.稳定地转发流量.相关的性能测试通常是通过流量生成器(一般是硬件测试仪表,可以发出线速的流量)来生成相应的流量让被测试设备承受不同的负载,检验其表现.通常会测试被测设备的容量(比如吞吐量),以及处理业务的特征如何(比如时延).以交换机为例,不同的交换机由于采用了不同的硬件架构,性能表现会有所不同:同一个交换机

七雄Q传封包辅助技术探讨回忆贴

前言 网页游戏2013年左右最火的类型最烧钱游戏,当年的我也掉坑了.为了边玩还满足码农精神我奋力的学习如何来做外挂.2013年我工作的第二个年头.多一半…介绍下游戏<七雄Q传>是北京游戏谷(北京漫游谷信息技术有限公司)研发的一款以春秋战国为时代背景的大型Q版社交SLG游戏, 这款游戏官方推出比肩爆款七雄争霸二代产品.七雄争霸不用说了当年月流水上亿 2013年7月左右开服到2017年2月闭服 这款游戏距今快7年了,算上封测 我也是删档测试的玩家,.(他们关服了我才敢写) 注册时间2013-1-2

基于无线控制的智能家居技术探讨

谈到智能家居的无线控制方式,就不得不联想到与之相关的几大无线技术.目前,全球通用的无线技术主要包括红外.蓝牙.RFID.ZigBee.WIFI等.随着科技的不断发展,无线技术也进行着日新月异的改进.基于其灵活性.无需布线等优点,在市场上也得到相当广泛应用.智能家居产品的出现,更是为无线技术开辟了另一方新的应用空间.相比较传统智能家居系统采用的有线布网方式,无线技术的应用则可以减少布线带来的麻烦,具有更好的可扩展性.移动性.因此采用无线智能控制模式是智能家居发展的必然选择.下面小编就和大家共同探讨

cocos2d-x 2.1 Win32+Android开发中的sqlite数据库加密技术探讨

注意:本博客转移自本人约一年前的ITPUB博客文章,为的是便于学员参考之用. 很显然,cocos2d-x编程中只了解基本的sqlite数据库操作技术只是一个开头,真正把此数据库数据应用于实际中不使用一定的加密及解密技术几乎是不行的. 这个问题尽早会来到我面前,这不?现在就来了.一开始,自然想使用最省工的了:但是,这样的好事并不多,极少极少...... 于是,我先搜罗了一些现成的文章拿来一阅. 1,Sqlite数据库加密解密 SRC: http://blog.sina.com.cn/s/blog_

使用视频作为网页背景的技术探讨

http://www.chinaz.com/web/2014/0530/353774.shtml 怎么开淘宝店 网站优化方法 创业如何获得投资 小米note顶配版评测 最新LOL活动 使用视频作为网页背景是件很酷的事情,但也是件困难的事情.CSS里的background-image属性只能使用图片.SVG.颜色或渐变色.但从技术讲,我们是可以伪造出一种效果,让视频以背景的角色出现在其它HTML元素后面.这其中的难点是视频要填充整个浏览器页面,而且要响应浏览器窗口大小的变化. 观看演示1 视频作为

关于检测网络内部私接随身WIFI行为的技术探讨

2013年,360公司推出了首款硬件版的随身WIFI,因其很好的满足了智能手机可随时通过WIFI上网的需求,加上其安装和使用上的便利和便携性,随身WIFI很快成为了智能手机的上网伴侣,到京东网上搜一下随身WIFI,就可以了解此类设备的出货量,360随身WIFI的用户评价数量已超过了30万,由此可见其推广和普及程度. 目前随身WIFI已发展为两大类:硬件版和免费的软件版.其中硬件版的典型代表有360随身WIFI.小米WIFI.小度WIFI等:免费软件版的典型代表有360免费WIFI.金山猎豹.WI