【问题标题】:Would it be feasible to have a compiler directly/manually emit LLVM IR?让编译器直接/手动发出 LLVM IR 是否可行?
【发布时间】:2015-04-27 12:31:40
【问题描述】:

手动发出 LLVM IR 而不是使用 LLVM API/绑定是否可行?很少有语言具有 LLVM 绑定,而且它们通常已经过时或缺乏良好的文档,我真的很想避免使用 C++,因此直接发出 LLVM IR 可以让我使用我选择的语言 (F#)。

为了清楚起见,我希望编写自己的针对 LLVM 的小型编译器,这样我就可以使用 LLVM ARM 后端为 ARM Cortex M 微控制器生成代码。

【问题讨论】:

  • 可行是什么意思? LLVM 语言规范完整地定义了 IR,包括文本表示。据我所知,它已经稳定了很多年。几十年来,编译器一直在发布汇编代码。为什么这会从根本上有所不同?至于是否更可取 使用可能有问题的绑定,我认为归结为个人意见。
  • 那么手动发出 LLVM IR 是否比使用 API 需要更多的工作?我的意思是显然一切皆有可能,但问题是这是否是一个好主意。请记住,我以前从未编写过编译器,并且对 LLVM 完全陌生。
  • 抱歉,如果我觉得我很苛刻——那不是我的本意! :-) 我认为这是最好尝试的时代之一。我看不出为什么以文本形式发出 LLVM IR 比发出 x86-64 汇编代码要困难得多。如果您发现 F# LLVM 绑定的质量欠缺(或者根本没有),您最好生成文本表示。
  • 改用 C 绑定,它们现在非常全面。无需通过 C++。在 llvm-c 周围生成 p/invoke .net 包装器很简单,请参见此处的示例:github.com/combinatorylogic/clike/tree/master/llvm-wrapper(python cindex 用于解析 llvm-c 标头)
  • 这个问题不会简化为“LLVM IR 代码是否稳定”,例如跨版本?

标签: compiler-construction llvm llvm-ir


【解决方案1】:

对于一些可行的定义,是的。 Glasgow Haskell 编译器emits LLVM bitcodesee also——实际上可能对那个链接上的整个教程感兴趣)

在走这条路之前,您不妨考虑一些现有的解决方案:

【讨论】:

    【解决方案2】:

    如果您要连接到 f#,我建议为您需要的部件制作一个 c++/CLI 程序集。写出文本并重新解析它会更慢,具体取决于用例的大小,生成正确的文本并检查标识符名称有其自身的问题。

    【讨论】:

    • 老实说,我不明白你的意思;)你能澄清一下你的答案吗?我既不是 .Net 专家,也不是 VM 和编译器方面的专家,我最近才对该领域感兴趣,到目前为止,我所做的唯一一件与远程相关的事情就是编写一个小型堆栈机器。为了清楚起见,我意味着编写在 F# 中发出 LLVM IR 的编译器。
    • 当然,c++/CLI 是 Visual Studio 中的一种项目类型,您可以在其中创建 .NET 程序集,可用于任何 .NET 语言,包括 F#,它可以进行正常的 c++ 调用。这将允许您编写一个用于从 F# 中访问 LLVM 的包装器。正如有人指出的那样,LLVMSharp 项目似乎已经完成了这项工作,所以如果可能的话,我会使用他们的库来节省大量的样板工作。
    • 啊,非常感谢您的澄清。这解释了为什么我不理解您的评论,我从未使用过 VS(我使用 Mac OS X 并且以前使用过 Linux)。我将看看 LLVMSharp 项目。我应该说我已经决定推迟整个 LLVM 编译器的内容,因为我觉得我的知识还不够(我应该注意我目前还在上高中,所以我什至无法学习一门语言/compiler 类呢 ;) )。虽然我会一直对虚拟机/编译器领域感兴趣,所以我可能会在不久的将来回来;)
    猜你喜欢
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 2014-07-15
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多