本材料根据我们去年12月在Game Gathering 2017大会上所做的报告,继续发表了一系列出版物。 在其中一份
报告中 ,提出了选择嵌入式脚本语言的主题。

什么是脚本语言,为什么需要脚本语言
正如
我们博客的上一篇文章中已经提到的,我们公司已经编写了自己的引擎。 今天,我们将讨论为该引擎选择脚本语言时要遵循的指导。
为什么根本需要脚本语言? 俗话说:
“在游戏行业中,没有复杂的问题,不需要复杂的解决方案 。
” 除了解决复杂问题的经验丰富的程序员(而且价格昂贵!)之外,我们还需要很多人(例如很多人)来从事任务。 而且,说实话,我们希望这些程序员不要那么昂贵,理想情况下根本不是程序员,而是直接游戏设计师和脚本作者。
因此,需要一种工具来描述简单但仍是逻辑的工具,而不会涉及程序员的重炮。 我们得出结论-什么是脚本语言? 这是一个可以使游戏开发更快,更便宜的工具。
问题马上出现了,为什么我们不只使用XML之类的东西呢? 事实是,出于我们的目的,我们经常需要控制结构-分支和循环,而XML是声明性描述。
脚本语言的另一个优点是项目中的脚本可以是代码,也可以是资源。 并且,因此,不仅可以利用代码来更新游戏的脚本部分,即,可以通过应用商店的机制定期进行更新。 而且还有资源-即与使用CDN的图形和其他材料一起。
完善的脚本语言要求
我们制定了理想脚本语言的要求。
- 动态的。 根据我们的理解,理想的脚本语言应该是动态的。
- 人气。 语言的流行是指存在足够大的社区,可以回答有关StackOverflow等专用资源的问题。
- 温柔的学习曲线。 相对而言,我们想让几乎任何人都接受,并迅速训练他到一个可以使这个人高效完成我们的任务的水平。
- 充足的机会。 该语言必须功能强大且具有足够的功能,它必须支持不同的编程范例。 提供以这种语言编写的专业程序员将能够舒适而愉快地做到这一点。
- 高性能 性能是游戏行业的基石之一。
- 大量的图书馆。 很多时候,在解决我们面临的任务的过程中,我们不会创建根本上新的代码,而是使用别人已经编写的代码。 我们可以使用某种语言使用的越稳定,受支持的库越好。
- 易于嵌入。 我们谈论的是嵌入式语言,因此在选择脚本语言时,嵌入语言的能力将发挥重要作用。
让我们分析一些流行的编程语言,这些语言可用作脚本来满足这些要求。
巨蟒
Python是一种非常流行的动态语言。 它的特点是学习曲线相当柔和,学习起来很简单。 但是,正确学习它并不容易。 结果,优秀的Python程序员稀有且昂贵。 这与我们加速并减少开发游戏逻辑的成本的愿望相矛盾。
Python具有强大的功能和良好的性能。 它的问题是图书馆系统不一致。 他的另一个问题对我们起着重要的作用,实际上是他不是嵌入式语言。 这是一种可以方便地调用用C或C ++编写的库的语言。
关于Python嵌入功能,我们可以说,例如,有使用Python的Maya。 但是从内部看到Maya的Python插件的任何人都会同意我们的看法,即它们看起来不太好。
结果,我们可以说Python尽管具有所有优点,但并不适合我们。 现在考虑使用JavaScript。
Java脚本
毫不夸张地说,JavaScript是一种名副其实的好语言,已经风靡全球。
JavaScript是一种流行的动态语言,具有柔和的学习曲线,丰富的功能,良好的性能以及丰富的库集。
如果我们需要语言解释器来构建游戏引擎,则可以找到许多这样的解释器。 实际上,您必须从两个此类项目中进行选择-V8和WebKit。 两者都有很大的尺寸。 因此,如果我们谈论的是棋盘游戏,我们可以趁机将整个口译员包括在游戏中,但是对于手机游戏,此选项不适合我们。
SocialQuantum拥有自己的JavaScript解释器,该解释器通过了98%的测试,我们计划将该项目转移到开源类别中。
结果,事实证明JavaScript看起来很像嵌入式语言的候选者,但它也不适合我们。
哈克斯
应该注意的是,谈到JavaScript时,下一个通常会记住Haxe。 但是,实际上,谈论使用这种语言作为嵌入式语言的可能性毫无意义,因为事实上Haxe与其说是其他语言的反编译器,不如说是一种语言。 这不是我们所需要的。
也许我们对ActionScript或其他脚本语言感到满意?
动作脚本
如果我们正式分析ActionScript是否符合上述要求,那么似乎已经找到了理想的脚本语言。 它的方面是动态性质,受欢迎程度,易于学习,良好的功能,性能,库的可用性以及易于嵌入。 这种语言在游戏行业中广受喜爱和记忆,它编写了许多精彩的Flash游戏。 ActionScript的主要问题是该语言几乎已失效。 因此,他也不适合我们。
AngelScript,松鼠等
除了ActionScript,还有许多脚本语言,例如AngelScript,Squirrel等。 在这些语言中,您可以找到几乎完全可以满足我们要求的语言,但是通常这些语言与开发人员紧密相关,它们存在一些老问题,这些问题已经多年未解决。 最有可能的是,它们不是很受欢迎,它们没有得到充分的记录,关于它们的培训材料很少,它们没有很大的社区。 这种情况的后果之一是,很难研究它们(即使仅仅是因为还不完全清楚)它们是什么以及它们如何工作。
如您所见,我们尚未找到理想的嵌入式语言。 如果您创建自己的语言该怎么办?
创建自己的语言
公司内部开发的语言很可能会完全适合其需求并且易于学习。 但是,这种语言很可能不会流行。 这种语言要么库的数量最少,要么根本不存在。 另外,很难相信,在现代条件下,可以创造出比市场上已有的产品更好地工作,具有更高的生产率并更易于集成的产品。
有一些公司开发和使用自己的语言,其中有成功的游戏市场参与者,但这很可能不是一个好主意。
在研究了声称被嵌入的现有编程语言并讨论了开发我们自己的语言的想法之后,让我们继续研究Lua。
Lua是我们选择的嵌入式语言
Lua是一种动态语言。 它非常流行,围绕着它发展了一个大型社区,尤其是在游戏开发领域。 它具有非常柔和的学习曲线。 例如,在我们公司中,用于自动测试的脚本是用Lua编写的。 自动测试的标准入门课程大约需要两个小时,之后,一个人便可以使用该语言。 同时,Lua是一种多范式语言。 它支持编程和OOP的功能样式。 结果,它不仅适合解决一些简单的任务,而且适合专业程序员做的更严重的事情。
Lua具有良好的性能,并且具有许多库。 不像JavaScript那样多,但是,在
LuaForge网站上,
您几乎可以找到所需的任何东西。 最后,Lua非常易于嵌入,而且它是作为一种嵌入式语言而创建的。
例如,这是我们的JetBrains IDE
CLion工作区的外观。 在这里,您可以看到我们为Lua创建的自动完成机制,我们计划将其开源。 我们将制作开源调试器。
工作环境我们选择了Lua,但是在将其用作嵌入式脚本语言时,通常会遇到与我们现在考虑的相同的异议。
反对使用Lua
Lua适用于C,而不适用于C ++
没有人认为Lua是一门伟大的可嵌入语言。 他们认为它的主要缺点是它是为使用C语言而不是C ++而创建的。 因此,当尝试在Lua中应用C ++而不是C中的某些东西时,我们会遇到问题。 但是,必须在这里理解,这些问题已由许多非常聪明的人解决。 解决Lua嵌入C ++问题的工具包括Luabind,Luabridge,toLua ++,SQLuaHost等项目。 这不是完整列表。 它们具有不同的优点和缺点,但是,很可能,您可能需要的所有内容已经在这些解决方案之一中实现。
考虑例如SQLuaHost。 这是在SocialQuantum内部创建的绑定,计划将其设为开源。 这个决定代表了我们对Lua应该如何绑定的看法。 因此,有可能如果您在现有的活页夹中找不到所需的内容,则可以在SQLuaHost中找到它。
Lua很慢
我们经常碰到Lua是一种非常慢的语言的观点。 首先,事实并非如此。 Lua是一台堆叠式机器,实际上没有什么可以放慢的。 此外,我们必须了解,在脚本语言中,我们通常会放弃游戏逻辑,业务逻辑,而不是一些真正繁琐的事情。 结果,如果Lua脚本使游戏变慢,则问题可能出在最佳绑定或对某些语言功能的不适当使用上。 例如,我们进行了LuaJIT比Mono更快的综合测试。 同时,没有人愿意写这样的非最佳代码:
function myGame:onUpdate() local tex = Texture::new(name) self.background:setTexture(tex) end
此处,在每个游戏滴答中,都会创建一个新纹理并将其设置为背景。 当然,这样的设计不会特别快地工作,但是没有人会写这样的东西。
Lua仅适用于小型项目。
下一个反对意见是,Lua被要求写一些小东西,而用这种语言不能写一些大东西。 一方面,这是事实。 但是这种语言是高度模块化的。 从许多小模块中,您可以构建相当大型和复杂的系统。 而且,如果您还记得关于多范式和OOP的说法,那么OOP就会促使开发人员创建小的模块,这些模块可用于创建大型而复杂的结构。
此外,经常在Lua上快速编写一些小模块,在游戏行业中,“更快”表示“更便宜”。
其他反对Lua的论点
他们批评Lua,说这种语言很古老,正如他们所说的“开箱即用”不支持OOP,它的表中的元素编号不是以0开头的,就像任何一种体面的语言所期望的那样,而是1。
他们说它的缺点是它没有三元运算符。 实际上,有很多这样的论点反对Lua,但是我们不会讨论它们,因为我们认为它们在很大程度上与开发人员的习惯和个人喜好有关。
总结
总结一下。 如果您的任务是以最小的努力获得嵌入式语言,请选择Lua。 同时,如果您有时间和资源来开发自己的语言或自己的绑定,请再次注意Lua。 为什么在第一种情况和第二种情况下都推荐Lua?
在第一种情况下,选择Lua,您将选择一种非常易于嵌入和使用的语言。 该语言的作者只写了一篇
教程 。 没有其他书籍,仅仅是因为第一本书绝对讲述了您需要了解的有关Lua的所有知识,而且没有更多要讲述的内容。 Lua不是一种理想的语言,也不是世界上使用最广泛的语言,但从所有标准的总和来看,它绝对是嵌入的最佳语言之一。 他是我们目前拥有的最好的人。 另外,有许多用于Lua的标准工具可以极大地简化使用Lua的人们的生活。
在第二种情况下,如果您有开发工具的资源,那么选择Lua便可以真正使用这些资源,因为Lua尽管在游戏开发环境中很流行,但语言却被低估了。 结果,您将有机会以Lua为基础,考虑到您的需求并确切地获得您的需求。