从零开始的Lua教程(零):学习路线

出于分享学习心得和获得同伴讨论的目的,我打算写一个教程给想要学习如何实现lua解释器的同学提供一个参考。

我的学习经历

我在去年4月开始接触到游戏引擎的脚本引擎,那时我在读一本名为《游戏脚本高级教程》的书。

这本书在我的脑子里植入了一个想法:脚本引擎是一个方便的开发工具。

经过一些搜索和学习,我选择了lua语言并决定实现它。

我从4月开发到8月底,加上今年3月到5月,共计半年的时间,完成了python和c#两个版本。

这里我使用了原型开发方法:先使用python开发项目原型,理解实现框架和基本概念,使用pythonic的方式编写优雅的代码,忽略边界条件和细节。然后再用c#重写并最终实现项目。

学习路线

我提供一个学习路线:

简略版

  • 掌握C和Lua编程语言
  • 掌握编译原理
  • 实现一个json解析器
  • 实现lua解释器

详细版

首先需要一些编程的经验,应该掌握一门静态类型语言和一门动态类型语言。

C和Lua是必须的,因为Lua是用C实现的。

不必过于纠结细节,语言本身要通过使用来增进理解。


然后需要编译原理的知识,包括以下主题:

  • 了解编译器大概如何工作(龙书第2章)
  • 词法分析
  • 语法分析的LL算法
  • 代码生成

然后实现一个json解析器,参见milo yip的json教程。

Milo Yip:从零开始的 JSON 库教程​zhuanlan.zhihu.com

json是一个简洁的数据定义语言,适合作为实现lua的热身练习。

此外,你可以发现lua的表构造表达式(table constructor)和json非常相似,可以认为是抽出一部分先实现了。

然后才开始实现lua,获取以下资料后结合lua源代码学习如何实现lua:

Lua解释器实现参考资料

  • 《Lua设计与实现》
  • 《自己动手实现Lua》
  • 《Programming in Lua 4th Edition》
  • 《The Implementation Of Lua5》
  • 《A No Frill Intro To Lua5.1 VM Instructions》
  • 《Lua Bytecode Reference 5.3》
  • 《The Evolution Of Lua》

实现路线

我提供一个实现路线:

将lua分为前端编译器和后端虚拟机两个部分。

首先实现虚拟机。为了测试虚拟机,实现undump模块,使用clua编译出二进制chunk文件,由undump读取出Proto实例,喂给虚拟机执行。

  • 实现lundump模块(luaU_undump函数)
  • 实现lopcodes模块
  • 实现lobject模块
  • 实现虚拟机的指令循环(luaV_execute函数)

然后再实现编译器,按词法分析,语法分析,代码生成的顺序即可。

lua 获取网络时间_Lua脚本引擎教程:学习路线相关推荐

  1. lua游戏脚本实例源码_Lua脚本引擎教程(六):饥荒Lua脚本系统

    目录 饥荒的Lua逻辑层架构 迁移到Unity中使用Lua Lua擅长什么? 饥荒的Lua逻辑层架构 饥荒的整个逻辑层都是用Lua写的,并且把代码和艺术资产都开放给玩家,主要是供玩家中的mod制作者学 ...

  2. 华为OPENCPU如何自动获取网络时间

    华为OPENCPU如何自动获取网络时间 1.拷贝ntpdate文件到opencpu系统内,路径按sh脚本内路径: 2.拷贝sh脚本文件到opencpu系统内,执行sh脚本文件: #!/bin/sh # ...

  3. esp32获取网络时间和天气

    @[esp32获取网络时间和天气] esp32获取网络时间和天气 目录 一.库的获取 二.esp32连接wifi 三.oled显示 四.汉字或图片取模放在oled中显示 五.esp32获取网络时间 六 ...

  4. 获取网络时间并刷新本地时间(源码2)

    因为上次那个获取网络时间失效了(使用的是37端口),获取网络时间并刷新本地时间(源码1) 所以网上又找了一份代码,使用的是123端口,虽然没有测试成功,这里也做下记录,估计是本机环境问题,过两天再进行 ...

  5. 获取网络时间,在不同时间触发事件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 8266获取网络时间

    8266获取网络时间 今天第一次用阿里的博客写点东西感受一下.... sntp.sync("ntp1.aliyun.com",function()print("sync ...

  7. python获取网络时间_python获取网络时间和本地时间

    今天我们来看一下如何用python获取网络时间和本地时间,直接上代码吧,代码中都有注释. python获取网络时间获取网络时间 def getBeijinTime(): ""&qu ...

  8. stm32 + ESP8266 wifi获取网络时间和天气 stm32天气预报

    大家遇到什么什么题,可以私聊我. 近期由于某些原因,玩了一下stm32+WiFi获取网络天气和网络时间.之前一直觉得这个东西会有点难度,其实,做完了才发现,其实那只是想象中的难而已.现在,将这几天的成 ...

  9. Arduino ESP32 获取网络时间并同步本地RTC时钟

    Arduino ESP32 获取网络时间并同步本地RTC时钟 相关篇<Arduino ESP32 最简单直接获取网络时间方法> 在 ArduinoESP32核心支持库当中已经包含相关的获取 ...

最新文章

  1. 16进制的两位数转换不了 matlab_【大学生计算机基础】进制那些问题。小数或整数转换,各种进制间转换.........
  2. PHP做闹钟APP,8款超好用的闹钟APP,专治各种赖床
  3. sqlite 设置向下递增
  4. 兼容IE和Firefox
  5. python经典实例-Python机器学习经典实例
  6. 【Loss】深度学习的多个loss如何平衡?
  7. 【跳频扩频通信】基于matlab跳频扩频通信【含Matlab源码 1003期】
  8. JAVA跑步计时器app_锻炼计时器app
  9. DSP28335 SPWM之Trip-Zone中断
  10. 建设工程项目全寿命周期管理是指_建设工程全寿命周期的概述
  11. 分布式计算、并行计算、网格计算
  12. 精确光源 Punctual Light Source
  13. 交中IB课程中心2022届早申阶段录取成果汇总
  14. excel单元格内容拆分_自学EXCEL小技巧003→单元格内容拆分
  15. 基于pytorch+python实现一个中文到英文的神经网络的翻译模型
  16. python info函数的使用方法_sysinfo函数使用方法
  17. 字节Java高级岗:K8S太火了!花10分钟玩转它不香么
  18. python基础-数据类型
  19. 利用python将单个Excel文件转换为PDF
  20. 【Flutter 学习笔记八】 Flutter plugin not installed; this adds Flutter specific...

热门文章

  1. 【Elasticsearch】Elasticsearch 集群 运维 高性能 架构设计 高负载
  2. 95-10-030-启动-deamon定时任务
  3. 【杂项】2021年年度报告
  4. 【Elasticsearch】es Root mapping definition has unsupported parameters
  5. 【Flink】Flink反压(背压)网络流控
  6. 【Flink】部分task每秒处理速度为0
  7. 【Flink】Flink打包Could not resolve dependencies flink-statebackend-rocksdb_2.11:jar:1.9.1
  8. 玩转Eclipse--如何使用eclipse可以更好的提高我们的工作效率
  9. 求101-200以内的素数
  10. c语言输入一串字符辨别奇偶,c语言设计输入一个正整数判断其中各个数字是否奇数偶数交替出现是输出yes不是输出no...