【问题标题】:What libraries would be useful for implementing a small language interpreter in C?哪些库可用于在 C 中实现小型语言解释器?
【发布时间】:2010-12-17 05:33:47
【问题描述】:

出于我自己的学习经验,我想尝试用 C 语言为简单的编程语言编写解释器——我认为我需要的主要是一个哈希表库,但数据结构和辅助函数的通用集合将是很有帮助。大家有什么推荐的?

【问题讨论】:

    标签: c interpreter


    【解决方案1】:

    libbasekit - 作者是 Io。你也可以使用 libcoroutine。

    【讨论】:

    • 似乎 Steve Dekorte 制作了几个对我非常有用的库 - 谢谢!
    【解决方案2】:

    我推荐研究的一个库是 libgca garbage collector for C

    您可以通过将调用 mallocreallocstrdup 等替换为对应的 libgc(例如 GC_MALLOC)来使用它。它通过扫描堆栈、全局变量和 GC 分配的块来工作,寻找可能是指针的数字。信不信由你,它实际上表现得相当好(几乎与 非常好 ptmalloc 相提并论,这是 GNU/Linux 中的默认(非垃圾收集)malloc 实现),并且很多程序都使用它(包括MonoGCJ)。但是,一个缺点是它可能无法与您可能想要使用的其他库很好地配合使用,您甚至可能必须手动重新编译其中一些以将对 malloc 的调用替换为 GC_MALLOC

    【讨论】:

      【解决方案3】:

      老实说 - 我知道有些人会因此而讨厌我 - 但我建议你使用 C++。你不必为了能够开始你的项目而鼓起勇气去学习它。只需像 C 一样使用它,但在一个小时内,您可以学习如何使用 std::map(关联容器)、std::string 来轻松处理文本数据,以及 std::vector 来实现可调整大小的堆-分配的数组。如果你想多花一两个小时,学会把成员函数放在类中(不要担心多态性、虚函数等),你会得到一个更有条理的程序。

      【讨论】:

      • 我以前用过 C++,它看起来很合适,但我只是习惯了听到很多关于它的坏话,所以我有点犹豫。不过,现在我想起来了,大多数 JavaScript 实现都是用 C++ 编写的,所以也许它毕竟不是那么糟糕:)
      • 不知道自己在说什么的人的坏话! C++本质上是带有附加工具的C;如果你不使用那些额外的工具,它不会比 C 更差。如果你正在实现一种编程语言,那么 std::stack 将对很多事情有用。
      • @Clifford:我不同意。当然,C++(几乎)是 C 的超集,但 C 代码与 C++ 代码非常不同。 C++ 采用与 C 非常不同的方法来完成任务。一旦决定使用 C++,就应该一直使用 C++,而不仅仅是编写 C 代码并从 C++ 中借用一些东西。混合使用 C 和 C++ 是编写糟糕代码的好方法。
      • @Fabian:我认为我们完全不存在分歧。我实际上并不是建议只使用 C++ 的 C 子集,只是指出它是一个更大的工具集,除非在坏人手中,否则它不会是坏的。不好的不是 C++,而是那些建议他的人很可能只是不擅长 C++(或者可能不了解 OOP)。我不同意“C 代码与 C++ 代码非常不同”,但是,我同意 OO 代码与过程代码不同,但这不是一回事。
      • @Clifford:我同意,C++ 本身并不坏。我想我误解了(不是双关语)你的评论。但是,让 C++ 代码与 C 代码不同的不仅仅是 OO。一旦你开始使用 stl 数据结构,你将不得不担心异常安全。这当然对代码也有影响(RAII),也使得 C++ 代码不同于 C 代码。
      【解决方案4】:

      对于具有简单结构的适当小型语言,您只需要标准库即可。解释语言中最复杂的部分可能是expression evaluation。为此,您需要了解和实现堆栈数据结构,过程调用和构造嵌套。

      上面链接中的代码是 C++,但是算法描述得很清楚,你可以很容易地用 C 重新实现它。同样,没有使用 C++ IMO 的有效论据很少。

      【讨论】:

        【解决方案5】:

        在深入研究要使用的库之前,我建议您了解语法和编译器设计。尤其是输入解析对于编译器和解释器来说是类似的,即分词和解析。标记化过程将流字符(您的输入)转换为标记流。解析器获取此标记流并将其与您的语法匹配。

        您没有提及您正在为哪种语言编写解释器。但很可能该语言包含递归。在这种情况下,您需要使用所谓的自底向上解析器,您无法手动编写该解析器,但需要生成该解析器。如果您尝试手动编写这样的解析器,最终会导致容易出错的混乱。

        如果您正在为 posix 平台开发,那么您可以使用 lex 和 yacc。这些工具有点老,但对于构​​建解析器来说非常强大。 Lex 可以生成实现标记化过程的代码,而 yacc 可以生成自底向上的解析器。

        我的回答提出的问题可能比它回答的要多。这是因为编译器/解释器领域非常复杂,不能简单地用简短的回答来解释。买一本关于编译器设计的好书。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-11
          • 2010-09-14
          相关资源
          最近更新 更多