1      WebAssembly简介

WebAssembly是一种新兴的Web技术,网上的资料并不是很多,简单的可以理解为让C/C++程序运行在浏览器上,官网上用四个词来描述该技术:高效、安全、开放、标准。

1.1      高效

C/C++代码被编译成.wasm的二进制格式文件,其目标是充分发挥硬件能力已达到原生执行效率。

1.2      安全

WebAssembly应用运行在一个沙箱化的环境中,对外只暴露特定的接口,并且在Web环境中,WebAssembly将会严格遵守浏览器的一些安全策略。

1.3      开放

.wasm文件是二进制格式文件,不便于理解,但WebAssembly在将来可以直接通过浏览器查看wasm模块的源码。

1.4      标准

WebAssembly可以被JavaScript调用,同时也可以像WebAPI一样调用浏览器的功能。

2      工具安装

编写WebAssembly应用所需的工具比较多,主要包含有浏览器(新版的chrome、firefox)、C/C++开发环境、Web环境、Emscripten编译器。这里面最麻烦的就是Emscripten编译器的安装,Emscripten是把C/C++程序编译成浏览器运行的wasm文件以及对应的JS代码的编译器,主要有两种安装方式(已windows环境为例):

2.1      在线安装

在线安装比较容易出错,需要安装git并能访问github开源社区,参考官网:http://kripken.github.io/emscripten-site/docs/getting_started/downloads.html,步骤如下:

2.1.1        克隆emsdk仓库

git clone https://github.com/juj/emsdk.git,这一步容易报Timed out错误:

可以参考w3上面的解决方法:http://3ms.huawei.com/hi/group/1503847/thread_5329623.html?mapId=6456777&t_type=ask

2.1.2        安装工具

cd emsdk           // 定位到emsdk文件夹

emsdk update       // 执行更新

emsdk install latest   // 安装各种工具

emsdk activate latest  // 生成.emscripten文件,激活配置

2.2      离线安装

离线安装比较简单,在官网http://kripken.github.io/emscripten-site/docs/getting_started/downloads.html下载离线包emsdk-1.35.0-full-64bit.exe,里面集成了所需的各种工具,如clang、node、python、emscripten等,下载完成后直接运行就可以完成上述软件的安装,安装完成后的目录结构如下:

2.2.1        验证安装结果

打开cmd,输入emcc –v,提示如下信息则表示安装成功:

如果提示emcc不是内部或外部命令,去检查一下.emscripten文件,.emscripten文件在当前用户所在的文件夹中(C:\Users\你的用户名),正常安装后的内容为:

3      应用搭建

3.1      编写C/C++程序

代码说明如下:

1、  当对应的js文件被加载时,main方法自动执行,printf翻译成console.log;

2、  EMSCRIPTEN_KEEPALIVE修饰的方法表示是要导出的方法,这些方法才能生成对应的API,供js调用,API名一般为下划线+方法名,即是说_addTest、_subTest。

3.2      编译.c文件为js代码

打开cmd,输入以下指令:emcc index.c –s WASM=1 –O3 –o index.js,参数解释如下:

1、emcc:代表Emscripten编译器;

2、index.c:C代码的文件;

3、-s WASM=1:指定使用WebAssembly;

4、-O3:代码优化级别;

5、-o index.js:生成wasm模块的全部文件,包含.wasm文件和.js文件等。

emcc参数的详细说明可以参考官网介绍:http://kripken.github.io/emscripten-site/docs/tools_reference/emcc.html#emccdoc

编译结果如下:

包含如下文件:

3.3      搭建Web运行环境

3.3.1        目录结果

3.3.2        index.html代码

3.3.3        index.js代码

在emscripten编译的index.js代码基础上增加如下代码:

3.3.4        页面效果

浏览器访问对应的地址,点击等号,能完成_addTest()和_subTest()方法的调用,页面如下:

3.4      总结

上述应用,通过一个简单的例子实现了通过浏览器来执行C/C++代码,WebAssembly API的具体介绍可以参考官网:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly。

简单的WebAssembly应用搭建的更多相关文章

  1. 最简单的SVN环境搭建过程

    本文简单描述最简单的SVN环境搭建过程 搭建环境:windows (个人验证了windows2003,windows xp) 使用软件:Setup-Subversion-1.6.17  //Serve ...

  2. Elasticsearch简单使用和环境搭建

    Elasticsearch简单使用和环境搭建 1 Elasticsearch简介 Elasticsearch是一个可用于构建搜索应用的成品软件,它最早由Shay Bannon创建并于2010年2月发布 ...

  3. SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建

    SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建 技术栈 : SpringBoot + shiro + jpa + freemark ,因为篇幅原因,这里只 ...

  4. EpiiAdmin 开源的php交互性管理后台框架, 让复杂的交互变得更简单!Phper快速搭建交互性平台的开发框架,基于Thinkphp5.1+Adminlte3.0+Require.js。

    EpiiAdmin EpiiAdmin php开源交互性管理后台框架,基于Thinkphp5.1+Adminlte3.0+Require.js, 让复杂的交互变得更简单!Phper快速搭建交互性平台的 ...

  5. Python实现一个简单三层神经网络的搭建并测试

    python实现一个简单三层神经网络的搭建(有代码) 废话不多说了,直接步入正题,一个完整的神经网络一般由三层构成:输入层,隐藏层(可以有多层)和输出层.本文所构建的神经网络隐藏层只有一层.一个神经网 ...

  6. 简单谈谈eclipse下搭建PhoneGap环境来开发Android程序 - linux86(转)

    原来在逛园子的时候一不小心发现了一个新概念“PhoneGap”简称PG,我一直都喜欢追逐新事物,自然就产生了好奇心.于是乎我就在百度上面Google了一下PhoneGap是什么东西.简单的说就是用另一 ...

  7. asp.net mvc 简单项目框架的搭建(二)—— Spring.Net在Mvc中的简单应用

    摘要:上篇写了如何搭建一个简单项目框架的上部分,讲了关于Dal和Bll之间解耦的相关知识,这篇来把后i面的部分说一说. 上篇讲到DbSession,现在接着往下讲. 首先,还是把一些类似的操作完善一下 ...

  8. asp.net mvc 简单项目框架的搭建过程(一)对Bll层和Dal层进行充分解耦

    学习asp.net 已经有近三个月的时间了,在asp.net mvc上花的时间最多,但个人真是有些菜,不得不说,asp.net mvc的水真的还是蛮深的.目前在公司实习,也见过公司几个项目的代码了.对 ...

  9. 简单的SSM框架搭建教程

    简单的ssm框架的搭建和配置文件 ssm框架里边的配置: 1.src路径下直接存放数据库和log4j的properties文件 2.src路径下建个config包,分别放置ssm的xml文件 3.修改 ...

  10. 简单的SpringBoot环境搭建

    开始搭建前请确认您的计算机中的Maven已正确配置 一:使用IDEA创建一个Maven项目,图中第一个指针请选择自己正在使用的JDK版本,指针二请打勾,选中指针三所指向的类型并点击Next 二:填写G ...

随机推荐

  1. 【设计模式】Java设计模式 - 观察者模式

    [设计模式]Java设计模式 - 观察者模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 @一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长 ...

  2. KingbaseES Hint 使用

    前言:KingbaseES V8R6C4 之前版本hint 使用方法是与Postgresql 相同的,通过 pg_hint_plan扩展,支持在SQL中使用hint.由于该版本的hint只能放置于SQ ...

  3. Mysql_Order_By的坑

    CREATE TABLE `tt_transfer_container_pick_config` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, ...

  4. EntityFrameworkCore 模型自动更新(下)

    话题 上一篇我们讨论到获取将要执行的迁移操作,到这一步为止,针对所有数据库都通用,在此之后需要生成SQL脚本对于不同数据库将有不同差异,我们一起来瞅一瞅 SQLite脚本生成差异 在上一篇拿到的迁移操 ...

  5. 若依代码生成的一个大坑 You have an error in your SQL syntax; check the manual that corresponds to your MySQL s

    报错如下所示:显示我的xml文件的SQL语句有错 ### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You h ...

  6. csrf跨站请求伪造、csrf相关装饰器、auth认证模块、基于django中间件设计项目功能

    目录 csrf跨站请求网站 什么是csrf跨站请求网站 经典例子-钓鱼网站 模拟 如何避免这种现象(预防) 如何在django中解决这个问题 form表单 ajax csrf相关装饰器 FBV CBV ...

  7. Windows优先使用IPv4

    当前主流的Windows系统(从Windows 7之后)都会同时使用ipv6和ipv4,并且优先使用ipv6.当你ping另一个服务器的时候就能看到,优先使用的是ipv6进行通信.由于能够在DNS中解 ...

  8. HCNP Routing&Switching之ARP安全

    前文我们了解了IP安全相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16652367.html:今天我们来聊一聊ARP安全相关话题: 什么是ARP? ...

  9. JUC在深入面试题——三种方式实现线程等待和唤醒(wait/notify,await/signal,LockSupport的park/unpark)

    一.前言 在多线程的场景下,我们会经常使用加锁,来保证线程安全.如果锁用的不好,就会陷入死锁,我们以前可以使用Object的wait/notify来解决死锁问题.也可以使用Condition的awai ...

  10. rabbitmq的内存节点和磁盘节点

    RabbitMQ集群里有内存节点与磁盘节点之分. 所谓内存节点,就是将元数据(metadata)都放在内存里,磁盘节点就是放在磁盘上.(内存节点将全部的队列,交换器,绑定关系,用户,权限,和vhost ...