嵌入式语言,具有良好的字符串操作支持

时间:2009-08-15 03:33:46

标签: c string embed

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

哪种语言能够提供最佳的字符串操作支持,同时易于嵌入C程序中?

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

  • 性能非常重要(尤其是启动时间)
  • 需要在多个平台上轻松编译(Linux,Solaris,Win32(理想情况下是MinGW),Darwin)
  • 需要成为一种在5年后仍然存在的语言

我看了一点Python(也许是太重了?)和Lua(也许并不专注于字符串操作?)但是对它们不太了解或者其他选择可能会有什么。

8 个答案:

答案 0 :(得分:10)

我从不后悔使用Lua。

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

文本操作不是它的最佳功能,但它肯定比单独使用C好得多。并且LPEG库使得构建解析器几乎变得非常容易,使任何正则表达式都变得羞耻(但如果你喜欢它们,仍然有一些类似正则表达式的语法)。

答案 1 :(得分:4)

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,但对它们的了解不够充分

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

答案 2 :(得分:3)

人们已经将tcl嵌入到较大的项目中,看似年龄。已经有一段时间了,因为我不得不使用tcl做任何事情......

将tcl与其他编程语言区分开来的一个原因是所有都是一个字符串。

供您参考,这是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 14-Oct-2002)


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

将Lua编译到应用程序后you can "extend" C functions to Lua's interpreter。或者the built-in string functions也适合你。

你当然有几个选择。

答案 3 :(得分:3)

我们查看了Python和Lua的.NET产品脚本。目标是为最终用户提供一些可编程性。这个决定归结为Python,因为权力 - 在微软支持其他任何东西时都是首选。我的选择是Lua。

答案 4 :(得分: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,令人讨厌的语言。嵌入式SAPI实际上是一个二等公民,但确实有效。有很多字符串操作函数。不过,我不推荐它。
  • Perl:讨厌嵌入(据我所知),字符串支持可能更好。

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

答案 5 :(得分:1)

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

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

我提到它是用C写的吗? < / my2cents>

答案 6 :(得分:1)

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

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

答案 7 :(得分:0)

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