【问题标题】:Embeddable language with good string manipulation support具有良好字符串操作支持的可嵌入语言
【发布时间】:2010-11-19 20:18:00
【问题描述】:

我一直在开发一个 C 程序,该程序执行大量字符串操作,并且经常需要调整和重新编译以进行某种特殊情况处理。我一直认为嵌入一些具有良好字符串操作支持的脚本语言可能对项目有意义。

哪种语言可以提供最好的字符串操作支持,同时又易于嵌入到 C 程序中?

一些额外的背景......

  • 性能非常重要(尤其是启动时间)
  • 需要在多个平台上轻松编译(Linux、Solaris、Win32(最好使用 MinGW)、Darwin)
  • 需要成为一种在 5 年内仍然存在的语言

我看过一点 Python(也许重量太重?)和 Lua(也许不专注于字符串操作?),但对它们了解得不够多,或者还有哪些其他选择。

【问题讨论】:

    标签: c string embed


    【解决方案1】:

    Perl。它的(原始)存在的原因是字符串操作。

    【讨论】:

    • 但据我了解,嵌入到 C 程序中并不容易。你知道不同吗?
    • 从未尝试过,就我个人而言,除了“Hello World”之外,我还没有使用过多的 C/C++。我确实知道至少一个(我认为是 C++)开源项目确实嵌入了它,如果你想四处看看它是如何完成的。
    • 看来您必须为 kildclient 单独下载 Perl,因为我需要将其实际编译成二进制文件。
    • 可以嵌入 Perl:search.cpan.org/dist/perl/pod/perlembed.pod - 但我不会对不得不编写这些脚本的可怜用户施加如此残酷而强大的诅咒;)跨度>
    【解决方案2】:

    人们已经将tcl 嵌入到大型项目中似乎已经有很长一段时间了。自从我不得不使用 tcl 做任何事情以来已经有一段时间了......

    tcl 与其他编程语言的区别之一是 everything 是一个字符串。

    这里是tcl documentation on string functions,供您参考。

    tcl 可能比 perl 更容易嵌入,但我必须同意 @Matthew Scharley 的推理。此外,tcl 的性能并不完全出名,但近年来可能发生了变化。

    无论如何,here is the tcl wiki link on embedding tcl in C applications,以及来自页面的相关引用:

    “如何在我现有的 C(或 C++)应用程序中嵌入 Tcl 解释器?”是一个非常常见的问题。这很简单,当然比使用 Perl 或通常的 Python 更容易;此外,这种“可嵌入性”是 Tcl 最初的目标之一,许多项目都在这样做。没有关于该主题的完整讨论,但我们可以在这里给出一个概述。 (RWT 2002 年 10 月 14 日)


    正如您所提到的,另一种选择可能是使用 Lua,同时使用您选择的另一个 C 字符串库对其进行扩展(例如,Google 出现了 The Better String Library)。

    将 Lua 编译到应用程序后,you can "extend" C functions to Lua's interpreter。或者the built-in string functions 对你来说已经足够了。

    你当然有几个选择。

    【讨论】:

      【解决方案3】:

      我从不后悔使用 Lua。

      很容易嵌入到您的应用程序中。其实现在我一般不写C应用,我只是写C库,从Lua控制。

      文本操作并不是它最好的特性,但它肯定比单独的 C 语言要好得多。 LPEG 库让构建解析器变得非常简单,让任何正则表达式都感到羞耻(但如果你喜欢它们,仍然有一些类似正则表达式的语法)。

      【讨论】:

      • 在嵌入式语言领域,Lua 简直是完美的——小巧,完美的可移植性(严格的 C++ 可编译的 ANSI C 子集),简洁的语法,最小但方便的标准库,易于扩展(我敢说它在那里击败了 Python),以及非常好的文档。我过去对 Lua 的体验是积极的。它可能缺乏开箱即用的字符串操作功能,但您可以轻松提供该目的可能需要的所有自定义函数(正则表达式等)。
      • +1 用于编写由 Lua 控制的 C 库。这对我来说也变得越来越普遍。
      • 不要忘记 Lua 赢得了很多基准测试比赛,那是在为其字节码引入 JIT 编译器之前。而且,JIT 也可用,请参阅luajit.org 了解详细信息。
      【解决方案4】:

      我们研究了 Python 和 Lua 的 .NET 产品脚本。目标是为最终用户提供一些可书写性。决定归结为 Python,因为与其他所有东西相比,拥有微软支持的任何东西都更受欢迎。我的选择是 Lua。

      【讨论】:

        【解决方案5】:

        有些人可能不同意,但 Sara Goleman 已发布 a great book 关于扩展和嵌入 PHP。哪个正在成为周围使用最广泛的语言之一……:)

        PHP 字符串支持不如 Perl 好,但它非常好用。

        我有没有提到它是用 C 编写的?

        【讨论】:

        • 使用 PHP 作为嵌入式语言有什么好处?任何此类通常都是特定于域的,因此在其他地方的受欢迎程度并不是一个大因素。 PHP 作为一门语言本身就有很多批评者。
        【解决方案6】:

        Python 根本不是重量级的!嵌入非常简单(这里是official guide,但您也可以找到许多教程),非常强大,非常适合字符串处理,并且是一种易于使用的整体语言。它拥有庞大的用户社区和支持基础,这是一种奖励。

        Python 也被嵌入到大量现实生活中的应用程序中。我能立即想到的一个很酷的例子是 Civilization IV 游戏,其中大部分在 C++ API 之上的 Python 脚本上运行。

        【讨论】:

          【解决方案7】:

          关于各种脚本语言的嵌入 API 的相对优点,有一篇很好的调查论文:

          H. Muhammad and R. Ierusalimschy. C APIs in extension
          and extensible languages. Journal of Universal Computer
          Science, 13(6):839–853, 2007.
          

          着眼于结合出色的字符串操作和出色的嵌入 API,我建议按顺序:

          • Ruby:出色的字符串支持,包括对正则表达式的语法支持。精心设计的嵌入 API,非常易于使用。
          • Lua:我不确定它对字符串的支持如何,但它应该是一种很好的嵌入语言。
          • Python:与 Ruby 相比,嵌入不太容易,使用字符串功能稍微难一些。但它有 Pyrex,所以这可能是一种更简单的嵌入方式。
          • PHP:讨厌的 API,讨厌的语言。 embed SAPI 确实是二等公民,但它确实有效。有很多字符串操作函数。不过,我不会推荐它。
          • Perl:很难嵌入(据我所知),字符串支持可能会更好。

          我无法评论 TCL,但我听说它是​​为嵌入而设计的。

          【讨论】:

            【解决方案8】:

            Lua 远超其他选择。

            ...最好的字符串操作支持,同时易于嵌入?

            Lua 被设计嵌入到 C 中; API 清晰易用;文档很棒。

            其他一些回应贬低了 Lua 的字符串功能。我认为他们低估了 Lua。 Lua 的字符串功能实际上在“只是连接”和正则表达式的全部复杂性之间找到了一个最佳点。字符串格式化能力非常强,通过“缓冲区”或表格来累积字符串简单高效。

            在我看来,字符串扫描是设计中最好的部分之一。它没有“或”模式,但可以为您提供从正则表达式中获得的大部分内容,包括非常强大和优雅的“捕获”功能。例如,我可以通过捕获每个字符并对其应用函数来将字符串转换为十六进制:

            s:gsub('.', function(c) return string.format("%02x", string.byte(c)) end)
            

            或者我可以将非字母数字、非空格字符转义为八进制:

            s:gsub('[^%w%s]', function(c) return string.format([[\%03o]], string.byte(c)) end)
            

            这里展示的一些功能:

            • 字符串扫描的转义字符为%,与字符串引用的转义字符\不同。这个决定太棒了,应该会自己获奖:-)

            • 引用文字字符串有多种机制,包括 [[...]],其中 no 字符必须被转义。如果您想生成或匹配带有反斜杠的字符串(例如 LaTeX),这是天赐之物。

            如果您想要上下文无关解析器的全部功能,您可以随时使用 LPEG,这是由 Lua 的一位设计师编写的库。

            性能非常重要(尤其是启动时间)

            Lua 不断获得性能奖。启动速度快如闪电:整个系统(包括编译器、库、垃圾收集器和运行时系统)只有 150KB。为了避免暂停时间,Lua 提供了增量垃圾回收。另见 SO 问题Why is Lua faster than other scripting languages?

            您可以通过预编译脚本来加快启动速度,但我从未发现有必要这样做——而且因为编译代码(相对于源代码)不可移植,通常预编译带来的麻烦多于解决的问题。

            需要在多个平台上轻松编译

            Lua 使用纯 ANSI C 编译,甚至不需要 POSIX。我有一个在我的 PalmOS PDA 上运行的版本。

            需要成为一种在 5 年内仍然存在的语言。

            Lua 从 1993 年就已经存在。此外,团队中提供最多支持的两名成员是 PUC-Rio 的终身教授。 Lua是他们的生计。最后,整个系统只有 17,000 行代码。如果 Rio 明天从地图上掉下来,任何拥有良好本科编译器课程的人都可以拿起系统并维护它。会有很多志愿者。

            我看过一点 Python 和 Lua,但对它们了解不够

            请参阅 SO 问题 Which game scripting language is better to use: Lua or Python?

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-10-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多