[翻译]脚本引擎实现 - 第一部分 总揽

来源:互联网 发布:js数组排序方法速度 编辑:程序博客网 时间:2024/06/05 06:29
原文地址:http://www.flipcode.com/articles/scripting_issue01.shtml
作者:Jan Niestadt
译者:Tony Qu
备注:本文语言十分口语化,如果觉得读起来不舒服,可以告诉我,我会做适当修订。

介绍
你的脚本语言需要一个脚本引擎,为什么呢?因为他们真的很酷,几乎每个人都希望了解。
首先,你必须知道你需要的是哪种脚本引擎,Henry Robinson曾经写过一个关于不同脚本引擎的介绍(如果你没有读过那篇文章一定要读一下)。在这篇系列文章中,我将讨论一个编译器和虚拟机系统,就像UnrealScript一样。
接下来,你需要知道两件事,第一,如何实现一个脚本引擎;第二,脚本引擎为什么很酷且很实用。下面是我整理的特点:
  • 有用的新语言特性,如状态、隐藏代码等
  • 一个能够保证游戏引擎不崩溃的沙漏环境
  • 能够在不知道引擎内核的实现的情况下创建游戏内容,且不需要重新编译引擎
  • 完全平台独立的脚本代码
然而,也有一些缺陷
  • 比较慢,要比可执行代码慢将近15倍
  • 限制——脚本引擎无法完全创建新的可视效果(部分原因是缺乏速度)
  • 负责创建游戏内容的人员必须学习一种新的语言
当然,我们不能因为这些原因而停下来,我们已经下定决心了,好了,从哪里开始呢?

必读

由于Unreal迟迟没有发布,所以我才开始这个项目的。我浏览了他们的技术网站并获得了UnrealScript参考文档,我虽然曾经听说过UnrealScript,但我却不知道它到底是什么。我读了文档,发觉脚本语言是个很酷的东西,于是我打算自己实现,然后嵌入到游戏引擎中去,这样人们就可以方便地创建新的游戏内容了。

很幸运,上学期在编译构建课程中,我写了一个类,这是我们的作业,老师要求我们实现简单的Pascal编译器。接下来我就开始构建更好的编译器了。我已经有了一个可运行版本,它可以接受C的部分语法,但我仅用了两周时间完成它,所以内部结构很不好。因此我必须重新设计这个编译器,我想在你的人生中也遇到过类似的情况吧,于是我继续我的工作,并且边做边学习编译原理的知识。

好了,让我们谈一些有用的东西吧。

首先,我建议每一个打算编写编译器的朋友都去弄一本“龙书”,大部分人对这本书有了解,特别是像我这样的计算机专业的学生一定了解这本书。我说的其实就是 Aho,Sethi和Ullman写的那本编译器原理、技巧与工具(ISBN0-201-10194-7)。在它的封面上有一条龙,因此叫做“龙书”,而且几乎每一个了解编译器的人都读过这本书。

1986年以来,这本书就没有改版过,因为自从二十世纪六十年代编译器的设计技术就没有改变过,当然这本书中不包含特定处理器优化的东西,当然有其他书有这方面的内容。另外我们是编译到字节码,而不是机器码。

其次,如果你在寻找实现字节码语言的快速入门教材,那么请看GameSutra上的另一篇文章,它是一篇关于Jedi  Knight脚本语言实现的文章,当然我会将到其中的大部分内容,如果你有兴趣,读那篇文章也是个不错的选择。

我们需要什么
通常,一个编译器由以下几个部分组成
  • 符号表,所有关于类型、范围的符号和信息
  • 词法分析器,将字符流(如源文件)转为令牌(tokens)(例如,关键字、运算符等)
  • 解析器,构建一棵用于分析语法错误的语法树
  • 过度代码生成器,把语法树转换为中间代码
  • 优化器(可选),优化中间代码
  • 代码生成器,从中间代码生成字节码
  • 最后,也是最重要的,虚拟机,字节码要在它上面运行

当你编写完所有这些之后,你就可以构建一个脚本系统。

就这些吗?
是不是觉得有些惊讶,是不是觉得似乎脚本并没有想象中的那么酷,是不是只有使用dll才能做演示呢?不需要。我们接下来会讨论每个部件的详细部分,其中的大多数并没有想象中的那么无趣,其实要创建一个完整的脚本编辑器有很多事要做,虽然,结构化你的代码是必须的。

接下来这份教材中,我们会开发一个十分简单的编译器/虚拟机系统,虽然它和完整的脚本系统有很大差距,但是它实现了上面列出来的所有组件,实现的那个简单脚本语言是关于如何维护字符串的。

最后我告诉大家一些有用的东西(就像Denthor曾经做的那样),既然我认为我不够幽默,我更愿意从一些十分著名的书中引用一些东西。我相信你知道我说的是哪些书,如果不知道,请在这里查找。

引用
“但是计划已经展示出来了……”
“展示出来了?我想我只有在地下室才能找到它们”
"那不就是展示厅吗!"
"在那有火把"
"哦,火把可能早就烧完了"
"那估计楼梯也坏得差不多了"
"但是你看,你不是看到通知了吗?!"
"是的," Arthur说,"我是看到了,它曾经在那个被锁住的塞满东西的阁楼的底部,厕所的那个阁楼,厕所的门上还写着' 小心猎豹' "
原创粉丝点击