150 likes | 341 Views
第 3 章 控制流分析. 内容概述 定义一个函数式编程语言,变量可以指称函数 以 dynamic dispatch problem 为例(作为参数的函数被调用时,究竟执行的是哪个函数) 规范该控制流分析问题,定义什么是可接受的控制流分析 定义可接受分析在语义模型上的可靠性 讨论分析算法(语法制导、集合约束求解) 加上数据流分析 加上上下文信息. 第 3 章 控制流分析. 函数的不动点 若 f ( x ) = x ,则 x 是函数 f 的不动点 求解含函数变量 f 的方程
E N D
第3章 控制流分析 • 内容概述 • 定义一个函数式编程语言,变量可以指称函数 • 以dynamic dispatch problem为例(作为参数的函数被调用时,究竟执行的是哪个函数) • 规范该控制流分析问题,定义什么是可接受的控制流分析 • 定义可接受分析在语义模型上的可靠性 • 讨论分析算法(语法制导、集合约束求解) • 加上数据流分析 • 加上上下文信息
第3章 控制流分析 • 函数的不动点 • 若f(x) = x,则x是函数f 的不动点 • 求解含函数变量f 的方程 f = n. if n=0 then 1 else n f(n 1) end • 看成找下面函数的不动点 F f. n. if n=0 then 1 else n f(n 1) end F(阶乘函数) = 阶乘函数 • 该函数只有唯一的不动点 阶乘函数
第3章 控制流分析 • 函数的最小不动点 • 求解含函数变量f 的方程 f = n. if n=0 then 1 else if n = 1 then f(3) else f(n 2) end • 相应高阶函数有无数个不动点 当n是偶数时,结果是1 当n是奇数时,结果是a( a可以任取 ) • 最小不动点 n为偶数时, 结果是1; n为奇数时, 结果未定义
第3章 控制流分析 • 函数最小不动点的计算 • 例:F f. n. if n=0 then 1 else n f(n 1) end • lfp(F) = Fn() (n = 0, 1, …) • F0() = (表示处处无定义的函数) • F1() = F(F0()) = ( f. n. if n = 0 then 1 else n f(n 1) end ) = n. if n = 0 then 1 else n (n 1) end = {0, 0!}
第3章 控制流分析 • 函数最小不动点的计算 • 例:F f. n. if n=0 then 1 else n f(n 1) end • lfp(F) = Fn() (n = 0, 1, …) • F2() = F(F1()) =( f. n. if n=0 then 1 else n f(n 1)end)F1() =n. if n = 0 then 1 else n F1() (n 1) end = {0, 0!, 1, 1!} • 依次逐步计算可得:, {0, 0!}, {0, 0!, 1, 1!}, {0, 0!, 1, 1!, 2, 2!}, … (构成一个上升链) • lfp(F) = Fn() = {0, 0!, 1, 1!, 2, 2!, …}
第3章 控制流分析 • Tarski定理 • 令F : P(U) P(U)是单调函数 其中U是集合,P(U)表示U的幂集 • 集合XU是F封闭的 当且仅当F(X) X • 集合XU是F致密的 当且仅当X F(X) • 定义X.F(X)和X.F(X) X.F(X) ={X | F(X) X} X.F(X) = {X | X F(X)}
第3章 控制流分析 • Tarski定理 • 集合XU是F封闭的 当且仅当F(X) X • 集合XU是F致密的 当且仅当X F(X) • 定义X.F(X)和X.F(X) X.F(X) ={X | F(X) X} X.F(X) = {X | X F(X)} • 引理 X.F(X)是最小的F封闭集合 X.F(X)是最大的F致密集合
第3章 控制流分析 • Tarski定理 根据对偶性,只证明一种情况。首先证明引理: X.F(X) = {X | X F(X)}是最大F致密集合 • 最大是明显的 • 证明每个Xi都F致密,则i Xi也F致密则可 因为对每个i有XiF(Xi),则i Xii F(Xi) 因为F单调,则对每个i有F(Xi) F(i Xi) 由此可得iF(Xi) F(i Xi) 由传递性,i Xi F(i Xi),即i Xi是F致密的
第3章 控制流分析 • Tarski定理 再证明本定理(仍只证明 一种情况): 1、X.F(X)是F的最小不动点 2、X.F(X)是F的最大不动点 • 令= X.F(X),则是致密的,F() • 由单调性,F() F(F()),则F()也致密 • 由的定义知道F() • 由和F()之间的这两个不等式得= F() • 不动点都是致密的,因而都包含在中,所以是最大不动点
第3章 控制流分析 • 归纳和余归纳(coinduction) 归纳法 • 初始条件、迭代规则、最小化条件 • 字母表A上的串集A归纳定义如下 (1) A; (2)若aA且xA, 则axA ;(3)除此以外, A不含其它元素 余归纳法 • 迭代规则(循环条件),最大化条件 • 流可以通过余归纳法来定义 (1) 若t是A上的流且aA,则(a,t)也是A上的流; (2) A上的流集是满足上述规则的最大集合
S1, 1S2, 1 2 S1; S2, 2 S1, S1, S1; S2, S1; S2, S1, S1; S2, S2, 第3章 控制流分析 • 大步操作语义和小步操作语义的区别 • 大步操作语义 • 小步操作语义
第3章 控制流分析 • 规范s和的区别 • s和的区别主要在子句[fn]、[fun]和[app]上 • 的这些子句体现为跟踪运行情况的0-CFA分析:某个函数不被执行,则其体中信息不被收集 因递归函数会引起检查过程不终止,导致讨论余归纳和最大不动点 • s 是一种语法制导的0-CFA分析,它从程序中所有函数获取信息,而不管运行时函数是否真正被 执行,因此它是所获信息的一种近似 • 对于e : ((fn x => x) (fn y => let z = fn … in …)) (C,) e中的无需 z 的信息
第3章 控制流分析 • 约束求解(对照P68的算法) Step 1 初始化 • 所有的C(l)和r(x)都是图的结点q • D[q]表示q的值(函数集合),初值是空集 • E[q]表示q和其它结点的联系,初值是空链表 Step 2 构造图(对照P69的表和P70的初值) • {t} p: 出现在函数定义规则中,t应该在p所表示的函数集合中 • p1 p2:出现在变量、条件表达式和let子句等规则中,记录于E[p1],因p1变化则p2也可能变化
第3章 控制流分析 • 约束求解(对照P68的算法) Step 2 构造图 • {t} p p1 p2:出现在函数应用规则中,记录于E[p1]和E[p],因p1和p变化则p2也可能变化 Step 3 迭代(对照P70的表) • p1 p2:D[p1]并入D[p2]中,若(D[p1] D[p2]) • {t} p p1 p2:条件{t} p成立,则D[p1]并入D[p2]中,若(D[p1] D[p2]) • P70第2列,E[C(4)]中的函数应用引起 • P70第3列,E[r(x)]中,实参是函数引起
第3章 控制流分析 • 该控制流分析的回顾 • 先定义规范 ,是理想解的规范 • 理解解的讨论:最大和最小不动点、归纳和余归纳 • 讨论理想解的正确性 • 再定义语法制导的规范s ,是静态分析解的规范 • 寻找静态分析解的办法 1、将s转变成一组约束 2、求解该组约束