【问题标题】:TCL vs Lua - scripting a mmo serverTCL vs Lua - 编写 mmo 服务器脚本
【发布时间】:2016-10-21 21:29:53
【问题描述】:

我有一个 c++ 服务器端项目,我需要在其中嵌入某种脚本。它是在线 MMO 类型服务器的一部分。我在使用 TCL 方面有丰富的经验,这似乎是天作之合。在我的游戏开发期间,我只使用了少量的 Lua,我想知道这是否可能是一种更好的嵌入式脚本语言。学习一门新语言也很好。 TCL vs Lua 的相对优势和劣势是什么?谢谢!

【问题讨论】:

    标签: lua tcl


    【解决方案1】:

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

    我的建议是使用 Lua 一段时间,看看你喜欢它(因为你已经知道 Tcl)......然后选择你觉得最舒服的那个。如果您正在编写大量代码,那么您最终会经常使用它,因此您也需要一些可以使用的东西。最后,这两种语言选择对于您的最终用户来说都应该相当容易编写脚本。

    我个人偏爱 Tcl,既因为我不喜欢 Lua(我在其中为《魔兽争霸》插件编写了相当多的程序),又因为我喜欢 Tcl(我在其中为专业和私人工作)。

    编辑:添加了关于对最终用户来说都很容易的注释。得到了 2 票反对,除了没有澄清我声明的部分原因之外,想不出其他任何可能的原因。

    【讨论】:

      【解决方案2】:

      我想我和那里的 RHSeeger 正好相反。我已经在游戏中使用过 Lua 和 TCL(顺便说一下,在线游戏),如果我有选择的话,我不会再用 10 英尺的 bargepole 碰 TCL。我非常主观的看法是 Lua 是一种理智的语言,而 TCL 不是。相对于脚本语言的其他选项,TCL 语法对大多数人来说非常晦涩难懂,有所有的集合和 expr 以及美元符号和大量括号等。它唯一的客观好处是易于嵌入 - 但 Lua 并没有懈怠那个部门也是。

      如果这个脚本接口纯粹是为你准备的,那么你不妨选择 TCL,因为 Lua 不会为你提供任何新东西(除非你喜欢面向对象)。在熟练的用户手中,TCL 是一个合理的工具。但是,如果您希望经验不足的用户使用该系统,那么请使用 Lua - 更简单的语法将为他们带来很多生产力。

      【讨论】:

      • 我觉得我们可以有这样相反的意见很有趣。你所说的一切让 Lua 比 Tcl 更好,我想说的是让 Tcl 比 Lua 更好。对我来说,Tcl 语法比 Lua 等的更清晰、更明显。
      • 我同意 RHSeeger 的评论“你对 Lua 的评价,我对 Tcl 的评价”。你(kylotan)说你认为 Lua 更适合经验不足的用户,但我也认为这是倒退的。 Tcl IMO 的主要问题是经验丰富的程序员背负着太多的包袱——对语言应该如何工作的期望。 Tcl 由于其简单性而与众不同,但这种简单性是它的优势。您需要了解的有关 Tcl 的所有信息都可以在一个网页上表达。
      • 这正处于演变为“语言战争”的边缘。我认为这是一个适合这项工作的工具的问题,除了语法之外,这两种工具在这种情况下几乎同样适用,但在我看来,Tcl 之所以胜出是因为它的成熟度,因此它是库;确实,Lua 在这个部门似乎是出了名的一周。至于语法,是的,Lua 似乎更熟悉,几乎是 Basic/Python-esque,这确实是一种优势。但是对于那些只触及 Tcl 表面的人,我劝你:从头开始。当你“得到它”时,它实际上与“得到”Lisp 或 Haskell 处于同一水平。
      • 我确实承认并声明我的意见是主观的,TCL 对了解它的人来说非常好。然而,在游戏脚本领域,通常会做这件事的人会更熟悉简单的主流命令式语言,如 VBScript 和 Javascript,并且与能够充分利用的高级程序员相去甚远。 Haskell 或 Lisp。这只是我在该领域所见,与 TCL 作为一种语言的强大程度在很大程度上无关。
      • 哦,关于库点 - 通常对于游戏脚本,出于性能、维护或安全原因,您明确不希望向脚本公开任何外部库。同样,这完全取决于谁将编写脚本,希望这是原始发布者会考虑的事情。
      【解决方案3】:

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

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

      Lua 作为一种语言非常强大,它支持函数式和面向对象的编程风格。它也非常轻巧:完整的源工具包和完整的文档在 1 MB 以内,DLL 中的整个 VM、编译器和标准库在 Windows 上只有 164KB。

      自第 2 版左右以来,我还没有认真研究过 TCL……我不会尝试以具体的方式比较它们。我相信它们都是为了适应相同的利基而发明的,而且几乎是在同一时间发明的。它们当然都是成熟的语言,拥有狂热的用户社区。​​p>

      【讨论】:

        【解决方案4】:

        我怀疑 Tcl 将有更多的库,您可能会在此过程中发现必要或方便。

        【讨论】:

          【解决方案5】:

          正如其他人所说,两种语言都可以很好地工作。第三种可能也适用的选项是 JavaScript,因为它几乎适用于相同的利基市场。而不是试图向你求爱(因为我非常喜欢这两种语言),我将尝试关注一些客观差异,并指出我认为一种领先于另一种的地方。

          游戏服务器中最重要的问题可能是原始性能。两种语言都成熟且优化良好,但都承认某些问题最好通过延迟编译代码来优化。两种语言使用基本相同的机制来执行此操作。从语言本身的角度来看,Lua 似乎快了一点。 link

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

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

          【讨论】:

          • Javascript 可能具有对普通程序员熟悉的优点,但肯定有稀疏运行时库的缺点,至少对于 C 实现而言。
          【解决方案6】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-08-11
            • 2011-05-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-31
            相关资源
            最近更新 更多