写点什么

源码, AST, IR, CFG 之间的关系梳理

  • 2023-10-07
    广东
  • 本文字数:1507 字

    阅读完需:约 5 分钟

在上一篇文章“代码检查过程中为什么需要涉及到编译呢?”中,有提到 SAST 代码检查工具里编译过程会经历哪些阶段,里面有提到:

一般来说,完整的编译过程会经历:对源代码进行词法、语法、语义的分析,生成 AST,接着转换为 IR,生成 CFG,对数据流进行分析、优化,生成目标代码。

总结一下就说是源码 > AST > IR > CFG 这么个逻辑顺序,那它们三之间是怎么个依赖关系呢?本文尝试来梳理下。

源码和 AST 的关系

  • 源码就是程序员用 JAVA, C, C++, Python 等语言编写出来的代码。

  • AST, Abstract Syntax Tree 抽象语法树,是用来表示程序代码结构的树形数据结构。

在讲 AST 之前,我们先解释下解析树(parse tree),它又被叫做具象语法树(CST,Concret Syntax Tree),会包含代码中所有的语法信息,可以说是代码的直接翻译。而 AST 既然被叫做抽象语法树,从名字上就可以看出来,它会剥离掉一些不重要的细节(忽略掉一些语法信息)。因此,AST 可以说是解析树(parse tree)的一个精简版本。

源码和 AST 之间的转换是:

  • 源码通过编译器或解析器进行词法分析、语法分析、语义分析等操作,生成 AST。

  • AST 也可以通过代码生成器或反解析器进行优化、转换、翻译等操作,转换生成源码。

词法分析

词法分析, lexical analysis, 属于编译的第一个阶段,这其中会涉及到两个主要的工具:scanner 和分词器。Scanner 会从头到尾去扫描源代码文件,把文本拆成单词;之后这些单词会传入分词器,经过一些列识别器(关键字识别器、标识符识别器、常量识别器、操作符识别器等),识别确认单词的词性,生成一个<type, value>形式的二元组 token 序列(组合里的 type 指单词种类,value 则是属性值)。

语法分析

词法分析完成之后,第二个阶段就是语法分析, syntax analysis。在这个阶段,token 序列会传递给解析器,根据给定的语法规则,由其识别出代码中的各类短语并根据语言的文法规则来生成解析树。其主要目标是为了验证源代码是否符合语言的语法规范,同时创建源代码的解析树或抽象语法树(AST),用来表示源代码的层次和逻辑关系。

语义分析

词法分析和语法分析两个阶段中相关的操作都是上下文无关的。而语义分析的本质,就是针对上下文相关情况去做处理。

语义分析,Semantic Analysis,对抽象语法树进行下一步的检查和处理。其主要目的是为了确定源码是否有意义,同时也可以对源代码进行一些优化和转换。

常用的 AST 在线工具

在线转换代码为 AST 的工具地址:https://astexplorer.net/


AST 和 IR 的关系

当从源码生成了 AST 之后,IR 也可以从 AST 转换/变形而来。

两者都可以被 SAST 工具用于检查,区别在于:AST 更接近与源代码的语法结构,依赖于编程语言种类,扫描分析效率更快,但缺少控制流信息,即 AST 更关注代码的表面特征和规范性,更适合做一些简单的模式匹配和规则检查;IR 则更接近于机器码的语义结构,不依赖于编程语言种类,包含了控制流信息,更关注于代码的深层含义和安全性,更适合做一些复杂的数据流分析和漏洞检测。

IR 和 CFG 的关系

CFG 是从 IR 生成来的,是一种用来表示程序代码执行流程的图形数据结构;可以这么说,CFG 是 IR 的一种变形,它把代码分给为基本块,并用边表示基本块之间的跳转关系。

IR 和 CFG 之间的区别是:IR 接近于机器码的语义结构,不依赖于编程语言种类,包含了控制流信息,更关注于代码的深层含义和安全性;CFG 则带有控制流(专注于从 Source 到 Sink 的过程),可以更直观地展示代码的执行路径和分支条件,便于进行控制流分析和路径敏感的分析。

参考链接

  1. https://en.wikipedia.org/wiki/Lexical_analysis

  2. https://zhuanlan.zhihu.com/p/102385477

  3. https://www.geeksforgeeks.org/introduction-to-syntax-analysis-in-compiler-design/

  4. https://en.wikipedia.org/wiki/Semantic_analysis_(linguistics)

用户头像

公众号:华为云PaaS服务,有见面礼等你哦! 2022-09-26 加入

还未添加个人简介

评论

发布
暂无评论
源码, AST, IR, CFG之间的关系梳理_云计算_华为云PaaS服务小智_InfoQ写作社区