From cd2e6a1538e9dc38cc79eddb5a2da0024691e579 Mon Sep 17 00:00:00 2001 From: Liang ZhiBo Date: Tue, 22 Mar 2022 21:07:53 +0800 Subject: [PATCH] Change discussion of static analysis (#182) Co-authored-by: liangzhibo Co-authored-by: Luo Mai --- .../type_system_and_static_analysis.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/chapter_frontend_and_ir/type_system_and_static_analysis.md b/chapter_frontend_and_ir/type_system_and_static_analysis.md index 86bcfb9..eb83195 100644 --- a/chapter_frontend_and_ir/type_system_and_static_analysis.md +++ b/chapter_frontend_and_ir/type_system_and_static_analysis.md @@ -15,24 +15,22 @@ 4)可读性。阅读代码时,明确的类型声明有助于理解程序代码。 -机器学习框架一般使用Python语言作为描述网络模型结构的前端语言。Python语言是一门动态弱类型的语言,入门简单易学习,开发代码简洁高效,但由于其解释执行的方式,运行速度往往较慢。Python前端语言给用户带来了动态灵活的语义和高效的开发效率,但是若想要生成运行高效的后端代码,后端框架需要优化友好的静态强类型中间表示。因此,需要一种高效可靠的静态分析方法作为桥梁,将Python前端表示转换成等价的静态强类型中间表示,以此给用户同时带来高效的开发效率和运行效率,例如Hindley--Milner(HM)类型系统。这是一种具有参数多态性的简单类型lambda演算的类型系统。它最初由J. +机器学习框架一般使用Python语言作为描述网络模型结构的前端语言。Python语言是一门动态强类型的语言,入门简单易学习,开发代码简洁高效,但由于其解释执行的方式,运行速度往往较慢。Python前端语言给用户带来了动态灵活的语义和高效的开发效率,但是若想要生成运行高效的后端代码,后端框架需要优化友好的静态强类型中间表示。因此,需要一种高效可靠的静态分析方法作为桥梁,将Python前端表示转换成等价的静态强类型中间表示,以此给用户同时带来高效的开发效率和运行效率,例如Hindley--Milner(HM)类型系统。这是一种具有参数多态性的简单类型lambda演算的类型系统。它最初由J. Roger Hindley 提出 :cite:`1969The`,并由Robin Milner 进行扩展和验证 :cite:`1978A` 。后来,路易斯·达马斯(Luis Damas)对HM类型推导方法进行了详尽的分析和证明 :cite:`1982Principal`,并将其扩展到支持具有多态引用的系统。Hindley--Milner类型系统的目标是在没有给定类型注解的情况下,自动推导出任意表达式的类型。其算法具有抽象性和通用性,采用简洁的符号表示,能够根据表达式形式推导出明确直观的定义,常用于类型推导和类型检查。因此,Hindley--Milner类型系统广泛应用于编程语言设计中,比如Haskell和Ocaml。 ### 静态分析概述 -在编译器前端中,除了类型系统的设计,还需要对程序代码进行检查分析,经常用到静态分析技术。静态分析,是指在不实际运行程序的情况下,通过词法分析、语法分析、控制流、数据流分析等技术对代码进行分析验证的技术。 +在设计好类型系统后,编译器需要使用静态分析系统来对中间表示进行静态检查与分析。语法解析模块(parser)将程序代码解析为抽象语法树(AST)并生成中间表示。此时的中间表示缺少类型系统中定义的抽象信息,因此引入静态分析模块,对中间表示进行处理分析,并且生成一个静态强类型的中间表示,用于后续的编译优化、自动并行以及自动微分等。在编译器前端的编译过程中,静态分析可能会被执行多次,有些框架还会通过静态分析的结果判断是否终止编译优化。 -词法分析:将字符流变换为输入语言的单流,每个单词都必须归类到某个语法范畴中。常用的词法分析器包括表驱动词法分析器、直接编码词法分析器和手工编码的词法分析器。 +静态分析模块基于抽象释义对中间表示进行类型推导、常量传播、泛型特化等操作,这些专业术语的含义分别为: -语法分析:判断单词流表示的输入程序在程序设计语言中是否是一个有效的句子。语法分析分为自顶向下语法分析和自底向上语法分析。自顶向下语法分析器从语法分析树的根开始,系统化地向下扩展树,直至树的叶节点与语法分析器返回的已归类单词相匹配。而自底向上语法分析器从叶结点开始构建语法分析树,自叶结点向根节点的方向前景。 +抽象释义:通过抽象解释器将语言的实际语义近似为抽象语义,只获取后续优化需要的属性,进行不确定性的解释执行。抽象值一般包括变量的类型和维度。 -控制流分析:控制流分析是分析程序控制流图、获得程序静态属性的静态分析方法。常见的控制流分析方法包括抽象释义、约束补偿和类型系统等。 +类型推导:在抽象释义的基础上,编译器推断出程序中变量或表达式的抽象类型,方便后续利用类型信息进行编译优化。 -数据流分析:数据流分析用于确定可进行优化的机会,并证明变换的安全性。 - -通过以上几种分析,静态分析对程序代码进行扫描,验证代码是否满足规范性、安全性、可靠性、可维护性等指标。 +泛型特化:泛型特化的前提是编译器在编译期间可以进行类型推导,提供类型的上下文。在编译期间,编译器通过类型推导确定调用函数函数时的类型,然后,编译器会通过泛型特化,进行类型取代,为每个类型生成一个对应的函数方法。 接下来以MindSpore框架为例,简要介绍一下静态分析模块的具体实现。MindSpore采用抽象释义的方法,对抽象值做不确定的抽象语义的解释执行,函数图中每个节点的抽象值是所期望得到的程序静态信息。基本的抽象释义方法流程可以理解为,从MindIR的顶层函数图入口开始解释执行,将函数图中所有节点进行拓扑排序,根据节点的语义递归推导各节点的抽象值。当遇到函数子图时,递归进入函数子图进行解释执行,最后返回顶层函数输出节点的抽象值。根据抽象释义方法流程,MindSpore的静态分析模块主要分为抽象域模块、缓存模块、语义推导模块和控制流处理模块。