【问题标题】:Python vs Lua for embedded scripting/text processing engine用于嵌入式脚本/文本处理引擎的 Python vs Lua
【发布时间】:2011-04-16 00:05:59
【问题描述】:

对于我目前正在进行的一个项目,我希望将脚本引擎嵌入到我的 C++ 代码中,以实现一些可扩展性。该应用程序将需要大量的文本处理并在这些脚本中使用正则表达式。

我知道 Lua 在嵌入式脚本方面通常是业界的宠儿,但我也知道它不支持正则表达式(至少开箱即用)。这导致我倾向于使用 python 来嵌入我的语言,因为它似乎在 Lua 背后有最好的支持,并且仍然提供强大的正则表达式功能。

这是正确的选择吗?我应该看另一种语言吗?我有理由再看一下 Lua 吗?

【问题讨论】:

  • 这个问题的关键是平衡你得到的东西和语言会让你跳过的障碍,这似乎只有在 Roger 的回答中明确解决。
  • Lua 确实有开箱即用的模式匹配,尽管它不是 POSIX reg exps - lua.org/pil/20.2.html

标签: c++ python scripting lua embedded-language


【解决方案1】:

如果您特别需要所谓的“正则表达式”(根本不是正则表达式),那么您有两种选择:

  1. 使用 Python。它包含的正则表达式与 Perl 和 sed/grep 足够相似
  2. 使用 Lua 和外部PCRE library

另一方面,如果您需要任何良好的模式匹配,您可以继续使用 Lua,并且:

  1. 使用 Lua 包含的模式匹配,这不是 grep 传统中的,但非常有能力。缺少的功能是子模式替代品 (|)
  2. 使用LPEG,它比正则表达式更强大,而且通常也更快。

如您所知,我是最后一个的忠实粉丝。它不仅可以让您定义非常复杂但具有确定性的模式,它还是一个完整的语法工具,您可以使用它来创建一个完整的解析器。如果您愿意,可以在单个多行字符串常量中描述语法,并使用您自己定义的挂钩来捕获数据并构建您的结构。

我用它来快速破解 JSON 解析器、C 调用树、xPath 库等。

【讨论】:

  • 内置模式中包含一个PCRE之类比较麻烦的技巧:平衡括号匹配%b()。可以使用任何一对不同的字符;该项目匹配以( 开头、以) 结尾且() 平衡的字符串。
  • 我自己从来没有在 Lua 中编写过一个简单的魔兽世界扩展程序,您能谈谈设计高级类和功能的能力吗?我知道它支持面向对象的编程,但我只听说它被用于相当简单的应用程序。我可以预见我的开发人员将其用于高级机器学习功能以及网络通信。我已经在 Python 中完成了所有这些工作,没有任何问题。 Lua 在这些事情上是否那么简单?
  • @Wade Tandy:这是一个很大的话题。事实上,Lua 并没有“自带”OOP 工具,但它的语法支持许多不同的 OO 风格。对于大多数用途,只需几行即可创建适当的元表。但是,如果您需要完全类似静态的基于类的继承,它本身很快就会成为一个不平凡的项目。就我而言,我非常很少需要基于类的 OOP。封装和多态性是 OOP 的真正优势,您几乎可以通过一点代码纪律自动获得它们
【解决方案2】:

boost.python 极大地帮助了 Python 和 C++ 的集成。如果那些熟悉您的 C++ 源代码的人主要是编写脚本的人,您可能会发现这更方便。

即使脚本编写者不熟悉您的特定源代码,如果他们更熟悉类似 C 的语法(C、C++ 等),他们应该会发现 Python 更易于使用——也许只是一点点,Lua 不是不难。优秀的程序员无论如何都可以使用多种语言,但是您没有提供有关您的受众的任何信息。

Lua 比 Python 更容易沙箱化,因此如果您必须限制脚本可以执行的操作(例如生成其他进程、读取文件),则可能会排除 Python。

【讨论】:

  • boost.python?听起来不错。它在让您不必担心 Python 的状态方面有多好?
  • @Charles:内部解释器状态,比如你在使用Python的C API时需要担心吗?我还没有考虑使用 boost.python,但我也没有广泛使用它。
  • 内存管理器的正确和边界问题。 boost.python 常见问题解答说如果不小心,它就不能与多线程一起使用。
  • 是否可以在不小心的情况下使用多个线程? :)
【解决方案3】:

我自己在我的一个 C 项目中加入了 Lua,我建议使用 Lua,因为这样更容易。

但这取决于您的脚本语言需要具备的能力。 Lua 上升为事实上的游戏脚本语言。如果您需要高级脚本功能,您可能会使用 Python,但如果只是为了简单的脚本支持,请使用 Lua。就我所见,Lua 对于不习惯编写脚本的新手来说更容易学习。

我认为 Lua 更轻量,如果你需要有外部包,你可以添加它们,但关键是 Lua 的原子部分比 Python 小得多。

【讨论】:

    【解决方案4】:

    别忘了他们的祖父 - tcl

    有一个用于 tcl 的 c++ 包装器,它非常容易嵌入

    我在当前项目中使用它

    在之前的 (c#) 项目中,我使用 lua 而不是 python。在较早的 c# 项目中,我使用过 python; 我选择 lua 是因为语法对于普通脚本编写者来说更正常(用于 vbscript 或 javascript)。但是,我将在下一个 c# 项目中改回 (iron)python; lua 太晦涩了

    对于 c++,从现在开始我将一直使用 tcl

    编辑:我最喜欢的是 jint(.net javascriptt 解释器)v 易于使用,界面美观。鉴于 js 目前是很酷的语言,没有人可以抱怨这种语言

    【讨论】:

    • Tcl 是专为此类工作而设计的,它仍然是最好的。我只能假设 Lua 的原作者根本没有听说过它!
    • @Gaius Tcl 作为一种语言充其量是一种“古怪”的语言,尤其是在 Lua 最初创建时(90 年代初)的早期版本。即使他们听说过 tcl,他们也可能根本不喜欢它……(它的古怪使 tcl 成为那些宁愿拥有更“真实”语言的人争论不休的话题)
    • @Gaius:实际上,我做了一些检查,Lua 的作者在他们第一次制作 Lua 时确实知道 tcl:“在 1993 年,唯一真正的竞争者是 Tcl,它被明确设计为嵌入到应用程序中。但是,Tcl 语法不熟悉,对数据描述的支持不好,只能在 Unix 平台上运行。” [来自论文Lua的演变lua.org/doc/hopl.pdf)]
    • 恕我直言,TCL 在语法上已经过时了。如果易于书写表达或可读性很重要,请使用 Python。
    猜你喜欢
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 2016-04-11
    • 2011-05-27
    • 2016-03-20
    相关资源
    最近更新 更多