| 作者 |
| [英] 戈登·F.威廉姆斯(Gordon F.Williams)张秀宏 |
| 丛书名 |
| 出版社 |
| 机械工业出版社 |
| ISBN |
| 9781911201743 |
| 简要 |
| 简介 |
| 内容简介书籍计算机书籍 ---------------------------自己动手做智能产品:嵌入式JavaScript实现--------------------------- 本书将通过简单的嵌入式编程,教会大家如何将日常物品转变为智能机器。当然市场中的ARM编程书籍多为平淡的教科书,相对复杂,编程语言对于初学者存在一定难度,本书采用读者易学易懂的编程语言,并结合实际动手操作来帮助读者实现产品智能化。 ---------------------------自己动手实现Lua:虚拟机、编译器和标准库--------------------------- 内容简介 本书是一本面向Lua程序员和脚本语言爱好者的语言自制指南和实战宝典。 全书将带给读者3个维度的收获: 维度1:深入理解Lua语言本身 作者融合自己丰富的工程实践经验,详细阐述了Lua语言的核心语法和实现原理,深入探讨了Lua虚拟机、编译器和标准库的实现,并给出了实际可以编译执行的代码。 维度2:从零开始实现一门脚本语言 本书以Lua语言为例,系统、完整地(涵盖虚拟机、编译器和标准库)讲解了如何零基础编写一门脚本语言,帮助读者彻底理解脚本语言的工作原理。 维度3:提升Go和Java语言编程能力 . 本书分别用Go语言和Java语言来实现Lua,包含大量对Go和Java的使用,有很多巧妙的设计,能帮助读者提升Go和Java的编程能力。 全书共21章,分为3个部分: 第一部分(第1-13章) 主要讲解Lua API和虚拟机的实现,包括二进制chunk格式、Lua虚拟机指令集、元编程、错误处理等。 第二部分(第14-17章) 主要讨论Lua语法和编译器的实现,包括词法分析、语法分析、代码优化、代码生成等。 第三部分(第18-21章) 主要讲解Lua辅助API和标准库实现,包括基础库、实用工具库、包和模块、协程等。 |
| 目录 |
---------------------------自己动手做智能产品:嵌入式JavaScript实现--------------------------- 前言 1 第1章 简介 5 为何要将物品智能化 5 在实践中学习 5 利用JavaScript进行创造 6 工具和材料 7 第一部分 微控制器 第2章 微控制器为何物 13 ARM历史 14 利用微控制器编程 15 第3章 Espruino入门 19 准备工作 20 插入接口 21 软件安装 22 连接开发板 24 固件升级 25 命令行初体验 26 编辑器 27 第4章 开启JavaScript之旅 31 准备工作 31 注释 32 数据类型 32 数学计算 33 变量 35 自增与自减 37 对象 38 函数 38 数组 42 面向对象 44 按位运算 45 if语句 51 &&和|| 52 三元操作符 53 for循环 53 异常 55 第二部分 电动机 第5章 什么是电动机 59 实验1:法拉第的电动机 60 实验2:电动机换向器 64 无刷直流电动机 68 实验3:步进电动机 69 实验4:步进电动机控制 72 实验5:多个步进电动机控制 76 第6章 频闪仪 79 找到一个风扇 79 实验6:速度检测 81 实验7:频闪仪 84 实验8:照得更远的频闪仪 86 第7章 约翰·罗杰·贝尔德的电视机 89 实验9:视觉的持续性 89 实验10:约翰·罗杰·贝尔德的电视机 92 第三部分 机电部分 第8章 制作一个简单的机器人 101 实验11:试用伺服电机 102 实验12:制作一个简单的机器人 105 实验13:循光 113 第9章 铅笔绘图仪 117 实验14:铅笔绘图仪 117 第10章 数码针孔相机 131 实验15:制作一个数码相机 131 第11章 打印机 145 实验16:制作一个打印机 145 第四部分 通信 第12章 有线通信 161 时序 161 实验17:制作示波器 163 第13章 切断连线:红外线 169 实验18:制作红外接收器 169 实验19:解码红外线信号 171 实验20:使用解码信号 175 实验21:用dweet.io在网络上使用遥控器 176 实验22:通过IFTTT在网络上使用遥控器 178 第14章 切断连线:无线电信号 181 实验23:连接接收器 182 实验24:连接发射器 183 实验25:从Espruino发射 185 实验26:解码接收的数据 186 第15章 连接无线网络 193 实验27:将WiFi添加到你的Pico 194 实验28:测试你的布线 198 实验29:连接到WiFi 199 实验30:将数据发送到Internet 200 实验31:从Internet接收数据 202 实验32:建立一个服务器 206 控制物品 209 第16章 低功耗蓝牙 213 低功耗蓝牙如何工作 214 如何使用低功耗蓝牙 216 Web Bluetooth 216 实验33:使用Puck.js 217 实验34:制作一个开门计数器 219 实验35:广播开门次数 222 实验36:用Eddystone接收开门次数 223 第五部分 合而为一 第17章 XY绘图仪 229 实验37:制作XY表 229 实验38:控制XY表 235 第18章 联网绘图仪 243 实验39:联网绘图仪 245 第六部分 总结 第19章 未来如何 257 附录A 零件和材料 259 附录B 常见的Espruino命令和变量 271 附录C Espruino汇编 277 ---------------------------自己动手实现Lua:虚拟机、编译器和标准库--------------------------- 前言 第一部分 准备 第1章 准备工作 3 1.1 准备开发环境 3 1.1.1 操作系统 3 1.1.2 安装Lua 4 1.1.3 安装Go 4 1.2 准备结构 4 1.3 本章小结 6 第二部分 Lua虚拟机和Lua API 第2章 二进制chunk 9 2.1 什么是二进制chunk 10 2.2 luac命令介绍 11 2.2.1 编译Lua源文件 11 2.2.2 查看二进制chunk 13 2.3 二进制chunk格式 15 2.3.1 数据类型 16 2.3.2 总体结构 17 2.3.3 头部 18 2.3.4 函数原型 22 2.4 解析二进制chunk 27 2.4.1 读取基本数据类型 28 2.4.2 检查头部 29 2.4.3 读取函数原型 30 2.5 测试本章代码 33 2.6 本章小结 36 第3章 指令集 37 3.1 指令集介绍 37 3.2 指令编码格式 38 3.2.1 编码模式 38 3.2.2 操作码 39 3.2.3 操作数 40 3.2.4 指令表 41 3.3 指令解码 42 3.4 测试本章代码 44 3.5 本章小结 47 第4章 Lua API 49 4.1 Lua API介绍 49 4.2 Lua栈 51 4.2.1 Lua数据类型和值 51 4.2.2 栈索引 54 4.2.3 定义luaStack结构体 54 4.3 Lua State 57 4.3.1 定义LuaState接口 57 4.3.2 定义luaState结构体 58 4.3.3 基础栈操纵方法 59 4.3.4 Push方法 64 4.3.5 Access方法 65 4.4 测试本章代码 69 4.5 本章小结 70 第5章 Lua运算符 71 5.1 Lua运算符介绍 71 5.2 自动类型转换 75 5.3 扩展LuaState接口 79 5.3.1 Arith()方法 80 5.3.2 Compare()方法 83 5.3.3 Len()方法 85 5.3.4 Concat()方法 86 5.4 测试本章代码 87 5.5 本章小结 88 第6章 虚拟机雏形 89 6.1 添加LuaVM接口 89 6.1.1 定义LuaVM接口 91 6.1.2 改造luaState结构体 92 6.1.3 实现LuaVM接口 93 6.2 实现Lua虚拟机指令 94 6.2.1 移动和跳转指令 94 6.2.2 加载指令 96 6.2.3 算术运算指令 101 6.2.4 长度和拼接指令 103 6.2.5 比较指令 106 6.2.6 逻辑运算指令 107 6.2.7 for循环指令 110 6.3 指令分派 113 6.4 测试本章代码 115 6.5 本章小结 118 第7章 表 119 7.1 表介绍 119 7.2 表内部实现 121 7.3 表相关API 125 7.3.1 Get方法 126 7.3.2 Set方法 129 7.4 表相关指令 131 7.4.1 NEWTABLE 131 7.4.2 GETTABLE 133 7.4.3 SETTABLE 135 7.4.4 SETLIST 136 7.5 测试本章代码 138 7.6 本章小结 140 第8章 函数调用 141 8.1 函数调用介绍 141 8.2 函数调用栈 143 8.2.1 调用帧实现 144 8.2.2 调用栈实现 145 8.3 函数调用API 147 8.3.1 Load() 148 8.3.2 Call() 149 8.4 函数调用指令 152 8.4.1 CLOSURE 152 8.4.2 CALL 153 8.4.3 RETURN 157 8.4.4 VARARG 158 8.4.5 TAILCALL 159 8.4.6 SELF 160 8.4.7 扩展LuaVM接口 162 8.4.8 改进SETLIST指令 163 8.5 测试本章代码 164 8.6 本章小结 166 第9章 Go函数调用 167 9.1 Go函数登场 167 9.1.1 添加Go函数类型 168 9.1.2 扩展Lua API 169 9.1.3 调用Go函数 170 9.2 Lua注册表 172 9.2.1 添加注册表 172 9.2.2 操作注册表 173 9.3 全局环境 175 9.3.1 使用API操作全局环境 175 9.3.2 在Lua里访问全局环境 178 9.4 测试本章代码 179 9.5 本章小结 181 第10章 闭包和Upvalue 183 10.1 闭包和Upvalue介绍 183 10.1.1 背景知识 183 10.1.2 Upvalue介绍 185 10.1.3 全局变量 187 10.2 Upvalue底层支持 189 10.2.1 修改closure结构体 189 10.2.2 Lua闭包支持 191 10.2.3 Go闭包支持 192 10.3 Upvalue相关指令 195 10.3.1 GETUPVAL 195 10.3.2 SETUPVAL 196 10.3.3 GETTABUP 197 10.3.4 SETTABUP 199 10.3.5 JMP 200 10.4 测试本章代码 202 10.5 本章小结 203 第11章 元编程 205 11.1 元表和元方法介绍 205 11.1.1 元表 206 11.1.2 元方法 206 11.2 支持元表 207 11.3 调用元方法 208 11.3.1 算术元方法 209 11.3.2 长度元方法 211 11.3.3 拼接元方法 211 11.3.4 比较元方法 212 11.3.5 索引元方法 214 11.3.6 函数调用元方法 216 11.4 扩展Lua API 217 11.4.1 GetMetatable() 218 11.4.2 SetMetatable() 218 11.5 测试本章代码 219 11.6 本章小结 222 第12章 迭代器 223 12.1 迭代器介绍 223 12.2 next()函数 226 12.2.1 修改luaTable结构体 227 12.2.2 扩展Lua API 228 12.2.3 实现next()函数 229 12.3 通用for循环指令 229 12.4 测试本章代码 232 12.5 本章小结 234 第13章 异常和错误处理 235 13.1 异常和错误处理介绍 235 13.2 异常和错误处理API 237 13.2.1 Error() 238 13.2.2 PCall() 239 13.3 error()和pcall()函数 240 13.4 测试本章代码 241 13.5 本章小结 242 第三部分 Lua语法和编译器 第14章 词法分析 245 14.1 编译器介绍 245 14.2 Lua词法介绍 247 14.3 实现词法分析器 251 14.3.1 定义Token类型 252 14.3.2 空白字符 254 14.3.3 注释 256 14.3.4 分隔符和运算符 256 14.3.5 长字符串字面量 258 14.3.6 短字符串字面量 259 14.3.7 数字字面量 262 14.3.8 标识符和关键字 263 14.4 LookAhead()和其他方法 264 14.5 测试本章代码 265 14.6 本章小结 267 第15章 抽象语法树 269 15.1 抽象语法树介绍 269 15.2 Chunk和块 270 15.3 语句 272 15.3.1 简单语句 273 15.3.2 while和repeat语句 273 15.3.3 if语句 274 15.3.4 数值for循环语句 275 15.3.5 通用for循环语句 275 15.3.6 局部变量声明语句 276 15.3.7 赋值语句 277 15.3.8 非局部函数定义语句 278 15.3.9 局部函数定义语句 279 15.4 表达式 280 15.4.1 简单表达式 280 15.4.2 运算符表达式 281 15.4.3 表构造表达式 281 15.4.4 函数定义表达式 282 15.4.5 前缀表达式 283 15.4.6 圆括号表达式 284 15.4.7 表访问表达式 284 15.4.8 函数调用表达式 285 15.5 本章小结 286 第16章 语法分析 287 16.1 语法分析介绍 287 16.1.1 歧义 288 16.1.2 前瞻和回溯 289 16.1.3 解析方式 290 16.2 解析块 290 16.3 解析语句 293 16.3.1 简单语句 294 16.3.2 if语句 296 16.3.3 for循环语句 297 16.3.4 局部变量声明和函数定义语句 299 16.3.5 赋值和函数调用语句 300 16.3.6 非局部函数定义语句 302 16.4 解析表达式 303 16.4.1 运算符表达式 304 16.4.2 非运算符表达式 306 16.4.3 函数定义表达式 307 16.4.4 表构造表达式 308 16.4.5 前缀表达式 310 16.4.6 圆括号表达式 311 16.4.7 函数调用表达式 312 16.4.8 表达式优化 313 16.5 测试本章代码 315 16.6 本章小结 316 第17章 代码生成 317 17.1 定义funcInfo结构体 317 17.1.1 常量表 318 17.1.2 寄存器分配 319 17.1.3 局部变量表 320 17.1.4 Break表 323 17.1.5 Upvalue表 324 17.1.6 字节码 325 17.1.7 其他信息 327 17.2 编译块 327 17.3 编译语句 329 17.3.1 简单语句 330 17.3.2 while和repeat语句 331 17.3.3 if语句 333 17.3.4 for循环语句 334 17.3.5 局部变量声明语句 335 17.3.6 赋值语句 337 17.4 编译表达式 339 17.4.1 函数定义表达式 340 17.4.2 表构造表达式 341 17.4.3 运算符表达式 343 17.4.4 名字和表访问表达式 345 17.4.5 函数调用表达式 346 17.5 生成函数原型 347 17.6 使用编译器 349 17.7 测试本章代码 350 17.8 本章小结 350 第四部分 Lua标准库 第18章 辅助API和基础库 353 18.1 Lua标准库介绍 353 18.2 辅助API 355 18.2.1 增强版方法 357 18.2.2 加载方法 358 18.2.3 参数检查方法 359 18.2.4 标准库开启方法 360 18.3 基础库 361 18.3.1 基础库介绍 362 18.3.2 基础库实现 362 18.4 测试本章代码 365 18.5 本章小结 366 第19章 工具库 367 19.1 数学库 367 19.2 表库 369 19.3 字符串库 372 19.4 UTF-8库 374 19.5 OS库 376 19.6 本章小结 379 第20章 包和模块 381 20.1 包和模块介绍 381 20.2 实现包库 386 20.3 测试本章代码 391 20.4 本章小结 392 第21章 协程 393 21.1 协程介绍 393 21.2 协程API 396 21.2.1 支持线程类型 396 21.2.2 支持协程操作 398 21.3 实现协程库 400 21.4 测试本章代码 403 21.5 本章小结 404 附录A Lua虚拟机指令集 405 附录B Lua语法EBNF描述 407 后记 409 |