Java 中的脚本编写

8

我和一些朋友正在用Java编写MORPG,我们希望使用脚本语言来创建任务等。

我们没有在Java中使用脚本的经验。我们使用过Python,但是我们对它很不熟悉。其中一个人也使用过Javascript。

我们应该使用哪种脚本语言? 我们不应该使用哪种脚本语言?

11个回答

9
我负责一个相当大的混合Java/Jython系统。我们使用Java进行核心API开发,然后使用Jython将Java对象连接在一起。这是在科学计算环境中进行的,我们需要能够快速组合特定数据分析脚本。
如果我今天从头开始创建这个系统,我不会选择Jython作为脚本语言。我喜欢Python,但我经常遇到Python类型系统和Java类型系统之间的不匹配。例如,如果你只想要一个hashtable,应该使用Python字典还是Java HashMap?决策可能因您是仅在Python代码中本地使用数据结构还是跨越Java边界传递它而异。Jython可以为您执行某些类型强制转换,但它并不完美。即使第一次使用脚本语言是为了增强您的生产力,也很让人烦恼必须考虑这样的问题。
我假设JavaScript或JRuby会有类似的问题。今天我会选择专门针对JVM并利用Java类型系统的脚本语言。显然的候选者是Groovy和Beanshell;Groovy最近似乎一直在增长,所以我会仔细看它。

如果你从2012年开始重新开始,你会以不同的方式处理“粘合组件”吗? - Thorbjørn Ravn Andersen

7

我同意维克托的Jython建议。除此之外,JavaScript(你已经提到了,并且通过javax.script包内置于Java 6+中) GroovyJRuby 也值得一看。

顺便说一句,您应该看看Wyvern,它也是用Java编写的MMORPG,并使用Jython进行脚本编写。其作者Steve Yegge时不时地谈论它。 :-)


5
Java支持多种脚本语言,其中一些列在维基百科这里这里。你可能应该选择具有强大DSL和元编程能力的语言,例如Clojure
但是,如果你需要更简单的东西,JavaScript可能是一个可行的选择。

4

4
如果你想创建自己的专业脚本语言,该怎么办呢?如果你的应用程序是用Java编写的,你可以使用ANTLR(http://www.antlr.org/)来创建语言解析代码。我之所以这样说是因为通用脚本语言可能提供了太多的功能(因为我假设脚本仅用于任务)。但是,如果制作自己的语言太难,那么上述任何建议都可以使用——你只需要弄清楚如何将游戏运行时绑定到脚本中。我还建议Lua(http://www.lua.org/)作为许多游戏使用的另一种选择。

3

简短版

不要使用脚本语言!相反,专注于可配置性(这是非程序员可以很好地完成的事情)。

详细版

支持使用脚本语言的一个常用论点是它允许较差的程序员完成更琐碎的任务。不要相信这一点,因为真正的程序员已经能够在短时间内完成这些琐碎的任务了。相反,应该追求可配置性而不是脚本编写,这样你就可以避免将复杂的算法和概念泄漏到游戏设计师的手中。

在MMOG中缺乏热交换(编辑和继续)可能是实现脚本语言的原因(您不想为小的代码更改重新加载整个游戏),但是使用具有内置热交换功能的Java,您真的没有理由再添加脚本语言。

我花了多年时间思考这些问题;在那天,我自己为MMOG实现了完整的脚本语言、IDE、VM、调试器等。从那以后,我变得更加明智。

如果您仍然选择走无限糟糕的不归路,请记住以下几点。

  • 选择一个成熟的语言,它已经存在一段时间了。
  • 自动测试、调试和编辑将非常糟糕,直到您制作自己的工具/插件/开始在VM中进行黑客攻击。

迄今为止,我从未见过能够改善情况(获得更易维护产品)的DSL。我曾将Python集成到我的个人游戏引擎中,但最终醒悟并将其删除。"Stackless Python"只是一种说法,意味着"不易维护但快速"。如果我错了,请任何人纠正我?


包含脚本语言的一个好处是,当您需要添加新功能(因此无法进行配置)而无需重新部署时,可以实现这一点。 - Thorbjørn Ravn Andersen
但是Java支持(重新)加载类,并且使用一些思考和反射将帮助您走得更远。如果必要的话。 - Jonas Byström
你仍然需要编译修改后的Java类。 - Thorbjørn Ravn Andersen
编译应该是微不足道的问题,与我所能想象的所有方式相比,都是如此。 - Jonas Byström

1


1

1

我会推荐JavaScript来完成这个目的。Mozilla Rhino http://www.mozilla.org/rhino/ 是一个非常出色的实现,完全符合您的需求。

我推荐JavaScript而不是Jython或JRuby,因为它更加熟悉。简单的JavaScript遵循着非常熟悉的语法,任何人都可以使用。然而,如果有人想要做一些更加复杂的事情,JavaScript是一种非常强大的函数式编程语言。

我经常在职业上使用Groovy和Ruby,并认为它们最适合编写具有特别复杂逻辑的应用程序部分,其中Java编写起来很麻烦。JavaScript是嵌入式通用脚本语言的更好选择,可用于游戏中。我没有使用过Python,但它在语法上与Ruby非常相似,我相信它的用途也会类似。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接