如何理解基於CFL-reachability的過程間分析?
過程間分析是如何轉化為CFL-reachability問題的?CFL-reachability問題又是如何求解的?
能否結合實際問題給出些淺顯的例子?
那位Hao Fu同學已經答出關鍵了,context-free languages因為有那個棧,所以可以用來識別括弧匹配的問題。說得更具體一點就是能配對。程序分析中有許多問題需要解決這個配對的問題,比如interprocedural analysis需要call和return配對,指針分析需要load和store配對。這些需要配對的問題就可以描述成CFL-reachability problem。
關於CFL-Reachability問題本身,Thomas Reps寫有一篇文章:Program Analysis via Graph Reachability。該文包含CFL-Reachability的定義、性質、例子、解法。還給出4個能描述成CFL-reachability problem的程序分析問題(interprocedural data-flow analysis, slicing, shape analysis, flow-insensitive points-to analysis)。題主想要的答案就在裡邊。
把interprocedural analysis轉化成CFL-reachability problem的一個好處是,可以使一部分滿足特定性質的interprocedural data-flow problem,以不那麼高的成本獲得full context-sensitivity。詳情請見Reps等人95年發表於POPL的經典論文Precise Interprocedural Dataflow Analysis via Graph Reachability。前面的回答已經解釋了CFL-Reachability問題以及如何用它來解決過程間分析,我再補充一下如何求解CFL-Reachability。
傳統的演算法基於動態規劃,其中
是圖中頂點數,並假設文法的大小是常數。對文法先進行正則化處理,通常是轉化成2NF,即每個rule右端的長度不超過2。這個過程只會讓文法大小線性增長。令
表示
到
存在一條路徑,這條路徑所表示的串可以被非終結符
生成。可見狀態空間為
。狀態轉移則是枚舉rule進行。以
為例,設當前有一個未轉移的狀態
,那麼枚舉已轉移的狀態
,得到新狀態
。一次狀態轉移的複雜度為
,從而整個演算法是三次方級別的。
一些過程間分析中會產生規模很大的圖,三次方的演算法在效率上比較吃力,於是有一些工作想要優化CFL-Reachability的演算法,或者在實踐中通過一些heuristic提升效率。POPL08有一篇Subcubic Algorithms for Recursive State Machines,大致是用四個毛子演算法優化到了。CC15有一篇Towards a Scalable Framework for Context-Free Language Reachability,大致是借用Datalog(也是一種被用來描述程序分析的語言,表達能力是包含CFL的)裡面的技巧,並使用了四分樹來優化一些矩陣操作。
因為題主已經搞懂了,而且有專家現身,我就不繼續班門弄斧了。
取匿了,歡迎搞程序分析的同學私信交流學習。/***********************************************************************************************************/正在學這塊, 先談談自己的理解.
context-free grammar 相比regular更強大的原因在於它的自動機(push-down automata)多了一個棧, 因此可以識別括弧匹配這類原本RL識別無能的語言(證明參見pumping lemma). CFL的識別語言問題又可以通過轉化成解圖可達性的問題並用相關演算法來解決.現在需要把一個函數的調用和它的返回配對起來, 那麼可以把這個函數調用看成(, 返回看成). 因此它也就能用CFL描述, 也就可以用圖可達性來解了. 具體的例子以後上.推薦閱讀:
※C++越跑越慢的問題?
※求講解下列鏈接以及pascal嵌套子程序是如何實現的?
※關於c前置,後置++,及函數傳參的問題?
※已經不在學校了,在軟體專業上,該怎麼制定學習的策略?
※國內哪一家公司的編譯隊伍技術最高?