【问题标题】:What language should we use to let people extend our terminal/sniffer program?我们应该使用什么语言来让人们扩展我们的终端/嗅探器程序?
【发布时间】:2010-08-20 19:11:42
【问题描述】:

我们有一个非常通用的终端/嗅探器应用程序,它可以通过 TCP、UDP 和串行连接执行各种操作。

我们希望使其可扩展——即允许人们编写自己的协议解析器、荧光笔等。

我们创建了一种类似 C 的语言来扩展产品,然后发现对于一些编码人员来说,这会带来陡峭的学习曲线。

我们现在正在思考这个问题:我们应该坚持使用 C 还是使用 Ruby 或 Lua 之类的东西?

C 非常适合低级的东西(比如解析二进制数据),因为它支持指针。但正是由于这个原因,它可能很难学习。

Ruby(等)很容易学习,但没有指针,所以任何与解析二进制数据有关的事情都会很快变得丑陋。

你怎么看?用于扩展解析二进制数据的产品——Ruby/Lua 还是 C/C++?

如果你能在回复时提供一些背景信息,那就太好了——尤其是如果你做过类似的事情。

【问题讨论】:

    标签: c plugins lua terminal sniffer


    【解决方案1】:

    Wireshark,“世界上最重要的网络协议分析器”,也是一个数据包嗅探器/分析器,以前也称为 Ethereal。它使用 Lua 来编写自定义解析器和水龙头,请参阅the manual

    但是,请注意,我没有使用过它,所以我不知道这个 API 有多好/有效/容易学习。

    【讨论】:

      【解决方案2】:

      与 TCL 一样,Lua 旨在与应用程序紧密集成。就个人而言,我发现 Lua 的语法和习语比 TCL 更容易处理。

      Lua 易于与现有系统集成,并且易于扩展。创建安全沙箱也相当容易,用户提供的代码可以在其中运行,而无需完全访问您的产品内部。

      【讨论】:

        【解决方案3】:

        如果您编写了 API,是否会有所不同?使用类 C API 的人只需了解按值传递或引用传递之间的区别。

        【讨论】:

        • 也许我没有完全准确。我的意思是我们已经编写了一种语言,但我们觉得这可能太难了,并且正在考虑改用另一种语言——但不确定。我会相应地更新问题。
        【解决方案4】:

        你的核心做一件事非常好,很好。就这样吧。我认为您应该创建一个基于 std in/out 的 API,就像良好的 unix 设计方式一样。然后任何人都可以使用任何选择的语言对其进行扩展。

        【讨论】:

        • 使用标准输入/标准输出的 IME(根据我的经验)控制不够可靠。 GNU chess、GNU gdb、Mplayer 使用它,有时当两侧(前端和后端)不同步时会导致问题。可能类似于标准输入/标准输出,但基于消息/分隔的文件描述符(AF_UNIX + SOCK_DGRAM),而不是默认的流式描述符。
        【解决方案5】:

        Tcl 的设计目标是允许为 C 程序编写脚本,因此实现起来会容易得多。

        http://en.wikipedia.org/wiki/Tcl#Interfacing_with_other_languages

        【讨论】:

        • 但是Tcl本身支持解析二进制数据吗?
        • 我不知道。但无论如何,您可以用 C 编写解析函数并从 Tcl 调用它们。
        【解决方案6】:

        我赞同约翰的想法。虽然过去当我不得不做这样的事情时,我坚持 C 语言 API 和人们只能使用 C 语言。但现在我看着它, 我意识到如果我们按照 Johan 描述的方式进行操作会更有效率

        PS:巧合的是,它是一个使用数据包嗅探器的协议测试应用

        【讨论】:

        • 问题是 API 非常深入地与我们的产品挂钩,包括更改 UI、创建屏幕按钮等,以及分析数据包。因此,我认为提供 IO 接口对于 GUI 部分来说并不是一个很好的解决方案。除非我错过了什么。
        • 我明白了。那么在这种情况下最好保持原样,因为要为开发人员提供增强功能,您可能会破坏核心部分。但是,如果您选择任何其他语言,对此没有足够了解的人可能会遇到同样的问题。结论,在我看来坚持 c/c++
        • 谢谢!感谢您的反馈。
        【解决方案7】:

        perl、sed、awk、lex、antler……这些是我比较熟悉的语言,我想用这些语言编写类似的东西。不过,这取决于数据流。

        真的很难说什么是正确的使用方法。我认为其他人没有提到的是要记住脚本会有错误。设计这样的东西很容易,这样脚本中的错误(尤其是运行时错误)要么只是显示“脚本错误”,要么杀死整个系统。

        您应该保持脚本应该是可单元测试的,并且失败应该是可重现的。

        【讨论】:

        • 这是一个很好的观点——绝对应该考虑调试。这实际上是选择“简单”语言的另一个原因,因为我认为 C 代码更容易以令人惊讶的方式搞砸(尤其是在涉及指针时)。
        【解决方案8】:

        我认为你做什么并不重要,只要你做一件事,放弃内部语言。听起来您选择将 C 变成脚本语言。我看到的一个问题是 C 程序员看起来很熟悉,但不一样。我无法想象您已经模仿了 C 的语义,这会使现有的 C 程序员感到舒适。而且正如您所提到的,其他人会发现很难学习。

        我工作的公司开发了自己的语言。它使用 XML 作为结构,因此解析很容易。语言“按需”增长。这意味着如果缺少某个功能,那么它将被添加。我很确定它从 XML 数据库变成了需要控制流的东西。但我的观点是,如果您不考虑将其构建为一种语言,那么您将无意中限制用户可以使用它做的事情。

        就我个人而言,我一直在研究如何让公司开始利用 Lua。特别是 Lua 有几个原因。 Lua 是作为一种通用的扩展语言而开发的。它可以轻松地与包括 Python 和 Ruby 在内的语言交互。非程序员使用它既小又简单(在您的情况下并不真正需要)。它可以简单地替换 XML、INI... 进行配置设置,并且功能强大到可以替换另一种编程语言。

        http://www.lua.org/spe.html

        【讨论】:

          猜你喜欢
          • 2010-12-27
          • 1970-01-01
          • 2011-05-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-06
          • 2013-08-11
          • 1970-01-01
          相关资源
          最近更新 更多