Compiler construction 数据流分析和抽象解释之间有什么区别

Compiler construction 数据流分析和抽象解释之间有什么区别,compiler-construction,static-analysis,dataflow,abstract-interpretation,Compiler Construction,Static Analysis,Dataflow,Abstract Interpretation,数据流分析和抽象解释之间的区别是什么?它们是否用于相同的目的?这两者相对的优缺点是什么。可以归结为“效率与准确性” 数据流分析尝试合并路径数据,而不是抽象解释。抽象解释遍历所有路径,使数据值保持抽象。简而言之,它们属于不同的类别。这就像比较衣服和裤子 抽象解释是一个使用抽象域和抽象传递函数形式化不动点计算的框架。抽象解释保证,如果满足某些条件,则应在有限的步骤中找到不动点(详情如下:)。抽象解释的伟大之处在于扩大和缩小。抽象解释可以计算无限域上的一个不动点,因为它们 在我看来,数据流分析只是抽象

数据流分析和抽象解释之间的区别是什么?它们是否用于相同的目的?这两者相对的优缺点是什么。

可以归结为“效率与准确性”


数据流分析尝试合并路径数据,而不是抽象解释。抽象解释遍历所有路径,使数据值保持抽象。

简而言之,它们属于不同的类别。这就像比较衣服和裤子

抽象解释是一个使用抽象域和抽象传递函数形式化不动点计算的框架。抽象解释保证,如果满足某些条件,则应在有限的步骤中找到不动点(详情如下:)。抽象解释的伟大之处在于扩大和缩小。抽象解释可以计算无限域上的一个不动点,因为它们


在我看来,数据流分析只是抽象解释的一个例子。由于数据流分析所使用的大多数具体领域都是有限的,因此您甚至不需要扩大和缩小范围。

我不确定这里的任何答案是否真的符合原始问题的意图,这似乎是在要求一个直观而非技术性的解释。数据流分析涉及到在给定位置获取某些信息的价值。“信息”的例子包括哪些定义到达给定位置,哪些变量在给定位置存在,哪些表达式在给定位置保持不变等。数据流框架通常要求值域形成有限格,传递函数是单调的(传递函数确定信息如何从块的入口传播到块的出口),所有这些都是为了能够计算数据流值的定点。它用于编译器中

抽象解释(AI)OTOH旨在构建语言的抽象解释程序。目标是确定“这段代码计算的是什么?让我们试着用抽象的意义来回答这个问题”。例如,如果计算返回某个索引变量i的值,AI可能会计算i的范围,以便您可以回答是否存在边界冲突或其他问题。因此,抽象值的域略有不同,可能是范围域、多面体域等。因此,AI对数据流设置了不同的约束:具体域和抽象域通常需要通过称为galois连接的东西进行关联,该连接将具体值集与抽象值集关联起来。因为所使用的域不需要是有限的,AI不会总是以加宽/缩小操作的形式在没有干预的情况下收敛。AI用于正式验证在工具上。它们都有一个共同的愿望,就是让函数迭代收敛,但仅此而已。因此,如果你想知道某个位置上某个东西的价值,请使用数据流分析,如果你想知道程序抽象计算的内容,请使用AI


数据流和AI都可以一起使用。例如,反汇编工具Jakstab将两者结合起来-数据流用于确定间接跳转目标的值(即,新计算的是将要加载的PC的值)人工智能用于抽象地评估二进制代码。

这个答案是错误的。路径敏感性与抽象解释和数据流分析之间的差异无关。我曾在一个抽象解释程序上工作过,我认为这是一个很好的总结。