再次 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上的兄弟姐妹们,你们去找它们闹去吧,不然没奶吃的啦!哈哈哈
再会!
再次 WebAssembly 技术探讨的更多相关文章
- 暴力破解FTP服务器技术探讨与防范措施
暴力破解FTP服务器技术探讨与防范措施 随着Internet的发展出现了由于大量傻瓜化黑客工具任何一种黑客攻击手段的门槛都降低了很多但是暴力破解法的工具制作都已经非常容易大家通常会认为暴力破解攻击只是 ...
- Oracle数据库容灾备份技术探讨
Oracle数据库容灾备份技术探讨 三种Oracle灾备技术 对于Oracle数据库的灾备技术,我们可以从Data Guard,GoldenGate和CDP角度去考虑. Oracle Data Gua ...
- 新华三孟丹:NFV资源池实现中的技术探讨
近日,在第三届未来网络发展大会SDN/NFV技术与应用创新分论坛上,新华三解决方案部架构师孟丹女士发表了主题为<NFV资源池实现中的技术探讨>的主题演讲. 孟丹指出,新华三的NFV核心理念 ...
- 七雄Q传封包辅助技术探讨回忆贴
前言 网页游戏2013年左右最火的类型最烧钱游戏,当年的我也掉坑了.为了边玩还满足码农精神我奋力的学习如何来做外挂.2013年我工作的第二个年头.多一半…介绍下游戏<七雄Q传>是北京游戏谷 ...
- 关于IPA文件重签名后如何跟踪管理APP的技术探讨和实践演示
前言:开发iOS的朋友都知道,在功能开发完成后,我们就会用申请的苹果账号在后台做证书配置,然后提交到AppStore,但是也有部分APP我们不需要提交到AppStore,比如内部测试用的APP.定制给 ...
- 微软加入字节码联盟,进一步开发支持Blazor 的WebAssembly技术
字节码联盟 (Bytecode Alliance)宣布已正式成为 501(c)(3) 非营利组织,参与组建的企业/组织包括 Fastly.英特尔.Mozilla 和微软,此外还邀请到了 Arm.DFI ...
- 安卓Dex壳技术探讨(1)
最近在研究安卓平台的加壳技术,以前以为只有原生层的代码才可以加壳,看了看网上的资料,才发现原来Java层也可以加壳,虽然与传统的壳有些区别,但就最终的效果来说,反静态分析的目的还是达到了的. 目前安卓 ...
- 抽奖随机算法的技术探讨与C#实现
一.模拟客户需求 1.1 客户A需求:要求每次都按照下图的概率随机,数量不限,每个用户只能抽一次,抽奖结果的分布与抽奖概率近似. 1.2 客户B需求:固定奖项10个,抽奖次数不限,每个用户只能抽一次, ...
- Java实现二维码技术探讨。
Java生成二维码方法有三种: 1: 使用SwetakeQRCode在Java项目中生成二维码 http://swetake.com/qr/ 下载地址 或着http://sourceforge.j ...
随机推荐
- log4j组件的用法(log4j1)
在实际的项目开发和维护中,日志是经常用到的一个内容.遇到问题的时候,经常需要通过日志去查出问题的所在并解决问题. 通常我们会用: System.out.println(xxx); 来打印运行中所需要的 ...
- .NET Core开发日志——Dapper与MySQL
Dapper作为.NET生态中广为人知的轻量级ORM类库在.NET Core里仍能被有效利用,并且其不但可以连通SQL Server数据库还提供对其它数据库,比如MySQL的支持.这里试验了一下通过D ...
- centos 阿里云 安装VNC Viewer
https://help.aliyun.com/knowledge_detail/41530.html 这个东西非常的不安全,极其容易造成密码账号丢失.非常容易导致各类远程攻击,切记...
- POJ 3635 - Full Tank? - [最短路变形][手写二叉堆优化Dijkstra][配对堆优化Dijkstra]
题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: ...
- confd
1.下载安装confd ]# wget https://github.com/kelseyhightower/confd/releases/download/v0.15.0/confd-0.15.0- ...
- mysql 超时时间
小结: 1.mysql服务端主动关闭链接的秒数: MySQL :: MySQL 8.0 Reference Manual :: 5.1.8 Server System Variables https: ...
- =[Mathematics] 数学主题
https://www.douban.com/group/maths/ 圆锥体体积公式的证明
- delphi中的 IntToHex()
Delphi 自带函数 IntToHex 功能说明:该函数用于将“十进制”转换成“十六进制”.该函数有二个参数.第一个参数为要转换的十进制数据,第二个参数是指定使用多少位来显示十六进制数据. 参考实例 ...
- 搭建Kubernetes服务集群遇到的问题
kube-proxy问题: Apr 12 09:42:49 compute1 kube-proxy[12965]: E0412 09:42:49.602342 12965 reflector.go:2 ...
- AIX动态增加SWAP空间
增加SWAP交换页空间 查看SWAP,使用lsps –a命令查看,默认安装SWAP是512M,例如: # lsps -a Page Space Physical V ...