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

news/2024/6/16 8:03:26
原文地址: http://www.flipcode.com/articles/scripting_issue01.shtml
作者:Jan Niestadt
译者:Tony Qu
备注:本文语言十分口语化,如果觉得读起来不舒服,可以告诉我,我会做适当修订。

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

必读

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

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

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

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

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

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

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

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

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

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

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

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




http://www.niftyadmin.cn/n/3656322.html

相关文章

linux远程登陆命令(无工具)

方法一: telnet命令 网络应用 telnet命令用于登录远程主机,对远程主机进行管理。telnet因为采用明文传送报文,安全性不好,很多Linux服务器都不开放telnet服务,而改用更安全的ssh方式了。但仍然有很多别的系统可能采用…

[推荐]学习XML / XPath / XSLT的好书

书名:《XML完全探索》原著名:《Inside XML》出版社:中国青年出版社售价:89元页数:877页第一次印刷:2001年10月本书是目前为止见到的涵盖面最广的XML参考书,不仅详细阐述了XML,XPath,XLST,XLink,…

用户名密码正确,在登陆界面循环的问题centos7

文章目录一、问题描述:二、问题原因:三、解决方案:1、单用户重置密码1. 进入单用户模式2.重置密码2、单用户用户修改系统文件3、命令行模式操作4、救援模式替换系统文件5、救援模式修改系统文件PS:记录一次centos7在登陆界面循环的问题&#…

XSLT学习笔记

XSLT全称eXtended Stylesheet Language Transformationxslt文件头xml version"1.0" encoding"utf-8"?><xsl:stylesheet version"1.0" xmlns:xsl"http://www.w3.org/1999/XSL/Transform"> <script src"http://local…

解析Google新产品Google Cube发布

本文纯属个人观点&#xff0c;如果觉得不赞成请反驳&#xff0c;但请给出理由&#xff0c;大家交流一下今天在2月27日的《计算机世界》B3版上看到这么一则标题——期待新型PC: Google Cube&#xff0c;讲的是Google负责产品的总裁已经宣布将发布一款网络PC&#xff0c;它的名字…

VS调试技巧(上)

转载自&#xff1a;http://blog.jobbole.com/45249/ 近碰巧读了Ivan Shcherbakov写的一篇文章&#xff0c;《11个强大的Visual Studio调试小技巧》。这篇文章只介绍了一些有关Visual Studio的基本调试技巧&#xff0c;但是还有其他一些同样有用的技巧。我整理了一些Visual Stu…

robots.txt 指南--介绍 [翻译]

原文&#xff1a;http://javascriptkit.com/howto/robots.shtml译者&#xff1a;Tony Qu&#xff0c;BluePrint翻译团队有一种力量其实一直在渗入大量的网站和页面&#xff0c;我们通常看不到它们&#xff0c;而且它们通常也很蛮横&#xff0c;大部分人甚至不知道它的存在&…

VS 调试技巧(下)

转载自&#xff1a;http://blog.jobbole.com/45447/ 我的上篇文章《Vistual Studio原生开发的10个调试技巧》引发了很多人的兴趣&#xff0c;所以我决定跟大家分享更多的调试技巧。接下来你又能看到一些对于原生应用程序的很有帮助的调试技巧&#xff08;接着上一篇文章来编号…