劉爽
遼寧錦州渤海大學信息科學與技術學院
動態分析JavaScript的代碼推薦方法
劉爽
遼寧錦州渤海大學信息科學與技術學院
本文基于現有靜態分析技術,編程時代碼靜態分析方式所推薦方法準確度很低,更加重要的是推薦的響應速度慢,本文動態分析的JavaScript代碼推薦方式,根據Eclipse插件所實現的推薦平臺。本文采取一種預先建模方式用來保存動態代碼推薦的存儲數據結構和運行環境,根據對象節點上下文特征建立特征索引。同時將用戶程序代碼片段進行分解,分解的抽象語法樹是代碼分塊的執行基礎,在用戶代碼解釋執行過程中基于對象節點之間的相似度修正個別變量代碼推薦方式,并在文章結尾給出模擬、解釋執行動態代碼推薦產生的方法,實現動態分析代碼推薦的方法。根據文章最后的實驗結果分析可知,與靜態分析比較而言,JavaScript要實現動態分析代碼推薦必然能夠實現代碼推薦準確性有所提高和響應速度有所加快。
JavaScript 靜態分析 動態分析 代碼推薦 抽象語法樹
目前,JavaScript技術作為非常流行腳本編程語言,JS腳本語言在不同的瀏覽器上應用,重要的是不限于瀏覽版本,除此之外的還有網絡服務器、智能手機操作系統。正是由于JavaScript技術的正盛,JavaScript本身擁有的全部集成開發環境(IDE)新特性和新功能,新特性和新功能備受關注。
很多IDE開發環境為用戶提供了JavaScript腳本代碼推薦的功能,當程序員輸入了某個關鍵字時,在繼續輸入一個點號“·”操作符,IDE自帶的開發平臺會自動彈出相關的代碼推薦列表,會根據實際情況自動推薦出有可能出現在點號之后的一些屬性或者是函數名稱,推薦給你能夠大大的縮短程序員系統內的類庫或本人已經定義的類庫進行使用,減輕程序編寫過大的工作量,避免開發過程中因為拼寫錯誤出現的異常處理,從而提高程序的開發效率,縮短軟件開發周期。
目前,代碼推薦在靜態分析的基礎上進行的分析過程,通過對代碼分析過程和數據流程分析構建基于靜態分析代碼推薦系統,另一種方法是通過分析歷史使用過的代碼進行靜態分析過程。另外,JavaScript某些特性是動態的,使用原型(prototype)開發模式實現JS類中部分屬性聲明和類與類之間的繼承特性,JavaScript在HTML網頁上可以通過先解釋后執行的方式運行用戶程序代碼片段,對象節點的類型在解釋運行代碼的過程中有可能變量類型發生改變。
為了能夠解決在JavaScript程序代碼推薦所產生的困難,JavaScript中的變量類型可以實現動態分析,動態分析JavaScript的變量或者函數推薦問題,通過模擬代碼解釋執行環境與系統的應用環境,按照解釋運行用戶代碼順序,獲得合理的推薦類型和代碼推薦信息。
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.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,并繼續順序執行用戶定義的代碼塊。
本文研究的動態分析方式實現的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