计算机软件分为应用软件和系统软件。应用软件针对用户的具体应用需求,而系统软件则用于控制和协调计算机及外部设备,并支持应用软件开发和运行[120]。不论是应用软件还是系统软件,都是一组程序的集合,而这组程序则实现了软件应该包含的所有功能。
从模块化软件架构的角度来看,软件可以划分为相对独立完成部分功能的子系统,子系统间边界清晰,内部业务和数据具有较高的凝聚性;而子系统又可以继续分解为若干个功能模块,功能模块则是由实现原子功能的函数组成。软件分解如图2 所示。
图2 软件功能分解图
随着软件规模的不断扩大和软件复杂性提高,模块化思想应运而生,模块化指的是软件按照某种规则被分成了很多模块,模块与模块之间通过调用建立联系。每个模块都由两个部分组成:可变部分和稳定部分。为了降低耦合度,提高安全性,软件在实现时,通过将模块中可变的部分(具体实现细节)封装起来,而将稳定的部分以接口的形式暴露给其他模块,以供调用。由于模块的粒度可大可小,因此一个接口可以对应一个功能函数,如图3(a)所示;也可以对应多个功能函数,如图3(b)所示。
图3 接口与功能函数的对应关系
从图3 中可以看出,软件功能的一次实现,是一个功能函数的执行或若干个功能函数按一定顺序的执行,因此也可以由接口的执行序列来表示,在这个接口序列中的接口也因为共同实现的软件功能而具备了局部语义相关性。例如,若软件的某个功能是实现对文件a的操作,那么在这个接口序列中,出现用来打开文件的接口的概率就很大;同样对于某个函数f1,若它的输出是函数f2的输入,或函数f2用来将它的输出关闭,抑或是其他情况,即函数f1与函数f2必须成组出现,那么若f1出现在这个接口序列中,函数f2 在这个接口序列中出现的概率同样很大。本章利用接口在代码中的局部语义相关性,实现对源代码中所使用的系统调用接口的快速定位。
由于系统调用是操作系统向上层应用软件提供的一组接口,从本质上说,它也是接口,具备接口的所有特性。接下来,本节将对接口进行形式化建模。
定义1 (系统调用接口/应用程序访问接口API)API=(api_Name,{method_Name,returnValueType,{parameters}*}+)。其中:
(1)api_Name表示接口的名称,作为每个API的唯一标识;(www.xing528.com)
(2)method_Name表示接口中函数的名称的集合,该集合中至少有一个元素;
(3)methodValueType表示函数类型的集合;
(4)parameters=[para Value Type,para_Name]表示函数输入参数的集合,每个函数可以有0 个、1 个或多个输入参数,para Value Type表示输入参数(即形参)的类型,para_Name表示输入参数的名称。
如前文所述,本体描述的是领域概念,以及概念与概念之间的关系,它可以由概念、关系以及公理约束组成的三元组来定义,由于操作系统中有类型之分,同一操作还有版本的区别,因此为了更好地对操作系统所提供的系统调用接口进行建模,本节在本体的基本表示上进行了扩展,如下给出接口本体的形式化定义。
定义2 (接口本体API_Onto)API_Onto=(onto_Info,concepts,relations,axioms),其中:
(1)onto_Info表示的是接口本体的基本信息,包括名称、创建者、创建时间等元数据信息;
(2)concepts表示的接口的集合;
(3)relations表示接口本体中二元关系的集合,包括接口与接口之间的二元关系;
(4)axioms是表示接口本体约束关系的公理集合。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。