龙书TAC说明书(三地址码)



我写的程序是翻译成英文的,我所有的相关知识都来自龙书。但是当我试图为数组成员引用和结构成员引用编写代码时,我有一些疑问。

在c语言中,x=arr[i]本质上相当于x= *(arr+i),即arr的基地址加上偏移量。

然而,在tac中,也存在x=*y和*x=y这样的指令,所以在实践中我们是否可以用后者来代替前者?我想知道在龙书中,x=arr[I]或arr[I]=x是理论的还是写作的而不是实践的。对于以下tac:

before: x = arr[i];//龙书使用

after: t1 = arr+i;//计算addr

x=*t1;//加载mem(t1)到x

最后,如果可以,如何表示后者?我们是否需要添加Load/Store IR?

一般来说,您将需要在中间表示中使用load/store指令。

龙书似乎引入了这种数组下标符号,作为IR中load/store操作的一种糖。考虑书中的例2.20:

a[i] = 2 * a[j-k]

归一化为

t3 = j - k
t2 = a[t3]
t1 = 2 * t2
a[i] = t1

转换为三地址代码(或类似的IR)的一个被低估的点是,复杂的表达式被分解;所有中间计算都有名称(例如上面转换示例中引入的临时值),所有操作数都很简单(它们要么是变量,要么是常量)。这是转换为TAC IR的更重要的方面,因为x[y] = zz = x[y]的操作数的原子性质可以更容易地为它们选择相应的load/store目标指令。

龙书选择保留数组下标表示法似乎纯粹是为了表示的一致性。稍后在本书中(见例2.80),这些IR指令树被平铺成相应的load/store ("LD/ST ")指令。

学术界经常出现的一个非常简单的指令集是"Schizo-Jouette"(https://pages.cpsc.ucalgary.ca/~罗宾/类/510/jouette.pdf)。在这方面,一本比龙之书更实用的书是Andrew Appel的《Modern Compiler Implementation in ML/Java/c》,它展示了Schizo-Jouette树匹配方案,并向读者解释了如何使用最大咀嚼树匹配来执行指令选择。

最新更新