當前位置:編程學習大全網 - 編程軟體 - 如何使用AST生成程序的控制流圖

如何使用AST生成程序的控制流圖

對壹個有結構化編程特性的編程語言而言,抽象語法樹(AST)與“流分析”(flow analysis)不夠兼容的地方在於:這些編程語言會有分支、循環、跳轉(break/continue,或者像C#那樣受限的goto)、異常處理等語法結構,它們隱含了不連續的控制流;而AST的結構雖然已經省略了壹些語法細節,但仍然貼近語言的語法,所以AST裏控制流往往是隱含在上述語法結構對應的節點裏。更糟糕的是,這些編程語言中許多都有條件表達式(典型的是 ? : 三元運算符)以及帶有短路求值語義的邏輯運算表達式(典型的是 &&、|| 二元運算符),這些“表達式”內也隱含控制流,更是藏得深。

所以正統做法推薦的是在做數據流分析之前,先把AST轉換為壹種更細粒度的、把控制流顯式暴露出來的中間表示(IR)。虎書教的做法正是如此,第7章介紹從AST生成IR,第8章介紹了IR裏的控制流與基本塊。前面 @vczh 和 @陳煒 的回答都提到了這壹點。 @邵成 的回答提到龍書第8~9章,我覺得把第6章(特別是6.6 Control Flow)也包括進來更好。

對數據流分析來說,IR無論是樹形、DAG還是線性形式都沒關系,只要控制流和數據依賴易於分析就好。SSA形式的IR可以把兩者都顯式暴露出來,特別是use-def關系(並且有些IR會額外維護def-use關系),所以在現代編譯器和程序分析器裏比較流行。

  • 上一篇:高壹怎麽學編程?
  • 下一篇:用VBA編程,鼠標範圍
  • copyright 2024編程學習大全網