写点什么

缺少的一环 中间表达式

作者:Miracle
  • 2025-09-24
    四川
  • 本文字数:928 字

    阅读完需:约 3 分钟

缺少的一环 中间表达式

要想高效的执行这个 Statement 的 集合,我们缺少一个关键的环节

那么缺少的是什么呢?

缺少的是符号表。

大家可以看到这里面有很多 value 文字的值,有很多 identity。就是符号,然后我们所有的操作语句中的操作包括表达式里面的那个所处理的这个表达式的成员,比如说赋值。都是针对这个。

Ident 是合法的字符串,首先字符串本身的处理。是非常低效的。

第二,对于底层硬件来说是没有字符串的概念的。对吧?底层的硬件里面只有存储区的地址,只有寄存器的编号。只有这些东西。

所以我们如果直接抽象执行这种包括把它 target 就是把它把它编译成这个目标代码的时候生成,

我们叫 generate,叫生成。生成目标代码的时候,直接使用符号去生成是非常低效的。

所以我们就需要一个中间形式。通常意义上来讲,比如说我们现在讲的是编辑的后端啊,呃,比较多的编辑后,大家还比较呃比较熟悉的是 lvm。这个后端,那么这是一个它是个标准的中间语言。

包括那个 shader 写 shader 的语言叫做 spirv,包括给那个英伟达 GPU 编程的那个中间语言叫 ptx

这些中间语言相当于是直接面对硬件层次,所以我们还需要在我们的抽象语法树 AST 和最终的就是可以直接去执行的机器代码。或者是交给那个后端,就就是所谓的 LLVM 。那个 target 目标生成器。生成字节码,

因为我们没有必要去了解这个机器的字节码是我们针对他这种就是

所谓的静态单赋值的这种架构 SSA 。系针对它生成中间语言。所以我们还需要一个中间表达式,就是能够把里面的符号信息全部去掉。完成寄存器的分配或者是叫变量的分配。

在语法这一层级就 ast 这个完成之后的中间表达。生成中间表达之后,然后就可以一一对应的翻译成为我们想要面对的那个目标平台的。这中间的中间表达,比如说 lvm 比如 PTX 是非常细节 面向硬件的。

所以我们接下来要做的是什么呢?我们要做的是一个编译。这种编译不是说是通常意义上的编译,是把 AST 编译到一个面向那个平台中间码的。这样一个中间表达形式。就是这里面最重要的是完成一个抽象的符号分配,就把所有的 AST 的 statement 里面所有的符号给拿掉。只是用编号或者是在我们内部的一个寄存器表达式来代替,这样的话就是可以最终可以实现非常高效的这个代码生成。


我们需要 在 抽象 语法树 面向机器的 中间代码之间 加上一层 面向 AST 的中间表达



用户头像

Miracle

关注

三十年资深码农 2019-10-25 加入

还未添加个人简介

评论

发布
暂无评论
缺少的一环 中间表达式_Miracle_InfoQ写作社区