
这些东西是以前见到的, 觉得有一定的价值, 所以记录下来, 以后见到类似的疑问可以查阅, 同时分享出来也可便于必须的人, 转载请注明来自RingOfTheC[ring.of.the.c@gmail.com]
发现一篇很好的非常常用脚本语言的文章, 翻译过来 :)
我最熟悉Lua, 也知道一些GameMonkey, 最近正在翻译GameMonkey的资料,对于本文中其它的语言游戏脚本语言有哪些, 都并非停留在了解这种的层面, 翻译中或许有一些不当的地方, 先翻下来再说吧
原文地址是:
概述
许多游戏都使用脚虽然制作跟游戏玩法逻辑. 脚本语言一般都擅长于迅速原型, 以及提供更好的代码组织结构. 几乎每个有用的游戏引擎还会使用某些脚本语言.
有很多有用的脚本语言可完成工作. 其中Lua可能是最为流行的游戏脚本语言. 其他选择有: AngelScript, GameMonkey, Io, Pawn, Squirrel以及Scheme. 还有一些重量级选手可以选用, 比如Python, Ruby, 当然这种语言通常不易现实嵌入, 其次他们在速度上值得商榷.
在这里我将非常AngelScript, GameMonkey, Pawn, Lua以及Squirrel. 也会简单介绍一下TinyScheme, 但并不把它跟其它语言运行做相当. Io看起来很有趣, 但是它文档很过缺失, 我也不准备在这里比较它.
语言介绍
Pawn在这群语言中是个奇怪的家伙, 我从它起初介绍
Pawn 小, 而且简洁, 它使用C样式的语法, 而且唯有一种数据结构, 叫做cell. 一个cell通常是一个integer, 但是它经过处理后也可以表示character, boolean, float. Pawn不支持struct 和class, 但是使用变量的"named position"来模拟struct.
在这篇文章中提及的所有语言中, Pawn是唯一一个将编译器和虚拟机完全分离的类库. 当然, 它在编译期提供更多的检查. 所有的变量应该声明, 所有的本地函数需要前向声明. 这很好, 因为这种检查是在compile-time进行的, 避免了在run-time时对本地函数参数的检测. 我看到编译器也给出了考量周到的警示信息, 比如它会警告你使用了不恰当的缩进, 这样可以帮助你保持一致的编程风格, 防止意外错误. 对于它, 我唯一抱怨的地方就是, 在使用float类别常量的之后, 你需要写成0.5形式, 而不能是.5这个被觉得是语法出错.
Pawn有完整的文档和广泛的应用, 以及一个不太活跃的论坛. Pawn是我见到的更快的轻量级脚本语言. 我在游戏中使用Pawn来进行低级脚本编程, 包括角色跟对象的.

Lua拥有自己另类的语法, 有点像Basic. 它也迅速, 编译出的byte-code相当小. Lua是动态语言, 变量在使用之前不需要声明, 而且function作为first-class值(这意味着它的编译器和具象机制是紧密结合在一起的, function可以保存在一个变量中). Lua中的table被广泛应用, 它是Lua中唯一的复杂数据类别. 一个table中可以部分存储function, 另一部分存储data, 这样就可以拿来模仿class, object.
Lua广泛的应用在工业中, 它拥有一个活跃的社区跟一个巨大的开源组件基地. Lua是本文提及的所有脚本语言中最早形成的, 而且深深地影响着本文中的其它语言, 我看到熟悉Lua的用法之前(这应该长期的联系), lua API document是个难以理解的东西. Lua也有一本书可以拿来学习—Programming in Lua, 这本书覆盖了这本语言方方面面的细节.
GameMonkey借鉴了这些Lua中的概念, 不同的是它运用C风格脚本. 它并且table变的十分强大, 可以象Lua那样用来模拟object. 它提供有限状态机机制, 变量使用前不需要声明, function也是成为first-class.
GameMonkey的速度跟byte-code的小巧着实让我震惊(我的含义是它是到精至简的). GM的API参考文档非常的欠缺. 源代码是使用Doxygen结构注释的, 所以可以使用Doxygen来制造帮助文档(我并没有发现生成好的online帮助文档). 它有一个远程脚本调试器. 我也是短暂的玩了一下这个调试器, 但是还是看到它是非常简单的.
看不到有关于GameMonkey的天花乱坠的宣传, 但是它有一个活跃的论坛. 几个社区成员在背后推动着GameMonkey的演进, 主要是提供各类bindings, 以及更好的调试器等.
Squirrel是一个高级动态类别, 面向对象的语言, 提供了类跟继承, 使用C风格. 同样, 它借鉴了Lua中的table. 它很容易编译, 而且看起来有高水平的文档.
尽管Squirrel是一门年轻的语言, 但是它或者被用在了一些商业程序中, 它有一个活跃的论坛.
AngelScript是一门静态类别语言, C++风格. AngelScript拥有最好的原生支持bindings. 通常, 一个函数以及是类只应该注册到AS的虚拟机中, 就可以在AS脚本中使用了. 本文中的其它脚本语言都必须中间插件帮助从而推动函数的binding. 当然, 如果本地函数没有先注册的话, AS脚本也有编不过的. 这帮这些想要预编译AS byte-code的人提高了一个额外方法.
AngelScript不支持table, 事实上这一点不会造成麻烦, 因为AS是静态类型脚本.
AS拥有一个活跃的论坛, 漂亮的文档, 而且维持持续的升级.
TinyScheme有被用来讨论的价值. 它包括在一个C的源文件中. 不像本文中提及的其它脚本语言, 它是解释性的, 所以它的速度最慢, 当然, 如果速度问题对你没有太大影响, 而且你刚好想将Scheme加入至你的项目中去, 我强烈推荐TinyScheme.
我考验过这些其它的Scheme, 但是都遇到了严重的编译问题. TinyScheme很容易编译, 而且它有众多选项可以供你hack.
测试用的版本跟授权

语言
版本
授权
AngelScript
2.16.0
GameMonkey
5.1.4
3.3.4058
Squirrel
2.2.2
TinyScheme
绑定
如果嵌入式脚本语言不能调用本地C函数以及是C++方法, 作用经常大打折扣. AngelScript的binding非常简单, 只要你告诉lib你的函数, 就可以很快在脚本中使用了. 其他脚本都必须一些额外的粘合代码.

Pawn把一个int型的泛型作为传给变量的参数. float需要简单的转换, 对于string来说你必须读取一些特殊的变量.
GameMonkey, Lua, Squirrel使用一个栈来释放参数. 因为它们都是动态类别语言, 值可以以不同的类别从栈中弹出(比如: int, float, char*). 这个方式有一点不好理解, 但是它可以工作的很高. 每个语言都定义了一些宏, 使得对栈的操作非常轻松容易.
每个库必须第三方库的支持, 以便促使binding更加易于. 比如,这是一份Lua可用的binding库. 个人觉得游戏脚本语言有哪些, 你可以使用本地binding很好的工作, 它们一般是一些宏.
并发
AngelScript, Lua, GameMonkey和Squirrel都支持某些方式的并发. 这允许脚本创建使虚拟机看起来是在并发的thread. 这样可以减少在执行一个很长的算法时扰乱职责. 这些thread不会提供性能上的优势, 因为他们都是用户线程, 但是它们提供了程序设计上的优势, 那就是产生一个单独的执行流去执行一个处理过程.
GameMonkey原生的提供使thread阻塞在某个事故上只至该事件出现. 比如说, 如果一个thread需要等待一个"door open"事件, 它可以在此之前去睡眠, 只到某个线程抛出"door open"事件. 我觉得要帮其它的脚本加上类似的模式不是一件困难的事情, 但是GameMonkey已经提供了这种的模式.
速度
我对好几种语言进行了速度检测, 这些测试不能否体现出真实应用中的状况, 但是它们给出了一个各种语言之间的非常. Fibonacci数列测试, 脚本函数递归调用1,402,817,464次. Primi测试主要是反复的降维和基本的integer运算. 原生的string测试是类库中读取本地C/C++函数10兆次, 传递12个字符的字符串参数. 原生数字测试调用本地函数billion次, 传递一个单独的数字参数. Lua只能支持double, 但是其它语言使用integer.
![]()
每个测试, 都先将脚本编译作为byte-code, 因此测试时间包含从磁盘上载入byte-code, 但是它不包括脚本的编译时间. Pawn, Lua, Squirrel使用独立的编译器. AS和GM使用的byte-code但没有独立的编译器, 但是我不得不去汇集程序产生的byte-code.
一个值得提及的信息是Lua, Pawn, Squirrel都有自己的Just-In-Time编译器可以. 我没有测试他们. Pawn附带着一个预编译的实现, 所以我测试了它.
自从脚本语言被频繁用于字符串处理以来, 我就在基准测试中向本地函数释放变长字符串. Pawn在它的虚拟机中有一种独特的体现字符串的方法, 转化一个长的字符串的损失巨大. 在其它语言中不需要做哪些特别的转化, 所以速率跟字符串的长度没有什么关系.
![]()

Byte-Code大小
在发布游戏的之后, 往往不会直接发布游戏的类库源码, 而是发布编译后的byte-code. 每个测试的脚本语言都产生了较小的byte-code, 它们更合适用来当着配置脚本. 在这些状况下, 在大小跟速度上, 这些脚本语言都要优于传统的配置文件, 比如XML.
![]()
库大小
这个可能很少会是一个问题, 其实就是指的虚拟机库大小. 换句话说, 如果你想你的程序运行脚本, 你可以借助库大小预期你的程序的膨胀程度.
![]()
语法
我将进行了基准测试的类库的例程提供帮你, 通过这种代码就可以帮你一个对诸多脚本语言词汇的基本感受.
AngelScript, GameMonkey, Pawn和Squirrel使用C风格, Lua拥有自己的类Basic风格, 这种样式继承了Basic亲近初学者的传统, 使得Lua对非程序员更加易于接近.
Scheme的语法和其它的有一些差别, 但是一旦你了解C, 你必须可以在10分钟之内掌握其它任何一门语言词汇的90%的内容.
结束语
每个语言都有其长处和短处, 如果你必须一门嵌入式的类库语言, 我希望这篇文章可帮你一定的帮助.
我尽可能的保持公平, 但是我不确认自己有没有在这个难题上犯错误, 欢迎任何的评论/建议/纠正.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-143308-1.html
声音好苏爱你
美国在反is的问题上本身就是矛盾的