WebAssembly分享

什么是WebAssemblely

WebAssembly是一种运行在现代网络浏览器中的新型代码并且提供新的性能特性和效果。它设计的目的不是为了手写代码而是为诸如C、C++和Rust等低级源语言提供一个高效的编译目标。 对于网络平台而言,这具有巨大的意义——这为客户端app提供了一种在网络平台以接近本地速度的方式运行多种语言编写的代码的方式;在这之前,客户端app是不可能做到的。

目标

  • 快速,高效,可移植--通过利用通用的硬件功能,可以在不同的平台上以接近原生代码执行的速度执行WebAssembly代码。
  • 可读性和可调式性--WebAssembly是一种低级汇编语言,但它具有人工可读的文本格式(规范仍在定案中),允许手动编写,查看和调试代码。
  • 保持安全--WebAssembly被指定为在安全的沙盒执行环境中运行。像其他网页代码一样,它会强制执行浏览器的相同来源和权限策略。
  • 不破坏网络--WebAssembly的设计可以很好地与其他网络技术搭配使用,并保持向后兼容性。

通俗的来讲,WebAssembly就是一种新的字节码格式,将其他代码变成底层的机器码,让代码运行的更快 什么是WebAssembly

“沙盒”技术与主动防御技术原理截然不同。主动防御是发现程序有可疑行为时立即拦截并终止运行。“沙盒”技术则是发现可疑行为后让程序继续运行,当发现的确是病毒时才会终止。“沙盒”技术的实践运用流程是:让疑似病毒文件的可疑行为在虚拟的“沙盒”里充分表演,“沙盒”会记下它的每一个动作;当疑似病毒充分暴露了其病毒属性后,“沙盒”就会执行“回滚”机制:将病毒的痕迹和动作抹去,恢复系统到正常状态。

WebAssembly是如何工作的?

1.Emscripten首先将C / C ++提供给LLVM--一个成熟的开源C / C ++编译器工具链。 2.Emscripten将LLVM的编译结果转换为.wasm二进制文件。 3.WebAssembly本身不能直接访问DOM; 它只能调用JavaScript,传入整数和浮点基元数据类型。因此,要访问任何Web API,WebAssembly需要调用JavaScript,然后进行Web API调用。因此,Emscripten创建了实现此目的所需的HTML和JavaScript 胶水代码

(1) LLVM(Low Level Virtual Machine),LLVM 核心库提供了与编译器相关的支持,可以作为多种语言编译器的后台来使用。能够进行程序语言的编译期优化、链接优化、在线编译优化、代码生成。LLVM的项目是一个模块化和可重复使用的编译器和工具技术的集合。提供一个现代化的,基于SSA的编译策略能够同时支持静态和动态的任意编程语言的编译目标。 (2) 胶接代码也被称为绑定代码,是用于连接不兼容软件组件的自定义编程语言。 胶接代码可以用与它连接的代码相同的语言编写,但是它通常是用专门的解释脚本语言编写的,用于连接称为Glue语言的系统组件。流行的胶水语言包括AppleScript、JavaScript、Perl、PHP、Python、Ruby、VBScript和PowerShell。 Emscripten实现流行的C / C ++库,如SDL,OpenGL,OpenAL和POSIX的一部分。这些库是根据Web API实现的,因此每个库都需要一些JavaScript粘合代码来将WebAssembly连接到底层Web API。 因此部分胶水代码正在实现C / C ++代码使用的各个库的功能。glue代码还包含调用上述WebAssembly JavaScript API以获取,加载和运行.wasm文件的逻辑。

怎么使用

1.安装Git,CMake,主机系统编译器,Python环境。 2.下载或者编译工具链 一个预编译的工具链可以从github中下载

$ git clone https://github.com/juj/emsdk.git
$ cd emsdk
$ ./emsdk install latest
$ ./emsdk activate latest

3.进入Emscripten编译器环境

$ source ./emsdk_env.sh --build=Release

4.编译运行一个简单的程序 我们现在有了完整的工具链能够来编译一个简单的程序到WebAssembly中,以下是一些注意事项

  • 必须传递连接标志-s WASM=1在emcc后(否则默认的emcc为执行asm.js
  • 如果我们想Emscripten生成一个HTML页面来运行程序,除了Wasm库和JS包裹层,要指明一个输出一个以.html结尾的文件名
  • 最后,我们不能直接打开这个HTML文件在浏览器中,因为跨域请求在file协议中不支持,我们需要在HTTP中运行 以下的命令行能创建一个“hello world”程序然后编译它
$ mkdir hello
$ cd hello
$ cat << EOF > hello.c
#include <stdio.h>
int main(int argc, char ** argv) {
  printf("Hello, world!\n");
}
EOF
$ emcc hello.c -s WASM=1 -o hello.html

为了在HTTP中运行,可以用Emscripten SDK emrun来建立一个本地服务器

$ emrun filename.html --no_browser --port 8080

Emscripten编译原理

Emscripten是一个开源的JS的LLVM(低级虚拟机Low Level Virtual Machine)编译器,能够使你

  • 编译C和C++代码到js中
  • 编译任何能够被转换成LLVM字节码的其他代码到JS中
  • 在其他语言环境下直接运行编译后的JS 使用Emscripten,任何可移植的C或C++代码可以编译成JavaScript,从高性能游戏需要渲染图形,播放声音,和负载和处理文件

Emscripten工具链

Emcc使用Clang(一个C/C++的编译器,其他使用LLVM的编程语言用它作为后端)将C/ c++文件转换为LLVM字节码。 Fastcomp (Emscripten的编译器核心-一个LLVM后端),将字节码编译为JavaScript。输出的js能够被node.js执行,HTML文件以浏览器执行 Emscripten SDK (emsdk) 被用来管理多个SDK和工具,并指定当前用于编译代码的特定SDK/工具集(活动工具/SDK)。 Emsdk将“active”配置写入到编译器配置文件(. Emscripten)。这个文件被emcc使用,以获得当前正确的构建工具链。 官网上的详情

怎样运行

WebAssembly目前必须通过JS来加载和编译,基础的加载分为以下3个步骤

  • 将获取的.wasm字节变成一个typed array或一个ArrayBuffer
  • 将这个字节编译成一个WebAssembly.Moudle
  • 将WebAssembly.Module用import 实例化以获取可调用的export 知乎 JIT 博客 在线例子

为什么它的效率快

参考链接

总结

1.什么是WebAssembly 实际上就是一堆二进制代码 2.怎么编译的 通过emscripten这个工具将其他语言的代码编程wasm模块,它是由二进制代码组成 3.怎么运行 将二进制的模块实例化然后导出

参考链接: WebAssembly官网 Emscripten官网 MDN

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏HaHack

jQuery-based Local Search Engine for Hexo

974
来自专栏哲学驱动设计

OEA 中的多国语言实现

    本篇博客主要描述在 OEA 框架中的多国语言框架的原理及应用。 多国语言常见实现及原理分析     管理软件平台,一般来说,都应该支持多国语言,以支持应...

1828
来自专栏freesan44

Injection for Xcode 高效Xcode编译调试插件

对于iOS开发者来说,XCode有个另人十分难耐的特性——编译时长的问题。也许工作的时候你能够为自己找到一个闲下来喝杯咖啡的正当的借口,然而,多次的调试编译过程...

821
来自专栏互联网开发者交流社区

AngularJS基础

932
来自专栏Java与Android技术栈

Kotlin 1.3 终于正式发布,带来了稳定的 Coroutines、beta版本的Kotlin/Native

Kotlin 官网:https://kotlinlang.org/ Github 地址:https://github.com/JetBrains/kotlin

563
来自专栏大内老A

“前.NET Core时代”如何实现跨平台代码重用 ——程序集重用

除了在源代码层面实现共享(“前.NET Core时代”如何实现跨平台代码重用 ——源文件重用)之外,我们还可以跨平台共享同一个程序集,这种独立于具体平台的“中性...

1888
来自专栏程序员互动联盟

Linux初学者要善于利用“男人(man)”

对于Linux初学者,常常有很多命令和函数的用法不清楚,现在网络发达了,什么命令和函数都可以Google和百度。其实不用网络,在Linux下就有这些使用秘籍,要...

2959
来自专栏面朝大海春暖花开

分布式锁的理解,java自带的锁为什么会失效

对应的链接https://www.cnblogs.com/c-h-y/p/9391602.html

611

用CasperJS构建你的网络爬虫

为应用程序收集数据有时候是一件困难和费力的事。一个急需的API可能会丢失,或者可能有太多的数据需要处理。有时候,只是有时候,你需要通过网络抓取信息。

1203
来自专栏码洞

不安分的 Go 语言开始入侵 Web 前端领域了

从 Go 语言诞生以来,它就开始不断侵蚀 Java 、C、C++ 语言的领地。今年下半年 Go 语言发布了 1.11 版本,引入了 WebAssembly 技术...

701

扫码关注云+社区