动态分析JavaScript的代码推荐方法
2017-02-20刘爽
刘爽
辽宁锦州渤海大学信息科学与技术学院
动态分析JavaScript的代码推荐方法
刘爽
辽宁锦州渤海大学信息科学与技术学院
本文基于现有静态分析技术,编程时代码静态分析方式所推荐方法准确度很低,更加重要的是推荐的响应速度慢,本文动态分析的JavaScript代码推荐方式,根据Eclipse插件所实现的推荐平台。本文采取一种预先建模方式用来保存动态代码推荐的存储数据结构和运行环境,根据对象节点上下文特征建立特征索引。同时将用户程序代码片段进行分解,分解的抽象语法树是代码分块的执行基础,在用户代码解释执行过程中基于对象节点之间的相似度修正个别变量代码推荐方式,并在文章结尾给出模拟、解释执行动态代码推荐产生的方法,实现动态分析代码推荐的方法。根据文章最后的实验结果分析可知,与静态分析比较而言,JavaScript要实现动态分析代码推荐必然能够实现代码推荐准确性有所提高和响应速度有所加快。
JavaScript 静态分析 动态分析 代码推荐 抽象语法树
1 引言
目前,JavaScript技术作为非常流行脚本编程语言,JS脚本语言在不同的浏览器上应用,重要的是不限于浏览版本,除此之外的还有网络服务器、智能手机操作系统。正是由于JavaScript技术的正盛,JavaScript本身拥有的全部集成开发环境(IDE)新特性和新功能,新特性和新功能备受关注。
很多IDE开发环境为用户提供了JavaScript脚本代码推荐的功能,当程序员输入了某个关键字时,在继续输入一个点号“·”操作符,IDE自带的开发平台会自动弹出相关的代码推荐列表,会根据实际情况自动推荐出有可能出现在点号之后的一些属性或者是函数名称,推荐给你能够大大的缩短程序员系统内的类库或本人已经定义的类库进行使用,减轻程序编写过大的工作量,避免开发过程中因为拼写错误出现的异常处理,从而提高程序的开发效率,缩短软件开发周期。
目前,代码推荐在静态分析的基础上进行的分析过程,通过对代码分析过程和数据流程分析构建基于静态分析代码推荐系统,另一种方法是通过分析历史使用过的代码进行静态分析过程。另外,JavaScript某些特性是动态的,使用原型(prototype)开发模式实现JS类中部分属性声明和类与类之间的继承特性,JavaScript在HTML网页上可以通过先解释后执行的方式运行用户程序代码片段,对象节点的类型在解释运行代码的过程中有可能变量类型发生改变。
为了能够解决在JavaScript程序代码推荐所产生的困难,JavaScript中的变量类型可以实现动态分析,动态分析JavaScript的变量或者函数推荐问题,通过模拟代码解释执行环境与系统的应用环境,按照解释运行用户代码顺序,获得合理的推荐类型和代码推荐信息。
2 建立动态分析代码推荐模型问题
2.1 初始化运行环境
初始化代码推荐的运行环境是为了让用户程序片段能够解释执行,其中包括:上下文对象节点和JavaScript的内置变量类型和函数,实际上,不同的JavaScript引擎需要运行在不同的平台之上。让JavaScript运行在Eclipse平台中,与Java代码进行结合,一方面可以实现字符串类型作为输入参数,另一方面可以选择直接解释执行某段代码,在完成用户代码解释执行,用户方可获取代码解释执行与之相关的上下文数据,包括:定义的变量和函数等等。
2.2 添加类库文件并保存上下文数据
当JavaScript程序开发时,需要基于第三方或者程序员定义的类库文件,通过这种方式有利于减轻软件开发负担。但是,大量开源类库给动态分析的代码推荐工作有效性提供了可能。首先,由于类库文件内容普遍较大且类库的结构复杂,基于静态分析程序效果不佳,要实现准确得到类库对象类型较难。另外,由于类库的动态分析要求时间和空间开销较大,每次代码推荐过程都必须完成动态分析操作,需要重复地完成上述操作,并将动态类库分析结果进行保存便于后面的代码调用。由于现有的类库数量较多,且新的类库正在不断的涌现,并不需对全部的类库都进行分析和保存。
2.3 保存全部可达对象节点
在模拟代码推荐过程中,由于程序代码片段并不完整地呈现,代码推荐模拟过程中需要进行对象节点的替换操作,需要替换对象节点是代码解释执行中所创建的对象,也就是通过new的对象需要实时更新,在模拟运行环境中替换的所有已经创建的对象。将所有的从根节点出发可达的JavaScript解析数节点对象都可以进行替换操作,因此,需要保存从根节点到任何可达对象节点的全部记录。
2.4 建立对象索引数据结构
本节中建立对象索引数据结构是根据已经获得的所有已经保存的JavaScript对象节点数据,获取两种特征值作为对象节点数据Map结构的键和值,键值变量的存储类型均为字符串类型,因此,本文所使用对象节点数据Map类型作为存储对象节点索引的数据组织结构。
序号COI(objects)CreateObjectIndex建立对象索引函数,并输入参数为对象集合输入: objects- JavaScript 关于 JavaScript节点的对象集合;输出:index,记录对象索引信息的存储数据结构Map,数据类型为string 1 Index←0;//下标的参数2for i←0 to objects .size-1//循环整个对象索引数组3for j←0 to map.size-1//循环变量在记录对象索引的全部数据4 If(比较对象索引的对象名称与记录对象索引的对象名称是否相同) map.add(对象名称,对象索引数组); //在这判断对象索引的对象名称与记录对象索引的对象名称是否相同,相同的则添加到对象索引信息的存储数据结构Map中5 String [] lists=分割函数(对象名称) //取出对象索引数组中的对象名称,将对象节点名称数据放入lists数组中;6Foreach String list in lists Do//遍历全部的对象节点名称7 index←对象节点数据结构.添加函数(对象节点列表,对象索引数组) //取出对象节点名称的下标值8 End Foreach 9 End if 10End for 11End for
2.5 生成代码推荐
在本小节中,需要生成代码推荐模型,并结合对象索引需要推荐的用户代码片段中,通过该模型建立代码推荐信息。本文叙述的代码推荐模型和代码片段相关,当用户提出代码推荐请求时。在进行代码推荐模型的同时需要先对用户代码划分,建立代码推荐模型之后运行代码片段,根据节点推荐对象的类型,给出待代码推荐的排序结果对象列表。
在生成代码推荐模型的初期,本文将根据代码推荐模型发出推荐代码,在全程生成代码推荐时,必须进行预处理的数据都保存在代码推荐模型里。再次,由于本文所列出的代码推荐模型针对HTML网页中的JavaScript推荐程序,本文想要提供了一个待选的代码步骤,由用户推荐时决定是否进行网页页面绑定的结果,在应用程序中JS的代码推荐应用,代码推荐应用主要的作用是对网页页面XML对象节点树状结构的修改操作,这种能够修改XML对象节点绑定相关页面,为下一步的代码推荐的准确度。然后,本文提出了一种动态分析用户代码片段的推荐方法,通过预分析代码片段中无关代码块进行剔除,剔除在代码片段中函数无关代码也能够被运行。最后,当运行用户代码片段的模拟运行开始,在代码运行期间一般会出现不同异常问题,本文通过替换某些变量等方式实现代码推荐。当在模拟代码推荐运行结束之后,在生成代码推荐得到关注的是对象类型信息,在对代码推荐结果进行排序之后,给出代码推荐序列。
3 执行代码的模拟过程
当接收来自程序员提交功能请求时,通过模拟代码解释和执行用户代码片段的方式,以此方式获得对象节点的数据信息,并实现动态分析类中变量类型代码推荐方式。动态分析对象类型给出准确的推荐请求,另外,推荐对象适用于复杂表达式,在多个方法连续调用或者数组变量存在的地方,首先将用户自定义的代码片段分解成若干个不同的用户代码块,其次,按照顺序的方式执行已经分解过的代码块。
3.1 用户代码块分解
在此处将用户要执行的代码片段进行逐个分解。在下述代码片段中,程序员在①处提出了代码推荐请求操作,此请求不但位于类对象节点T2的定义中,重要的是也位于Bp2函数代码段,此种相互调用方式并不能顺序执行请求。
下述的伪代码片段以JavaScript语言结构转换成的抽象语法树,得到的转化结果则是一个包含抽象的对象结点列表数据。在抽象语法树上实现对对象节点的遍历操作,如果对象结点是方法名称或者对象节点的属性时,表明该对象节点可能为用户动态分析代码推荐点,将对象结点中除了表达式之外的父结点都置于结果列表中,反之,需要添加在表达式之前节点上即可,循环遍历结束为止。
序号用户代码片段的分解示意1 Var T1{//定义一个代码段T1 2 a=1;//初始化变量值3函数(参数){renturn a;}//调用某个函数4 } 5 T1.ap3=2;//定义一个全局变量,并赋值6 Var T2{//定义一个代码段T2 7Bp1:b=1;//在bp位置定义一个变量,并赋参数值8Bp2:函数(参数){//调用某个函数,并传递进一个相关参数9ap.a++; ap.ap3=2;//改变参数a和ap3的参数值10Return bp3.计算函数()①}//①处调用T2代码段的compute函数11Bp3:T1 12}
3.2 用户代码块的顺序执行
上面研究的依次执行代码块是基于动态分析实现代码推荐过程中的主要内容。在代码解释执行时,变量未被定义则会抛出异常处理请求,必须进行某些对象节点的替换操作。
在上面的代码分解后开始顺序执行代码块时,此时会出现在T1类中ap参数未定义的异常,必须进行某些对象节点的替换操作。先提取要替换对象Bp3的基本特征:属性名(a,ap3),变量名(a,ap3,ap)。接着根据对象节点提取的这些特征值进行匹配对象节点模型,获取包含全部对象节点的特征序列,将ap参数替换具有这些特征信息的对象节点a,并继续顺序执行用户定义的代码块。
4 结论与展望
本文研究的动态分析方式实现的JavaScript类属性和类方法的代码推荐方法,动态分析特性实现具有准确度较高、响应速度较快的优点,今后有可能将对JavaScript代码推荐结果的实现排序优化操作,使得代码推荐方法的实用性实现大范围扩展。
在以后的实践工作中,研究动态分析代码推荐方法指的关注的两方面的问题:
①在JavaScript实现的代码推荐过程中,现在网页中存在大量数据解析和代码运行问题,有可能通过创建一种动态代码推荐排序功能实现对应用程序的实现,将相似度高的推荐对象节点放在推荐列表上端。本文提出的代码推荐排序结果比较为简单,但是效果一般,在这一方面值得进行下一步深入研究代码推荐工作。
②进行有目的性的JavaScript使用代码推荐模式,目前存在不少工作量是针对使用动态方式的代码推荐,而针对在JS技术中实现的动态代码推荐分析的方法相关研究比较少,由于JavaScript技术的某种特性,使得动态的代码推荐方法有研究的可能性。
[1]叶云,李春强,胡军山.基于CK610的Dalvik虚拟机移植与优化[J].计算机工程,2011,37(16):291-292
[2]周毅敏,陈榕.Dalvik虚拟机进程模型分析[J].计算机技术与发展,2010,20(2):83-86
[3]吴通.基于程序分析和机器学习的JavaScript代码推荐研究[D].上海交通大学.2014
[4]吴通,陈雨亭.基于动态分析的JavaScript代码推荐[J],计算机工程.2014:40(10),66-68