实现一个脚本引擎

Part VIII:可执行代码

序言
bl_line.jpg (1610 bytes)

我们有了执行我们的程序的所有需要的东西,除了...可执行代码.我们已经有了中间代码,并且它已经非常接近我们的虚拟机能理解的东西了.所以我们必须作的是一个中间代码和可执行代码之间的快速的翻译步骤.

为什么这需要是一个分离的步骤?就象你看到的,翻译实际上涉及到把我们的字符串放到一个数组中,并且为符号表提供他们的索引而不是指针.我们上次已经做了跳转目的,所以他们将不再改变.所以这是一个简短的部分,代码改变不大.

也许对于我们,建立中间代码不是严格的需要.但是写一个更高级的编译器时,有这样一个分离是非常有用的,在实际的机器码之前更多的'概念上的'阶段:它简化代码优化;你可以不困难的重新定义你的编译器到另一个机器.

最后一步
gl_line.jpg (1418 bytes)

当你阅读这部分的代码时,你将在几个地方看到到我的懒惰,它使我写了真正罪恶的代码.

举个例,我把编译器和虚拟机组合到了一个程序中,并且我传送"中间代码"给虚拟机,这不是很恰当的方法.你也许想要你的编译器来处理每件事直到可执行代码产生,然后也许存储可执行代码到一个文件,然后让你的VM读取&执行这个文件.

在我们这里,VM中的Read()函数首先从我们的符号表中取得所有的字符串,然后把他们放入字符串数组.然后它线性的通览代码,并且一行接一行的翻译它们.我们所使用的特殊的跳转目的指令只被转换成NOP指令,它应该被优化掉.

Oh,我做得一个显著的可恶的事是我用来自编译器的符号表来存储虚拟机的字符串表索引(使用符号表的新成员PutNo()/GetNo())...它是非常简单的找到字符索引的方法,但是我同意模块化的程序设计是全然不同的...

它工作了!我简直不能相信!
bl_line.jpg (1610 bytes)

嗨,你真的可以使用这个编译器/虚拟机的结合体来执行一个程序!你大概几乎放弃了它,不是吗?好吧,继续尝试例子.这部分有源码可以下载...他们应该正确执行.这很有趣吧.

好的,那就是我们曾经为之工作的东西.一个小小的语言,尽管它自身不是很有用,但是它表现了很酷的东西--你现在学习了建立你自己的脚本引擎的足够的东西.

现在发生了什么?
gl_line.jpg (1418 bytes)

经过了这样一个难以置信的极限(啊咳)我相信你有一点感觉空虚和不知所措.我们将从这里去到哪里?

我将可能作一个或更多的part介绍一些高级的主题,也许谈到为这个语言增加函数,类,多态,等等.让我知道你对什么感兴趣.

尽管将不再有代码--每个人都可以取得这个简单的编译器并且扩充它.或者,更好,写一个你自己的.The world's your oyster!

Quote!
bl_line.jpg (1610 bytes)

"More importantly, a towel has immense psychological value. For some reason, if a strag (strag: non-hitch hiker) discovers that a hitch hiker has his towel with him, he will automatically assume that he is also in possession of a toothbrush, face flannel, soap, tin of biscuits, flask, compass, map, ball of string, gnat spray, wet weather gear, space suit etc., etc. Furthermore, the strag will then happily lend the hitch hiker any of these or a dozen other items that the hitch hiker might accidentally have "lost". What the strag will think is that any man who can hitch the length and breadth of the galaxy, rough it, slum it, struggle against terrible odds, win through, and still knows where his towel is is clearly a man to be reckoned with."

HHG 1:3

Downloads
gl_line.jpg (1418 bytes)

Download the tutorial code (tut8.zip) (15k)



返回目录
diamond Garden制作 2000年1月