整个编译器架构 nonapass的核心思想就是每一个步骤只做很少的事情, 它有一个非常明确的目标
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])))
所以我们需要考虑这两种情况, 将这两种方式给区分开