數(shù)據(jù)流分析(2) - 框架化分析 distributive framework

之前我簡單的介紹過幾種常見的過程內(nèi)分析算法邻耕。 可以看到這些算法有非常大的相似性冲呢,本質(zhì)都是使用一個(gè)worklist里面存放需要分析的語句舍败,再使用Kill/Gen 函數(shù)(或者說方程)對(duì)系統(tǒng)的約束條件進(jìn)行求解,最終得到想要的結(jié)果敬拓。 很自然的就可以想到有沒有一種理論可以把之前提到這幾種過程內(nèi)分析算法給統(tǒng)一起來邻薯,變成一種框架式的代碼,這樣比較方便我們使用和reason乘凸。

使用代數(shù)結(jié)構(gòu)來抽象問題厕诡, 以得到框架化的結(jié)構(gòu),是程序分析中的常用思路营勤,并且使用抽象代數(shù)結(jié)構(gòu)灵嫌,在證明的時(shí)候也會(huì)比較容易一點(diǎn)。格(lattice)就是被廣泛使用的一種代數(shù)結(jié)構(gòu)葛作。

偏序集(Partial Order Set) 與格(Lattice)

在介紹格之前先簡單介紹一下偏序集(partial order set)寿羞。 因?yàn)楦袷嵌x在他上面的。
偏序關(guān)系沒啥好多說的赂蠢,如果你沒有學(xué)習(xí)過代數(shù)知識(shí)其實(shí)也很好理解绪穆,通俗的說就是元素之間有大小關(guān)系,但是不是每一個(gè)元素互相都有大小關(guān)系虱岂,有些沒法比較玖院,經(jīng)典例子就是拓?fù)漤樞颉?br> 偏序集是一個(gè)二元組(P, \sqsubseteq) 其中

  • \sqsubseteq : P \times P \rightarrow \{ true, false \}是一個(gè)P上的二元關(guān)系,
  • 滿足自反性第岖,反對(duì)稱性难菌, 傳遞性

如果在一個(gè)偏序集中, 存在一個(gè)任意兩個(gè)元素都有唯一的上界和下界那么這個(gè)偏序集合構(gòu)成一個(gè)格(lattice)蔑滓。
根據(jù)定義不難發(fā)現(xiàn)郊酒,兩元素之間一定存在取上界和取下界的函數(shù)遇绞,可定義如下:
\sqcapmeet操作符, 可以求出x 猎塞,y的上界

  • x ~ \sqcap ~ y ~ \sqsubseteq ~ y , x ~ \sqcap ~ y ~ \sqsubseteq ~ x
  • z ~ \sqsubseteq ~ x, 并且z ~ \sqsubseteq ~ y,那么有 z ~ \sqsubseteq ~ x ~ \sqcap ~ y

\sqcupjoin操作符试读, 可以求出x 杠纵,y的下界

  • x ~ \sqsubseteq ~ x ~ \sqcap ~ y , y ~ \sqsubseteq ~ x ~ \sqcap ~ y
  • x ~ \sqsubseteq ~ z, 并且y ~ \sqsubseteq ~ z,那么有 z ~ \sqsubseteq ~ x ~ \sqcup ~ y

如果上述的join和meet操作只有一個(gè)被定義了荠耽,這種代數(shù)結(jié)構(gòu)被稱作半格(semi-lattice)

如果我們繼續(xù)增加限制,meet和join操作必須對(duì)所有P的子集都有定義比藻,那么這種格也被稱作完全格(complete lattice).
性質(zhì):
一個(gè)完全格必有一個(gè)全局的最大值(top)和一個(gè)最小值(bottom), 記做\top,\bot
所以可以完全格也可以用以下的六元組來表示(P, \sqsubseteq , \sqcap,\sqcup,\top,\bot)

回到程序分析上來說铝量,因?yàn)槲覀冃枰蠼獾膯栴}的最終都是要通過迭代求得一個(gè)不動(dòng)點(diǎn),在計(jì)算的過程中银亲,中間的結(jié)果就一定是有某種順序的慢叨,但是大多數(shù)情況下這種順序又是偏序的,而且因?yàn)槲覀兊牡瘮?shù)每一步都必然有結(jié)果务蝠, 所以使用格這一代數(shù)結(jié)構(gòu)是比較完美符和要求的拍谐。
比如求解available expression的過程就可以用下面的格來表述:

available expression

常數(shù)傳播(constant propagation)就可以用如下格:

constant propgation

Worklist 算法

之前的文章我已經(jīng)實(shí)現(xiàn)過混沌迭代(chaotic iteration)求解數(shù)據(jù)流分析的問題。在那個(gè)算法中馏段,我們判斷不動(dòng)點(diǎn)的時(shí)候每次都要把整個(gè)step函數(shù)的結(jié)果和之前一次的執(zhí)行結(jié)果去比較轩拨。這個(gè)思路非常的直接,其實(shí)對(duì)于數(shù)據(jù)流分析院喜,我們有更加簡單的判斷方法亡蓉。
我們可以在這個(gè)算法的基礎(chǔ)上添加一個(gè)worklist來統(tǒng)合我們的算法,比如一個(gè)Forward Must Analysis就可以用如下算法實(shí)現(xiàn)

Out(s) = ? for all statements s
W := { all statements }                    (worklist) 
repeat {
    Take s from W
    In(s) := ∩s′? pred(s) Out(s′)
    temp := Gen(s) ∪ (In(s) - Kill(s))
    if (temp != Out(s)) { 
        Out(s) := temp 
        W := W ∪ succ(s)
    }
} until W = ?

單調(diào)性(monotonicity)與算法終止的證明

根據(jù)偏序集的性質(zhì)我們不難在偏序集(為定義域)上定義單調(diào)函數(shù)
f是單調(diào)的(monotonic):假如 x ~ \sqsubseteq ~ y 那么 f(x) ~ \sqsubseteq ~ f(y)
在上面的worklist算法中喷舀,觀察

In(s) := ∩s′? pred(s) Out(s′)
temp := Gen(s) ∪ (In(s) - Kill(s))
也可以內(nèi)連一下---> 
temp := fs(∩s′? pred(s) Out(s′))

其中f_s也叫傳遞函數(shù)(transfer function)
可以發(fā)現(xiàn)這一迭代的核心計(jì)算部分(計(jì)算temp)的過程就是一個(gè)單調(diào)的函數(shù)(Forward Must請(qǐng)自動(dòng)帶入available express和上面有過的lattice圖)

從前面的格圖上我們可以看出來砍濒,格是有類似高度的屬性的。
首先定義下鏈(chain):
Y是偏序集P的一個(gè)子集硫麻,并有\forall x_0,x_1 \in Y, (x_0 \sqsubseteq x_1) \lor (x_0 \sqsubseteq x_1).
通俗的說就是格這個(gè)圖里的一條路徑爸邢。因?yàn)槎际怯眯∮阪溄拥乃赃@是一條下降的路徑被稱為降鏈(Descending Chain)
接下來可以定義格的高度(height)了:
格中最長的降鏈被稱為格的高度。

在定義了單調(diào)函數(shù)和格的高度之后之后我們可以這樣來證明算法可終止拿愧。
因?yàn)樯鲜稣麄€(gè)迭代函數(shù)中甲棍, 要么是W在減小,要不是Out(s)在減小赶掖,所以感猛,整個(gè)迭代函數(shù)必然是單調(diào)遞減的。從格的角度來說奢赂,因?yàn)楦袷怯邢薷叩呐惆祝詫?duì)于任意給定的程序語句集合s, (AExp,具體的可以翻之前PPA的小節(jié)), Out(s)只能遞減有限次。故算法可終止膳灶。并且算法的時(shí)間復(fù)雜度為 O(nk),

  • n是語句集合s的大小
  • k是格的高度
  • 假設(shè)meet的時(shí)間復(fù)雜度是1

進(jìn)一步抽象前向分析算法

我們可以把之前Forward Must算法中傳遞函數(shù)f_s稍微做一下修改咱士,把原本的集合操作替換成meet操作符立由,就得到了一個(gè)更加泛化的算法。 Must和May不過是算法先從\top開始然后選取合適的meet函數(shù),給出符合要求的格P序厉。

temp := fs(?s′? pred(s) Out(s′))

總結(jié)如下:
Available Expression

  • P = 所有語句
  • \sqcap = \cap
  • \top = 所有語句

reach definition

  • P = 賦值語句
  • \sqcap = \cap
  • \top = \emptyset

分配率(distributive)

如果一個(gè)偏序集上的函數(shù)滿足分配率锐膜,那么
如果有 f(x ~ \sqcap ~ y) \sqsubseteq ~ f(x) ~ \sqcap ~ f(y)
f(x ~ \sqcap ~ y) = ~ f(x) ~ \sqcap ~ f(y)
定義其實(shí)和一般的函數(shù)分配率沒有什么區(qū)別
不難發(fā)現(xiàn)我們之前說過的所有kill/gen style的分析算法都符合這一點(diǎn), 我們?cè)贛eet函數(shù)操作的過程中并沒有發(fā)生信息的丟失弛房。

滿足交換率的問題我們可以統(tǒng)一抽象為meet over all path(MOP) solution.
(其實(shí)我應(yīng)該先定義路徑(Path)是算法從程序起點(diǎn)到運(yùn)行到哪個(gè)block入口的遍歷過程)
定義如下:

  • f_s是傳遞函數(shù)
  • 如果p是路徑s_1 ... S_n, 有代入f后 f_p = f_{sn}; ...f_{s1}
  • paths(s) 是從entry到sd的路徑
  • MOP(s) = \sqcap_{p \in paths(s)}f_p(\top)

那么有沒有不符合分配率的算法呢道盏?當(dāng)然是有的,最經(jīng)典的例子是常量傳播(constant propgation)算法文捶。
具體的等下一次我寫Constant Prop的時(shí)候再證明好啦荷逞。


這一次的文章基本完全翻譯自Kris導(dǎo)師的slides
因?yàn)檎娴姆浅:茫郧暗谝淮巫xPPA這個(gè)章節(jié)的時(shí)候真的云里霧里的粹排。

btw, proud of my code here!
我的實(shí)現(xiàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末种远,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子顽耳,更是在濱河造成了極大的恐慌坠敷,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件射富,死亡現(xiàn)場離奇詭異膝迎,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)辉浦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門弄抬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宪郊,你說我怎么就攤上這事掂恕。” “怎么了弛槐?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵懊亡,是天一觀的道長。 經(jīng)常有香客問我乎串,道長店枣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任叹誉,我火速辦了婚禮鸯两,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘长豁。我一直安慰自己钧唐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布匠襟。 她就那樣靜靜地躺著钝侠,像睡著了一般该园。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上帅韧,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天里初,我揣著相機(jī)與錄音,去河邊找鬼忽舟。 笑死双妨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的萧诫。 我是一名探鬼主播斥难,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼枝嘶,長吁一口氣:“原來是場噩夢啊……” “哼帘饶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起群扶,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤及刻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后竞阐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缴饭,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年骆莹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颗搂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡幕垦,死狀恐怖丢氢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情先改,我是刑警寧澤疚察,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站仇奶,受9級(jí)特大地震影響貌嫡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜该溯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一岛抄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧狈茉,春花似錦夫椭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽猾漫。三九已至,卻和暖如春感凤,著一層夾襖步出監(jiān)牢的瞬間悯周,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工陪竿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留禽翼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓族跛,卻偏偏與公主長得像闰挡,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子礁哄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354