我有一个 c++ 服务器端项目,我需要在其中嵌入某种脚本。它是在线 MMO 类型服务器的一部分。我在使用 TCL 方面拥有丰富的经验,这似乎是天作之合。在我的游戏开发日中,我只使用了少量的 Lua,我想知道这是否可能是一种更好的嵌入式脚本语言。学习一门新语言也很好。TCL 与 Lua 的相对优势和劣势是什么?谢谢!
6 回答
老实说,他们都非常适合这项任务。两者都易于嵌入到应用程序中并且具有相当简单的语法。我知道在 Tcl 中添加新命令(与应用程序交互)非常简单,而且我听说 Lua 也非常擅长这种类型的事情。
我的建议是玩 Lua 一段时间,看看你喜欢它(因为你已经知道 Tcl)......然后选择你觉得最舒服的那个。如果您正在编写大量代码,那么您最终会经常使用它,因此您也需要一些可以使用的东西。最后,两种语言选择对于您的最终用户来说都应该相当容易编写脚本。
我个人偏爱 Tcl,既因为我不喜欢 Lua(我在其中为《魔兽争霸》插件进行了相当多的编程),又因为我喜欢 Tcl(我已经为专业和私人工作)。
编辑:添加了关于对最终用户来说都很容易的注释。得到 2 票反对,除了没有澄清我声明的原因部分之外,想不出其他任何可能的原因。
我想我是那里的 RHSeeger 的对立面。我已经在游戏中使用了 Lua 和 TCL(顺便说一下,在线游戏),如果我有选择的话,我不会再用 10 英尺的 bargepole 碰 TCL。我非常主观的看法是 Lua 是一种理智的语言,而 TCL 不是。相对于脚本语言的其他选项,TCL 语法对大多数人来说非常晦涩难懂,有所有的集合和 expr 以及美元符号和大量括号等。它唯一的客观好处是易于嵌入 - 但 Lua 并没有懈怠那个部门。
如果这个脚本接口纯粹是为你准备的,那么你最好选择 TCL,因为 Lua 不会为你提供任何新东西(除非你喜欢面向对象)。在熟练的用户手中,TCL 是一个合理的工具。但是,如果您希望经验不足的用户使用该系统,那么请使用 Lua - 更简单的语法将为他们带来很多生产力。
Lua C API 非常容易集成到应用程序中。在 C 中,您可以完全访问 Lua 状态及其本机数据类型。例如,我建议使用 Lua 来获取哈希表实现,即使不需要编写脚本。
用 C 语言编写的 Lua 函数可以作为全局名称注入,像大多数标准库函数一样收集在表中,或者在 DLL 中实现并在运行时动态加载。这允许应用程序提供稳定的 API,并支持用 Lua 或 C 编写的插件。
Lua 作为一种语言出奇地强大,支持函数式和面向对象的编程风格。它也非常轻巧:完整的源工具包和完整的文档在 1 MB 以内,而 DLL 中的整个 VM、编译器和标准库在 Windows 上只有 164KB。
自第 2 版左右以来,我还没有认真研究过 TCL……我不会尝试以具体的方式比较它们。我相信它们都是为了适应相同的利基而发明的,而且几乎是在同一时间发明的。它们当然都是拥有狂热用户社区的成熟语言。
我怀疑 Tcl 将有更多的库,您可能会在此过程中发现它们是必要的或方便的。
正如其他人所说,两种语言都可以很好地工作。第三种可能也适用的选项是 JavaScript,因为它几乎适用于相同的利基市场。而不是试图向你求爱(因为我非常喜欢这两种语言),我将尝试关注一些客观差异,并指出我认为一种领先于另一种的地方。
游戏服务器中最重要的问题可能是原始性能。两种语言都成熟且优化良好,但都认识到某些问题最好通过推迟编译代码进行优化。两种语言使用基本相同的机制来执行此操作。从语言本身的角度来看,Lua 似乎快了一点。关联
从库的角度来看,这是下一个重要因素,两种语言都不需要使用任何库才能有用;与需要大型运行时库才能使用的 Java 等语言相比,这两种语言都非常紧凑;同样,这是他们原始设计要求的结果。两种语言都有丰富的附加库可供选择,但至少我的印象是 TCL 在这一类别中的种类更多。tcl :( Tcl Extension Archive / Tcl Extension Repository ) lua:( LuaForge )
另一个区别在于核心语言本身。两种语言都重视简单而不是风格,但这就是相似之处。Lua 使用大多数程序员可能熟悉的语法,具有非常简单的上下文无关语法。TCL 语法也很简单,但与其他现有语言并没有什么共同之处,尽管它表面上看起来有点像 unix shell 语言。Tcl 可能只对非程序员更容易,因为它的面向行的命令语法非常清晰,但是有其他语言经验的程序员通常反对它晦涩难懂的语法。两者在代码生成方面都不是非常宽容,但两者都具有强大的元编程工具(可比较,但可能不如 CLISP 宏那么健壮)。
Lua 有LuaJIT,这是一个 JIT 编译器,可以在紧凑的循环中达到 C 速度,并用于像Snabb Switch这样的项目,其中性能至关重要(Snabb 可以处理每秒千兆比特,全部通过 LuaJIT 处理)。LuaJIT 还有一个易于使用的FFI,它允许人们在不编写 C 存根代码的情况下访问 C 函数。
PUC-Lua(标准实现)支持从内存耗尽中恢复。LuaJIT 和 TCL 都没有。