V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
find456789
V2EX  ›  问与答

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

  •  
  •   find456789 · 2020-12-19 15:15:47 +08:00 · 2121 次点击
    这是一个创建于 1469 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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


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

    如图

    image.png

    9 条回复    2020-12-19 21:56:56 +08:00
    sfqtsh
        1
    sfqtsh  
       2020-12-19 15:33:53 +08:00 via Android
    ghostheaven
        2
    ghostheaven  
       2020-12-19 15:41:55 +08:00 via Android
    你需要的是实现 llvm 的前端,找本编译原理看看。
    ghostheaven
        3
    ghostheaven  
       2020-12-19 15:43:26 +08:00 via Android
    当然 llvm 的 ir 也是要懂的
    xiri
        4
    xiri  
       2020-12-19 15:46:26 +08:00
    实现一门编程语言 /编译器并不是简单地“翻译”就够了。一般来说需要先进行词法分析、语法分析生成不依赖于具体文法和语言细节的 AST 树,然后在此基础上进行处理、优化,最后根据具体的平台 /系统生成目标代码。
    不能简单的看成用一门已有的语言将新语言的功能一一对应翻译出来,建议还是去系统的学习一下编译原理比较好。
    secondwtq
        5
    secondwtq  
       2020-12-19 16:23:00 +08:00 via iPhone
    我想用 x86 制作一门语言的编译器,是不是要学会 x86 汇编里的哪个奇怪的语法
    codehz
        6
    codehz  
       2020-12-19 16:58:23 +08:00 via Android   ❤️ 1
    然而 llvm ir 没有帮你处理好 abi,也就是包括调用约定在内的还是得和各个具体平台对接
    GeruzoniAnsasu
        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 实现出来
    amimo
        8
    amimo  
       2020-12-19 17:23:12 +08:00   ❤️ 1
    不需要。你使用的是 LLVM 提供 API 生成 IR,不需要预先学习这个 IR 的文本表示,但看懂它有助于调试你的前端。
    因为 llvm ir 是 ssa 形式的,没有接触过可能还不好转,你可以考虑把你的语言先转成 C,控制流使用 goto,这步走通之后再使用 llvm 。
    msg7086
        9
    msg7086  
       2020-12-19 21:56:56 +08:00
    不止是语言吧,还有运行时。你说的 print 是要真的有人写出来的。
    你可以调用现有 C 运行时里的函数,也可以实现自己的版本。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1170 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 18:14 · PVG 02:14 · LAX 10:14 · JFK 13:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.