5

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

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

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

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

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

4

8 回答 8

10

我从不后悔使用 Lua。

它很容易嵌入到您的应用程序中。事实上,现在我通常不写 C 应用程序,我只是写 C 库并从 Lua 控制它们。

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

于 2009-08-15T03:55:08.010 回答
5

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)

这里展示的一些功能:

  • 字符串扫描的转义字符是%,它不同于字符串引用的转义字符,即\. 这个决定很聪明,应该自己获奖:-)

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

如果你想要一个上下文无关解析器的全部功能,你总是可以使用LPEG,一个由 Lua 的设计者之一编写的库。

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

Lua 不断获得性能奖。启动速度快如闪电:整个系统(包括编译器、库、垃圾收集器和运行时系统)只有 150KB。为了避免暂停时间,Lua 提供了增量垃圾回收。另请参阅 SO 问题为什么 Lua 比其他脚本语言更快?

您可以通过预编译脚本来加快启动速度,但我从未发现有必要这样做——而且由于编译后的代码(相对于源代码)不可移植,预编译通常比它解决的问题更令人头疼。

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

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

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

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

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

请参阅 SO 问题 哪种游戏脚本语言更适合使用:Lua 还是 Python?.

于 2009-08-15T15:49:25.173 回答
3

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

于 2009-08-15T03:59:17.580 回答
3

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

将 tcl 与其他编程语言区分开来的一件事是一切都是字符串。

供您参考,这里是关于字符串函数的 tcl 文档

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

无论如何,这里是关于在 C 应用程序中嵌入 tcl 的 tcl wiki 链接,以及该页面的相关引用:

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


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

一旦将 Lua 编译到应用程序中,就可以将 C 函数“扩展”到 Lua 的解释器。或者也许内置的字符串函数对你来说已经足够了。

你当然有几个选择。

于 2009-08-15T03:41:59.533 回答
3

关于各种脚本语言的嵌入 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,但我听说它是​​为嵌入而设计的。

于 2009-08-15T11:02:04.560 回答
1

有些人可能不同意,但Sara Goleman已经出版了一本关于扩展和嵌入 PHP 的好书。这正在成为周围使用最广泛的语言之一...... :)

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

我有没有提到它是用 C 编写的?</my2cents>

于 2009-08-15T07:01:58.663 回答
1

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

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

于 2009-08-15T07:10:23.763 回答
0

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

于 2009-08-15T03:37:18.217 回答