编译器后端pass

59 阅读1分钟

整个编译器架构 nonapass的核心思想就是每一个步骤只做很少的事情, 它有一个非常明确的目标

Snipaste_2023-11-05_12-55-02.png

uniquify

首先是uniquify, 在这个阶段我们主要做的就是将每一个变量转化成SSA的形式

(let ([x 32])
    (let ([y 10])
     (+ x y)))

(let ([x.1 32])
    (let ([y.1 10])
        (+ x.1 y.1)))

也就是在每一个变量出现的地方, 然后给它改名, 我们先创建一个环境, 然后在环境中进行改名字

remove the complex operate

(+ (+ 42 10) (- 10))

(let ([tmp.1 (+ 42 10)])
    (let ([tmp.2 (- 10)])
        (+ tmp.1 tmp.2)))

但是碰到一个问题:

(let ([a 42]
    (let ([b a])
        a)))

;;上面这个东西首先应该转化成为下面这个
(let ([a 42])
    (let ([b a])
        a))

;;而不是转换成为
(let ([tmp1 42])
    (let ([a tmp1])))

所以我们需要考虑这两种情况, 将这两种方式给区分开