维基百科有一个关于控制流图的定义。我也听到过称为“调用(流?)图”的术语,但找不到相关资源。两者之间的关系是什么?
控制流图和调用(流?)图是两个不同的概念。控制流图描述了程序中控制流程的路径,而调用(流?)图描述了程序中函数之间的调用关系。它们都是在软件工程中用于分析和优化代码的工具。因此可以说,调用(流?)图是控制流图的一种特殊类型,用于描述程序中函数之间的控制流程。维基百科有一个关于控制流图的定义。我也听到过称为“调用(流?)图”的术语,但找不到相关资源。两者之间的关系是什么?
控制流图和调用(流?)图是两个不同的概念。控制流图描述了程序中控制流程的路径,而调用(流?)图描述了程序中函数之间的调用关系。它们都是在软件工程中用于分析和优化代码的工具。因此可以说,调用(流?)图是控制流图的一种特殊类型,用于描述程序中函数之间的控制流程。维基百科定义了 调用图(call graph) 为程序中子例程间的调用关系表示。在调用图中,两个节点 f
和 g
之间的边:
f --> g
表示子程序 f
调用了子程序 g
。调用图提供了一个关于程序的 跨过程 视图。
控制流图 (CFG) 提供了有关程序整体结构以及特定子程序的更精细的 "细节"。例如,子程序 f
的 CFG 将明确说明由条件分支引起的所有路径:
/ branch1 \
begin --> condition --> --> codeblock --> g --> end
\ branch2 /
这种CFG用于构建一个子例程的程序内部视图。
调用图(Call Graphs,CG)与控制流图(Control Flow Graphs,CFG)由节点和边组成。 CG 是跨过程的,节点表示子程序(方法、函数等),而边表示两个子程序之间的调用关系(例如,A -> B,“A”是调用方子程序,而“B”是被调用方子程序)。 CFG 是在过程内的,节点表示程序语句,包括被调用的子程序以及条件语句,而边表示程序的流程。当将CG和CFG结合起来时,它被称为过程间控制流图(Interprocedural Control Flow Graphs, ICFG)。CG的生成比CFG更加资源密集,但更详细。