【问题标题】:Bootstrapping a language on LLVM在 LLVM 上引导语言
【发布时间】:2011-01-01 19:30:16
【问题描述】:

我正在 LLVM 之上引导一个编程语言编译器。目前,我主要为 C 的一个子集编写了一个编译器,该子集是自编译的。完成后,我将引导我的语言远离 C,同时保持自编译。

由于编译器是自编译的,所以我使用的任何 C 功能都必须实现。所以这是一个恒定的平衡:如果我使用了太多的功能,我将不得不实现比我想要的更多的功能,但如果我没有实现足够的功能,则很难编写代码。

其中一个功能是 LLVM 绑定。在没有 LLVM C 绑定的情况下生成 LLVM 中间表示是很困难的。但是,如果我使用 LLVM 绑定,当我从 C 分支出来时,我必须再次实现它们。

我在这里遇到了一些困难,所以我正在寻找替代解决方案。有什么想法吗?

【问题讨论】:

  • 你用什么编写编译器? C?那么你是在使用 LLVM 进行机器代码编译吗?
  • 我的编译器是用它编译的 C 子集编写的。对不起,我没有解释清楚。我目前的计划是将 LLVM 中间表示写到一个文件中,然后使用 LLVM 来编译它,但这很复杂,我正在寻找一个更干净的解决方案。
  • LLVM 是后端的绝佳选择,顺便说一下。我很幸运。

标签: c llvm bootstrapping


【解决方案1】:

您可以使用 LLVM C 绑定,但这需要您的语言足够理解 C 才能做到这一点。

另一种选择是写出 LLVM 汇编语言(文本文件)并使用 llvm-as 将其转换为位码。


编辑:

我重新阅读了您的问题,我认为您已经了解 llvm-as 与绑定的东西。

您的语言可能希望能够绑定到 C 以获取支持库等。现在使用 C 绑定,并在您进一步了解时编写自己的绑定。

【讨论】:

  • 我没有考虑到 C 绑定可能是一个 临时 解决方案。好主意。
【解决方案2】:

【讨论】:

  • 我喜欢 ANTLR 和 StringTemplate!
【解决方案3】:

在某些时候,您可能想要提供一个 API 来将 C 库包装为扩展模块。 LLVM 可能已经支持这个(我知道 parrot vm 支持)。为什么不使用任何你用来包装 LLVM 自己的 API 的扩展系统呢?他们也可能已经支持这一点。 :)

【讨论】:

    猜你喜欢
    • 2013-10-29
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 2011-03-02
    • 2015-04-05
    • 2011-12-16
    • 2012-05-03
    • 2022-07-30
    相关资源
    最近更新 更多