TCL与Lua——为MMO服务器编写脚本

13

我有一个c++服务器端项目,需要嵌入某种脚本。它是在线MMO服务器的一部分。我在使用TCL方面有丰富的经验,它似乎是自然选择。在我的游戏开发日子里,我做了很少量的Lua,并且我想知道它是否是更适合于嵌入式脚本的语言。学习一门新语言也是不错的事情。TCL和Lua的相对优势和劣势是什么?谢谢!

6个回答

26
老实说,它们都非常适合这项任务。两者都易于嵌入应用程序并具有相对简单的语法。我知道在Tcl中添加新命令(与应用程序交互)非常简单,并且据说Lua在这方面也很擅长。
我的建议是先尝试一下Lua,看看你是否喜欢它(因为你已经了解Tcl)……然后选择你感觉最舒适的语言。如果你要编写大量代码,你最终将会频繁使用它,所以你需要一个你自己也能使用的工具。最终,这两种语言选择都应该相当容易让最终用户进行脚本编写。
我个人更喜欢Tcl,因为我不喜欢Lua(我已经为魔兽世界插件做了相当多的编程),而且我喜欢Tcl(无论是专业还是私人工作,我都已经做了很多编程)。
编辑:补充了两种语言选择都易于最终用户进行脚本编写的说明。我得到了2个负投票,我想不出其他可能的原因,除了没有说明我的声明的原因。

18

我想我和RHSeeger的情况恰恰相反。我曾经在游戏中(顺便说一下,是在线游戏)都嵌入了Lua和TCL,如果可以选择,我不会再去碰TCL。我的个人主观看法是Lua是一门合理的语言,而TCL则不是。相对于其他脚本语言选项而言,TCL的语法对大多数人来说非常晦涩,有许多set、expr、美元符号和大量的括号等等。它唯一的客观好处就是易于嵌入 - 但在这方面,Lua也毫不逊色。

如果这个脚本接口仅供您自己使用,那么您可能会选择TCL,因为Lua不会提供任何新东西(除非您喜欢面向对象编程)。在一个熟练的用户手中,TCL是一个合理的工具。然而,如果您期望 less experienced users 使用该系统,则应选择Lua - 简单的语法将为他们带来很多生产力。


6
我觉得我们能有如此不同的意见很有趣。你所说的一切让Lua比Tcl更好,我却认为这些都是让Tcl比Lua更好的地方。对我而言,Tcl语法比Lua更加简洁和明显等等。 - RHSeeger
11
我同意RHSeeger的评论,即“你对Lua所说的话我会用Tcl来形容”。你(kylotan)说你认为Lua更适合不那么有经验的用户,但我也认为这是相反的。在我的看法中,Tcl的主要问题是有经验的程序员会带上太多“包袱”——对语言运作方式的期望。Tcl因其简单而不寻常,但正是这种简单性成为了它的优势。关于Tcl的所有东西都可以在一个网页上表达清楚。 - Bryan Oakley
4
这似乎快要演变成“语言之争”。我认为这是使用合适工具的问题。除了语法之外,两种工具在此情况下都差不多适用,但在我看来,Tcl因其成熟度和库而获胜;实际上,Lua在这方面似乎出奇地弱。至于语法,是的,Lua的语法可能更加熟悉,几乎类似于Basic/Python,这确实可能是一种优势。但对于那些只是浅尝辄止 Tcl 的人,我敦促您:请深入挖掘。当你“get it”时,它几乎与“getting” Lisp或Haskell的水平相同。 - Dexygen
3
关于使用库的问题 - 对于游戏脚本,通常不希望将任何外部库暴露给脚本,以确保性能、维护和安全性。这取决于谁编写脚本,希望原始贴主会考虑这一点。 - Kylotan
2
@jk:我绝对理解你的意思,TCL的运作规则简洁明了,但它依赖于良好格式化和标点符号,而不是英语关键字,这使得它对于(讲英语的)初学者来说不太友好。在我看来。 - Kylotan
显示剩余4条评论

8
我猜想Tcl会有更多的库,这些库可能会在你使用过程中变得必要或者方便。

7
Lua C API非常易于集成到应用程序中。从C语言中,您完全可以访问Lua状态和其本地数据类型。例如,我建议即使没有脚本需要,也可以使用Lua来获取哈希表实现。
用C编写的Lua函数可以作为全局名称注入,像大多数标准库函数一样收集在表中,或者在DLL中实现并在运行时动态加载。这使得应用程序能够提供稳定的API,并支持用Lua或C编写的插件。
作为一种语言,Lua具有出乎意料的强大功能,支持函数式和面向对象的编程风格。它也出奇地轻巧:完整的源代码包和完整文档不到1 MB,整个VM、编译器和标准库在Windows上只有164KB。
自TCL 2版本以来,我就没有认真研究过它了... 我不会试图以具体的方式进行比较。我相信它们都是为了适应相同的领域而发明的,而且大约在同一时间。它们肯定都是成熟的语言,拥有热情的用户社区。

7
正如其他人所说,这两种语言都非常适合。第三个选项也很有可能同样适用,那就是JavaScript,因为它在大致相同的领域中发挥作用。我不会试图说服你选择其中一种(因为我都非常喜欢),而是尝试关注一些客观差异,并指出我认为哪个更好。
在游戏服务器中最重要的问题可能是原始性能。这两种语言都是成熟且经过优化的,但它们也都认识到某些问题最好通过转向编译代码来进行优化。这两种语言使用基本相同的机制来执行此操作。从语言本身的角度来看,Lua似乎略快一些。link

从图书馆的角度来看,这是下一个重要因素,两种语言都不需要使用任何库就可以很有用;也就是说,与需要大型运行时库才能发挥作用的语言(如Java)相比,这两种语言非常紧凑。这是由于它们最初设计要求的结果。两种语言都有丰富的附加库可供选择,但我至少的印象是TCL在这个类别中有更多的选择。tcl:(Tcl Extension Archive / Tcl Extension Repository) lua:(LuaForge)

另一个区别在于核心语言本身。两种语言都强调简单而不是风格,但相似之处就到此为止了。Lua使用对大多数程序员可能很熟悉的语法,具有非常简单的上下文无关语法。TCL语法也很简单,但实际上与其他现有语言没有任何共同之处,尽管它看起来表面上有点像Unix shell语言。Tcl可能仅对非程序员更容易,因为其基于行的命令语法非常清晰,但在其他语言中有经验的程序员通常反对其晦涩的语法。两者在代码生成方面都不是很宽容,但都具有强大的元编程功能(与CLISP宏相当,但可能没有那么健壮)。

2
JavaScript可能具有熟悉的优势,适合偶尔编写代码的人,但至少对于C实现来说,其缺点在于运行时库稀少。 - SingleNegationElimination

1
Lua有LuaJIT,它是一个JIT编译器,在紧密循环中可达到C语言速度,并用于像Snabb Switch这样对性能要求严格的项目(Snabb可以处理每秒千兆位,全部通过LuaJIT处理)。LuaJIT还有一个易于使用的FFI,允许用户在不编写C存根代码的情况下访问C函数。
PUC-Lua(标准实现)支持从内存耗尽时恢复。但LuaJIT和TCL都不支持。

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