一、例子
之后的所有讲解,都是基于这个例子的,所以在头部统一列出
假定某消费者购房需要贷款 30 万元,期限为 30 年,已知贷款年利率为 5.1%,问每月应还款多少?
符号约定如下
符号 | 释义 |
---|---|
$Q$ | 贷款总额(本金),此例为 30 万元 |
$N$ | 还款期限,此例为 30 年 |
$r$ | 利率 |
$y_i$ | 第 $i$ 个月的欠款总额 |
$x_i$ | 第 $i$ 个月的还款 |
行列式(determinant)可以看做在多维空间上的向量组形成“有向体积”,这种认识可以辅助我们理解一些性质:
可以利用行列式求解四边形面积、六棱锥体积。
交换构成行列式的向量,并不会改变行列式的绝对值,而可能会改变行列式的正负。这是因为改变边的顺序不会影响体积。
一旦有一行或者一列为 0,或者这个方阵没有满秩,就会导致行列式为 0。某一个向量为 0,肯定会导致体积为 0,当没有满秩,就说明有两条“边”方向重合了,也会导致体积为 0。
将一行(列)的 $k$ 倍加进另一行(列)里,行列式的值不变。类似于固定了底面和高,其实第三条楞只要在平行于底面的边上变化,就不会导致体积的改变
在行列式中,某一行(列)有公因子 $k$,则可以提出 $k$。类似于一条边的倍数发生变化的时候,会导致体积的倍数发生相同的变化。
运行时存储组织与管理要回答的问题是
函数在内存中是如何表示的
他们在内存中如何放置,如何管理(这里面有个专题是垃圾回收机制)
.data
的处理需要压缩文法包括两种:
关于优化,真的是一个令人生畏的事情,大致来说,一个优化分为两个部分:
- 分析
- 改写
但是在课程中大多只交第一个部分,而不讲第二个部分,这就导致一种“无意义性”,如果分析不能用于改造程序,那么就没有什么学习的动力。所以如果想要学好理论,那么必须要有一个宏观的角度去看发生的一切事情。
按照 《Engineering a Complier》的观点,按照优化的范围去给优化分类,大致可以分为以下四类
类型 范围 举例 局部优化 限制在某个基本块中 公共子表达式提取,局部值编号,树高平衡,窥孔优化 区域性优化 某几个有联系的基本块 循环展开 全局优化(过程内优化) 组成一个完整过程的基本块 图着色寄存器分配 过程间优化 多个过程 函数内联,过程间常数传递 至于为什么有这么多分类,是因为优化是一个很严谨而且需求具有多样性的事情,不同的范围对应的条件和限制是不一样的,那么可以进行优化的力度和策略也就是不一样的。
对于局部优化,因为它在一个基本块内,所以有两个极好的性质可以应用
- 语句是顺序执行的。
- 如果一条语句被执行,那么整个基本块的语句都会被执行。
从某种意义上讲,基本块让人们不再直面指令,而是变成面对一个数据流图。
而其他三种方法,都需要建立在对于 CFG 图上,也就是说,首先就是分析 CFG 图。另外还有一段话很有意思:
在进行区域性优化的时候,我们可以考虑通过某种图论性质定义的 CFG 子集,比如说支配图或者强联通分量。
通过一道题来介绍一下分法,不过介绍之前,还是说一下,此时的代码一定是 ir 了,但是对于课设用到的是那种 ir 呢?应该是某种神秘的四元式(这里插一嘴,llvm 也可以被认为成一种神秘四元式,即只有一小部分指令有大于 2 个的操作数)。
有三条规则: