一步步写lua解释器--开篇

本人去年开始接触lua,之后就被它简单的语法和恰到好处的功能给吸引住了。本人搞了几年的C++,深感C++的繁琐和深奥,后来接触了像python,javascript等脚本语言,学习到了函数式编程语言的精妙。

听说lua语言源码短小精悍,于是打算研究一下源码。可是看到其源码才发现,没有编译原理基础的我寸步难行,看别人写分析lua源码的博客也是门路不对。后来决定恶补一下编译原理的知识,在网上看了一些书籍,也买了龙书。但书本上的东西还是过于理论化,一些专有术语比较难理解。

后来又寄希望于视频教学了,看了某工大,某交大的编译原理视频,基本上是照本宣科,更加的云里雾里。不知道是我基础太差,还是中国大学老师的水平很一般。这么一折腾下来,只知道写一门语言的基本步骤:词法分析,语法分析,语义分析,代码生成等。后来决定还是老老实实的看源码吧。

于是又在github上找了一些稍微简单的编译原理项目,其中还有些是在校学生的编译原理大作业,虽然写的很粗糙,但是可以执行完整的自己的语言代码了。经过对源码的研究和反复调试跟踪流程,这才对如何实现一门简单语言有了一定的认识。这几个过程走下来,发现之前看到的理论知识,特别诸如模式匹配NFA,DFA等那些晦涩的术语已经显得不那么重要了。

不是真正说他们不重要,关键是得看你处在的层次。比方说在学高等数学时,你连基本函数的意义都没有搞懂,再谈微积分等于白费力。所以要想学习机器学习,人工智能AI的朋友,相关基础一定要打牢。而且当你遇到高深难懂的理论知识时一定要学会避其锋芒,找一个相关的,但是要简单的项目多多实践,到最后你发现那些相关的理论都已经掌握到心里去了。

好了,说了那么多废话,经过近一个月的奋战,我自己实现的类lua语言解释器终于有了基本雏形。除了元表,协程和一些内库,能够执行函数,闭包,if else语句,for循环语句,table等大部分的lua代码了。有了目前的基础,相信扩展内库不再是难事。下面是一些例子:

函数与闭包的例子:

local f = function(a)
    return function() a = a + 1 return a end 
end

local up = f(12)
local n1 = up()
local n2 = up()
print(n1, n2)
up = f(34)
local n1 = up()
local n2 = up()
print(n1, n2)

能正确的打印出

13      14
35      36

if语句,函数递归调用的例子:

function fib(n)
    if n == 0 then return 1
    elseif n == 1 then return 1
    else 
        return fib(n - 1) + fib(n - 2)
    end
end

local ret = fib(15)
print(ret)

能正确打印出987

泛型for循环:

local ipairsIter = function(t, i)
  i = i + 1
  local v = t[i]
  if v then
    return i, v, 10
  end
end
local tt = {12, 78}
for k, v, m in ipairsIter, tt, 0 do
    print(k, v, m)
end

能正确打印出:

1   12  10
2   78  10

table的例子

t = {name = 'shonm', 28, sex = 'male', game = {name = 'Glory of the king'}}

t.func = function(str) 
	    print(str, t.name, 'age is ', t[1], 'sex is ', t.sex, 'he plays', t.game.name) 
	end
t.func('hello')

部分内置函数和类库的例子

print(string.len('hello world'))
print(string.upper('world'))
print(math.pow(2, 6))
print(type({}))

元表的例子:

fa = {house = 3}
son = {car = 2}
fa.__index = fa
setmetatable(son, fa)
print(son.house)

能打印出预期结果3

面向对象多态特性

cat = {}
function cat.call()
	print('cat call maomao~~~')
end

dog = {}
dog.call = function ()
	print('dog call wangwang~~~')
end

function test_duck(duck)
	duck.call()
end

test_duck(cat)
test_duck(dog)

结果为:

cat call maomao~~~
dog call wangwang~~~

由于时间仓促,实现的还有很多不足,垃圾回收也没有做处理,也还有很多优化的地方。等基本完成了所有功能,再来处理。有问题可以在后面留言,或者加入QQ群 858791125 讨论。

项目地址为:
https://github.com/shonm520/mlua
欢迎star

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值