前言
在上一章里,我完成了词法分析器的设计与实现的论述,接下来我要继续论述语法分析器的设计与实现。限于篇幅,我将会把语法分析器分为两个部分来论述,本章为上部,下一章为下部。本章将会重新复习编译器的构造,并且论述编译流程,以及lua的parser所涉及的编译相关的内容,最后通过阐述虚拟机相关指令的实现,作为结尾。本章所涉及的代码,全部在dummylua工程里,欢迎star。另外,如果你喜欢我写的文章,喜欢讨论技术,欢迎加入我创建的群:QQ185017593
Articles are paginated with only three posts here for example. You can set the number of entries to show on this page with the “pagination” setting in the config file.
在上一章里,我完成了词法分析器的设计与实现的论述,接下来我要继续论述语法分析器的设计与实现。限于篇幅,我将会把语法分析器分为两个部分来论述,本章为上部,下一章为下部。本章将会重新复习编译器的构造,并且论述编译流程,以及lua的parser所涉及的编译相关的内容,最后通过阐述虚拟机相关指令的实现,作为结尾。本章所涉及的代码,全部在dummylua工程里,欢迎star。另外,如果你喜欢我写的文章,喜欢讨论技术,欢迎加入我创建的群:QQ185017593
构建Lua解释器Part5,对Lua解释器进行了整体介绍,并且以一个hello world程序为例子,给读者一个初步的概念。通过那一篇,我们知道了编译器至少要包括词法分析其和语法分析器,而本篇,我将集中时间和精力,用来介绍和讲解Lua词法分析器的设计与实现,实际上,它是对Part5词法分析器部分的一个补充。本文所指的词法分析器,是参照Lua-5.3这个版本的源码,并且亲自动手实现和测试过,它也已经被整合到dummylua这个工程中,欢迎大家star。由于整个词法分析是我自己重新实现,因此不会在所有的细节上和官方lua保持一致,最后由于本人水平有限,如有写的不正确的地方,欢迎大家批评指正。此外,我已经建了一个qq群(QQ:185017593),有兴趣参与技术讨论的同学可以加进来。
[Read More]我在前几年,写了一篇《skynet源码赏析》,阐述了skynet的整体设计,和核心运作机制流程,该文针对的是skynet-1.0版本,如今skynet已经升级到1.3版本,总的来说,skynet整体架构并没有特别大的改动,不过从1.2版本开始,skynet增强了网络并发处理的能力。1.3改进了cluster机制,修复了一些大量并发可能导致的bug。尽管《skynet源码赏析》这篇,已经详细地阐述了skynet内部实现机制,不过对于网络部分,这篇只是阐述了大致的运作机理,并未深入源码层进行非常细致的分析,为了填补这个遗憾,我决定在近期新增一篇专门讲解skynet网络机制的blog,此外我还计划在未来几个月内,写一篇集群机制的blog,以此完成我所谓的“skynet源码剖析三部曲”,XD。
[Read More]在经过漫长的准备,我终于完成了《构建Lua解释器》系列的第五部分的代码编写,并且通过了预定的测试。本篇我将对dummylua项目中的脚本运行基础架构的设计与实现进行介绍和解析,它包括了lua编译器基础架构以及虚拟机基础架构。过去4个部分的开发,为本部分提供了坚实且必要的基础,本篇将为编译与运行lua脚本搭建最基础的架构,后续内容将在此架构上继续填充与丰富,本部分,我们的目标是编译并运行如下所示的一段脚本代码:
[Read More]After a long time, now I decide to add a new post. This is my first post written in English. Maybe it is a challenge, but it is surely a good beginning. I believe that one step at a time can make a thousand miles. I am going to talk about the endianness in this post.
[Read More]在完成构建Lua解释器Part4以后,我原计划是将业余时间投入到Lua虚拟机的研究之中。不过最近,我们项目希望服务端和客户端共享战斗逻辑,功能由客户端实现,借以降低开发联调的成本,而客户端主要使用C#语言,在确定客户端能够做到表现和逻辑分离以后,我们决定服务端也搭建C#战斗集群来运行战斗逻辑。
[Read More] 本篇我将对dummylua中Table的设计和实现进行介绍和说明。本文的目的旨在梳理清dummylua项目Table的数据结构和运作流程,该部分深度参考了lua-5.3.4的Table设计与实现,由于所有的细节是我自己根据理解重新实现,因此不会在所有的设计细节上和官方lua保持一致,但是遵循了基本的设计思路。
Table是Lua语言中举足轻重的组成部分,掌握和理解它具有战略意义,这也是实现Lua虚拟机的基础所在,本文首先介绍dummylua项目Table的数据结构,然后在概念上介绍一些基本的操作流程,如创建、resize、查询、插入和迭代等操作。
上一章节我介绍了dummylua项目的gc的设计原理和实现方式,该部分我基本是仿造了官方lua-5.3.4的做法。本章节,我将为大家带来dummylua项目TString的设计实现讲解。和以往任何一篇一样,本篇我也是基本遵循lua-5.3的设计思想,但由于实现是我凭理解自己手动实现,因此不会在所有的细节上和官方lua保持一致。
任何一门语言都要支持字符串,lua也一样,本章将从lua string的数据结构开始阐述,然后深入其他细节进行阐述,并试图揭露这些设计的历史背景和原因,由于本人能力有限,如有不当之处想要指明,或是想和我一起讨论,欢迎加Q群与我讨论(QQ185017593),我是群主,欢迎大家的到来。
上一篇我已经设计和实现了Lua解释器最基础的基本数据结构,实现了纯C函数在栈中的调用流程,以及保护模式调用函数等内容,今天要介绍的则是Lua解释器的GC基础架构。Garbage Collection机制,可能是让人们听之不寒而栗的机制,都说GC很复杂,需要花费大量时间去消化和理解,那为什么要在本系列的第2篇就早早引入?做这个决定并非一时冲动之举,而是经过思考后而决定的。之前在阅读了云风大神翻译的《编程之魂》第7章[1],这篇关于对Lua设计者的访谈记录中,作者有这么说过:
[Read More]从本篇开始,我们正式进入到Lua解释器的开发阶段(这是一个遵循Lua5.3标准的项目)。本篇并不直接接入到设计和实现语法分析器和词法分析器的阶段,而是先设计和实现Lua虚拟机的基础数据结构(包括Lua最基本的数据结构,如基本数据类型,表示虚拟机状态的global_State和lua_State结构,在函数调用中扮演重要角色的CallInfo结构等)以及设计和实现基于栈的C函数调用流程。这些都是理解后面虚拟机运作的基础。由于这是一个仿制项目,为了和官方版本做区分,就称之为dummylua,后面要称呼本项目时,一律用dummylua来表示。
[Read More]