C 抽象解释器是如何工作的?

C 抽象解释器是如何工作的?,c,interpreter,abstract,C,Interpreter,Abstract,我正在尝试为C语言构建一个抽象解释器。可能不是为了整个语法,而是为了它的一个子集。我以前曾问过使用哪种语言。在我继续之前,我想知道这个抽象的解释是如何工作的 我已经浏览了维基链接和课堂讲稿链接。我已经理解了它背后的基本原理和理论。我已经完成了我的分析。我完全无法理解的部分是如何解释代码。也就是说,我有最初的代码。我现在已经对它进行了预处理。我还对分析所需的代码执行了一些规范化。现在,我如何逐行执行代码,并在继续执行时提取数据?(如果这是不可能的,请告诉我。或者有什么方法可以正确执行该计划,从而实

我正在尝试为C语言构建一个抽象解释器。可能不是为了整个语法,而是为了它的一个子集。我以前曾问过使用哪种语言。在我继续之前,我想知道这个抽象的解释是如何工作的

我已经浏览了维基链接和课堂讲稿链接。我已经理解了它背后的基本原理和理论。我已经完成了我的分析。我完全无法理解的部分是如何解释代码。也就是说,我有最初的代码。我现在已经对它进行了预处理。我还对分析所需的代码执行了一些规范化。现在,我如何逐行执行代码,并在继续执行时提取数据?(如果这是不可能的,请告诉我。或者有什么方法可以正确执行该计划,从而实现我的目标)。我正在收集诸如动态分配空间的内存地址、函数调用的返回地址等信息

早些时候有人建议我使用CIL,CIL主要是一个转换工具,将代码转换为一些规范化的形式,处理许多异常情况,但我无法获得与我的问题相关的任何信息

我的问题是如何逐行提取信息,哪种语言更可取?命令式语言还是函数式语言?我已经在谷歌上搜索了好几天关于这方面的信息,但是没有用。任何链接也非常感谢。谢谢

编辑:我还有一些疑问。我得到了我们尝试构建虚拟环境的部分。让我解释一下我想做什么,这样有助于讨论。我基本上是在做指针分析,主要集中在指针算法上。现在假设我有一个整数指针,并且我做了一个指针算术,那么我不能确定指针是否仍然指向有效的数据

从你所说的,我理解我们需要为变量分配空间,但是值呢。如果我有下面这样的东西


INTA=10
int*p=&a
p=p+4;

这里a和常数“4”的值是已知的。如果我从用户或文件中获得了值怎么办。在这种情况下,我需要执行实际的程序。同时,我需要捕获地址之类的数据。下面,


int*p=(int*)malloc(sizeof(int))
*p=15

假设你真的在谈论抽象的解释,而不仅仅是解释C

抽象解释依赖于两件事——一个抽象域、一个有限高度格和一个抽象语义,在此基础上,将一行的语义应用于前一行的域中的值必须在域中产生一个相同高度或更高的新值

i、 e.如果您的域是
{1,2,3,4}
的动力集,并且输入是
{1,2,3}
,则唯一有效的输出是
{1,2,3}
{1,2,3,4}
(假设通常的集合顺序)

然后,在每一行上执行定点递归,并将语义的输出与该行一起存储,将语义与函数定义一起存储在每个函数的末尾。你如何选择领域和解释你最终得到的集合在很大程度上取决于你试图做的分析,但这就是我所理解的大纲

我必须说,我不是这方面的专家,但我的一些研究同事过去曾与我讨论过这方面的问题,这是我得出的理解


此外,您也可以轻松地向后运行分析-从函数末尾开始向前运行,这将更适合于某些类型的分析…

假设您真正谈论的是抽象解释,而不仅仅是解释C

抽象解释依赖于两件事——一个抽象域、一个有限高度格和一个抽象语义,在此基础上,将一行的语义应用于前一行的域中的值必须在域中产生一个相同高度或更高的新值

i、 e.如果您的域是
{1,2,3,4}
的动力集,并且输入是
{1,2,3}
,则唯一有效的输出是
{1,2,3}
{1,2,3,4}
(假设通常的集合顺序)

然后,在每一行上执行定点递归,并将语义的输出与该行一起存储,将语义与函数定义一起存储在每个函数的末尾。你如何选择领域和解释你最终得到的集合在很大程度上取决于你试图做的分析,但这就是我所理解的大纲

我必须说,我不是这方面的专家,但我的一些研究同事过去曾与我讨论过这方面的问题,这是我得出的理解


此外,您也可以轻松地向后运行分析-从函数末尾开始向前运行,这将更适合于某些类型的分析…

从您提出问题的方式来看,您所谈论的似乎是解释,而不是抽象的解释。解释仅仅意味着获取C代码并自己运行,在您的情况下,从运行时发生的事情中提取一些信息。抽象解释是指一个静态分析过程,在这个过程中,您试图理解程序能够做什么,可能是为了优化,也可能是为了证明正确性或没有bug。当然,我可能完全错了,在这种情况下,你可以忽略这个答案

如果您试图编写一个解释器,那么您可能需要设置一个虚拟执行环境,程序将在其中运行。也就是说,您可能需要设置一个巨大的字节数组作为程序的内存
int a;
a = 137;