Compiler construction 让编译器直接/手动发出LLVM IR是否可行?

Compiler construction 让编译器直接/手动发出LLVM IR是否可行?,compiler-construction,llvm,llvm-ir,Compiler Construction,Llvm,Llvm Ir,手动发出LLVM IR而不是使用LLVM API/绑定是否可行?很少有语言有LLVM绑定,它们通常是过时的或缺少好的文档,我真的希望避免C++,所以直接发射LLVM IR将允许我使用我的选择语言(Fα)。 为了明确起见,我希望编写自己的针对LLVM的小编译器,这样我就可以使用LLVM ARM后端为ARM Cortex M微控制器生成代码。如果您连接到f#,我建议为您需要的部件制作一个c++/CLI程序集。根据用例的大小,写出文本并重新分析它的速度较慢,生成正确的文本并检查标识符名称也有其自身的问

手动发出LLVM IR而不是使用LLVM API/绑定是否可行?很少有语言有LLVM绑定,它们通常是过时的或缺少好的文档,我真的希望避免C++,所以直接发射LLVM IR将允许我使用我的选择语言(Fα)。
为了明确起见,我希望编写自己的针对LLVM的小编译器,这样我就可以使用LLVM ARM后端为ARM Cortex M微控制器生成代码。

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

对于可行的一些定义,是的。格拉斯哥哈斯克尔编译器(--该链接上的整个教程实际上可能很有趣)

<>在走下这条路之前,你可能想考虑一些现有的解决方案:


你所说的可行是什么意思?LLVM语言规范完整地定义了IR,包括文本表示。据我所知,它已经稳定多年了。编译器几十年来一直在发出汇编代码。为什么会有根本性的不同?至于使用可能有缺陷的绑定是否更可取,我认为这取决于个人观点。手动发出LLVM IR是否比使用API做更多的工作?我的意思是,显然一切都是可能的,但问题是这是否是个好主意。请记住,我以前从未编写过编译器,而且我对LLVM完全是新手。如果我的理解过于苛刻,我深表歉意-这不是我的初衷!-)我认为这是最好的尝试之一。我看不出为什么以文本形式发出LLVM IR比发出x86-64汇编代码要困难得多。如果您发现F#LLVM绑定的质量不高(或者根本没有),那么最好生成文本表示。使用C绑定,它们现在已经相当全面了。无需通过C++。围绕llvm-c生成p/invoke.net包装器很简单,请参见这里的一个示例:(python cindex用于解析llvm-c头)这个问题不归结为“llvm IR代码稳定吗”,例如跨版本吗?老实说,我不明白你的意思;)你能澄清一下你的答案吗?我既不是.Net专家,也不是VM和编译器方面的专家,我只是最近才对这个领域感兴趣,到目前为止,我做的唯一一件与远程相关的事情就是编写一个小型堆栈计算机。我的意思是要编写以F#格式发出LLVM IR的编译器。当然,C++ + CLI是VisualStudio中的一种项目类型,在其中可以创建.NET程序集,可以使用任何包括.f的.NET语言,它可以生成普通的C++调用。这将允许您编写从F#中访问LLVM的包装器。不过,正如有人指出的那样,LLVMSharp项目似乎已经完成了准备工作,所以如果可能的话,我会使用他们的库来节省大量的样板工作。啊,非常感谢您的澄清。这解释了为什么我不理解你的评论,我从来没有使用过VS(我使用MacOSX,以前使用过Linux)。我将看一下LLVMSharp项目。我应该说,我已经决定推迟整个LLVM编译器的课程,因为我觉得我的知识还不够渊博(我应该注意,我目前还在上高中,所以我甚至还没能参加语言/编译器课程;)。尽管我始终对VM/编译器领域感兴趣,所以我可能会在不久的将来回来;)