基于动态分析的JavaScript代码推荐

2014-06-07 05:53陈雨亭
计算机工程 2014年10期
关键词:类库分块插件

吴 通,陈雨亭

(上海交通大学软件学院,上海200240)

基于动态分析的JavaScript代码推荐

吴 通,陈雨亭

(上海交通大学软件学院,上海200240)

针对现有基于静态分析的JavaScript代码推荐技术准确度低且响应速度较慢的问题,提出一种基于动态分析的JavaScript代码提示方法,并设计基于Eclipse插件的代码推荐工具。采用事先建模的方法保存模拟运行环境,并且对上下文对象建立特征索引。同时在用户代码抽象语法树的基础上进行代码分块,按程序分块顺序对用户代码进行模拟执行,利用对象之间的相似度在用户运行时修正运行变量,并对模拟执行时产生的异常进行处理,实现针对用户代码的动态分析JavaScript代码提示。实验结果表明,与现有使用静态分析方法的JavaScript代码推荐技术相比,该方法具有更高的可推荐性和更快的响应速度。

代码推荐;Eclipse插件;动态分析;抽象语法树;模拟运行;异常处理

1 概述

JavaScript作为一种脚本语言正变得越来越流行,它不但被应用于像Gmail这样的浏览器应用程序,近年来更是被运用在服务器、手机、甚至Win8这样的桌面程序上。正因为JavaScript的流行,使得针对JavaScript集成开发环境[1](Integrated Development Environment,IDE)新特性[2]和功能[3]的研究受到了更多的关注。

不少IDE提供了针对JavaScript的代码推荐功能[4]:当开发人员输入了一个表达式e之后,输入一个点号“.”,代码推荐功能会推荐出可能出现在点号之后的属性和方法名。这项重要的功能能够缩短程序员对于不熟悉的类库或框架的学习时间,减轻代码编写过程中输入完整方法类型名称的负担,避免编程过程中的拼写错误,从而提高软件的开发效率。

现有的代码推荐方法大多基于静态的程序分析[5],通过指向分析[6]和数据流分析[7]建立类型系统[8-9],除此之外也有方法通过分析历史样例代码进行静态分析[10]。但是,JavaScript具有显著的动态特性[11],使用原型(prototype)的方式实现类型和继承系统,没有事先编译过程,通过解释执行的方式运行代码,对象的类型可以在运行过程中发生改变。这些动态的特性导致了传统的静态分析方法不能有效地建立JavaScript的类型系统[12]。

为解决在JavaScript代码推荐问题中类型分析困难的问题,本文提出一种基于动态分析的代码推荐方法,通过模拟代码执行环境,按特殊顺序运行用户代码,获得表达式的类型信息并给出合适的代码推荐。

2 JavaScript代码推荐分析

具体分析JavaScript代码推荐方法中的一些挑战,如下代码中的①,②,③分别代表了不同类型的代码推荐问题。

缺少对象类型:JavaScript是一种弱类型的语言,没有严格的类型申明,特别是在函数定义时参数和返回对象不确定类型。例如①中需要推荐的对象node是函数定义时的参数,②中需要分析jQuery函数的返回类型。

使用框架:在JavaScript编程过程中,框架的使用必不可少,但是一般来说框架十分复杂且与用户代码文件缺乏关联,这些因素使得针对JavaScript程序的代码推荐变得困难。例如②中就使用了jQuery框架及其插件中的方法。

类型动态改变:在JavaScript程序执行过程中对象的类型会发生变化。例如,程序中对象node在setColorText方法内添加了属性text,所以在③时应给出text属性的推荐。

3 动态分析的代码推荐方法

基于动态分析的代码推荐方法分为事先建立对象模型和模拟执行2个阶段。第1个阶段,采取事先建模的方法保存模拟运行环境,并且对上下文中的对象建立特征索引。第2个阶段,首先载入对象模型,然后分析当前推荐相关的部分代码,使用本文实现的代码执行器运行代码,最后根据获取的对象信息给出推荐。在代码执行过程中对程序执行顺序进行定义,实现了替换未知对象的机制,并能较好地处理异常。

4 对象模型的建立

建立对象模型的2个步骤如下:

(1)记录所有用户程序可见的JavaScript对象,包括所有浏览器等默认对象和所依赖类库中包含的对象。

(2)在记录这些对象的基础上,按照对象的特征建立索引。

使用动态运行用户代码的方法给出JavaScript推荐,首先必须有一个可供用户代码的执行环境,通过事先记录上下文中JavaScript对象的方法,建立一个代码的模拟执行环境。记录的对象包括浏览器等JavaScript默认对象和所依赖类库中包含对象。由于不同的浏览器对象虽然大部分通用的功能相同,但是也有一些特殊功能,因此选用了Envjs这个使用JavaScript开发的模拟浏览器框架,它能够模拟绝大多数浏览器的功能,框架载入完成之后将自动记录其中包含的所有对象,并提供较好的浏览器兼容性。另外,针对需要保存的是类库中对象的情况,提供了用户自定义的方式,只记录由开发人员定义需要使用的依赖类库中包含的各种对象。

在完成了记录上下文中JavaScript对象的工作之后,针对这些对象的特征建立索引。这里定义了2种特征,第1种特征是对象中包含的方法和属性,例如一个字符串对象 s就应该包含有 length和substring等属性和方法。选取这种特征是因为JavaScript中对象没有固定类型信息,不能通过类型名称等方法给对象分类,但是属性和方法名称能够说明对象的作用和类型。第2种特征是对象的变量名,在命名规范的代码中,变量名能够起到明确表征对象用途和类型的作用[13]。但是,变量名通常会因为程序员的个人特点而各不相同,例如对于一个表示浏览器表单对象的命名,可能就有 loginForm, lgFrom,fLogin等。为了让变量名更加有意义,采用了分割变量名的方法,例如将loginForm可以分割成login和form,并将它们和loginForm都作为对象的特征保存到索引中去。

5 执行代码的模拟

当接收到程序员发出的推荐请求时,通过模拟执行用户的相关代码的方法,获得推荐对象的结构信息,并给出类似静态类型分析的代码推荐。动态分析的方法能够在对象类型信息变化时同样给出准确的推荐信息,另外它也适用于推荐对象是复杂表达式的情况,例如多个方法连续调用和数组变量等。

在这个阶段,首先将用户代码分解成不同的代码块,然后按顺序执行代码块,并在执行过程中进行未知对象的替换和异常处理。

5.1 用户代码分块

针对需要用户的推荐发生在函数或者类型定义中的情况,对用户的代码进行分解。在下述代码中,用户在①提出了推荐请求,这个请求不但在对象b的定义中,而且它也位于bp2函数的定义中,这种情况下不能通过逐行执行的方式处理请求。

分块算法以代码转换成的抽象语法树(abstract syntax tree)作为输入,得到的结果是一个包含抽象语法树结点的列表。在算法开始时,在抽象语法树上进行遍历。如果结点是方法声明或者对象属性定义,表明代码推荐点之后的语句也可能对需要计算的表达式e的父结点产生影响,所以需要将结点中除了e的父结点之外的所有结点都加入到结果中去,反之只需要添加在e之前的所有子节点。遍历直到表达式e结束。在上文的例子中,将用户代码分割成 I(1 行 ~6行)、II(9 行、17行)、III (12行~14行)3个代码块。Algorithm 1展示了分割用户代码的具体过程。

5.2 代码块的顺序执行

将代码块进行分块之后,可以按照分块列表的顺序依次执行代码块。在执行的过程中,会遇到变量未定义等异常,例如在函数定义中参数未知,这时需要进行位置对象的替换。

在上面的例子中,在执行代码块III过程中会发生aParam未定义的异常,需要从对象模型中找到合适的对象进行替换。这里首先提取出需要替换对象bp3的特征:属性名(ap1,ap4),变量名(a,param, aParam)。接着根据这些特征值查找对象模型,取得至少含有一个特征值的所有对象,最后将aParam替换成包含有最多特征值的对象a,并继续执行代码块III。Algorithm 2展示了顺序执行代码块的具体过程。

6 实验与评估

最终实现了基于Eclipse插件[14]的代码提示工具JSRecommender。JSRecommender在 Eclipse JSDT的基础上实现了动态分析的代码推荐,使用了JSDT提供的AST接口实现抽象语法树的建立,并使用Rhino作为代码的执行引擎,通过序列化的方式保存上下文对象到文件中。接下来通过实验工具的实际使用价值,作为对比的是 Eclipse中最完整的JavaScript开发插件JSDT。

为了贴近实际的代码推荐问题,选取了实际的JavaScript项目作为实验的测试对象。jQuery-UI是基于jQuery框架[15]的JavaScript类库,它提供了完整UI用户接口,包括特效、控件、主题等,在所有jQuery插件中被最多用户使用。表1列出了实验中包含的jQuery-UI源文件信息。Lines表示源文件的行数,LOC表示需要推荐的位置个数。

表1 测试程序代码信息

为了衡量代码提示工具的实际使用价值,本文提出了2个标准:

(1)可推荐性

这个标准指在用户发起代码提示请求后,代码推荐工具提供的信息中包含正确推荐的百分比。在实验过程中,首先去除需要推荐的正确方法或属性名,在缺省的代码上使用代码推荐工具,获得可能的候选对象,对比原代码就可以获得推荐成功的百分比。

JSRecommender既可以作为单独的代码推荐工具,又可以作为JSDT的补充。所以在实验过程中对JSDT、JSRecommender和JSDT+JSRecommender这3种方法进行了比较。图1显示了3种推荐方法对于不同代码文件的推荐成功百分比。JSDT可以达到27.1%的推荐成功率,而JSRecommender和JSDT +JSRecommender 2种方法分别可以达到56.2%和66.74%的正确率。

图1 代码推荐准确度分析

(2)可扩展性

当代码变得越来越复杂时,代码推荐方法需要花费更多的时间获得推荐结果。比较对于不同规模的JavaScript代码,每一个代码推荐请求的平均响应时间。

图2显示了不同代码文件的代码推荐平均时间。JSDT的推荐平均响应时间是 219 ms, JSRecommender的平均响应时间是126 ms,并且响应时间没有因为代码量的增加出现明显的延长。

图2 响应时间分析

7 结束语

JavaScript的动态特性一直影响着各种代码推荐工具的准确度。本文提出了一种基于动态分析的JavaScript代码推荐方法,区别于传统的静态分析方法,更贴近JavaScript的动态特性,具有准确度高、响应时间短的优点,从一定程度上解决了动态特性对于代码推荐工具的影响。今后将对推荐结果的排序进行优化,使方法的可用性得到进一步的提高。

[1] Feldthaus A.Efficient Construction of Approximate Call Graphs forJavascriptIDE Services[C]//Proc.of International Conference on Software Engineering. [S.l.]:IEEE Press,2013:752-761.

[2] Schäfer M.Refactoring Tools for Dynamic Languages [C]//Proc.of the 5th Workshop on Refactoring Tools. [S.l.]:ACM Press,2012:59-62.

[3] Andreasen E,Feldthaus A,Jensen S H,et al.Improving Toolsfor JavaScriptProgrammers[C]//Proc.of International Workshop on Scripts to Programs.Beijing, China:[s.n.],2012:67-82.

[4] Rosco H,RideoutJ.AutomaticMethod Completion [C]//Proc.of the 19th International Conference on Automated Software Engineering.[S.l.]:IEEE Press, 2004:228-235.

[5] 杨 宇,张 健.程序静态分析技术与工具[J].计算机科学,2004,21(2):171-174.

[6] Kastrinis G,Smaragdakis Y.Hybrid Context-sensitivity for Points-to Analysis[J].ACM SIGPLAN Notices, 2013,48(6):423-434.

[7] Allen F E,Cocke J.A Program Data Flow Analysis Procedure[J].Communications of the ACM,1976,19 (3):137-142.

[8] Perelman D. Type-directed Completion of Partial Expressions[C]//Proc.of PLDI’12.[S.l.]:ACM Press,2012:275-286.

[9] Brian H,Guo Shuyu.Fast and Precise Hybrid Type Inference for JavaScript[J].ACM SIGPLAN Notices, 2012,47(6):239-250.

[10] Marcel B,Monperrus M,Mezini M.Learning from Examples to Improve Code Completion Systems[C]// Proc.of the 7th Joint Meeting of the European Software Engineering Conference and the ACM SIGSOFT Symposium on the Foundations of Software Engineering.[S.l.]:ACM Press,2009:213-222.

[11] Richards G,Lebresne S,Burg B,et al.An Analysis of the Dynamic Behavior of JavaScript Programs[C]// Proc.of ACM SIGPLAN Conference on Programming Language Design and Implementation.Toronto,Canada: ACM Press,2010:1-12.

[12] Jensen S H,Møller A,Thiemann P.Type Analysis for JavaScript[M].Berlin,Germany:Springer,2009.

[13] Heinemann L,Hummel B.Recommending API Methods Based on Identifier Contexts[C]//Proc.of the 3rd International Workshop on Search-driven Development: Users,Infrastructure,Tools,and Evaluation.[S.l.]: ACM Press,2011:1-4.

[14] Clayberg E,Rubel D.Eclipse:Building Commercialquality Plug-ins[M].[S.l.]:Addison-Wesley Publishing Company,2004.

[15] Jonathan C,Swedberg K.Learning Query:Better Interaction Design and Web Development with Simple JavaScript Techniques[M].[S.l.]:Packt Publishing, 2007.

编辑 任吉慧

JavaScript Code Recommendation Based on Dynamic Analysis

WU Tong,CHEN Yu-ting
(School of Software,Shanghai Jiaotong University,Shanghai 200240,China)

Aiming at the problem of low precise and slow response in the state of JavaScript code recommendation technology,this paper introduces a JavaScript code recommendation method based on dynamic analysis and implements a code recommendation plug-in for Eclipse.This approach builds model offline for storing the simulated runtime environment,and creates indexes for all objects in the environment.It simulates executing user code,while applying abstract syntax tree of user code for blocking and updating undefined variables at runtime,to achieve a JavaScript code recommendation tool based on dynamic analysis.Compared with current code proposal tools with static analysis, experiments show the tool improves both the precise and response time.

code recommendation;Eclipse plug-in;dynamic analysis;abstract syntax tree;simulated execution; exception handling

1000-3428(2014)10-0066-05

A

TP311.5

10.3969/j.issn.1000-3428.2014.10.013

国家自然科学基金资助项目(61272102,61100051)。

吴 通(1988-),男,硕士研究生,主研方向:程序语言分析;陈雨亭,讲师。

2013-11-06

2013-11-29E-mail:tong.wu.stap@gmail.com

中文引用格式:吴 通,陈雨亭.基于动态分析的JavaScript代码推荐[J].计算机工程,2014,40(10):66-70.

英文引用格式:Wu Tong,Chen Yuting.JavaScript Code Recommendation Based on Dynamic Analysis[J].Computer Engineering,2014,40(10):66-70.

猜你喜欢
类库分块插件
分块矩阵在线性代数中的应用
自编插件完善App Inventor与乐高机器人通信
用Java编写客户机/服务器端应用程序
Python在数据可视化中的应用
数据结构课程教学改革方案和应用效果
数据结构可视化类库的设计与实现
基于jQUerY的自定义插件开发
反三角分块矩阵Drazin逆新的表示
基于自适应中值滤波的分块压缩感知人脸识别
MapWindowGIS插件机制及应用