数据流分析的理论部分(foundation)
这一部分李越老师用了两课时(第五课
,第六课
),讲的很仔细,将一些比较抽象的概念也解释的很清楚,收获很多,顺便做了笔记和一点从自己角度的理解,将比窘上传,方便之后需要时再看,也欢迎大家阅读以及批评指正。
1. 迭代算法(iterative algorithm)
主要由上节课的三个算法引出迭代算法,从另一个角度来分析算法,从而更深刻的理解该算法
常见的迭代算法会产生一个数据流分析的解(eg:可达定义的最后一次迭代的结果,就是数据流分析的一个解)
-
从另一个角度去看迭代算法
-
理论方面
理论1:给定一个CFG有k个点(个人理解为有k个程序点,或者就是BB),迭代算法会在每次迭代的时候,更新每个程序点的OUT[n]
理论2:设数据流分析中解的值域为V,那么可以定义一个k-元组: ( O U T [ n 1 ] , O U T [ n 2 ] , . . . O U T [ n k ] ) (OUT[n_1],OUT[n_2],...OUT[n_k]) (OUT[n1],OUT[n2],...OUT[nk])
它们是集合 ( V 1 × V 2 × . . . × V k ) (V_1 \times V_2 \times... \times V_k) (V1×V2×...×Vk)中的一个元素(该集合其实就是幂集),可以写为 V k V^k Vk,代表每次迭代后,整体的值
理论3:每一次迭代都可以看成一个 V k V^k Vk映射到一个新的 V k V^k Vk,通过转换函数和控制流来实现映射,可以将其抽象为一个函数: F : V k → V k F:V^k \to V^k F:Vk→Vk
理论4:算法不断迭代,直到相邻两次迭代的k-元组的值一样,算法就结束了
-
举例
这边可以引出:不动点的概念 x i = f ( x i ) x_i = f(x_i) xi=f(xi),就是不动点
-
-
根据上面的角度,我们提出问题:
- 算法是否能保证一定停止或者就是抵达一个不动点(到不动点,根据算法限制的条件,就是停止的了),或者算法总是能得出一个解?
- 如果算法可终止,是否只有一个解/一个不动点?如果有多个的话,我们的解是最优的吗?
- 什么时候算法能到达一个不动点,或者什么时候我们能得到一个解?
2. 偏序(partial order)
是数学概念
定义:给定一个偏序集poset,是一组 ( P , ⊑ ) (P,\sqsubseteq) (P,⊑),其中 ⊑ \sqsubseteq ⊑是一个定义在P上的二元关系,它必须要满足如下性质才能算是偏序关系:
- ∀ x ∈ P , x ⊑ x \forall x \in P,x \sqsubseteq x ∀x∈P,x⊑x:满足自反性,自己和自己是满足偏序关系的
- ∀ x , y ∈ P , x ⊑ y ∧ y ⊑ x ⇒ x = y \forall x,y \in P, x\sqsubseteq y\land y\sqsubseteq x \Rightarrow x = y ∀x,y∈P,x⊑y∧y⊑x⇒x=y:对称性,x是y的偏序,y是x的偏序,则x = y
- ∀ x , y ∈ P , x ⊑ y ∧ y ⊑ z ⇒ x ⊑ z \forall x,y\in P,x\sqsubseteq y \land y\sqsubseteq z\Rightarrow x\sqsubseteq z ∀x,y∈P,x⊑y∧y⊑z⇒x⊑z:传递性
举例:
三个条件依次判断:
(1)自反: 1 ≤ 1 , 2 ≤ 2 1\le 1,2\le 2 1≤1,2≤2,满足
(2)反对称: x ≤ y , y ≤ x x \le y,y \le x x≤y,y≤x,在整数中,很显然满足
(3)传递: 1 ≤ 2 , 2 ≤ 3 ⇒ 1 ≤ 3 1 \le 2,2\le 3 \Rightarrow 1\le 3 1≤2,2≤3⇒1≤3,满足
所以该关系满足偏序
如果条件改为 ⊑ 代 表 < \sqsubseteq 代表 < ⊑代表<,那么显然不满足
举例2:
三个条件依次判断
(1)自反:自己就是自己的子集,满足
(2)反对称:满足
(3)传递:in - sing,sing-singing => in - singing
该关系满足偏序
可以发现一个结论:偏序意味着集合中的两个元素可以不相互比较,即集合中不是任意两个元素都必须满足偏序关系的
举例3:也是满足偏序的
3. 上界和下界(upper and lower bounds)
给定一个偏序集 ( P , ⊑ ) (P,\sqsubseteq) (P,⊑),并且子集S满足 S ⊆ P S \subseteq P S⊆P
上界:如果 ∀ x ∈ S , x ⊑ u , 其 中 u ∈ P \forall x \in S, x\sqsubseteq u, 其中u\in P ∀x∈S,x⊑u,其中u∈P,那么u就是子集P的上界(就是子集S中的所有元素均满足 x ⊑ u x \sqsubseteq u x⊑u)
下界:如果 ∀ x ∈ S , l ⊑ x , 其 中 l ∈ P \forall x \in S, l\sqsubseteq x, 其中l\in P ∀x∈S,l⊑x,其中l∈P,那么l就是子集P的下界(就是子集S中的所有元素均满足 l ⊑ x l\sqsubseteq x l⊑x)
举例:对于如下的子集S,{a, b, c}就是S的上界;{ }就是S的下界
最小上界:least upper bound(lub 或者称为join),用 ⊔ S \sqcup S ⊔S表示
定义为:对于子集S的任何一个上界u,均有 ⊔ S ⊑ u \sqcup S \sqsubseteq u ⊔S⊑u
最大下界:greatest lower bound(glb 或者称为meet),用 ⊓ S \sqcap S ⊓S
定义为:对于子集S的任何一个下界l,均有 l ⊑ ⊓ S l \sqsubseteq \sqcap S l⊑⊓S
举例:
通常:如果S只包含两个元素a、b(S = {a, b})那么上界可以表示为 a ⊔ b a