WebAssembly编程实践(1.4) 编译目标及编译流程

事实上Emscripten的诞生早于WebAssembly,在WebAssembly标准出现前的很长一段时间内,Emscripten的编译目标是asm.js。自1.37.3起,Emscirpten才开始正式支持WebAssembly。

asm.js为编译目标时,C/C++代码被编译为.js文件;以WebAssembly为编译目标时,C/C++代码被编译为.wasm文件及对应的.js胶水代码文件。两种编译目标从应用角度来说差别不大——它们使用的内存模型、函数导出规则、JavaScript与C相互调用的方法等都是一致的。我们在实际使用中遇到的主要区别在于模块加载的同步和异步:当编译目标为asm.js时,由于C/C++代码被完全转换成了asm.js(JavaScript子集),因此可以认为模块是同步加载的;而以WebAssembly为编译目标时,由于WebAssembly的实例化方法本身是异步指令,因此模块加载为异步加载。以asm.js为目标的工程切换至WebAssembly时,容易发生Emscritpen运行时未就绪时调用了Module功能的问题,需要按照1.3.3的方法予以规避。

自1.38.1起,Emscripten默认的编译目标切换为WebAssembly。如果仍然需要以asm.js为编译目标,只需要在调用emcc时添加-s WASM=0参数,例如:

> emcc hello.cc -s WASM=0 -o hello_asm.js

WebAssembly是二进制格式,体积小、执行效率高是其先天优势。作为比较,上述命令生成的hello_asm.js约300KB,而WebAssembly版本的hello.jshello.wasm加在一起还不到150KB。在兼容性允许的情况下,应尽量使用WebAssembly作为编译目标。

1.4.2 编译流程

emcc编译C/C++代码的流程如下:

C/C++代码首先通过Clang编译为LLVM字节码,然后根据不同的目标编译为asm.jswasm

由于内部调用Clang,因此emcc支持绝大多数的Clang编译选项,比如-s OPTIONS=VALUE-O-g等。除此之外,为了适应Web环境,emcc增加了一些特有的选项,如--pre-js <file>--post-js <file>等。

Clang类似,emcc所有的选项列表可以通过:

emcc --help

命令查看。

。。。。。。(略)

原文发布于微信公众号 - 玄魂工作室(xuanhun521)

原文发表时间:2018-11-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏魏艾斯博客www.vpsss.net

wordpress 免插件添加友情链接

74260
来自专栏安恒信息

安全通告 | S2-053远程代码执行漏洞

安全通告 S2-053远程代码执行漏洞 1. 漏洞描述 (S2-053/CVE-2017-12611) Struts2 REST插件存在远程代码执行漏洞,开发...

31660
来自专栏王磊的博客

Android的引用jar包

先来个基础的,在eclips里在工程名上右键->build path->contigure bud path->java build path里有个几个选项 a...

40070
来自专栏ASP.NET MVC5 后台权限管理系统

ASP.NET MVC5+EF6+EasyUI 后台管理系统(28)-系统小结

我们从第一节搭建框架开始直到二十七节,权限管理已经告一段落,相信很多有跟上来的园友,已经搭配完成了,并能从模块创建授权分配和开发功能了 我没有发布所有源代码,但...

27270
来自专栏用户画像

WAR包的目录结构

WAR(Web Archivefile)网络应用程序文件,是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件。

12820
来自专栏章鱼的慢慢技术路

Linux使用命令修改默认启动为图形或字符界面

 因为要在Linux系统上装NVIDIA显卡驱动,默认重启必须是字符界面,因此把这块所需命令记录下来。

28010
来自专栏开发技术

Maven pom.xml中的元素modules、parent、properties以及import

  项目中用到了maven,而且用到的内容不像利用maven/eclipse搭建ssm(spring+spring mvc+mybatis)用的那么简单;mav...

23420
来自专栏Django中文社区

自定义认证后台

Django auth 应用默认支持用户名(username)进行登录。但是在实践中,网站可能还需要邮箱、手机号、身份证号等进行登录,这就需要我们自己写一个认证...

27080
来自专栏C/C++基础

Linux命令(14)——df命令

用于查看Linux文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,以及剩余空间等信息。

17880
来自专栏增长技术

Apache Maven WAR Plugin

Apache Maven WAR插件负责收集所有工件的依赖性,web应用程序的类和资源,包装成一个web应用程序存档。

10020

扫码关注云+社区

领取腾讯云代金券