指令选择技术全解析
一、平铺算法效率分析
在指令选择过程中,Maximal Munch和动态规划是两种常用的算法。我们先来分析它们的效率。
假设存在T种不同的“瓷砖”(tile),平均匹配的瓷砖包含K个非叶子(有标签)节点,K′ 是为了查看在给定子树中哪些瓷砖匹配而需要检查的最大节点数,这大致与最大瓷砖的大小相同。并且,平均每个树节点有T′ 种不同的模式(瓷砖)匹配。对于典型的RISC机器,我们可能期望T = 50,K = 2,K′ = 4,T′ = 5。
如果输入树中有N个节点,那么Maximal Munch算法只需要考虑N/K个节点的匹配情况。因为一旦在根节点进行了“咀嚼”(munch)操作,就不需要在瓷砖的非叶子节点进行模式匹配。为了找到在一个节点匹配的所有瓷砖,最多需要检查K′ 个树节点,并且使用复杂的决策树时,每个节点只会被检查一次。然后,需要比较每个成功匹配的成本,看是否是最小的。因此,每个节点的匹配成本为K′ + T′,总成本与 (K′ + T′)N/K 成正比。
动态规划算法则需要找到每个节点的所有匹配,所以其成本与 (K′ + T′)N 成正比。不过,由于动态规划需要两次遍历树,而不是一次,所以其比例常数比Maximal Munch算法高。
由于K、K′ 和T′ 是常数,所有这些算法的运行时间都是线性的。在实际应用中,测量表明这些指令选择算法的运行速度比真正的编译器执行的其他工作要快得多,甚至词法分析可能比指令选择花费更多的时间。
二、CISC机器特点及应对策略
现代典型的RISC机器具有以下特点:
1. 32个寄存器。
2. 只有一类整数/指针寄存器。