控制流图(CFG)是CPython中函数的特定输入吗


  1. CFG是代码对象完成阶段的抽象概念吗?

  2. 如果是这样的话,数据结构的哪些方面保存了相关信息和相关代码,其中完成了从CFG到最终字节码的转换?

为了回答这个问题,我花了很多时间研究、修改和重建CPython源代码。我还使用PIPI的pycfg来提取各种目标的CFG(如GeeksforGeeks的一篇题为"使用pycfg|Python绘制控制流图"的文章所示(,并在论坛和谷歌上搜索其他相关信息。

基于对代码的业余研究,以及RealPython一篇题为";Your Guide to the CPython Source";,似乎没有创建特定的CFG对象,然后将其用作某种类型的CFG到字节码方法的输入。(我想我甚至可能在浩瀚的互联网上读到过这篇文章。(这个假设正确吗?如果是这样的话,即使在生成了最终的字节码之后,CFG也能从代码对象中提取出来吗?

如果是这样的话,可以公平地说,CFG只是一个概念,它代表了具有分支信息的代码对象和某种级别的字节码转换之间的粗略转换,该转换还不包括所有字节码的完整转换(尤其是分支码和相关的依赖项(。

  1. 是否至少有定义明确的数据结构和方法来表示这种转换状态?

  2. 请提供有关具体结构和方法的任何详细信息。

除了查看各种版本的compile.c及其更改日志,以及上面提到的文章外,我还在CPython文档(尤其是DevGuide(中寻找更好的理解。

我目前非常高级的猜测是,这发生在以下形式的宏中:

#define VISIT(C, TYPE, V) {
if (!compiler_visit_ ## TYPE((C), (V))) 
return 0; 
}

如果有人好奇为什么学习这一点对我来说很重要,这与为定制处理器架构创建虚拟机的想法的高级审查有关,该架构需要比当前字节码集中可用的更高级别的信息(或抽象(。它最终需要像CFG到(可能是自定义的(字节码语言翻译器这样的东西,而目前很难想象如何实现这种动物。

谢谢!

CFG是代码对象完成阶段的抽象概念吗?

我还没有检查Python源代码,在旧的Python中,它肯定不存在。在大多数编译器中,这种东西是不公开的,并且是高度自定义的。这种事情通常是在代码优化中完成的。通常在Python中,这是在JITing技术中完成的。所以我会看看pyston和PyPy项目。

如果是,数据结构的哪些方面包含相关信息和相关代码,其中完成了从CFG到最终字节码的转换?

这是一个过于宽泛的问题,所以我会说,同样宽泛,因为这通常是主要目的。

如果您想从字节码中提取python控制流信息,即在事实之后或在生成字节码之后,请参阅https://github.com/rocky/python-control-flow

这有一个优点,即即使不在Python编译器源代码中,它也可以在Python版本上工作。

相关内容

  • 没有找到相关文章

最新更新