考试结束了,Vczh Free Script 2.0也放出来了,正则表达式的代码也一并发包含在VFS 2.0里面了。于是想写一个关于如何开发脚本引擎的系列。过几天要去实习了,如果找到晚上上网的办法的话会陆续发出来,要不然的话只能在实习结束之后一并发上来了。
脚本引擎在很多时候都能用上,而且现在也有很多脚本引擎的产品了。为什么还要学习如何写脚本引擎呢?其一是为了学习,其二是为了了解。学习对于自己的编程水平的提高很有帮助,了解对于使用当今的脚本引擎也很有帮助。而且自己开发脚本引擎的好处在于可以自己控制安全问题。虽然这个在大多数情况下并不是优先考虑的条件。
脚本引擎的开发是有一定的方法的。首先,要把输入的脚本代码变成记号,也就是说把“printf("Hello World");”变成print、(、"HelloWorld"、)和;五个部分。至于开发可配置的高速词法分析器可以看这篇文章。接下来就是语法分析器。这个时候首先需要了解为什么代码是一棵树(数据结构的树),然后才能开始工作。至于如何写语法分析器,或者词法分析器也想手写的话,可以看这篇文章。为了执行效率,我们需要将语言抽象成指令集,就像X86的指令集一样,但是更加简单。可以使用堆栈机。
一门支持能垃圾收集的string、array和不能垃圾收集的class的语言是很容易编译成机器码的。现在我正在阅读intel的文档了解x86(32位)的指令格式。如果在写文章的过程中这个问题被我解决了的话,我也会顺便把如何将脚本编译成机器码以便加快执行速度的办法写出来。现在我对于x86指令集的模式已经了解了,剩下具体问题。垃圾收集器的资料并不多,我唯一找到的就是《Garbage Collection,Algorithms for Automatic Dynamic Memory Management》。中文版貌似卖完了,我只能下载英文版的影印版看。很惨。在文章里面我会讲述一种比较简单的单代compact垃圾收集器(.NET用的是多代)。
文章的组织暂时决定使用如下方法:
·如何设计合适自己使用的语言
·词法分析器、语法分析器与语法树的结构(一开始只有函数、字符串以及能进行垃圾收集的数组,弱类型语言)
·如何设计合适的指令集
·指令集(堆栈机)的数据结构以及从语法树翻译到指令集的方法
·虚拟机的开发
·如何向虚拟机加入外部函数以便让脚本可以调用程序提供的其他功能
·进一步修改语言,加上其他特性等
如果x86的指令集研究的速度够快的话,将会添加如下内容
·分配寄存器的算法
·x86指令格式
·如何调用自己产生的机器码
这个系列持续的时间将比较久,而且每一篇文章将附带示例代码。如果只需要了解方法而不需要看具体的实现的朋友们可以略过这个部分。关于具体实现的部分我将可能在文章中标明出来。
posted on 2008-07-06 08:37
陈梓瀚(vczh) 阅读(2274)
评论(5) 编辑 收藏 引用 所属分类:
脚本技术