抽象语法树AST

研究生期间开发的代码异味检测工具中使用的抽象语法树思想AST与JVM作比较,大家可忽略也可批评指正。
正文:我自己编写了一个代码解析工具DT,利用抽象语法树AST思想进行代码解析,把代码解析后做后续研究。抽象语法树AST的功能是解析源代码。Eclipse AST提供了ASTParser类用于解析源代码, Eclipse AST的代码解析功能类似于JVM的代码解析功能,只能说是类似,不能说完全一样。
使用的核心类 org.eclipse.jdt.core.dom.AST (创建AST对象org.eclipse.jdt.core.dom.ASTNode及其派生类(表示java语言中的所有节点)org.eclipse.jdt.core.dom.ASTVisitor(ASTVisitor类,定义了统一的访问AST中各个节点的方法。)
抽象语法树AST会查看堆区域中类的对象以及其对应的实例化对象,在程序中用到了preVisit,visit,endvisit等几个方法来访问Java程序中的类和方法节点。preVisit 运行在调用visit方法之前,endvisit方法运行在调用visit方法当然这三个方法在使用时都要重写。
ASTVisitor:AST访问者类,它针对不同类型的节点提供了一系列重载的visit()和endvisit()方法,意思就是访问到该类型的节点时执行visit()方法,访问完该类型节点后执行endvisit()方法。其中,visit()方法需返回boolean类型的返回值,表示是否继续访问子节点。另外ASTVisitor还提供了preVisit()和postVisit()方法,参数类型为ASTNode,也就是说不论哪种类型的节点,访问前后都要分别执行preVisit()和postVisit()。
关于方法的分析:对于抽象语法树AST要检测一个方法中使用的变量,调用的方法以及调用的类。我们便可以计算堆栈区中。对于堆栈区中每个方法所对应的堆栈帧,存储的变量信息,个人认为包含数据变量,调用的类变量以及调用的方法变量。
关于继承关系的分析:我的检测工具DT利用抽象语法树AST,可以从方法区获取到类的权限全限定名A ,方法信息B, 类的直接超类的全限定名C。我们可以统计类A的方法有哪些,以及可以再根据父类C路径中去查看相关信息。举例我们可以来比较子类A对父类C方法的继承如何。
JVM的执行引擎部分 JIT编译器中的分析器,功能是负责查找热点,即该方法是否被多次调用
按JVM的垃圾收集器角度分析AST, AST查找方法中实例化的节点classInstanceCreation,如果其被
所有方法调用的次数等于0,则删除该对象(-1,调用system.gc()) 我的检测工具DT则有一点不同,它是统计每个方法中实例化类的情况,有则加1(+1)

猜你喜欢

转载自blog.csdn.net/sdtvyyb_007/article/details/79343510