计算机
类型
可以朗读
语音朗读
165千字
字数
2020-12-01
发行日期
展开全部
主编推荐语
WebAssembly布道者撰写,详解使用C/C++/Rust开发WebAssembly应用的技术和方法。
内容简介
内容简介这是一部讲解如何用不错编程语言开发WebAssembly应用的著作,由国内WebAssembly领域的先驱者和布道者撰写。
全书一共10章,分为三个部分:
第一部分基础篇(1~3章)首先介绍了WebAssembly的基础和工具链Emscripten的用法,然后详细讲解了使用C/C语言和Emscripten开发WebAssembly模块的方法。
第二部分方法篇(第4~8章),对Emscripten运行时、WebAssembly友好的一般性方法、网络I/O、并发执行、GUI及交互等知识点展开了深入的讨论。
第三部分前沿篇(第9~10章),详细讲解了WASI以及如何使用Rust语言开发WebAssembly模块和WASI应用。
目录
- 版权信息
- 前言
- 第一篇 基础篇
- 第1章 认识WebAssembly
- 1.1 WebAssembly的诞生背景
- 1.2 Web的第4种语言
- 1.3 本章小结
- 第2章 Emscripten快速入门
- 2.1 安装Emscripten
- 2.1.1 使用emsdk命令行工具安装Emscripten
- 2.1.2 在Docker环境中安装Emscripten
- 2.1.3 校验安装
- 2.2 你好,世界!
- 2.2.1 生成.wasm文件
- 2.2.2 运行
- 2.2.3 使用Emscripten生成测试页面
- 2.3 胶水代码初探
- 2.3.1 WebAssembly汇编模块载入
- 2.3.2 导出函数封装
- 2.3.3 异步加载
- 2.4 编译目标及编译流程
- 2.4.1 编译目标的选择
- 2.4.2 编译流程
- 2.5 示例:放大镜特效
- 2.5.1 模板程序
- 2.5.2 静态的放大镜
- 2.5.3 动态的放大镜
- 2.6 本章小结
- 第3章 C与JavaScript互操作
- 3.1 JavaScript调用C函数
- 3.1.1 定义函数导出宏
- 3.1.2 在JavaScript中调用C导出函数
- 3.2 JavaScript函数注入C环境
- 3.2.1 C函数声明
- 3.2.2 JavaScript实现C函数
- 3.2.3 闭包限制及解决办法
- 3.2.4 JavaScript函数注入C环境的优缺点
- 3.3 单向透明的内存模型
- 3.3.1 Module.buffer
- 3.3.2 Module.HEAPX
- 3.3.3 在JavaScript中访问C/C++环境内存
- 3.4 JavaScript与C/C++交换数据
- 3.4.1 参数及返回值
- 3.4.2 通过内存交换数据
- 3.4.3 在JavaScript中分配内存
- 3.4.4 字符串
- 3.5 EM_ASM系列宏
- 3.5.1 EM_ASM
- 3.5.2 EM_ASM_/EM_ASM_DOUBLE
- 3.5.3 EM_ASM_INT_V/EM_ASM_DOUBLE_V
- 3.6 emscripten_run_script()系列函数
- 3.6.1 emscripten_run_script()
- 3.6.2 emscripten_run_script_int()
- 3.6.3 emscripten_run_script_string()
- 3.7 ccall()/cwrap()
- 3.7.1 ccall()
- 3.7.2 cwrap()
- 3.7.3 ccall()/cwrap()的潜在风险
- 3.8 本章小结
- 第二篇 方法篇
- 第4章 Emscripten运行时
- 4.1 main()函数与生命周期
- 4.2 消息循环
- 4.2.1 emscripten_set_main_loop()
- 4.2.2 消息循环的暂停、继续及终止
- 4.3 文件系统
- 4.3.1 Emscripten虚拟文件系统架构
- 4.3.2 基于MEMFS的打包文件系统
- 4.3.3 NODEFS文件系统
- 4.3.4 IDBFS
- 4.4 内存管理
- 4.4.1 内存容量/栈容量
- 4.4.2 可变内存
- 4.4.3 内存分配器
- 4.5 Module定制
- 4.6 示例:人脸检测
- 4.6.1 facedetect_cnn()函数
- 4.6.2 facedetect_cnn()函数再封装
- 4.6.3 读取图像并检测人脸
- 4.6.4 基于SDL显示IplImage图像
- 4.7 本章小结
- 第5章 WebAssembly友好的一般性方法
- 5.1 消息循环分离
- 5.1.1 emscripten_set_main_loop()的不足
- 5.1.2 在JavaScript中创建定时循环
- 5.2 内存对齐
- 5.2.1 asm.js
- 5.2.2 wasm
- 5.2.3 避免及检测未对齐的内存操作
- 5.3 使用C接口导出C++对象
- 5.4 C++对象生命周期管理
- 5.4.1 引用计数
- 5.4.2 AddRef()/Release()使用规则
- 5.4.3 导出AddRef()/Release()
- 5.5 使用C接口注入JavaScript对象
- 5.5.1 创建JavaScript对象/ID表
- 5.5.2 注入JavaScript对象的生命周期管理
- 5.6 小心64位整型数
- 5.6.1 WebAssembly原生支持int64
- 5.6.2 导出函数包含int64
- 5.6.3 注入函数包含int64
- 5.7 文件系统的缺陷
- 5.8 本章小结
- 第6章 网络I/O
- 6.1 XMLHttpRequest
- 6.1.1 XMLHttpRequest对象使用简介
- 6.1.2 XMLHttpRequest对象的C接口封装
- 6.1.3 扩展回调处理
- 6.2 WebSocket
- 6.2.1 创建WebSocket测试服务
- 6.2.2 在JavaScript中使用WebSocket
- 6.2.3 WebSocket对象的C接口封装
- 6.3 本章小结
- 第7章 并发执行
- 7.1 JavaScript中的并发模型
- 7.2 在Worker中使用Emscripten
- 7.3 pthread线程
- 7.3.1 原子操作
- 7.3.2 pthread示例
- 7.3.3 在浏览器环境运行pthread示例
- 7.4 本章小结
- 第8章 GUI及交互
- 8.1 Canvas
- 8.2 鼠标事件
- 8.3 键盘事件
- 8.4 Life游戏
- 8.4.1 Life简介
- 8.4.2 设计要求
- 8.4.3 Life游戏C代码
- 8.4.4 Life游戏网页代码
- 8.4.5 运行Life
- 8.5 本章小结
- 第三篇 前沿篇
- 第9章 Rust和WebAssembly
- 9.1 Rust入门
- 9.1.1 安装Rust开发环境
- 9.1.2 你好,世界
- 9.1.3 Cargo管理工程
- 9.1.4 本地文档
- 9.2 你好,WebAssembly
- 9.2.1 安装WebAssembly开发环境
- 9.2.2 打印“你好,WebAssembly”
- 9.3 导入和导出函数
- 9.3.1 导出main()函数
- 9.3.2 导入宿主打印函数
- 9.3.3 导出自定义函数
- 9.4 打印命令行参数
- 9.4.1 打印字符串
- 9.4.2 准备导入env_print_str()函数
- 9.4.3 向Rust传入字符串
- 9.4.4 命令行参数封装
- 9.4.5 传入命令行参数
- 9.5 no_std
- 9.5.1 输出文件的大小
- 9.5.2 通过no_std裁剪标准
- 9.5.3 库
- 9.6 嵌入C代码
- 9.6.1 C语言思维
- 9.6.2 连接C语言库
- 9.6.3 集成C语言源码
- 9.6.4 build.rs自动构建
- 9.7 本章小结
- 第10章 WASI系统接口
- 10.1 WASI简介
- 10.2 探秘WASI工作原理
- 10.2.1 准备工作
- 10.2.2 探秘wasm32-wasi底层
- 10.2.3 Rust和wasm32-unknown-unknown
- 10.2.4 C/C++编译成WASI程序
- 10.2.5 汇编程序
- 10.3 WebAssembly虚拟机
- 10.3.1 准备WebAssembly测试模块
- 10.3.2 Node.js环境:基于wasi包
- 10.3.3 Node.js环境:手工实现fd_write()函数
- 10.3.4 Rust环境:导入wasi包
- 10.3.5 Rust环境:手工实现fd_write()函数
- 10.4 wapm包管理器
- 10.4.1 安装wapm包管理器
- 10.4.2 安装并运行cowsay小程序
- 10.4.3 创建wapm模块
- 10.5 本章小结
- 附录
- 附录A WebAssembly接口
- A.1 WebAssembly对象
- A.2 全局方法
- A.2.1 WebAssembly.compile()
- A.2.2 WebAssembly.instantiate()
- A.2.3 WebAssembly.validate()
- A.2.4 WebAssembly.compileStreaming()
- A.2.5 WebAssembly.instantiateStreaming()
- A.3 Module对象
- A.3.1 WebAssembly.Module()
- A.3.2 WebAssembly.Module.exports()
- A.3.3 WebAssembly.Module.imports()
- A.3.4 WebAssembly.Module.customSections()
- A.4 Instance对象
- A.4.1 WebAssembly.Instance()
- A.4.2 Instance.prototype.exports
- A.5 Memory对象
- A.5.1 WebAssembly.Memory()
- A.5.2 Memory.prototype.buffer
- A.5.3 Memory.prototype.grow()
- A.6 Table对象
- A.6.1 WebAssembly.Table()
- A.6.2 Table.prototype.get()
- A.6.3 Table.prototype.length
- A.6.4 Table.prototype.set()
- A.6.5 Table.prototype.grow()
- 附录B 机器指令
- B.1 常数指令
- B.2 算术运算指令
- B.3 位运算指令
- B.4 变量访问指令
- B.5 内存访问指令
- B.6 比较指令
- B.7 类型转换指令
- B.8 控制流指令
- B.9 其他指令
展开全部
出版方
机械工业出版社有限公司
机械工业出版社是全国优秀出版社,自1952年成立以来,坚持为科技、为教育服务,以向行业、向学校提供优质、权威的精神产品为宗旨,以“服务社会和人民群众需求,传播社会主义先进文化”为己任,产业结构不断完善,已由传统的图书出版向着图书、期刊、电子出版物、音像制品、电子商务一体化延伸,现已发展为多领域、多学科的大型综合性出版社,涉及机械、电工电子、汽车、计算机、经济管理、建筑、ELT、科普以及教材、教辅等领域。