• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      基于動態(tài)分析的JavaScript代碼推薦

      2014-06-07 05:53:21陳雨亭
      計算機工程 2014年10期
      關鍵詞:類庫分塊插件

      吳 通,陳雨亭

      (上海交通大學軟件學院,上海200240)

      基于動態(tài)分析的JavaScript代碼推薦

      吳 通,陳雨亭

      (上海交通大學軟件學院,上海200240)

      針對現(xiàn)有基于靜態(tài)分析的JavaScript代碼推薦技術準確度低且響應速度較慢的問題,提出一種基于動態(tài)分析的JavaScript代碼提示方法,并設計基于Eclipse插件的代碼推薦工具。采用事先建模的方法保存模擬運行環(huán)境,并且對上下文對象建立特征索引。同時在用戶代碼抽象語法樹的基礎上進行代碼分塊,按程序分塊順序?qū)τ脩舸a進行模擬執(zhí)行,利用對象之間的相似度在用戶運行時修正運行變量,并對模擬執(zhí)行時產(chǎn)生的異常進行處理,實現(xiàn)針對用戶代碼的動態(tài)分析JavaScript代碼提示。實驗結(jié)果表明,與現(xiàn)有使用靜態(tài)分析方法的JavaScript代碼推薦技術相比,該方法具有更高的可推薦性和更快的響應速度。

      代碼推薦;Eclipse插件;動態(tài)分析;抽象語法樹;模擬運行;異常處理

      1 概述

      JavaScript作為一種腳本語言正變得越來越流行,它不但被應用于像Gmail這樣的瀏覽器應用程序,近年來更是被運用在服務器、手機、甚至Win8這樣的桌面程序上。正因為JavaScript的流行,使得針對JavaScript集成開發(fā)環(huán)境[1](Integrated Development Environment,IDE)新特性[2]和功能[3]的研究受到了更多的關注。

      不少IDE提供了針對JavaScript的代碼推薦功能[4]:當開發(fā)人員輸入了一個表達式e之后,輸入一個點號“.”,代碼推薦功能會推薦出可能出現(xiàn)在點號之后的屬性和方法名。這項重要的功能能夠縮短程序員對于不熟悉的類庫或框架的學習時間,減輕代碼編寫過程中輸入完整方法類型名稱的負擔,避免編程過程中的拼寫錯誤,從而提高軟件的開發(fā)效率。

      現(xiàn)有的代碼推薦方法大多基于靜態(tài)的程序分析[5],通過指向分析[6]和數(shù)據(jù)流分析[7]建立類型系統(tǒng)[8-9],除此之外也有方法通過分析歷史樣例代碼進行靜態(tài)分析[10]。但是,JavaScript具有顯著的動態(tài)特性[11],使用原型(prototype)的方式實現(xiàn)類型和繼承系統(tǒng),沒有事先編譯過程,通過解釋執(zhí)行的方式運行代碼,對象的類型可以在運行過程中發(fā)生改變。這些動態(tài)的特性導致了傳統(tǒng)的靜態(tài)分析方法不能有效地建立JavaScript的類型系統(tǒng)[12]。

      為解決在JavaScript代碼推薦問題中類型分析困難的問題,本文提出一種基于動態(tài)分析的代碼推薦方法,通過模擬代碼執(zhí)行環(huán)境,按特殊順序運行用戶代碼,獲得表達式的類型信息并給出合適的代碼推薦。

      2 JavaScript代碼推薦分析

      具體分析JavaScript代碼推薦方法中的一些挑戰(zhàn),如下代碼中的①,②,③分別代表了不同類型的代碼推薦問題。

      缺少對象類型:JavaScript是一種弱類型的語言,沒有嚴格的類型申明,特別是在函數(shù)定義時參數(shù)和返回對象不確定類型。例如①中需要推薦的對象node是函數(shù)定義時的參數(shù),②中需要分析jQuery函數(shù)的返回類型。

      使用框架:在JavaScript編程過程中,框架的使用必不可少,但是一般來說框架十分復雜且與用戶代碼文件缺乏關聯(lián),這些因素使得針對JavaScript程序的代碼推薦變得困難。例如②中就使用了jQuery框架及其插件中的方法。

      類型動態(tài)改變:在JavaScript程序執(zhí)行過程中對象的類型會發(fā)生變化。例如,程序中對象node在setColorText方法內(nèi)添加了屬性text,所以在③時應給出text屬性的推薦。

      3 動態(tài)分析的代碼推薦方法

      基于動態(tài)分析的代碼推薦方法分為事先建立對象模型和模擬執(zhí)行2個階段。第1個階段,采取事先建模的方法保存模擬運行環(huán)境,并且對上下文中的對象建立特征索引。第2個階段,首先載入對象模型,然后分析當前推薦相關的部分代碼,使用本文實現(xiàn)的代碼執(zhí)行器運行代碼,最后根據(jù)獲取的對象信息給出推薦。在代碼執(zhí)行過程中對程序執(zhí)行順序進行定義,實現(xiàn)了替換未知對象的機制,并能較好地處理異常。

      4 對象模型的建立

      建立對象模型的2個步驟如下:

      (1)記錄所有用戶程序可見的JavaScript對象,包括所有瀏覽器等默認對象和所依賴類庫中包含的對象。

      (2)在記錄這些對象的基礎上,按照對象的特征建立索引。

      使用動態(tài)運行用戶代碼的方法給出JavaScript推薦,首先必須有一個可供用戶代碼的執(zhí)行環(huán)境,通過事先記錄上下文中JavaScript對象的方法,建立一個代碼的模擬執(zhí)行環(huán)境。記錄的對象包括瀏覽器等JavaScript默認對象和所依賴類庫中包含對象。由于不同的瀏覽器對象雖然大部分通用的功能相同,但是也有一些特殊功能,因此選用了Envjs這個使用JavaScript開發(fā)的模擬瀏覽器框架,它能夠模擬絕大多數(shù)瀏覽器的功能,框架載入完成之后將自動記錄其中包含的所有對象,并提供較好的瀏覽器兼容性。另外,針對需要保存的是類庫中對象的情況,提供了用戶自定義的方式,只記錄由開發(fā)人員定義需要使用的依賴類庫中包含的各種對象。

      在完成了記錄上下文中JavaScript對象的工作之后,針對這些對象的特征建立索引。這里定義了2種特征,第1種特征是對象中包含的方法和屬性,例如一個字符串對象 s就應該包含有 length和substring等屬性和方法。選取這種特征是因為JavaScript中對象沒有固定類型信息,不能通過類型名稱等方法給對象分類,但是屬性和方法名稱能夠說明對象的作用和類型。第2種特征是對象的變量名,在命名規(guī)范的代碼中,變量名能夠起到明確表征對象用途和類型的作用[13]。但是,變量名通常會因為程序員的個人特點而各不相同,例如對于一個表示瀏覽器表單對象的命名,可能就有 loginForm, lgFrom,fLogin等。為了讓變量名更加有意義,采用了分割變量名的方法,例如將loginForm可以分割成login和form,并將它們和loginForm都作為對象的特征保存到索引中去。

      5 執(zhí)行代碼的模擬

      當接收到程序員發(fā)出的推薦請求時,通過模擬執(zhí)行用戶的相關代碼的方法,獲得推薦對象的結(jié)構(gòu)信息,并給出類似靜態(tài)類型分析的代碼推薦。動態(tài)分析的方法能夠在對象類型信息變化時同樣給出準確的推薦信息,另外它也適用于推薦對象是復雜表達式的情況,例如多個方法連續(xù)調(diào)用和數(shù)組變量等。

      在這個階段,首先將用戶代碼分解成不同的代碼塊,然后按順序執(zhí)行代碼塊,并在執(zhí)行過程中進行未知對象的替換和異常處理。

      5.1 用戶代碼分塊

      針對需要用戶的推薦發(fā)生在函數(shù)或者類型定義中的情況,對用戶的代碼進行分解。在下述代碼中,用戶在①提出了推薦請求,這個請求不但在對象b的定義中,而且它也位于bp2函數(shù)的定義中,這種情況下不能通過逐行執(zhí)行的方式處理請求。

      分塊算法以代碼轉(zhuǎn)換成的抽象語法樹(abstract syntax tree)作為輸入,得到的結(jié)果是一個包含抽象語法樹結(jié)點的列表。在算法開始時,在抽象語法樹上進行遍歷。如果結(jié)點是方法聲明或者對象屬性定義,表明代碼推薦點之后的語句也可能對需要計算的表達式e的父結(jié)點產(chǎn)生影響,所以需要將結(jié)點中除了e的父結(jié)點之外的所有結(jié)點都加入到結(jié)果中去,反之只需要添加在e之前的所有子節(jié)點。遍歷直到表達式e結(jié)束。在上文的例子中,將用戶代碼分割成 I(1 行 ~6行)、II(9 行、17行)、III (12行~14行)3個代碼塊。Algorithm 1展示了分割用戶代碼的具體過程。

      5.2 代碼塊的順序執(zhí)行

      將代碼塊進行分塊之后,可以按照分塊列表的順序依次執(zhí)行代碼塊。在執(zhí)行的過程中,會遇到變量未定義等異常,例如在函數(shù)定義中參數(shù)未知,這時需要進行位置對象的替換。

      在上面的例子中,在執(zhí)行代碼塊III過程中會發(fā)生aParam未定義的異常,需要從對象模型中找到合適的對象進行替換。這里首先提取出需要替換對象bp3的特征:屬性名(ap1,ap4),變量名(a,param, aParam)。接著根據(jù)這些特征值查找對象模型,取得至少含有一個特征值的所有對象,最后將aParam替換成包含有最多特征值的對象a,并繼續(xù)執(zhí)行代碼塊III。Algorithm 2展示了順序執(zhí)行代碼塊的具體過程。

      6 實驗與評估

      最終實現(xiàn)了基于Eclipse插件[14]的代碼提示工具JSRecommender。JSRecommender在 Eclipse JSDT的基礎上實現(xiàn)了動態(tài)分析的代碼推薦,使用了JSDT提供的AST接口實現(xiàn)抽象語法樹的建立,并使用Rhino作為代碼的執(zhí)行引擎,通過序列化的方式保存上下文對象到文件中。接下來通過實驗工具的實際使用價值,作為對比的是 Eclipse中最完整的JavaScript開發(fā)插件JSDT。

      為了貼近實際的代碼推薦問題,選取了實際的JavaScript項目作為實驗的測試對象。jQuery-UI是基于jQuery框架[15]的JavaScript類庫,它提供了完整UI用戶接口,包括特效、控件、主題等,在所有jQuery插件中被最多用戶使用。表1列出了實驗中包含的jQuery-UI源文件信息。Lines表示源文件的行數(shù),LOC表示需要推薦的位置個數(shù)。

      表1 測試程序代碼信息

      為了衡量代碼提示工具的實際使用價值,本文提出了2個標準:

      (1)可推薦性

      這個標準指在用戶發(fā)起代碼提示請求后,代碼推薦工具提供的信息中包含正確推薦的百分比。在實驗過程中,首先去除需要推薦的正確方法或?qū)傩悦?在缺省的代碼上使用代碼推薦工具,獲得可能的候選對象,對比原代碼就可以獲得推薦成功的百分比。

      JSRecommender既可以作為單獨的代碼推薦工具,又可以作為JSDT的補充。所以在實驗過程中對JSDT、JSRecommender和JSDT+JSRecommender這3種方法進行了比較。圖1顯示了3種推薦方法對于不同代碼文件的推薦成功百分比。JSDT可以達到27.1%的推薦成功率,而JSRecommender和JSDT +JSRecommender 2種方法分別可以達到56.2%和66.74%的正確率。

      圖1 代碼推薦準確度分析

      (2)可擴展性

      當代碼變得越來越復雜時,代碼推薦方法需要花費更多的時間獲得推薦結(jié)果。比較對于不同規(guī)模的JavaScript代碼,每一個代碼推薦請求的平均響應時間。

      圖2顯示了不同代碼文件的代碼推薦平均時間。JSDT的推薦平均響應時間是 219 ms, JSRecommender的平均響應時間是126 ms,并且響應時間沒有因為代碼量的增加出現(xiàn)明顯的延長。

      圖2 響應時間分析

      7 結(jié)束語

      JavaScript的動態(tài)特性一直影響著各種代碼推薦工具的準確度。本文提出了一種基于動態(tài)分析的JavaScript代碼推薦方法,區(qū)別于傳統(tǒng)的靜態(tài)分析方法,更貼近JavaScript的動態(tài)特性,具有準確度高、響應時間短的優(yōu)點,從一定程度上解決了動態(tài)特性對于代碼推薦工具的影響。今后將對推薦結(jié)果的排序進行優(yōu)化,使方法的可用性得到進一步的提高。

      [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] 楊 宇,張 健.程序靜態(tài)分析技術與工具[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

      中文引用格式:吳 通,陳雨亭.基于動態(tài)分析的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.

      猜你喜歡
      類庫分塊插件
      分塊矩陣在線性代數(shù)中的應用
      自編插件完善App Inventor與樂高機器人通信
      電子制作(2019年22期)2020-01-14 03:16:34
      用Java編寫客戶機/服務器端應用程序
      Python在數(shù)據(jù)可視化中的應用
      數(shù)據(jù)結(jié)構(gòu)課程教學改革方案和應用效果
      軟件工程(2017年12期)2018-01-29 17:35:55
      數(shù)據(jù)結(jié)構(gòu)可視化類庫的設計與實現(xiàn)
      反三角分塊矩陣Drazin逆新的表示
      基于自適應中值濾波的分塊壓縮感知人臉識別
      MapWindowGIS插件機制及應用
      基于多分辨率半邊的分塊LOD模型無縫表達
      龙游县| 犍为县| 城步| 沅江市| 中江县| 巫溪县| 龙岩市| 杂多县| 清新县| 义乌市| 凤庆县| 克山县| 滕州市| 民权县| 芒康县| 武强县| 吉首市| 阿拉善左旗| 兰州市| 哈尔滨市| 惠州市| 黄平县| 康定县| 武清区| 和平区| 黄石市| 东至县| 祥云县| 双流县| 沾益县| 乐都县| 兴海县| 黄陵县| 元谋县| 五莲县| 正镶白旗| 湟源县| 宜兰市| 绵竹市| 河北省| 邵武市|