Lua 解释器

Lua 解释器

警告??:这将是一个又臭又长的系列教程,教程结束的时候,你将拥有一个除了性能差劲、扩展性差、标准库不完善之外,其他方面都和官方相差无几的 Lua 语言解释器。说白了,这个系列的教程实现的是一个玩具语言,仅供学习,无实用性。请谨慎 Follow,请谨慎 Follow,请谨慎 Follow。

前言

编译原理是计算机科学的一个重要且复杂的知识体系。这个系列教程也只是你入门前的垫脚石。但即使如此,也并不代表这个教程就很简单,如果决定开始,请坚持到底。这是一个认真严肃的教程(咳咳),它不像网络上的其他类似教程,要么实现一个“高级计算器”就完事了,要么语法分析还没讲完,就太监了。也不像其他的 Lua 源码阅读类的指导教程,去教你怎么阅读并理解 Lua 的源码。但我相信完成本教程后再去读 Lua 的源代码,也会轻松很多。

本教程将从零开始,一砖一瓦的构建出一个完整的解释器。不使用任何自动化的工具,也不使用任何第三方库,从词法分析到虚拟机,全部亲力亲为。我们将要实现的语言起名为 SLua,意思是 Simple Lua。

前置要求

本教程并不是面向编程初学者的,你至少需要满足以下要求才可以继续阅读:

  • 本教程使用的编程语言为 Google 出品的 Go 语言。Go 语言上手非常容易,如果你有过其他任何语言的编程经验,请花几个小时阅读这篇教程:墙外多语言版墙内中文版
  • 本教程的定位不是教科书,因此不会过多的提及关于编译原理的理论性的内容,而更加注重实践。所以,这要求你至少要知道编译过程流水线的基本步骤以及每个步骤的作用,比如:词法分析、语法分析、虚拟机等。
  • 既然要实现 Lua 语言的解释器,自然要求你熟悉 Lua 语言,即使没有用它写过项目,至少要熟悉 Lua 语言的语法及语言特性。

面向人群

  • 如果你很想知道脚本语言的解释器的工作原理,请继续阅读。
  • 如果你不仅想知道工作原理,还想亲自实现一个,请继续阅读。
  • 如果你学完学校开设的编译原理课程,除了学会了 LEX 和 YACC,其余的还是一无所知,请继续阅读。

开发方式

我们不准备从一开始就着手实现一个完完整整的解释器,支持所有的 Feature,这样无疑会顾此失彼,也会极大的拉高教程的阅读门槛。所以我们会先抽取 Lua 中一些最最基本的特性,实现一个可以工作的原型。在原型之上,我们再不断添加特性,直到完成为止。

在第一个版本中,我们会将一些比较重要的 Feature 都砍掉,将目光集中在整个流程的实现上。

所以,第一个版本将:

  • 不支持 Table
  • 不支持函数和闭包
  • 不支持 for 循环语句
  • 不支持 repeat...until 循环语句
  • 不支持多行注释和多行字符串

阉割的差不多了,看看还剩下什么:

  • 变量的声明及赋值(全局变量和局部变量)
  • do...end 代码块
  • if...elseif...else...end 分支语句
  • while 循环语句
  • 单行注释
  • 单行形式的字符串
  • 各种单目和双目的运算符

编译流程

SLua 的编译共分为以下几个阶段:

  • 词法分析:将用户输入的文本形式的源代码分解为一个 Token 列表
  • 语法分析:将词法分析的输出作为输入,生成无语义信息的抽象语法树(AST)
  • 语义分析:完善 AST 中的语义相关的信息
  • 代码生成:根据 AST 生成字节码
  • 虚拟机:解释并执行字节码
  • 标准库:提供系统级的实用函数

教程的章节安排也和编译流程保持一致。

获取源代码

代码已托管到 Github 上:SLua,每一个阶段的代码我都会创建一个 release,你可以直接下载作为参照。虽然提供了源代码,但并不建议直接复制粘贴,因为这样学到的知识会很容易忘记。

刚开始玩 Github 和 博客园,所以没有任何粉丝和关注量(哭),如果你觉得这篇教程有帮助,请不要吝啬给文章点个喜欢,给 Github 上的项目点个 Star。如果能 Follow 一下博客园 和 Github 的账号就更好啦,我也会更加有动力将这个系列写下去。:)

时间: 05-05

Lua 解释器的相关文章

用VS2005编译生成Lua库文件和解释器

转自http://blog.csdn.net/lieyingshengbao/article/details/9188997 TMD,本来很简单的东西,网上说的乱七八糟,说的也不明白,大家抄来抄去,估计都不自己实践的..花了半个下午研究了一下,总结一下. 1)下载lua工程文件,地址为http://www.lua.org/ftp/,我下载的lua-5.1.3.tar.gz版本:开始时我下载的是最新版本,结果没有.bat文件,费了好多时间,TMD.所以,如果想方便,就下载这个版本的.2)下载后,在

[Lua]50行代码的解释器,用来演示lambda calculus

嗯,来写写经过: 在知乎上看见用Belleve牛用javascript写了一个精简的lisp解释器 => 我也想写一个,用lua写,能多简单呢? => 写了一个阉割的scheme解释器,包含lambda/if两个special form,以及+-=print几个过程,60行代码 => 能再精简吗?比如把if给去掉? => 搜索,嗯,lambda calculus能帮我 => 阅读wiki上lambda calculus的"Encoding datatypes&quo

nginx+lua+redis(openresty)配置

nginx+lua+redis(openresty)配置 2014-07-18 11:10 2494人阅读 评论(1) 收藏 举报 方案一: 1.安装lua解释器 wget http://luajit.org/download/LuaJIT-2.0.2.tar.gz (http://luajit.org/download.html) 配置lua Lib和include/luajit-$version目录为环境变量 2.下载ngx_devel_kit和lua-nginx-module https:

第1课 - 学习Lua的意义

学习Lua的意义 1.Lua简介 (1) 1993年.巴西 (2) 小巧精致的脚本语言,大小只有200K (3) 用标准C语言写成,能够在所有的平台上编译运行 (4) 发明的目标是嵌入在C/C++中,为应用程序提供灵活的扩展和定制功能 (5) 不适合用于开发独立的应用程序 2.Lua产生的原因 C/C++工程中有大量的业务逻辑,而业务逻辑经常发生改变,这就需要更改源代码.由于C/C++是编译型语言,源码一旦改变就需要重新编译整个工程,在面对代码量很大的工程时需要耗费大量的时间.因此产生了一种想法

Lua总结二

Lua实践准备 刚开始练习Lua需要一个Lua解释器来执行Lua代码,我是在Windows上学习Lua的,需要自己生成最新版本的Lua解释器. 方法见于: http://www.lua.org/manual/5.3/readme.html Building Lua on other systems 建立一个visual studio Win32 Console Application项目,把c文件和h文件分别放在Source Files和Header Files目录中,删掉luac.c文件.启动

Lua 架构 The Lua Architecture

转载自:http://magicpanda.net/2010/10/lua%E6%9E%B6%E6%9E%84%E6%96%87%E6%A1%A3/ Lua架构文档(翻译) 十 102010 前段时间翻译了lua官方关于lua5架构设计的一份文档,现在分享给大家. 注意:所有版权都归lua官方所有,本人仅将其翻译为中文,以方便中文阅读者.翻译中出现任何错误导致的结果,本人不负任何责任. 如果有任何翻译错误,以及意见与建议,请email本人.邮件地址:[email protected]. 转载请注

lua——环境配置

一.官网源码url: http://www.lua.org/download.html 二.windows平台环境搭建: 方式一(可视化新建vs项目生成): (1)生成lua库文件 1.官网上下载lua源码 2.用vs新建win32静态库项目(去选预编译头,本人的项目命名为"lua") 3.添加源码中所有头文件和除lua.c.luac.c以外的源文件到项目中. 4.选择release模式,生成->重新生成解决方案. (2)生成lua解释器 1.用vs新建win32控制台项目(勾选

使用Nginx+Lua代理Hadoop HA

一.Hadoop HA的Web页面访问 Hadoop开启HA后,会同时存在两个Master组件提供服务,其中正在使用的组件称为Active,另一个作为备份称为Standby,例如HDFS的NameNode.YARN 的ResourceManager.HDFS的web页面只有通过Active的NameNode才能正常访问,同样地,YARN的web页面也只有通过Active的ResouceManager才能正常访问. (1) HDFS HA的Web访问 正常使用Nginx的proxy_pass代理单

C/C++ Lua Parsing Engine

catalog 1. Lua语言简介 2. 使用 Lua 编写可嵌入式脚本 3. 嵌入和扩展: C/C++中执行Lua脚本 4. 将C/C++函数导出到Lua引擎中: 在Lua脚本中执行C/C++函数 1. Lua语言简介 0x1: 运行 Lua是类C的,所以,他是大小写字符敏感的,同时,Lua脚本的语句的分号是可选的(和GO语言类似)可以像python一样,在命令行上运行lua命令后进入lua的shell中执行语句 也可以把脚本存成一个文件,用如下命令行来运行 0x2: 语法 1. 注释 --