我想用 llvm 制作一门语言的编译器,是不是要学会 llvm ir 里的哪个奇怪的语法

2020-12-19 15:15:47 +08:00
 find456789

我的理解是,llvm ir 里的语法,应该也类似一门编程语言,但这个语言是针对大部分硬件平台通用的

我只要把我的编程语言,翻译成 llvm ir 里的语言, 就可以实现一门可以在大多数平台编译的语言了

所以,在我的语言里,我要实现 print("hello world"), 那我就要掌握 llvm ir 里,怎么实现 打印 hello word,

如果我要实现 定义一个函数的功能, 就要掌握 用 llvm ir 语言定义函数的方法

只有掌握了 llvm ir 语言, 才能实现这个翻译的过程

请问我的理解对吗? 我应该怎么办


下图是我发现的 llvm ir 的语言

如图

2085 次点击
所在节点    问与答
9 条回复
sfqtsh
2020-12-19 15:33:53 +08:00
ghostheaven
2020-12-19 15:41:55 +08:00
你需要的是实现 llvm 的前端,找本编译原理看看。
ghostheaven
2020-12-19 15:43:26 +08:00
当然 llvm 的 ir 也是要懂的
xiri
2020-12-19 15:46:26 +08:00
实现一门编程语言 /编译器并不是简单地“翻译”就够了。一般来说需要先进行词法分析、语法分析生成不依赖于具体文法和语言细节的 AST 树,然后在此基础上进行处理、优化,最后根据具体的平台 /系统生成目标代码。
不能简单的看成用一门已有的语言将新语言的功能一一对应翻译出来,建议还是去系统的学习一下编译原理比较好。
secondwtq
2020-12-19 16:23:00 +08:00
我想用 x86 制作一门语言的编译器,是不是要学会 x86 汇编里的哪个奇怪的语法
codehz
2020-12-19 16:58:23 +08:00
然而 llvm ir 没有帮你处理好 abi,也就是包括调用约定在内的还是得和各个具体平台对接
GeruzoniAnsasu
2020-12-19 17:17:47 +08:00
不完全是,你写代码的时候用的是 llvm 框架提供的 ir builder,它有自己的代码来生成对应的 byte code

但你自己的语言里,要将语言背后的数据结构(类似 PyObject 这种东西)做好定义,并且每个词法元素之间的相互作用也要自己实现,这是实现编译器很麻烦的一个地方。举个例子我想实现全 OO 语言,把所有词法元素都看做 MyLangObject 这很好,但 MyLangObject 的结构如何定义,内存如何分配,是否要调语言 Runtime 实现的 API,这些都是要提前考虑的,然后调用 Runtime 的内存分配这件事,你要用 byte code 实现出来
amimo
2020-12-19 17:23:12 +08:00
不需要。你使用的是 LLVM 提供 API 生成 IR,不需要预先学习这个 IR 的文本表示,但看懂它有助于调试你的前端。
因为 llvm ir 是 ssa 形式的,没有接触过可能还不好转,你可以考虑把你的语言先转成 C,控制流使用 goto,这步走通之后再使用 llvm 。
msg7086
2020-12-19 21:56:56 +08:00
不止是语言吧,还有运行时。你说的 print 是要真的有人写出来的。
你可以调用现有 C 运行时里的函数,也可以实现自己的版本。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/737049

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX