1、 本 科 毕 业 论 文 基于虚拟机和解释器的游戏脚本 系统 解释器模块设计 与实现 Game Scripting System based on Virtual Machine and Interpreter - Design and Implementation of Interpreter 姓 名: 学 号: 学 院:软件学院 系:软件工程 专 业:软件工程 年 级: 指导教师: 年 月 摘 要 随着游戏行业的飞速发展,脚本语言扮演着越来越重要的角色。游戏脚本是计算机游戏逻辑的载体,将脚本引入到游戏开发中,可以避免硬编码游戏逻辑,从而提高游戏开发效率,降低游戏开发成本。目前国外已经有多个
2、适合游戏开发的动态脚本语言,例如 Ruby, Lua,而国内的游戏开发公司则也逐渐将动态脚本语言应用到游戏开发中。 本研究介绍一个基于虚拟机和解释器的 游戏脚本系统 的设计与实现 ,我们称之为 GSS 系统 。其主要思路如下:首先实现一个解释器程序,它将使用 本研究定义的脚本 语言编写的源程序翻译成字节码文件,然后虚拟 机程序以字节码文件为输入,执行具体工作。 本文针对整个系统的解释器模块进行展开,首先介绍动态脚本语言的研究背景和现状;其次阐述整个系统的总体框架和解释器 模块 的框架;然后详细说明了如何实现 GSS 系统中 的解释器 模块 ,包括词法 分析 ,语法分析,语义分析和字节码生成。最
3、后,使用 本研究中定义的脚本 语言实现数个典型的算法,以验证系统的有效性,同时展示系统具体功能。 关键字: 游戏开发 ; 解释器;脚本语言 Game Scripting System based on Virtual Machine and Interpreter - Design and Implementation of Interpreter Abstract With the rapid development of the gaming industry, scripting language play an increasingly important role. Game scr
4、ipt is the carrier of computer game logic. Introducing script into the game development will avoid hard-coded game logic and thus greatly improve the efficiency of game development, which will reduce costs. At present, foreign countries have a number of dynamic scripting languages for game developme
5、nt, such as Ruby, Lua. And the domestic game companies have been applying the dynamic scripting languages to game development. This study introduced the implementation of game scripting system, we call it GSS which based on virtual and interpreter. The core idea is to implement the interpreter of th
6、e corresponding syntax and to translate script language into byte code which will be accepted by the virtual machine and then byte code run on virtual machine. In the thesis, we are going to expand around the realization of interpretive module of GSS. First, it is to present the background and curre
7、nt situation to study dynamic scripting languages; then this thesis will provide the explanation of interpretive programs whole frame work; after that, it will show the detailed design of the interpretive program implemented in this study, composed of lexical analysis, syntax analysis, semantic anal
8、ysis and the generating of byte code; finally we are going to make use of the studied script language to realize some typical algorithms, in order to show the systems concrete functions. Keywords: Game Development; Interpreter; Script Language.第一章 绪 论 1 目 录 第一章 绪 论 . 3 1.1 研究背景及意义 . 3 1.2 研究现状与存在的问题
9、 . 4 1.3 论文主要内容及特色 . 6 1.4 论文组织结构 . 8 第二章 GSS 系统的总体设计 . 10 2.1 GSS 系统需求 . 10 2.2 GSS 系统分析与设计 . 11 2.3 解释器模块的架构及任务 . 13 第三章 解释器模块的设计 . 18 3.1 开发工具及软硬件环境 . 18 3.2 词法分析模块的设计与实现 . 19 3.3 语法分析模块的设计与实现 . 25 3.4 语义分析模块的设计与实现 . 27 3.5 字节码生成模块的设计与实现 . 31 3.6 GSS 系统展示 . 37 第四章 总结与展望 . 47 参考文献 . 48 致 谢 . 50 基于
10、虚拟机和解释器的游戏脚本语言实现 解释器模块 2 Contents Chapter 1 Introduction.1 1.1 Background . 1 1.2 Current Situation. 2 1.3 Contents and Tasks . 4 1.4 Architecture of Thesis . 6 chapter 2 General Design of GSS System.8 2.1 Requirement Analysis of GSS System . 8 2.2 Analysis and Design of GSS System. 9 2.3 Framework
11、and Assignment of GSS System . 11 Chapter 3 Design and Implementation of Interpreter . 16 3.1 Based Environment and Tools for Development. 16 3.2 Lexical Analysis Module. 17 3.3 Parse Module. 23 3.4 Semantic Analysis Module . 25 3.5 Byte-Code Generator Module. 29 3.6 Exhibition of GSS System . 34 Ch
12、apter 4 Conclusions and Future Work . 45 References. 46 Acknowledgements . 48 第一章 绪 论 3 绪 论 随着游戏项目规模的不断扩 大,游戏内容越来越丰富,需要实现 的东西越来越多,对数据驱动的要求也越来越高,传统的编译型语言 C/C+已无法满足游戏开发者对于语言灵活性,易用性,动态编译的需求。游戏开发趋向于将脚本语言和 C/C+等语言结合起来。基于效率的考虑,作为底层的游戏引擎大部分使用汇编 , C/C+等语言开发,然而,游戏本身却用动态脚本语言来实现 1。本章将对现有脚本语言的现状和存在的问题进行阐述,并对本文研
13、究内容和本文的结构安排进行总体概述。 1.1 研究背景及意义 每一个技术的出现,都可能催生一个巨大的 行业。在互联网技术日趋成熟,并实现将现实生活与虚拟世界完美结合的 大背景下,在网络基础设施正逐渐由窄带向宽带过渡的中国,一个巨大的数字娱乐媒体行业 网络游戏业应运而生。 大型的网络游戏在选择编程语言时,基于效率的考虑 ,普遍使用 C/C+实现。然而,随着网络游戏市场的需求越来越庞大,在程序人才大量匮乏的情况下造成了 C/C+人才的高成本。另外,即便有足够的 C/C+程序员,在开发游戏过程中,也不能无视 C/C+的高级特性和高度灵活性带来的高项目风险。C/C+是易学难精的编程语言,在开发大型网络
14、游戏的时候程序员 的水平参差不齐, C/C+语言的高级特征也不可避免会被大量滥用,因此给项目带来高风险、高成本 1。 同时,传统的方法中游戏逻辑是被硬编码到游戏主程序中。由此带来的直接后果之一就是程序编译极度耗费时间。因为游戏逻辑的任何一个小变动都将导致整个程序 或部分程序 的重新编译,尤其在游戏开发和测试阶段,这种变动通常是很普遍、频繁的。而最近几年,游戏规模 均 已经以 G 为计量单位,故一次完全编译要耗去几个小时。 脚本语言的执行效率比传统的编译型语言要低。 然而,随着机器性能的飞跃,当前 游戏业中的主要矛盾已经由性能低下的硬件与游 戏执行效率之间的矛盾转变为快速变化的市场需要与低效的开
15、发工具之间的 矛盾 。 易学易用 且解释型 的 脚本 语言 在 游戏编程中 的 大量引用 是历史的必然 2。 基于虚拟机和解释器的游戏脚本语言实现 解释器模块 4 相对于传统的编译型语言,脚本语言主要有以下优势: 1. 易学易用。 脚本语言中抽象符号、 古怪的语法和缩写词相对较少,编写和维护容易,其结果是 测试、 调试和修改也变得容易 ; 2. 动态数据类型检查。 变量不需要预先定义其类型,系统会在运行时自行 检查变量的类型 ; 3. 自动垃圾收集和内存分配。 据 CERT(The Computer Emergency Response Team)报告称,软件中 80%的漏洞是由缓冲区溢出产生
16、的 3。脚本语言没有指针,在运行时自动处理垃圾收集和内存分配,这样就使得缓冲区溢出难以发生 ; 4. 较少编程时间。 脚本语言针对游戏中的特殊需求,提供了相应的 高级数据类型等专门机制,使得实现同样的功能,脚本语言实现比 C/C+实现所花时间缩短 5 倍 4, 5; 5. 可移植性强。 脚本语言与处理器,操作系统无关。对于基于虚拟机开发的脚本语言,当其编写的程序移植到不同的平台时,程序可以不需要更改 ; 6. 扩展性强。 脚本语言非常容易与 C/C+、 Java 整合。脚本语言提供了外界联系的接口,语言的组件或库可 以 用于 扩展脚本语言功能。 另外, 本论文选题除了脚本语言本身价值, 还出于
17、该课题对 本文 作者的吸引:设计一个解释器将有助于对程序的翻译过程的了解、对实现的 数据结构 ,算法等 知识拓展以及 编程质量 的 提高 。 1.2 研究现状与存在的问题 脚本语言对开发效率的主要贡献在于:内置了丰富语言特性和数据结构,使得可以用更少的语句完成相同的功能;拥有完善的自动内存管理和简单实用的异常机制;没有指针;灵活的类 /函数定义方式使得开发人员可以以更合理的方式完成编码任务。 就目前来看,比较流行的脚本有: 1. Python: Python( Lutz & Ascher, 2004)是一种面向对象的解释式脚本语言。它的开发工作由“ Python 软件基金协会”承担。 Pyth
18、on 的语第一章 绪 论 5 法没有 直接以任何一种常用的语言为基础。它是类型检测的,然后是动态类型化的语言; Python 语言提供了三种类型的数据结构代替数据:表、被称为元组( Tuple)的不变表、以及被称 为字典的散列; Python包括了 Perl语言的模式匹配功能,还具有异常处理功能; 当 对象不再使用时 , 回收它们 ; 2. Ruby: 由 Yukihiro Matsumoto 在 1996 年发布的一种新语言。其诞生的动机是它的设 计者对 Perl和 Python的不满 他 需要一门完全面向对象的脚本语言。 Ruby 中所有的类、对象都是动态的,这意味着可以动态为它们添加方法
19、。同时也意味着在每次执行期间,类和对象拥有不同的方法集。因此,同一个类的不同实例呈现不同的行为, 方法、数据和常量都能包含在类的定义中 ; 3. Erlang: Erlang 是一种通用的面向并发的 编程语言,它由瑞典电 信设备制造 商爱立信 所辖的 CS-Lab 开发,目的是创造一种可以应对大规模并发活动的编程语言和运行环境 ; 4. LUA: LUA 是一种轻量语言, 1993 年由巴西里约热内卢天主教大学的3 位研究人员开发 6。 官方 版本中只包括一个精简的核心和最基本的库,而网络通讯、图形界面等并 没有提供默认支持。 LUA 是一个动态弱类型语言,支持增量式垃圾收集策略。有内建的、与
20、操作系统无关的协作多线程( Coroutine)的支持 。 就目前来看,比较流行的动态脚本语言有: Python, Lua, Ruby, Erlang。其中 Python 和 Lua 是网络游戏开发的中坚力量。 Ruby 凭借 rubyonrails 的 web 开发框架的强劲力量,其在游戏业的发展前途不可小视。 Erlang 在高并发性上的原生优势吸引了无数追求高性 能网络游戏服务器开发人员的目光 4。 相对而言,国内对于脚本语言的研究热情似乎远低于国外。但是近几年,随着多家游戏软件开发企业对动态语言的研究与应用力度 加大 ,脚本语言逐渐为大众所熟悉。如网易在“大话西游”系列中使用 LUA
21、完成配置管理和逻辑控制,而 GBITS 则在游戏所有地方包括服务器端、客户端、引擎方面则全部由脚本语言 LPC 来完成。 公司总部位于中国厦门的一家游戏开发公司,其麾下的回合制网络游戏问道深受广大玩家的欢迎。 基于虚拟机和解释器的游戏脚本语言实现 解释器模块 6 在游戏开发中,动态脚本语言有许多独特优势,提高了游戏开发人员的工作效率,降低了项目风险与成本。然而,它也存在诸多 不足,主要表现在 : 1. 执行效率低。 与编译型的静态语言相比,脚本语 言边解释边执行,这样虽然减少了程序人员的编码时间和调试难度, 但它的执行速度慢,所以它不适合 开发系统的底层部分,例如游戏引擎 ,数据持久化 ; 2
22、. 安全性不佳。 使用游戏脚本语言写的源代码 被解释后形成的 字节码容易受到攻击 。另外,相对于编译型语言被编译后形成的二进制代码相比,字节码文件更容易被翻译成源语言文件,这对代码安全造成一定影响 ; 3. 其它 。 游戏脚本语言缺乏对底层资源的控制和管理,调试器也不够先进。在一些特殊的平台,由于内存,处理器等资源的限制,动态脚本语言也不能得到有效的使用。 随着市场对游戏的需求扩大以及网络游戏 生产组件化,以及开发者对于语言灵活性,易用性,动态编译的需求,为脚本语言的发展提供了空间。但脚本语言不可能代替以 C/C+为代表的其他编译型语言。脚本语言和编译型语言在生产效率和执行效率上各有所长。游戏
23、开发即需要对游戏数据驱动和内容管理等方面提供很好支持的脚本语言,也要有能够满足游戏引擎快速执行特点的编译型语言。没有一种脚本语言适合所有类型的游戏开发,只能是根据所开发游戏的类型和特点来选择不同的脚本语言 5。 1.3 论文主要内容及特色 本研究的主要内容是研究几种典型的脚本语言,并 针对在实际游戏开发中碰到 的需求, 设计实现 GSS 脚本系统 。其中, GSS 是 Game Scripting System 的首字母缩写, 该系统由三部分组成:本研究中定义的脚本语言,将脚本语言源文件翻译成字节码文件的解释器模块和具体执行字节码的虚拟机模块。 使用 这种 脚本语言编写的源文件以 .ds 为后
24、缀 。 GSS 系统 实现的基本框架如图 1-1 所示 ,其中解释器读入源程序,经过数个阶段后输出虚拟机可接受的字节码文件, 我们选择后缀名 .ds,起因是本研究中定义的脚本语言语法类似于 C 语言。 第一章 绪 论 7 解释器与虚拟机就是通过这种方式相互配合,最终得到程序要表达的行为 。 源 程 序源 文 件读 入解 释 器语 法 分 析词 法 分 析字 节 码 生 成 器字 节 码虚 拟 机堆 栈运 行 逻 辑M a p p i n g垃 圾 回 收图 1-1 GSS 系统 实现基本框架 脚本系统通过解释器分析后缀名为 .ds 的文件中的的脚本 语言程序 ,生成虚拟机识别的字节码,并 由
25、虚拟机对字节码逐条进行执行。将脚本系统运用于游戏中,即由游戏引擎(一般为 C/C+实现)负责 调用脚本系统,脚本系统通过执行返回结果并回到游戏引擎处。其具体的运用流程如图 1-2 所示 ,其中宿主主程序一般由编译型语言实现,是整个游戏的底层部分,使用 GSS 系统实现变化频率很高的游戏逻辑,两者之间通过预先定义好的接口进行交互 。 宿 主 主 程 序 ( 游 戏 主 程 序 )宿 主 C / C + +程 序G S S 系 统调 用 接 口脚 本 文 件图 1-2 GSS 系统运行环境 本人在 GSS 系统中的工作内容是负责解释器模块的实现,包括词法分析程序,语法分析程序,语义分析程序和字节码生成程序,以最终将用动态脚