自定义脚本引擎开发纪实
前序
大家可能对JavaScript,VBScript,Python,Lua,Shell等脚本语言并不陌生,有时候也对Swift语言的特性表现出很大的兴趣。大家在乐此不彼的使用这些语言的时候,有没有想过要自己实现一个脚本引擎呢?(拜托,自己写的能跟那些成熟的比吗?!)话一点错没有,不过通过自己一步步实现一个引擎,从中可以学到不少的知识,也能对现在大家使用的编译器有个旁观的认识。
为了执行的性能,再加一个脚本的“汇编器”;跨平台,给自己的脚本引擎写一个虚拟机,哈哈,也是一种乐趣。
饭呢,要一口一口的吃,事呢要一步一步的做,从简单到复杂,Let’s go!
首先呢,先给要写的脚本引擎一个定位,我们要讲的这个,先定义为嵌入式脚本吧,添加的类库越来越齐全的时候,“经验值”就到了要升级的时刻了,那时,就不仅仅只做潜入式的活了。
要实现的脚本引擎具有的特性
- 数值运算,逻辑运算,字符串运算 ,这是基础
- 弱类型
- 与宿主语言的交互:互相传递参数,互相调用函数,这也是基础。
- 支持定义脚本函数
- 变量作用域:支持全局变量,局部变量
- 支持不定参数(变参)
- 支持整数,浮点数,字符串;
- 支持多参数,多返回值
- 支持if elseif else, for, foreach, while, switch,goto等指令
- 支持二进制数据操作
- 支持object,key-value对
- 支持struct,与宿主语言处理结构体
- 支持调用framework提供的dll中的函数和第三方dll中提供的函数。备注:暂不支持调用类似com导出接口的函数,因为脚本不识别头文件,但可以作为指针去获取值,然后再调用c函数处理。
- 方便扩展,方便使用者增加自己的函数(比如:c/c++函数)给脚本调用。
- 支持闭包的概念
- 支持对变量读写的监控(来自Swift的启发)
伪代码:
func getter()
...
end
func setter(old_value, new_value)
...
end
script.observer("name", {"get"="getter", "set"="setter"})
name="xiaoming" //触发getter,setter
缘由
需求千变万化,客户端发版费时费力,无可奈何,回忆下引擎实现的点滴过程,并作为系列文章,分享给大家。