1、本 科 毕 业 论 文基于虚拟机和解释器的游戏脚本系统虚拟机模块设计与实现Game Scripting System based on Virtual Machine and Interpreter-Design and Implementation of Virtual Machine姓 名:学 号:学 院:软件学院系:软件工程专 业:软件工程年 级:指导教师: 年 月摘 要随着游戏行业的飞速发展,脚本语言扮演着越来越重要的身份。游戏脚本是计算机游戏逻辑的载体,将脚本引入到游戏开发中,可以避免游戏逻辑的硬编码化,从而大大提高游戏的开发效率,并进一步降低成本。目前国外已经有多个适合游戏开发的动
2、态脚本语言(例如 Ruby、Python、Lua),而国内的游戏开发公司则也逐渐将动态脚本语言应用到开发中。 本研究项目为基于虚拟机和解释器的游戏脚本系统(GSS)的设计与实现。其开发的核心思路是:设计对应语法的解释器,将本研究定义的脚本语言程序翻译成虚拟机接受的机器码并由虚拟机完成具体执行工作。该虚拟机必须是简洁、高效的,且允许跨平台执行。本文针对整个系统的虚拟机部分为主要研究内容。该虚拟机以 Linux GCC为开发环境,实现了对脚本语言的正确执行,并根据游戏开发的需求,提供高效垃圾回收机制与关联数组结构。论文针对虚拟机的设计展开,介绍脚本语言的研究背景、现状,开发了虚拟机部分,并设计了几
3、个程序对系统进行展示验证。 关键字:虚拟机;脚本语言;垃圾回收Game Scripting System based on Virtual Machine and Interpreter- Design and Implementation of Virtual MachineAbstractWith the rapid development of the gaming industry, scripting language began to play an increasingly important role. Game Script is the carrier of compute
4、r 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 further reduce costs. At present, foreign countries have a number of dynamic scripting languages (such as Ruby, Python, LUA) for game de
5、velopment, and the domestic game development companies have been applying the dynamic scripting language to game development.This study introduced the design and implementation of game scripting system based on virtual machine and interpreter. The core ideas of designation are to achieve the interpr
6、eter of the corresponding syntax and to translate scripting language into the machine code which will be accepted by the virtual machine and then be implemented. The virtual machine should be easily operated, highly efficient, and allow platform independence implementationIn this thesis, we focus on
7、 the design of virtual machine, which is in Linux GCC development environment, and achieves a correct implementation of scripting language; In accordance with the needs of game developers, this virtual machine will provide efficient garbage collection mechanism and associative array structure. This
8、thesis is concerned with the implementation of virtual machine. Firstly it introduced the research background and current situation of scripting language; Then it was followed by the implementation of virtual machine. Finally, a number of programs were designed to verify this game scripting system.K
9、ey words: Virtual Machine; Scripting Language; Garbage Collection目录第一章 绪论 .11.1 研究背景与选题意义 .11.2 研究现状与存在的问题 .21.3 主要研究内容及特色 .41.4 本文结构安排 .6第二章 GSS 的架构设计 .72.1 GSS 系统需求分析 .72.2 GSS 系统分析与设计 .72.3 虚拟机模块构架设计 112.4 小结 20第三章 GSS VM 的实现 .213.1 实现的环境和语言 213.2 系统开发流程 223.3 虚拟机实现 223.4 系统运行结果 363.5 小结 44第四章 总结
10、与展望 45参考文献 .46致谢 .47ContentsChapter 1 Introduction .11.1 Background.11.2 Current Situation .21.3 Contents and Tasks 41.4 Architecture of Thesis6Chapter 2 Overall Design of GSS72.1 Requirement Analysis of GSS .72.2 Analysis and Design of GSS.72.3 Framwork of GSS Virtual Machine .112.4 Summary.20Chapt
11、er 3 Implementation Value value;第三章 GSS VM 的实现23 Object;其中,Type 为一个 enum 型变量,用于表示该数据的类型。具体的,一共提供 8 种类别的数据类型:typedef enum T_MARK, T_NIL, T_NUMBER, T_STRING, T_ARRAY, T_FUNCTION, T_CFUNCTION, T_USERDATA, Type; T_MARK 类型:设计为标记位,当函数调用、压栈等操作时,通过T_MARK 确定边界问题。 T_NIL 类型:同 C 语言的 NULL 类型,在 GSS 中未初始化的数值标记位 T_
12、NIL 以及用 T_NIL 来表示 False 情况。 T_NUMBER:数值类型。 T_STRING:字符串类型。 T_ARRAY:关联数组类型,即为键值对的 mapping 结构。 T_FUNCTION:GSS 函数指针类型。 T_CFUNCTION:C 语言写的库函数的类型。 T_USERDATA:用户自定义类型。而 Object 中的 Value 类型则用于存储值,详细定义如下:typedef unionCfunction f;real n;char *s;Byte *b;struct Hash *a;void *u; Value;即定义为一个 UNION 型,共用一块 32 位的内存
13、区域。其中,real 类型存储为实值,其余类型则为一个地址指针(在 C 语言中,指针为 32 位正整数) 。在进行类型操作过程中,详细如下: Object 声明时,其 tag 被定义为 T_NIL,而 value 不需要进行特别处理。基于虚拟机和解释器的游戏脚本系统24 在进行赋值操作的时候,由编译器确定类型后,分两种情况:如果该Object 非 NIL,则必须同类型或可进行强制转换的方可赋值,否则给出出错信息。如果该 Object 为 T_NIL 型,意味着还是空白,则写入 tag位以及 value 位。 在进行比较时,需要判断 tag 位必须相同方可进行,并依据不同的类型进行不同的比较策略
14、。3.3.2 Mapping 实现Mapping 内部设计为 Hash Table 实现。而 Hash Tabel 则以开链法作为冲突解决法,具体实现如图 3-2 所示。H a s h T a b l eN o d eN o d eN o d el i s t图 3-2 Hash Table 结构我们将 Hash 是实现为一个二维指针,其包含了对 list 数组的引用,而 list本身是一个 Node 的链表。同一个 list 其哈希值是一致的。使用开链法进行索引或者插入时,先由 Hash Function 计算出所处 list,并顺序遍历该 list 直到找到值。节点的定义:节点为键值对,ref 为其索引值,而 val 代表具体值。同时,节点必须拥有对下一个节点的指向。typedef struct Node