我的理解是,llvm ir 里的语法,应该也类似一门编程语言,但这个语言是针对大部分硬件平台通用的
我只要把我的编程语言,翻译成 llvm ir 里的语言, 就可以实现一门可以在大多数平台编译的语言了
所以,在我的语言里,我要实现 print("hello world"), 那我就要掌握 llvm ir 里,怎么实现 打印 hello word,
如果我要实现 定义一个函数的功能, 就要掌握 用 llvm ir 语言定义函数的方法
只有掌握了 llvm ir 语言, 才能实现这个翻译的过程
请问我的理解对吗? 我应该怎么办
下图是我发现的 llvm ir 的语言
如图
1
sfqtsh 2020-12-19 15:33:53 +08:00 via Android
|
2
ghostheaven 2020-12-19 15:41:55 +08:00 via Android
你需要的是实现 llvm 的前端,找本编译原理看看。
|
3
ghostheaven 2020-12-19 15:43:26 +08:00 via Android
当然 llvm 的 ir 也是要懂的
|
4
xiri 2020-12-19 15:46:26 +08:00
实现一门编程语言 /编译器并不是简单地“翻译”就够了。一般来说需要先进行词法分析、语法分析生成不依赖于具体文法和语言细节的 AST 树,然后在此基础上进行处理、优化,最后根据具体的平台 /系统生成目标代码。
不能简单的看成用一门已有的语言将新语言的功能一一对应翻译出来,建议还是去系统的学习一下编译原理比较好。 |
5
secondwtq 2020-12-19 16:23:00 +08:00 via iPhone
我想用 x86 制作一门语言的编译器,是不是要学会 x86 汇编里的哪个奇怪的语法
|
6
codehz 2020-12-19 16:58:23 +08:00 via Android 1
然而 llvm ir 没有帮你处理好 abi,也就是包括调用约定在内的还是得和各个具体平台对接
|
7
GeruzoniAnsasu 2020-12-19 17:17:47 +08:00 1
不完全是,你写代码的时候用的是 llvm 框架提供的 ir builder,它有自己的代码来生成对应的 byte code
但你自己的语言里,要将语言背后的数据结构(类似 PyObject 这种东西)做好定义,并且每个词法元素之间的相互作用也要自己实现,这是实现编译器很麻烦的一个地方。举个例子我想实现全 OO 语言,把所有词法元素都看做 MyLangObject 这很好,但 MyLangObject 的结构如何定义,内存如何分配,是否要调语言 Runtime 实现的 API,这些都是要提前考虑的,然后调用 Runtime 的内存分配这件事,你要用 byte code 实现出来 |
8
amimo 2020-12-19 17:23:12 +08:00 1
不需要。你使用的是 LLVM 提供 API 生成 IR,不需要预先学习这个 IR 的文本表示,但看懂它有助于调试你的前端。
因为 llvm ir 是 ssa 形式的,没有接触过可能还不好转,你可以考虑把你的语言先转成 C,控制流使用 goto,这步走通之后再使用 llvm 。 |
9
msg7086 2020-12-19 21:56:56 +08:00
不止是语言吧,还有运行时。你说的 print 是要真的有人写出来的。
你可以调用现有 C 运行时里的函数,也可以实现自己的版本。 |