TCL vs Lua - 编写mmo服务器脚本

时间:2009-09-10 18:09:08

标签: lua tcl

我有一个c ++服务器端项目,我需要嵌入某种脚本。它是在线MMO类型服务器的一部分。我有使用TCL的丰富经验,看起来很自然。我在游戏开发日里做了少量的Lua,我想知道这对于嵌入式脚本来说是否是一种更好的语言。学习一门新语言也很不错。 TCL与Lua的相对优势和劣势是什么?谢谢!

6 个答案:

答案 0 :(得分:21)

老实说,他们都非常适合这项任务。两者都很容易嵌入到应用程序中,并且具有相当简单的语法。我知道在Tcl中添加新命令(与应用程序交互)非常简单,我告诉Lua也非常擅长此类事情。

我的建议是和Lua玩一会儿来看看你喜欢它(因为你已经知道了Tcl)......然后选择一个让你觉得最舒服的那个。如果你正在编写大部分代码,那么你最终会使用它,所以你也需要一些你可以使用的东西。最后,两种语言选择都应该相当容易让最终用户编写脚本。

我个人的偏好是Tcl,因为我不喜欢Lua(我已经为魔兽插件做了大量的编程)而且因为我喜欢Tcl(我已经完成了大量的编程)专业和私人工作)。

编辑:添加了关于最终用户都很容易的说明。获得了2张选票,除了不澄清我发言的部分原因之外,他无法想到其他任何事情。

答案 1 :(得分:16)

我想我在那里与RHSeeger相反。我已经在游戏中使用了Lua和TCL(在线游戏,偶然),如果我有选择的话,我不会再用10'的bargepole触摸TCL。我非常主观的看法是,Lua是一种理智的语言而TCL则不是。相对于脚本语言的其他选项,TCL语法对于大多数人来说都非常模糊,包括所有set和expr以及美元符号和大量括号等。它唯一的客观好处是易于嵌入 - 但是Lua并不吝啬该部门。

如果这个脚本界面纯粹是为了你,那么你也可以选择TCL,因为Lua不会为你提供任何新东西(除非你的对象取向)。在技​​术熟练的用户手中,TCL是一种合理的工具。但是,如果您希望经验较少的用户使用该系统,那么请使用Lua - 更简单的语法将为他们带来更多的工作效率。

答案 2 :(得分:7)

我怀疑Tcl会有更多您可能认为必要或方便的库。

答案 3 :(得分:7)

正如其他人所说,两种语言都能很好地运作。第三种选择也可能同样适用于JavaScript,因为它适用于大致相同的利基市场。而不是试图把你佑到一个或另一个(因为我非常喜欢这两种语言),我会尝试关注一些客观的差异,并指出我认为一个领先于另一个的地方。

游戏服务器中最重要的问题可能是原始性能。这两种语言都是成熟且经过优化的,但两者都认识到,通过推迟编译代码可以最好地优化某些问题。两种语言使用基本相同的机制来执行此操作。从语言本身的角度来看,看起来Lua的速度要快一些。 link

从图书馆的角度来看,这是下一个重要因素,两种语言都不需要使用任何图书馆。与Java等需要大型运行时库有用的语言相比,这两种语言都非常紧凑;同样,这是他们原始设计要求的结果。这两种语言都有丰富的附加库可供选择,但至少我的印象是TCL在这一类别中有更多的变化。 tcl :( Tcl Extension Archive / Tcl Extension Repository)lua:(LuaForge

另一个区别在于核心语言本身。两种语言都重视简约而不是风格,但这就是相似性结束的地方。 Lua使用大多数程序员可能熟悉的语法,使用非常简单的上下文无关语法。 TCL语法也很简单,但与其他现有语言没有任何共同之处,尽管它看起来有点像unix shell语言。 Tcl可能只对非程序员更容易,因为它的面向行的命令语法非常清楚,但是在其他语言中经验丰富的程序员通常会反对其神秘的语法。在代码生成方面,两者都不是非常宽容,但两者都具有强大的元编程功能(可比,但可能不如CLISP宏那么强大)。

答案 4 :(得分:6)

Lua C API非常易于集成到应用程序中。从C,您可以完全访问Lua状态及其本机数据类型。我建议使用Lua来获取哈希表实现,即使不需要编写脚本,例如。

用C编写的Lua函数可以作为全局名称注入,像大多数标准库函数一样收集在表中,或者在DLL中实现并在运行时动态加载。这允许应用程序提供稳定的API,以及支持用Lua或C编写的插件。

Lua作为一种语言非常强大,支持功能和面向对象的编程风格。它还具有令人惊讶的轻量级:完整的源代码包和完整的文档适用于1 MB以下,并且DLL中的整个VM,编译器和标准库在Windows上仅为164 KB。

我从第2版开始就没有认真检查过TCL ......我不会尝试以具体方式对它们进行比较。我相信它们都是为了适应相同的利基而发明的,并且大约在同一时间。它们当然都是具有狂热用户社区的成熟语言。

答案 5 :(得分:0)

Lua有LuaJIT,它是一个JIT编译器,在紧密循环上达到C速度,用于Snabb Switch等项目,其中性能至关重要(Snabb可以处理每秒千兆位,所有处理都通过LuaJIT)。 LuaJIT还有一个易于使用的FFI,允许用户无需编写C存根代码即可访问C函数。

PUC-Lua(标准实现)支持从内存不足中恢复。 LuaJIT和TCL都没有。