论文部分内容阅读
AspectJ是一门新的程序设计语言,它是在Java语言的基础上扩充了AOP系统而来的。AspectJ语言的面向方面程序设计方法能够弥补传统面向对象技术在模块化软件中横切关注点方面的不足,因此它不仅是人们研究AOP语言的主要平台,在现实中也有着广泛的应用。
AspectJ语言既对程序分析领域提出了新问题,也对传统的分析提出了新的挑战。我们对AspectJ程序的面向方面调用图及其构造,以及动态通知的编织优化进行了深入的研究,并按照新的需求重新考虑了Java程序类型分析和指向分析等问题。
论文的主要研究成果包括:
(1)提出了基于SAT求解的Java程序类型分析的新方法,该方法是流敏感、属性敏感以及上下文敏感的,能够在复杂度可接受的情况下构造出更加精确的程序调用图。方法的基本思想是将程序抽象为命题逻辑公式,然后利用SAT求解器求解来完成分析。我们以方法为单位进行抽象,首先将方法转换成SSA扩展形式,然后将变量和属性抽象为布尔向量,类型被编码为具体的向量,相关语句的公式通过联结符“∧”联结成方法的公式。我们通过求取方法抽象的概要进一步缩小方法公式的规模并化简推导过程。对于方法概要公式,既可以单独求解(过程内分析),也可以按照上下文不敏感或敏感的方式联结起来求解(过程间分析)。
(2)提出了基于SAT求解的Java程序指向分析的新方法,该方法同样是流敏感、属性敏感以及上下文敏感的,能够有效缓解传统方法精确分析时的状态空间爆炸问题。方法的基本思想和主要分析流程与基于SAT求解的Java程序类型分析方法相同。主要区别在于指向分析方法是一个反复迭代、逐步求精的过程,它利用已有的分析结果精化当前的方法公式,再次组成程序的公式并求解,从而获得更加精确的分析结果,如此反复直至达到稳定。
(3)提出了适合AspectJ程序分析的面向方面调用图,该调用图能够表示AspectJ语言定义的多种程序执行事件,并且能够在上下文不敏感的情况下间接表示出与节点相关的部分对象的动态类型,解决了传统上下文不敏感调用图的缺陷。我们在传统调用图的基础上增加了节点的种类,定义了节点的类型并区分静态节点类型和动态节点类型,另外还定义了边的种类。我们将基于SAT求解的Java程序类型分析方法用于上下文不敏感面向方面调用图的构造。对于基程序和方面程序中的通知,我们采用基于SAT的方法分析。对于通知在程序中的织入点,我们通过对切点做快速的解析来估计。对于静态通知,我们能够准确的估计通知的织入点,但对于动态通知,我们只能估计出所有可能的织入点。要想进一步提高动态通知织入点的估计精度,可以运用我们提出的动态通知编织优化方法。
(4)提出了基于上下文不敏感面向方面调用图的AspectJ程序动态通知编织优化方法,相比较其它优化方法,该方法考虑了具有分别与对象的动态类型和程序运行时调用栈有关的两类动态性的通知的编织优化。我们的方法在上下文不敏感面向方面凋用图上求解程序运行到可能织入点时的调用栈表达式,并利用面向方面调用图的动态类型推导能力推导调用栈表达式中节点的所有可能的类型,然后将该表达式与切点匹配,若切点包含表达式中的所有模式,则将通知调用无条件织入该节点;若切点不包含其中任一种模式,则通知调用不织入;至于其它情况,通知调用仍需条件织入。