𝔖 Scriptorium
✦   LIBER   ✦

📁

深入浅出WebAssembly

✍ Scribed by 于航


Publisher
电子工业出版社
Year
2018
Tongue
Chinese
Leaves
548
Category
Library

⬇  Acquire This Volume

No coin nor oath required. For personal study only.

✦ Synopsis


WebAssembly是一种新的二进制格式,它可以方便地将C/C++等静态语言的代码快速地“运行”在浏览器中,这一特性为前端密集计算场景提供了无限可能。不仅如此,通过WebAssembly技术,我们还可以将基于Unity等游戏引擎开发的大型游戏快速地移植到Web端。WebAssembly技术现在已经被计划设计成W3C的标准,众多浏览器厂商已经提供了对其MVP版本标准的支持。在Google I/O 2017大会上,Google首次针对WebAssembly技术进行了公开演讲和推广,其Post-MVP版本标准更是对诸如DOM操作、多线程和GC等特性提供了支持。WebAssembly所带来的Web技术变革势不可挡。

《深入浅出WebAssembly》力求从一些简单的实践入手,深入理论,到复杂的具有实际业务价值的综合实践,深入浅出地介绍Wasm技术发展至今,其背后所涉及的各种底层设计原理与实现、相关工具链以及未来发展方向等多方面内容。本书内容包括:WebAssembly技术的发展历程,从PNaCl到ASM.js再到WebAssembly,以及这些技术的基本应用方法与性能对比;WebAssembly的标准上层API、底层堆栈机的设计原理,以及对MVP标准理论的深入解读;与WebAssembly标准相关的进阶内容,如单指令多数据流(SIMD)、动态链接(DL)等;LLVM工具链与WAT可读文本格式的相关内容;基于Emscripten工具链开发WebAssembly应用的基本流程,以及工具链的一些基本常用功能和特性;基于Emscripten工具链实现C/C++语言动态关系绑定技术;Emscripten工具链所提供的一些如WebGL支持、虚拟文件系统、应用优化以及HTML 5事件系统等高级应用特性;构建一个具有实际业务价值的WebAssembly应用,现阶段Wasm生态的发展情况,以及在Post-MVP标准中制订的一些WebAssembly未来发展规划。

《深入浅出WebAssembly》的目标读者为Web前端开发人员、C/C++开发人员和对WebAssembly技术感兴趣的人员。

✦ Table of Contents


扉页
版权页
序言(一)
序言(二)
前 言
目 录
第1章 漫谈WebAssembly 发展史
1.1 JavaScript 的发展和弊端
1.1.1 快速发展与基准测试
1.1.2 Web 新时代与不断挑战
1.1.3 无法跨越的“阻碍”
1.1.4 Chrome V8 引擎链路
1.2 曾经尝试——ASM.js 与PNaCl
1.2.1 失落的ASM.js
1.2.2 古老的NaCl 与PNaCl
1.3 新的可能——WebAssembly
1.3.1 改变与颠覆
1.3.2 一路向前,WCG 与WWG
第2章 WebAssembly 核心原理(基于MVP标准)
2.1 应用与标准Web 接口
2.1.1 编译与初始化
2.1.2 验证模块
2.1.3 遇到错误
2.1.4 内存分配
2.1.5 表
2.2 深入设计模型——堆栈机
2.2.1 堆栈式虚拟机
2.2.2 逆波兰表达式
2.2.3 Shunting-yard 算法
2.2.4 标签与跳转
2.2.5 条件语句
2.2.6 子程序调用
2.2.7 变量
2.2.8 栈帧
2.2.9 堆
2.3 类型检查
2.3.1 数据指令类型
2.3.2 基本流程控制
2.3.3 基于表达式的控制流
2.3.4 类型堆栈的一致性
2.3.5 不可达代码
2.4 二进制编码
2.4.1 字节序——大端模式与小端模式
2.4.2 基于LEB-128 的整数编码
2.4.3 基于IEEE-754—2008 的浮点数编码
2.4.4 基于UTF-8 的字符串编码
2.4.5 模块数据类型
2.4.6 虚拟指令与编码
2.4.7 类型构造符
2.5 模块
2.5.1 段
2.5.2 索引空间
2.5.3 二进制原型结构
2.6 内存结构
2.6.1 操作运算符
2.6.2 寻址
2.6.3 对齐
2.6.4 溢出与调整
第3章 动态链接与SIMD(基于MVP 标准)
3.1 动态链接(Dynamic Linking)
3.1.1 ELF
3.1.2 符号重定向(Symbol Relocation)
3.1.3 GOT(Global Offset Table,全局偏移表)
3.1.4 PLT(Procedure Lookup Table,过程查询表)
3.1.5 基于表的Wasm 模块动态链接
3.2 单指令多数据流(SIMD)
3.2.1 SIMD 应用
3.2.2 并行与并发
3.2.3 费林分类法
3.2.4 SIMD.js & TC39
3.2.5 WebAssembly 上的SIMD 扩展
第4章 深入LLVM 与WAT
4.1 LLVM——底层虚拟机
4.1.1 传统的编译器架构
4.1.2 LLVM 中间表示层
4.1.3 基于LLVM 的编译器架构
4.1.4 LLVM 优化策略
4.1.5 LLVM 命令行工具
4.1.6 WebAssembly 与LLVM
4.2 基于LLVM 定义新的编程语言
4.2.1 图灵完备与DSL
4.2.2 简易词法分析器
4.2.3 RDP 与OPP 算法
4.2.4 AST(抽象语法树)
4.2.5 简易语法分析器
4.2.6 生成LLVM-IR 代码
4.2.7 链接优化器
4.2.8 编译到目标代码
4.2.9 整合I/O 交互层
4.3 WAT
4.3.1 S-表达式
4.3.2 WAT/Wasm 与Binary-AST
4.3.3 其他与设计原则
第5章 Emscripten 基础应用
5.1 利器——Emscripten 工具链
5.1.1 Emscripten 发展历史
5.1.2 Emscripten 组成结构
5.1.3 Emscripten 下载、安装与配置
5.1.4 运行测试套件
5.1.5 编译到ASM.js
5.2 连接C/C++与WebAssembly
5.2.1 构建类型
5.2.2 Emscripten 运行时环境
5.2.3 在JavaScript 代码中调用C/C++函数
5.2.4 在C/C++代码中调用JavaScript 函数
第6章 基于Emscripten 的语言关系绑定
6.1 基于Embind 实现关系绑定
6.1.1 简单类
6.1.2 数组与对象类型
6.1.3 高级类元素
6.1.4 重载函数
6.1.5 枚举类型
6.1.6 基本类型
6.1.7 容器类型
6.1.8 转译JavaScript 代码
6.1.9 内存视图
6.2 基于WebIDL 实现关系绑定
6.2.1 指针、引用和值类型
6.2.2 类成员变量
6.2.3 常量“const”关键字
6.2.4 命名空间
6.2.5 运算符重载
6.2.6 枚举类型
6.2.7 接口类
6.2.8 原始指针、空指针与void 指针
6.2.9 默认类型转换
第7章 探索Emscripten 高级特性
7.1 加入优化流程
7.1.1 使用编译器代码优化策略
7.1.2 使用GCC 压缩代码
7.1.3 使用IndexedDB 缓存模块对象
7.1.4 其他优化参数
7.2 使用标准库与文件系统
7.2.1 使用基于musl 和libc++的标准库
7.2.2 虚拟文件系统结构
7.2.3 打包初始化文件
7.2.4 基本文件系统操作
7.2.5 懒加载
7.2.6 Fetch API
7.3 处理浏览器事件
7.3.1 事件注册函数
7.3.2 事件回调函数
7.3.3 通用类型与返回值类型
7.3.4 常用事件
7.4 基于EGL、OpenGL、SDL 和OpenAL 的多媒体处理
7.4.1 使用EGL 与OpenGL 处理图形
7.4.2 使用SDL 处理图形
7.4.3 使用OpenAL 处理音频
7.5 调试WebAssembly 应用
7.5.1 编译器的调试信息
7.5.2 使用调试模式
7.5.3 手动跟踪
7.5.4 其他常用编译器调试选项
第8章 WebAssembly 综合实践、发展与未来
8.1 DIP 综合实践应用
8.1.1 应用描述
8.1.2 滤镜与卷积
8.1.3 基本组件类型与架构
8.1.4 编写基本页面骨架(HTML 与CSS)
8.1.5 编写核心卷积函数(C++)
8.1.6 编写主渲染循环与“胶水”代码(JavaScript)
8.1.7 使用Emscripten 编译并运行应用
8.1.8 性能对比
8.2 WebAssembly 常用工具集
8.2.1 Cheerp
8.2.2 Webpack 4
8.2.3 Go 和Rust 的WebAssembly 实践
8.2.4 Binaryen
8.2.5 WasmFiddle
8.2.6 Wabt
8.2.7 AssemblyScript
8.3 WebAssembly 未来草案
8.3.1 GC(垃圾回收)
8.3.2 Multi-Thread(多线程)与原子操作
8.3.3 异常处理
8.3.4 多返回值扩展
8.3.5 ES 模块
8.3.6 尾递归
8.3.7 BigInts 的双向支持
8.3.8 自定义注释语法


📜 SIMILAR VOLUMES


深入浅出JavaScript
✍ Michael Morrison 📂 Library 📅 2010 🏛 东南大学出版社 🌐 Chinese

<p>你将从《深入浅出JavaScript(中文版)》学到什么?这么说你准备从写html和css的静态网页跃进到编写动态网络应用程序脚本了?这里就是起点。《深入浅出java script》带你游历令人兴奋的交互式网页创建过程。为了启发你的思考,《深入浅出JavaScript(中文版)》覆盖了所有的java script基本知识,从基本网络编程技巧,如变量、函数和循环语句,到高级一些的专题,如表单验证、dom操作、客户端对象、脚本程序调试——甚至是aiax!赶快做好准备……快速响应的网站离你只有几页纸那么远。</p> <p>为何《深入浅出JavaScript(中文版)》看上去如此不同?</p>

深入浅出 Rust
✍ 范长春 📂 Library 📅 2018 🏛 机械工业出版社 🌐 Chinese

内容简介 · · · · · · 本书详细描述了Rust语言的基本语法,穿插讲解一部分高级使用技巧,并以更容易理解的方式解释其背后的设计思想。全书总共分五个部分。 第一部分介绍Rust基本语法,因为对任何程序设计语言来说,语法都是基础,学习这部分是理解其他部分的前提。 第二部分介绍属于Rust独一无二的内存管理方式。它设计了一组全新的机制,既保证了安全性,又保持了强大的内存布局控制力,而且没有额外性能损失。这部分是本书的重点和核心所在,也是Rust语言的思想内核精髓之处。 第三部分介绍Rust的抽象表达能力。它支持多种编程范式,以及较为强大的抽象表达能力。 第

深入浅出 Rust
✍ 范长春 📂 Library 📅 2018 🏛 机械工业出版社 🌐 Chinese

内容简介 · · · · · · 本书详细描述了Rust语言的基本语法,穿插讲解一部分高级使用技巧,并以更容易理解的方式解释其背后的设计思想。全书总共分五个部分。 第一部分介绍Rust基本语法,因为对任何程序设计语言来说,语法都是基础,学习这部分是理解其他部分的前提。 第二部分介绍属于Rust独一无二的内存管理方式。它设计了一组全新的机制,既保证了安全性,又保持了强大的内存布局控制力,而且没有额外性能损失。这部分是本书的重点和核心所在,也是Rust语言的思想内核精髓之处。 第三部分介绍Rust的抽象表达能力。它支持多种编程范式,以及较为强大的抽象表达能力。 第

深入浅出 Networking
✍ [美] Al Anderson,[美] Ryan Benedetti 著;徐定翔 译 📂 Library 📅 2011 🏛 电子工业出版社 🌐 Chinese

《深入浅出Networking》内容简介:厌倦了让人昏昏欲睡的网络术语?想学网络管理却苦于无法入门?试试《深入浅出Networking》吧。这是本渐进式的学习指南,书中以趣味案例为背景讲解网络知识,规划了从初学者到专家的学习课程,目标是让读者知其然,更知其所以然。想寻找网络电缆的断路点?布线时遇到障碍?该用交换机还是路由器,用DHCP还是NAT,用端口映射还是静态IP地址?如何排查网络故障?《深入浅出Networking》会告诉你答案。