论文部分内容阅读
程序分片是一种程序抽取技术,对于程序分析、程序理解以及软件工程的各个领域都很有帮助。自从1979年被提出以来,程序分片受到人们的广泛关注,目前它的技术已经很成熟。特别静态分片和动态分片部分,算法很多,且已经十分成熟。它的主要算法有 Mark Weiser 提出的数据流等式算法,K.J.Ottendtein和L.M.Ottendtein以及Horwitz 提出的基于依赖图的图可达性算法,Bergeretti提出的信息流算法等。随着静态分片技术的不断成熟,人们开始研究分片的新领域,首先提出针对不同语言的分片算法,如Larsen和Harrold的针对C++语言的图的可达性算法,Kovacs et al 和Zhao修改后解决JAVA系统特殊机制的方法;其次对分片的概念加以扩充,出现了条件分片,无定型分片等概念。这些方法和概念的提出,把分片带到了更加广阔的领域。随着面向对象语言的广泛应用,人们开始研究针对面向对象语言的分片技术。但是面向对象语言存在着一些特殊的机制,如继承、多态、动态绑定等,传统的分片方法已经不能解决这些问题。旧的方法需要改进,人们提出了一些方法解决这些问题。按照目前的研究状况,针对面向对象语言的分片技术基本成型,它的主要方法是在图的表示上作一些修改,用图形来表示上述提到的各种机制。算法基本成熟,但是比较成形的工具还很少;另外针对JAVA语言的分片技术还属于方法的提出阶段。基于这样的情况,我们决定开发一个针对JAVA语言的分片系统,它能处理JAVA语言的各种特殊机制,并且高效。条件分片是一个新提出的概念。静态分片不考虑输入情况,是一种完全静态的抽取,这样得到的结果很大,而动态分片考虑所有的输入,在确定一种输入的情况下,它能得到唯一的一个分片结果。人们发现这两种分片都很极端,而通常人们的需求是一定条件下程序的抽取结果,这是就引出了条件分片的概念。它介于静态和动态分片之间,是程序分片下一步的研究重点。这个概念提出没有多长时间,技术还不成熟,于是我们在自己的系统中加入条件分片的技术,并且对所处理的语言进行一定的条件分片的处理,希望这是一个好的开端,在接下来的研究中,逐步完善系统中条件分片的算法,使条件分片的算法逐步完善。 <WP=61>本系统分为两部分,首先完成针对JAVA语言的静态分片,采用的是基于JAVA的系统依赖图(JSDG)的可达性算法;然后完成条件分片的部分处理,因为条件分片可以利用第一步中静态分片的结果,所以我们在这里分开处理上述两部分。在JAVA的静态分片处理中,我们对JAVA 语言的基本的类型,大多数的机制都进行了处理。主要完成以下工作首先针对源程序进行预处理,得到源程序的各个语句的标记,这是JSDG和源程序的桥梁。建造JSDG,在此过程中,通过各个边和节点可以把JAVA语言中的程序结构、机制表示出来,本过程的结束得到的是源程序的图形表示。根据用户输入的分片准则采用分片的算法,得到基于图形的分片结果。转换。要把图的结果转化为程序的结果。第二大部分是条件分片处理部分,我们采用类型程序的部分求值技术和符号约束求解相结合的方法。首先用户给出程序的一些条件集,这些条件给出了部分变量的取值范围值。然后根据已知变量的范围值来求出未知变量的范围值。最后根据求出的变量范围值来对JAVA语言的条件表达式进行判断,如果能够判断出来则留下相应的分支,否则全部保留。在论文中,我们详细的介绍了条件表达式的文法,条件判断的简单文法和判断方程,并给出确定表达式取值范围的函数,针对不同的程序语句给出处理,并给出结构流图。本系统采用的开发工具是编译的自动生成工具ACCENT和VC++,ACCENT 自动进行词法分析、语法分析,可以在文法的任意部位插入语义动作,这样我们在语义动作中完成JSDG的建造。本系统的特点是解决了JAVA语言中的特殊机制,给出了处理对象的准确方法,在分析数据流的时候,通过建造定义性变量表来记录变量的临时信息,查找数据流关系的时候可以通过查表找到相关的语言;同时建造类表和函数表,寻找类间和函数间的关系时就可以通过查表来找到相关信息。采用的方法简单,效率较高。在条件分片部分,提出了自己的方法。 <WP=62>本系统还有很多没有完成的工作。比如JAVA语言的复杂数据结构—数组、JAVA的异常和多线程都没有进行处理,条件分片的研究还属于初步,实现的结构还很少。在接下来的工作中,这些都是重点,我们的目标是要建成一个全面的、精确的JAVA的分片系统。本系统的重要意义在于实现了面向对象语言的分片技术,并把研究扩展到比较新的条件分片领域,这是程序分片技术的下一步的研究重点,也是我们工作的重点。目前本系统还属于试验性质,但对于JAVA语言还是能够得到比较准确的分片结果。我们希望在此基础上继续研究,开发出全面的、精确的JAVA语言的分片系统工具。