999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

JavaScript代碼分析技術(shù)綜述

2018-11-30 01:52:06吳毅堅(jiān)趙文耘
關(guān)鍵詞:語(yǔ)言分析研究

史 櫓 吳毅堅(jiān) 趙文耘

1(復(fù)旦大學(xué)軟件學(xué)院 上海 201203)2(復(fù)旦大學(xué)計(jì)算機(jī)科學(xué)技術(shù)學(xué)院 上海 201203)3(上海市數(shù)據(jù)科學(xué)重點(diǎn)實(shí)驗(yàn)室 上海 201203)

0 引 言

作為2017年GitHub[1]上最受歡迎的語(yǔ)言,JavaScript這種基于對(duì)象的解釋性腳本語(yǔ)言有著諸多靈活的特性,例如它無(wú)需提前編譯,變量的數(shù)據(jù)類(lèi)型也可以改變。這些特性配合瀏覽器事件、HTML DOM、CSS等技術(shù)使得根據(jù)用戶(hù)交互動(dòng)態(tài)改變頁(yè)面而無(wú)需刷新成為可能,極大地豐富和美化了原本只能提供靜態(tài)顯示功能的網(wǎng)頁(yè)。與此同時(shí),越來(lái)越多基于JavaScript語(yǔ)言開(kāi)發(fā)的插件和庫(kù)也提高了開(kāi)發(fā)者編寫(xiě)效率,深化了所開(kāi)發(fā)網(wǎng)站平臺(tái)的功能。

隨著2013年Node.js[2]的發(fā)布,JavaScript語(yǔ)言可以在非瀏覽器環(huán)境下運(yùn)行。脫離了瀏覽器環(huán)境束縛的JavaScript不但性能更好,而且可以實(shí)現(xiàn)讀寫(xiě)本地磁盤(pán)等傳統(tǒng)瀏覽器中無(wú)法達(dá)到的功能,吸引了更多的開(kāi)發(fā)者。根據(jù)TIOBE[3]所統(tǒng)計(jì)的數(shù)據(jù),2017年12月份JavaScript在其熱門(mén)語(yǔ)言排行榜上排名第六。

然而,隨著JavaScript的逐漸普及和程序規(guī)模的逐漸擴(kuò)大,許多工程師也意識(shí)到其靈活的特性有可能降低它的可維護(hù)性和可理解性。由于JavaScript語(yǔ)言中既不存在命名空間的設(shè)計(jì),也不像Java等語(yǔ)言一樣存在包和引入的概念。對(duì)于一個(gè)網(wǎng)頁(yè)來(lái)說(shuō),其需要的所有JavaScript文件將會(huì)被一同載入,互相之間可以隨意訪問(wèn),同名函數(shù)或?qū)ο笠矔?huì)產(chǎn)生沖突。這些JavaScript語(yǔ)言特征給程序帶來(lái)了問(wèn)題,同時(shí)也催生了各種針對(duì)JavaScript程序的分析和重構(gòu)工具。

對(duì)JavaScript語(yǔ)言的研究在20世紀(jì)90年代已經(jīng)逐步開(kāi)展,但是學(xué)術(shù)界仍然較缺乏系統(tǒng)的研究綜述,特別是對(duì)代碼分析框架、技術(shù)以及應(yīng)用方面。國(guó)內(nèi)早期存在JavaScript語(yǔ)言綜述[4],主要僅針對(duì)語(yǔ)言特性。近年來(lái),JavaScript研究逐漸受到研究者的關(guān)注,出現(xiàn)了針對(duì)JavaScript語(yǔ)言近十余年的分析方法和具體研究問(wèn)題的綜述,并以時(shí)間軸的形式對(duì)研究趨勢(shì)做了分析[5]。但該綜述研究涉及面很廣,沒(méi)有特別關(guān)注JavaScript的代碼分析等軟件開(kāi)發(fā)和維護(hù)問(wèn)題。Mesbah等[6]針對(duì)Web應(yīng)用總結(jié)了近二十年來(lái)關(guān)于分析和測(cè)試的研究成果和工具,但也不是僅針對(duì)JavaScript這種語(yǔ)言,沒(méi)有細(xì)化討論其分析方法??梢?jiàn),對(duì)JavaScript代碼的分析的現(xiàn)狀認(rèn)知仍需更有針對(duì)性的綜述和梳理。

本文的主要貢獻(xiàn)在于,重點(diǎn)收集了自1995年以來(lái)與JavaScript相關(guān)的國(guó)內(nèi)外文獻(xiàn),根據(jù)所發(fā)表期刊、會(huì)議的級(jí)別和主題等標(biāo)準(zhǔn)精選了291篇,并對(duì)其中與JavaScript代碼分析最相關(guān)的158篇文獻(xiàn)進(jìn)行了系統(tǒng)的整理,分析了歷史上和近年來(lái)JavaScript代碼分析的主要研究方向、應(yīng)用,并對(duì)相關(guān)研究現(xiàn)狀和趨勢(shì)進(jìn)行了討論。

1 研究方法

根據(jù)系統(tǒng)文獻(xiàn)回顧(SLR)方法,本文對(duì)國(guó)外文獻(xiàn)整理時(shí)使用Dblp[7]計(jì)算機(jī)文獻(xiàn)數(shù)據(jù)庫(kù)進(jìn)行綜合檢索,對(duì)JavaScript代碼分析技術(shù)這一問(wèn)題進(jìn)行研究。截止2017年底,該數(shù)據(jù)庫(kù)共收錄超過(guò)400萬(wàn)篇目計(jì)算機(jī)文獻(xiàn),涉及到超過(guò)3萬(wàn)種會(huì)議和3萬(wàn)種期刊,時(shí)間跨度從1995年至今,在國(guó)內(nèi)外具有較高的權(quán)威性。具體文獻(xiàn)內(nèi)容以及引用關(guān)系從IEEEExplorer、ACMdl、Springer等網(wǎng)站中獲取。

使用JavaScript作為關(guān)鍵字,共有782篇文獻(xiàn)資料被檢索到,其中會(huì)議論文524篇,期刊論文140篇,其余書(shū)籍、非正式出版物或數(shù)據(jù)資料不列入研究范圍。根據(jù)統(tǒng)計(jì),包含2篇及以上JavaScript文獻(xiàn)的會(huì)議82個(gè),文獻(xiàn)共計(jì)346篇;期刊24種,文獻(xiàn)共計(jì)71篇。從研究領(lǐng)域上考慮,按照中國(guó)計(jì)算機(jī)學(xué)會(huì)的分類(lèi),A類(lèi)和B類(lèi)的會(huì)議37個(gè),文獻(xiàn)共計(jì)198篇;期刊6種,文獻(xiàn)共計(jì)23篇。其中軟件工程和設(shè)計(jì)語(yǔ)言領(lǐng)域最多,共計(jì)148篇;其次是網(wǎng)絡(luò)與信息安全領(lǐng)域,共計(jì)40篇;此外交叉和綜合領(lǐng)域共計(jì)19篇。由于JavaScript語(yǔ)言的使用與網(wǎng)絡(luò)息息相關(guān),本文主要選擇前兩個(gè)領(lǐng)域A類(lèi)與B類(lèi)的文獻(xiàn)資料作為研究對(duì)象,對(duì)JavaScript代碼分析技術(shù)這一問(wèn)題進(jìn)行研究。

以上188篇文獻(xiàn)在經(jīng)過(guò)初步閱讀并進(jìn)行篩選后被分為九個(gè)類(lèi)別,如表1所示。由于本文研究的是代碼分析技術(shù),因此對(duì)綜述、性能、測(cè)試、底層、功能擴(kuò)展和安全領(lǐng)域不進(jìn)行進(jìn)一步分析,而是主要考察語(yǔ)言特性、分析框架方法、維護(hù)和重構(gòu)的89篇文獻(xiàn)。

表1 研究文獻(xiàn)分類(lèi)

根據(jù)技術(shù)背景和經(jīng)驗(yàn),本文還指定了多個(gè)額外的關(guān)鍵詞進(jìn)行搜索,從其他會(huì)議和期刊中補(bǔ)充了65篇文獻(xiàn),如表2所示。

表2 擴(kuò)展關(guān)鍵字查詢(xún)

續(xù)表2

在國(guó)內(nèi)期刊方面,本文在中國(guó)知網(wǎng)上以JavaScript作為關(guān)鍵詞,對(duì)國(guó)內(nèi)計(jì)算機(jī)類(lèi)核心期刊進(jìn)行查詢(xún)時(shí)共搜索到103篇論文,其中57篇論文運(yùn)用JS技術(shù)或者AJAX技術(shù)實(shí)現(xiàn)功能或開(kāi)發(fā)應(yīng)用,20篇涉及JavaScript代碼混淆、惡意腳本檢測(cè)等安全問(wèn)題,8篇與底層設(shè)計(jì)、瀏覽器尤其是移動(dòng)端或嵌入式瀏覽器有關(guān),9篇為AJAX、JavaScript、DOM等內(nèi)容的綜述,4篇對(duì)AJAX等功能進(jìn)行了擴(kuò)展,以及1篇提出了Web前端性能的整體解決方案。僅有4篇論文與語(yǔ)言特性或程序分析框架方法有關(guān),在本文中進(jìn)行了整理和綜述。

為了更好地對(duì)總計(jì)158篇的JavaScript代碼分析技術(shù)相關(guān)文獻(xiàn)進(jìn)行研究,本文提出以下幾個(gè)研究問(wèn)題并在后面的章節(jié)中進(jìn)行回答:

RQ1:當(dāng)前JavaScript代碼的分析方法和框架有哪些?有什么特點(diǎn)和缺陷?

RQ2:當(dāng)前針對(duì)JavaScript語(yǔ)言的代碼分析研究主要集中在哪些方面?

RQ3:針對(duì)JavaScript語(yǔ)言的研究呈現(xiàn)怎樣的現(xiàn)狀和趨勢(shì)?

2 JavaScript分析方法與框架

JavaScript代碼中數(shù)據(jù)流和控制流的跟蹤和分析是掌握整個(gè)程序中各個(gè)部分之間關(guān)聯(lián)的重要條件,也是獲取程序中函數(shù)關(guān)系的重要步驟。而采用不同的分析方法和框架亦會(huì)產(chǎn)生不同的結(jié)果從而影響開(kāi)發(fā)者對(duì)程序的評(píng)估以及問(wèn)題的檢測(cè)。在對(duì)文獻(xiàn)的研究中,本文發(fā)現(xiàn),JavaScript代碼的分析方法主要有靜態(tài)分析、動(dòng)態(tài)分析和混合分析幾類(lèi),并會(huì)在接下來(lái)的小節(jié)對(duì)方法和框架進(jìn)行闡述,以回答第一個(gè)研究問(wèn)題。

2.1 靜態(tài)分析

靜態(tài)分析是在不執(zhí)行目標(biāo)代碼的情況下,通過(guò)分析代碼本身實(shí)現(xiàn)對(duì)數(shù)據(jù)流和控制流的掌控。其優(yōu)點(diǎn)是與實(shí)際執(zhí)行的環(huán)境無(wú)關(guān),不受實(shí)際使用時(shí)給出的參數(shù)影響,從而可以發(fā)現(xiàn)實(shí)際使用中不會(huì)或很少出現(xiàn)的程序異常。同時(shí),因?yàn)闊o(wú)需實(shí)際解釋和執(zhí)行代碼,尤其是不需要自動(dòng)或人工輸入?yún)?shù),靜態(tài)分析的速度更快,效率更高。靜態(tài)分析的缺點(diǎn)在于對(duì)一些動(dòng)態(tài)數(shù)據(jù)類(lèi)型或動(dòng)態(tài)綁定等涉及使用動(dòng)態(tài)特性的代碼可能產(chǎn)生誤判或漏判。近年來(lái)相關(guān)研究工作中主要使用了以下幾種基于靜態(tài)分析的綜合框架。

T.J.Watson Libraries for Analysis,簡(jiǎn)稱(chēng)WALA[8],是2006年IBM公司T.J.Watson實(shí)驗(yàn)室在研究過(guò)程中初步建立起靜態(tài)開(kāi)源分析框架。WALA框架面對(duì)Java語(yǔ)言,可以實(shí)現(xiàn)類(lèi)型分析、指針?lè)治?、調(diào)用圖構(gòu)建、數(shù)據(jù)流分析、切片等多種靜態(tài)分析。針對(duì)JavaScript語(yǔ)言的特性,WALA開(kāi)發(fā)了將JavaScript代碼標(biāo)準(zhǔn)化的工具JS_WALA[9]并在此基礎(chǔ)上實(shí)現(xiàn)了部分基礎(chǔ)分析功能,其中包括基于指針?lè)治龅恼{(diào)用圖構(gòu)造分析以及基于域的調(diào)用圖構(gòu)造分析。前者由于需要保證其充分性,在使用了大量框架的JavaScript程序中效率較低。而后者提供了一種較為近似的處理方式,犧牲充分性以提高效率。需要注意的是,JS_WALA在GitHub上的源代碼已經(jīng)四年沒(méi)有更新過(guò),這不僅意味著很可能難以直接從開(kāi)發(fā)者處獲取支持,更意味著此框架在未來(lái)幾年可能無(wú)法適應(yīng)JavaScript語(yǔ)言本身的更新與發(fā)展。

SAFE[10]是2012年由韓國(guó)科學(xué)技術(shù)研究院針對(duì)JavaScript所遵循標(biāo)準(zhǔn)ECMAScript[11]5.0版本所開(kāi)發(fā)的開(kāi)源靜態(tài)分析工具。此分析工具在Java和JavaScript的抽象語(yǔ)法樹(shù)AST分析工具Rhino[12]的基礎(chǔ)上進(jìn)行了擴(kuò)展,并使用Java和Scala[13]語(yǔ)言對(duì)生成的AST進(jìn)行處理以方便轉(zhuǎn)化為中間語(yǔ)言進(jìn)行后續(xù)分析。但是,該工具不支持eval語(yǔ)句、JavaScript 嚴(yán)格模式,以及一些標(biāo)準(zhǔn)內(nèi)建對(duì)象,對(duì)with語(yǔ)句也只是部分支持。隨后,陸續(xù)有論文基于或以SAFE為參照對(duì)JavaScript進(jìn)行靜態(tài)分析,例如LSA分析[14-15]、Web API請(qǐng)求靜態(tài)檢測(cè)[16]等。2016年,SAFE更新至2.0版本,為原本的分析器加入了基于HTML的圖形化展示工具,并將向輕量化的JavaScript網(wǎng)絡(luò)應(yīng)用分析程序發(fā)展,逐步支持錯(cuò)誤檢測(cè)、DOM建模、jQuery分析、事件處理等功能。

2015年,兩種框架的設(shè)計(jì)者聯(lián)合發(fā)表了一篇論文[17]。不同于JS_WALA中所提供的兩種極端方案,論文中設(shè)計(jì)了由用戶(hù)自行調(diào)整充分性和效率性所占的比例的針對(duì)大規(guī)模JavaScript程序的靜態(tài)分析框架,并在平均調(diào)用數(shù)的準(zhǔn)確性和覆蓋度兩方面與JS_WALA和SAFE進(jìn)行了比較,為研究者提供了更多的選擇。

與綜合分析框架不同,一些部分分析的工具也被廣泛使用。例如Esprima[18]作為靜態(tài)分析的第一步,在Node.js環(huán)境下將ECMAScript轉(zhuǎn)換為抽象語(yǔ)法樹(shù)AST,并支持最新標(biāo)準(zhǔn)[19]。在許多針對(duì)JavaScript程序分析的論文中,作者并沒(méi)有直接使用完整的分析框架,而是選擇生成抽象語(yǔ)法樹(shù)之后根據(jù)自身的需求或條件進(jìn)行有目的地分析從而獲得更高的靈活度和效率,例如數(shù)據(jù)類(lèi)型失配檢測(cè)[20]等。因此,在某些特定范圍的分析中可以選擇在抽象語(yǔ)法樹(shù)的基礎(chǔ)上直接開(kāi)展有針對(duì)性的研究而無(wú)需應(yīng)用整個(gè)靜態(tài)分析流程,從而減少不必要的時(shí)間成本。

此外,還有部分靜態(tài)分析工具主要用于代碼檢查。例如谷歌、雅虎等著名企業(yè)使用的JSHint[21],可以對(duì)用戶(hù)所編寫(xiě)的JavaScript代碼進(jìn)行語(yǔ)法檢查,通過(guò)已知的問(wèn)題特征發(fā)現(xiàn)隱性類(lèi)型轉(zhuǎn)換、變量泄露等問(wèn)題。類(lèi)似的工具還有ESHint[22]、JSLint[23]、Plato[24]等。文獻(xiàn)[25]等對(duì)這些靜態(tài)檢查工具在實(shí)際JavaScript程序中的應(yīng)用情況也進(jìn)行了調(diào)查,而文獻(xiàn)[26]等使用各種靜態(tài)方法檢測(cè)實(shí)際系統(tǒng)中的問(wèn)題。

2.2 動(dòng)態(tài)分析

如果將靜態(tài)分析比作軟件測(cè)試中的白箱測(cè)試,動(dòng)態(tài)分析就類(lèi)似于黑箱測(cè)試。與靜態(tài)分析相反,動(dòng)態(tài)分析將分析的過(guò)程放在代碼的實(shí)際運(yùn)行環(huán)境中,通過(guò)直接跟蹤代碼的執(zhí)行過(guò)程實(shí)現(xiàn)獲取數(shù)據(jù)流、控制流等信息的目的。在JavaScript中存在大量的動(dòng)態(tài)特征,例如將字符串轉(zhuǎn)化為代碼執(zhí)行的eval語(yǔ)句,使用字符串變量直接調(diào)用對(duì)象屬性的表示方法等。這些信息需要在運(yùn)行過(guò)程中確定而不能僅僅依靠分析源代碼得到結(jié)果,因此無(wú)法完全使用靜態(tài)分析實(shí)現(xiàn)。相對(duì)于靜態(tài)分析框架,盡管與動(dòng)態(tài)分析相關(guān)的內(nèi)存抓取[27]、自動(dòng)化測(cè)試[28]、用戶(hù)交互捕捉[29]、代碼推薦[30]、提高覆蓋率[31]等技術(shù)或方法常有發(fā)表,但是動(dòng)態(tài)分析框架的實(shí)現(xiàn)則相對(duì)較少。

Jalangi[32]是近年來(lái)較為重要的JavaScript動(dòng)態(tài)分析工具。自2013年Jalangi以論文形式發(fā)表以來(lái),根據(jù)谷歌學(xué)術(shù)統(tǒng)計(jì)的引用數(shù)量已有130篇,并且近年來(lái)出現(xiàn)的使用動(dòng)態(tài)分析研究JavaScript具體問(wèn)題,例如動(dòng)態(tài)對(duì)類(lèi)型一致性[33]、數(shù)據(jù)結(jié)構(gòu)遍歷[34]、動(dòng)態(tài)流[35]等中也多有涉及。而在2013年對(duì)JavaScript進(jìn)行動(dòng)態(tài)分析的相關(guān)文獻(xiàn)僅有2篇關(guān)于JavaScript動(dòng)態(tài)行為和動(dòng)態(tài)特性的研究。Jalangi作為一種重量級(jí)的動(dòng)態(tài)分析框架,既可以使用記錄-重現(xiàn)技術(shù)進(jìn)行離線模式分析,也可以在瀏覽器中使用影子內(nèi)存技術(shù)直接進(jìn)行在線分析,同時(shí)提供了大量常用的分析模板供研究者選擇。在Jalangi不足方面,由于其對(duì)源代碼進(jìn)行了修改和添加,實(shí)際執(zhí)行的修改后的JavaScript程序不僅在體積上遠(yuǎn)遠(yuǎn)超出原有大小,代碼執(zhí)行速度上也會(huì)受到一定影響。目前,Jalangi1.0版本已經(jīng)停止更新,Jalangi2[36]項(xiàng)目不再使用記錄-重現(xiàn)技術(shù)并整合了部分動(dòng)態(tài)代碼檢查工具,目前支持ECMAScript5.1版本。

2017年8月份GitHub上出現(xiàn)了動(dòng)態(tài)分析框架Iron.js[37]。該框架的機(jī)制與Jalangi類(lèi)似,同樣是記錄代碼運(yùn)行時(shí)的數(shù)據(jù)并通過(guò)監(jiān)聽(tīng)器對(duì)數(shù)據(jù)進(jìn)行跟蹤和處理。目前,該框架的版本為0.3,仍處于測(cè)試階段并且沒(méi)有相關(guān)的發(fā)表文獻(xiàn)。

2.3 混合分析

混合分析即是把靜態(tài)分析與動(dòng)態(tài)分析相結(jié)合,利用兩種分析方式的優(yōu)點(diǎn),填補(bǔ)他們的不足。例如,動(dòng)態(tài)分析可以對(duì)靜態(tài)分析難以企及的JavaScript動(dòng)態(tài)特性進(jìn)行處理,而靜態(tài)分析則可以填補(bǔ)測(cè)試用例和輸入?yún)?shù)設(shè)計(jì)所帶來(lái)的覆蓋率問(wèn)題,從而使分析結(jié)果更完整、可信度更高。

在DBLP數(shù)據(jù)庫(kù)上搜索JavaScript和blended analysis、hybrid analysis或static dynamic analysis共有13篇論文。其中文獻(xiàn)[38-39]等提出了使用動(dòng)態(tài)分析跟蹤執(zhí)行軌跡和動(dòng)態(tài)加載的代碼并進(jìn)行靜態(tài)污點(diǎn)分析的框架JSBAF;文獻(xiàn)[40]等提出了DOM敏感的變更影響混合分析工具TOCHAL;文獻(xiàn)[41]等提出了混合安全分析方法JSA等。此外,基于混合分析的JavaScript類(lèi)型分析工具JSFox[42]發(fā)表在2017年ICSE會(huì)議上。該工具使用Esprima和JS_WALA進(jìn)行靜態(tài)類(lèi)型分析,借助Jalangi進(jìn)行動(dòng)態(tài)類(lèi)型分析并將靜態(tài)分析中不易發(fā)現(xiàn)的調(diào)用關(guān)系或動(dòng)態(tài)特征等動(dòng)態(tài)分析的結(jié)果作為補(bǔ)充依據(jù),與靜態(tài)類(lèi)型分析結(jié)果相結(jié)合。在這些論文中,研究者分別使用靜態(tài)和動(dòng)態(tài)分析框架并合理組合,取得了更為科學(xué)的實(shí)驗(yàn)信息和結(jié)果。

3 JavaScript代碼分析的研究目的

為回答第二個(gè)研究問(wèn)題,本文對(duì)158篇論文考察后發(fā)現(xiàn)針對(duì)JavaScript語(yǔ)言的代碼研究主要集中在以下幾個(gè)方面。

3.1 語(yǔ)言特性

JavaScript的語(yǔ)言特性在帶來(lái)靈活編程風(fēng)格的同時(shí),也給系統(tǒng)的維護(hù)和代碼的分析帶來(lái)了諸多問(wèn)題。因此,部分學(xué)者針對(duì)其語(yǔ)言特性不斷進(jìn)行研究,例如文獻(xiàn)[43]對(duì)JavaScript語(yǔ)言特性的實(shí)際使用情況進(jìn)行了研究,文獻(xiàn)[39]為JavaScript語(yǔ)言特性設(shè)計(jì)了混合分析框架,文獻(xiàn)[44]對(duì)語(yǔ)言特性在實(shí)際開(kāi)發(fā)中引入和應(yīng)用的情況進(jìn)行了經(jīng)驗(yàn)研究等。此外還有數(shù)篇有關(guān)異步交互等動(dòng)態(tài)行為的案例研究與分析[45-51]。本節(jié)將按照不同的語(yǔ)言特性對(duì)這些研究進(jìn)行分類(lèi)敘述。

3.1.1 類(lèi)型分析

JavaScript作為弱類(lèi)型語(yǔ)言,變量不僅定義時(shí)無(wú)需指定變量類(lèi)型,甚至可以在執(zhí)行中隨意修改類(lèi)型,這為類(lèi)型推斷等帶來(lái)了麻煩。

許多研究者針對(duì)JavaScript的動(dòng)態(tài)類(lèi)型這一特征帶來(lái)的問(wèn)題,設(shè)計(jì)或擴(kuò)展出新的類(lèi)型系統(tǒng)。例如支持參數(shù)化類(lèi)型和能夠簡(jiǎn)化類(lèi)型書(shū)寫(xiě)的TeJeS[52],保證互聯(lián)網(wǎng)應(yīng)用中類(lèi)型安全的TS*[53],為網(wǎng)絡(luò)沙盒屬性提供基于編碼和確認(rèn)功能的ADsafety[54],支持嵌套保護(hù)和流敏感類(lèi)型的DJS[55],修復(fù)JavaScript對(duì)象布局問(wèn)題的SJS[56]及其擴(kuò)展[57],為移動(dòng)設(shè)備設(shè)計(jì)的輕量級(jí)Typed JS[58],基于復(fù)雜格結(jié)構(gòu)的TAJS[59],平攤類(lèi)型系統(tǒng)[60]及其他類(lèi)型系統(tǒng)研究[61-65]等。此外,文獻(xiàn)[66]對(duì)靜態(tài)類(lèi)型系統(tǒng)進(jìn)行了研究,闡述了Flow或typeScript等是如何提升軟件質(zhì)量,降低錯(cuò)誤數(shù)量的。

類(lèi)型檢查和類(lèi)型推斷是另一類(lèi)重要的類(lèi)型分析,例如前文提到的類(lèi)型一致性分析工具TypeDevil[27]和混合類(lèi)型分析工具JSFox[42]。此外還有針對(duì)數(shù)字類(lèi)型進(jìn)行快速推斷并以此提升編譯器效率的靜態(tài)分析工具RATA[67],量化了動(dòng)態(tài)類(lèi)型檢查代價(jià)并擴(kuò)展了原生類(lèi)型檢查的Checked Load[68],基于規(guī)則約束并支持undefined等類(lèi)型的類(lèi)型分析算法TypeCastor[69],以及數(shù)篇通過(guò)動(dòng)態(tài)和靜態(tài)結(jié)合方法進(jìn)行類(lèi)型分析和推斷的研究文獻(xiàn)[70-72]。

其他有關(guān)類(lèi)型的研究也具有參考的價(jià)值,例如:文獻(xiàn)[73]基于對(duì)象的結(jié)構(gòu)和行為推斷類(lèi)型確定動(dòng)態(tài)耦合;文獻(xiàn)[74]在TAJS基礎(chǔ)上設(shè)計(jì)了基于類(lèi)型的依賴(lài)分析;文獻(xiàn)[75]提出了類(lèi)型細(xì)化以提高靜態(tài)分析的準(zhǔn)確性;文獻(xiàn)[76]使用動(dòng)態(tài)分析方法對(duì)JavaScript隱式類(lèi)型轉(zhuǎn)換進(jìn)行了經(jīng)驗(yàn)研究;文獻(xiàn)[77]設(shè)計(jì)了基于類(lèi)型感知的符號(hào)測(cè)試等。

3.1.2 回調(diào)函數(shù)

回調(diào)是JavaScript代碼中另一個(gè)重要的語(yǔ)言特性。匿名回調(diào)、回調(diào)嵌套等在JavaScript項(xiàng)目中均存在廣泛使用,同時(shí)也對(duì)代碼的可讀性和可維護(hù)性造成了不良影響。

文獻(xiàn)[78]對(duì)138個(gè)JavaScript項(xiàng)目的超過(guò)500萬(wàn)行代碼中的回調(diào)情況按照同步異步回調(diào)、命名匿名回調(diào)、嵌套回調(diào)等類(lèi)別提出了分類(lèi)方法并進(jìn)行了研究,發(fā)現(xiàn)其中大多數(shù)函數(shù)均存在嵌套的情況,超過(guò)一半的是異步回調(diào),并且在客戶(hù)端項(xiàng)目中出現(xiàn)較多。同時(shí),帶參數(shù)的回調(diào)函數(shù)中有43%為匿名函數(shù)。此外,論文還分析并比較了錯(cuò)誤優(yōu)先回調(diào)、Async、Promise三種解決回調(diào)函數(shù)所帶來(lái)的復(fù)雜性問(wèn)題的方案。

文獻(xiàn)[79]針對(duì)嵌套回調(diào)導(dǎo)致代碼難以理解和難以回調(diào)的問(wèn)題設(shè)計(jì)了Sync/CC庫(kù),通過(guò)應(yīng)用Continuation和Aspects的方法幫助開(kāi)發(fā)者在維持回調(diào)依賴(lài)關(guān)系的同時(shí),同步地處理嵌套回調(diào)。

3.1.3 其他特性

一些零散的其他特性,例如綁定、閉包、eval函數(shù)、類(lèi)對(duì)象等也被許多學(xué)者所研究。

關(guān)于綁定和閉包,文獻(xiàn)[80]針對(duì)移動(dòng)平臺(tái)上的嵌入式函數(shù)對(duì)象所涉及的閉包問(wèn)題進(jìn)行了研究,并設(shè)計(jì)了實(shí)時(shí)棧以處理這一問(wèn)題。關(guān)于eval函數(shù),文獻(xiàn)[81]對(duì)JavaScript網(wǎng)絡(luò)應(yīng)用中該函數(shù)的使用進(jìn)行了研究,文獻(xiàn)[82]提出了半自動(dòng)eval函數(shù)移除工具。在對(duì)類(lèi)對(duì)象的研究中,文獻(xiàn)[83]使用靜態(tài)方法對(duì)遺留系統(tǒng)中的類(lèi)依賴(lài)進(jìn)行了識(shí)別,文獻(xiàn)[84]開(kāi)發(fā)了Eclipse插件進(jìn)行類(lèi)維護(hù)和理解,文獻(xiàn)[85-86]使用靜態(tài)分析將JavaScript程序中對(duì)類(lèi)的使用進(jìn)行了分類(lèi),并提出了針對(duì)遺留系統(tǒng)代碼進(jìn)行類(lèi)檢測(cè)的策略。此外,文獻(xiàn)[87]提出了對(duì)匿名函數(shù)的分析和命名工具。

3.2 代碼壞味道

代碼壞味道(bad smell)是代碼中存在潛在問(wèn)題的信號(hào)。文獻(xiàn)[88]在1999年提出了22種針對(duì)面向?qū)ο笳Z(yǔ)言的壞味道,例如重復(fù)代碼、過(guò)長(zhǎng)函數(shù)等。JavaScript代碼中也存在類(lèi)似的問(wèn)題。

文獻(xiàn)[89]對(duì)互聯(lián)網(wǎng)環(huán)境下JavaScript應(yīng)用所存在壞味道的研究[90-91]進(jìn)行了總結(jié),歸納了13種壞味道,例如:閉包壞味道、過(guò)多局部變量、過(guò)長(zhǎng)鏈?zhǔn)秸{(diào)用、回調(diào)嵌套、繼承壞味道等,并開(kāi)發(fā)了自動(dòng)檢測(cè)工具JSNOSE。該工具對(duì)11個(gè)Web應(yīng)用項(xiàng)目的壞味道檢測(cè)準(zhǔn)確率達(dá)到了93%。該項(xiàng)研究成果被后續(xù)研究多次引用,是有關(guān)代碼壞味道研究的重要成果之一。

文獻(xiàn)[92]依據(jù)JSNOSE研究中多個(gè)JavaScript類(lèi)庫(kù),例如jQuery的代碼風(fēng)格手冊(cè)中所提出的代碼壞味道,選擇了單行過(guò)長(zhǎng)、函數(shù)參數(shù)過(guò)多、變量重復(fù)指派、switch-case過(guò)多等12個(gè)壞味道對(duì)JavaScript服務(wù)端的5種應(yīng)用共計(jì)537個(gè)版本進(jìn)行了研究。同時(shí),作者也對(duì)1 484位JavaScript工程師進(jìn)行了調(diào)查采訪,獲取了他們對(duì)不同壞味道的重視程度。這一研究主要的貢獻(xiàn)在于其方法針對(duì)的是服務(wù)端應(yīng)用而非客戶(hù)端應(yīng)用。

文獻(xiàn)[93]將遺傳算法用于JavaScript壞味道檢測(cè)。他們將JSNOSE等發(fā)現(xiàn)的已知壞味道案例作為訓(xùn)練集訓(xùn)練壞味道檢測(cè)模型,從而能從其他JavaScript代碼中發(fā)現(xiàn)壞味道。在對(duì)9個(gè)JavaScript網(wǎng)絡(luò)項(xiàng)目的實(shí)驗(yàn)中,他們將遺傳算法的壞味道檢測(cè)結(jié)果與JSNOSE工具所分析的結(jié)果進(jìn)行了對(duì)比,達(dá)到了92%的準(zhǔn)確率,可見(jiàn)將遺傳算法引入壞味道檢測(cè)這一方法在將來(lái)可能能夠成為檢測(cè)問(wèn)題的有效切入點(diǎn)。

文獻(xiàn)[94]將動(dòng)態(tài)類(lèi)型改變作為一種性能相關(guān)的JavaScript代碼壞味道進(jìn)行了研究,提出JavaScript能夠動(dòng)態(tài)改變類(lèi)型這一特性會(huì)導(dǎo)致編譯器優(yōu)化失效,從而產(chǎn)生性能問(wèn)題。因此,他們將其列作壞味道進(jìn)行分析,開(kāi)發(fā)了JSweeter工具對(duì)這一問(wèn)題進(jìn)行檢測(cè)。在對(duì)Octane項(xiàng)目進(jìn)行的應(yīng)用研究中,該工具檢測(cè)到了46個(gè)問(wèn)題,其中19個(gè)被后續(xù)修復(fù),說(shuō)明了工具的有效性。

3.3 代碼重構(gòu)

及時(shí)準(zhǔn)確的代碼重構(gòu)能夠提高系統(tǒng)的可擴(kuò)展性和可維護(hù)性,發(fā)現(xiàn)并解決潛在問(wèn)題。在文獻(xiàn)中有以下幾類(lèi)有關(guān)重構(gòu)的研究。

文獻(xiàn)[95-96]對(duì)JavaScript的重構(gòu)進(jìn)行了研究,提出了以指針?lè)治鰹榛A(chǔ),對(duì)重命名、封裝屬性、提煉模塊三種重構(gòu)內(nèi)容進(jìn)行查找和重構(gòu)的框架。該作者在另一篇關(guān)于半自動(dòng)重命名重構(gòu)的研究[97]中提出了一套的類(lèi)型推斷系統(tǒng),以半自動(dòng)方式進(jìn)行重命名重構(gòu)。

文獻(xiàn)[98]針對(duì)JavaScript遺留系統(tǒng)中與類(lèi)結(jié)構(gòu)近似的代碼能否向ECMAScript6[99]新標(biāo)準(zhǔn)所提供的類(lèi)語(yǔ)法進(jìn)行遷移重構(gòu)這一問(wèn)題進(jìn)行了調(diào)查和分析。文獻(xiàn)[100]列出了異步回調(diào)的使用環(huán)境,并嘗試以ECMAScript6中的Promise對(duì)其進(jìn)行重構(gòu)。該工具與文獻(xiàn)[101]提出的針對(duì)nodeJS風(fēng)格的異步回調(diào)向Promise重構(gòu)工具Due相比,多完成了235%的重構(gòu)任務(wù)。文獻(xiàn)[102]針對(duì)耦合和命名沖突設(shè)計(jì)開(kāi)發(fā)了將代碼自動(dòng)重構(gòu)為ECMAScript6中module的方法。這三篇論文均涉及到JavaScript最新標(biāo)準(zhǔn)ECMAScript6相關(guān)特性的應(yīng)用以及將遺留系統(tǒng)遷移至新標(biāo)準(zhǔn)的重構(gòu)嘗試。

隨著JavaScript的不斷發(fā)展,許多新的特性和方法被開(kāi)發(fā)出來(lái)以解決實(shí)際問(wèn)題,例如Promise對(duì)象通過(guò)定義reject和resolve等方法處理異步調(diào)用時(shí)不同狀態(tài),用于異步計(jì)算;通過(guò)創(chuàng)建Promise實(shí)例將回調(diào)函數(shù)的嵌套狀態(tài)解除,解決回調(diào)地獄(callback hell)問(wèn)題,提高代碼可維護(hù)性和可讀性。文獻(xiàn)[103]還對(duì)JavaScript項(xiàng)目中使用Promise出現(xiàn)的錯(cuò)誤進(jìn)行了分類(lèi),并設(shè)計(jì)了Promise圖以檢測(cè)這些錯(cuò)誤。

3.4 模塊化

模塊化分析是代碼分析的另一項(xiàng)重要內(nèi)容,高內(nèi)聚、低耦合的模塊化開(kāi)發(fā)能夠提高系統(tǒng)的可擴(kuò)展性和可維護(hù)性。傳統(tǒng)的JavaScript語(yǔ)言并不強(qiáng)調(diào)模塊化特性,缺乏模塊化管理手段。JavaScript程序一般直接以文件作為程序?qū)ο?如變量、方法)進(jìn)行管理。在早期JavaScript程序規(guī)模比較小并且僅用于少量的Web頁(yè)面前端處理的情況下,這種特性并不會(huì)產(chǎn)生太大的問(wèn)題。然而,隨著JavaScript程序日益復(fù)雜,規(guī)模日益增大,這種不利于代碼維護(hù)和管理的開(kāi)發(fā)方式的缺陷也逐步顯現(xiàn)出來(lái)。因此,近年來(lái)JavaScript開(kāi)發(fā)社區(qū)對(duì)其模塊化問(wèn)題也做了大量的研究和實(shí)踐。

文獻(xiàn)[104]針對(duì)JavaScript缺乏模塊管理這一問(wèn)題,設(shè)計(jì)了一種能夠支持安全的進(jìn)行增量開(kāi)發(fā)的模塊系統(tǒng)。作者希望通過(guò)擴(kuò)展JavaScript現(xiàn)有語(yǔ)法以實(shí)現(xiàn)這一系統(tǒng),并給出了詳細(xì)的語(yǔ)法設(shè)計(jì),但是并沒(méi)有給出具體的實(shí)現(xiàn)。與之類(lèi)似的研究還有文獻(xiàn)[105-106]提出的基于SAFE框架的模塊系統(tǒng),并從不支持eval等角度與Kang的設(shè)計(jì)進(jìn)行了對(duì)比,給出了一些具體的設(shè)計(jì)問(wèn)題,例如,如何處理eval函數(shù)、全局變量沖突等。文獻(xiàn)[107-108]針對(duì)JavaScript中的模塊模式進(jìn)行了探討。由于沒(méi)有原生的模塊系統(tǒng),模塊模式就成為了JavaScript實(shí)現(xiàn)模塊化變成的手段之一。文獻(xiàn)[109]提出了基于擴(kuò)展的WebIDL語(yǔ)言中JavaScript庫(kù)API誤用的深度檢測(cè)方法,同時(shí)也設(shè)計(jì)實(shí)現(xiàn)了針對(duì)可復(fù)用性和可維護(hù)性的模塊化檢測(cè)工具,并嘗試與SAFE2相結(jié)合。

為了解決JavaScript模塊化不強(qiáng)的問(wèn)題,近幾年也不斷有模塊管理和前端MVC框架被開(kāi)發(fā)出來(lái),提供模塊化編程功能。例如以AMD標(biāo)準(zhǔn)[110]開(kāi)發(fā)的RequireJS[111],可以實(shí)現(xiàn)對(duì)JavaScript文件的模塊化加載功能,使得原本同時(shí)加載的文件可以按照依賴(lài)關(guān)系逐步載入,降低了系統(tǒng)的耦合。在前端MVC方面,謝珩[112]等設(shè)計(jì)了一種MVC在前端的實(shí)現(xiàn)方式。而AngularJS[113]作為流行的前端MVC框架,包含模塊化、依賴(lài)注入等各種功能。它通過(guò)聲明各種概念,大大簡(jiǎn)化所需編寫(xiě)的代碼量,提高了項(xiàng)目的可維護(hù)性和開(kāi)發(fā)效率。該框架在不斷迭代升級(jí)中逐漸成熟,目前已經(jīng)發(fā)展到第五版。近年來(lái)針對(duì)該框架的研究也日益增多,例如文獻(xiàn)[114-115]對(duì)460個(gè)項(xiàng)目中AngularJS使用情況進(jìn)行了調(diào)查,統(tǒng)計(jì)了其中最受歡迎的幾大特征,如自定義接口、依賴(lài)注入和二路綁定等,同時(shí)也指出了所存在的性能問(wèn)題及其原因。此外也有一些基于該框架進(jìn)行的研究或開(kāi)發(fā)的工具,例如模型驅(qū)動(dòng)在AngularJS項(xiàng)目中的應(yīng)用[116],基于AngularJS的實(shí)時(shí)網(wǎng)絡(luò)社交應(yīng)用[117]等。另外,由于commonJS等模塊管理類(lèi)庫(kù)以及ECMAScript6中module等特性的出現(xiàn),開(kāi)發(fā)者有了新的標(biāo)準(zhǔn)化的模塊化方法。

4 JavaScript研究趨勢(shì)及現(xiàn)狀

為了回答第三個(gè)研究問(wèn)題,本文首先對(duì)所研究的291篇論文以時(shí)間為考量進(jìn)行了統(tǒng)計(jì),如圖1所示。從總數(shù)上看,在JavaScript語(yǔ)言發(fā)明的10年后,也就是2005年后相關(guān)論文數(shù)量開(kāi)始穩(wěn)步增加,并且在正值20周年和ECMAScript6標(biāo)準(zhǔn)發(fā)布的2015年出現(xiàn)了井噴的情況。整體上看,研究工作隨著JavaScript的逐步普及呈穩(wěn)步上升趨勢(shì)。從分布上看,有關(guān)JavaScript的應(yīng)用研究逐年減少,反之分析框架方法和語(yǔ)言特性的研究呈上升趨勢(shì)并且逐漸穩(wěn)定,證明研究重心逐步從以JavaScript作為開(kāi)發(fā)語(yǔ)言設(shè)計(jì)應(yīng)用轉(zhuǎn)移到對(duì)其程序本身的特性和行為進(jìn)行分析。

圖1 文獻(xiàn)總數(shù)和比例趨勢(shì)

同時(shí),關(guān)于目前的研究現(xiàn)狀,291篇文獻(xiàn)中近三年來(lái),即2015年到2017年的文獻(xiàn)共計(jì)98篇。如圖2所示,近三年來(lái)文獻(xiàn)數(shù)量最多的三類(lèi)是分析框架方法、語(yǔ)言特性和安全。其中分析框架方法方面,盡管分析方法多種多樣,但是從分析框架的角度考慮,靜態(tài)分析仍然是主流。15篇論文使用靜態(tài)分析,5篇論文使用動(dòng)態(tài)分析,2篇論文使用混合分析。其次是JavaScript的安全性問(wèn)題,不論是信息流的監(jiān)控和限制,還是信息泄露的檢測(cè),抑或是第三方資源的引用安全問(wèn)題,都是目前安全工程師和研究者們關(guān)注的重點(diǎn)。第三是語(yǔ)言特性方面,針對(duì)類(lèi)型分析的論文共計(jì)8篇,JavaScript類(lèi)的論文4篇,異步行為論文2篇,回調(diào)論文1篇。在這些論文中,雖然類(lèi)和類(lèi)型分析的研究論文數(shù)量最多,但隨著新的JavaScript標(biāo)準(zhǔn)和新框架的出現(xiàn),研究中涉及到異步問(wèn)題、回調(diào)等的內(nèi)容也呈逐漸上升的趨勢(shì)。由于相關(guān)技術(shù)在實(shí)踐中的逐步推廣,針對(duì)這些新方法、新特性的研究,可能成為后續(xù)的研究熱點(diǎn)之一。

圖2 近三年文獻(xiàn)類(lèi)別分布

5 結(jié) 語(yǔ)

本文系統(tǒng)收集了1995年以來(lái)針對(duì)JavaScript的研究論文,對(duì)JavaScript代碼分析技術(shù)所使用的分析框架按照靜態(tài)分析、動(dòng)態(tài)分析和混合分析進(jìn)行了綜述,整理了當(dāng)前研究中常用的JavaScript代碼分析框架和方法,并進(jìn)一步按照語(yǔ)言特性、代碼壞味道、代碼重構(gòu)、模塊化等四種研究目的對(duì)JavaScript代碼分析技術(shù)的研究成果進(jìn)行了解讀。最后,依據(jù)文獻(xiàn)資料對(duì)近年來(lái)JavaScript研究的現(xiàn)狀和趨勢(shì)進(jìn)行了梳理,并希望借此為廣大研究者對(duì)JavaScript代碼分析技術(shù)和方向以及所使用的工具帶來(lái)宏觀的認(rèn)識(shí)。

隨著ECMAScript6標(biāo)準(zhǔn)的逐步普及,有關(guān)該標(biāo)準(zhǔn)中包含的新方法與新特性以及遺留系統(tǒng)向該標(biāo)準(zhǔn)遷移正在逐步地實(shí)施之中,可能會(huì)出現(xiàn)新的研究點(diǎn)。不論是嵌套回調(diào)函數(shù)重構(gòu)為Promise函數(shù)[100],還是匿名函數(shù)參數(shù)重構(gòu)為箭頭函數(shù),在這些改變的背后都有可能存在著潛在的代碼可讀性、健壯性或性能問(wèn)題,將來(lái)值得研究者們隨時(shí)予以關(guān)注。

猜你喜歡
語(yǔ)言分析研究
FMS與YBT相關(guān)性的實(shí)證研究
遼代千人邑研究述論
隱蔽失效適航要求符合性驗(yàn)證分析
語(yǔ)言是刀
文苑(2020年4期)2020-05-30 12:35:30
視錯(cuò)覺(jué)在平面設(shè)計(jì)中的應(yīng)用與研究
科技傳播(2019年22期)2020-01-14 03:06:54
EMA伺服控制系統(tǒng)研究
電力系統(tǒng)不平衡分析
電子制作(2018年18期)2018-11-14 01:48:24
讓語(yǔ)言描寫(xiě)搖曳多姿
電力系統(tǒng)及其自動(dòng)化發(fā)展趨勢(shì)分析
累積動(dòng)態(tài)分析下的同聲傳譯語(yǔ)言壓縮
主站蜘蛛池模板: 全部免费毛片免费播放| 在线观看国产黄色| 国产精品微拍| 欧美成人看片一区二区三区| 先锋资源久久| 亚洲三级片在线看| 国产视频欧美| 婷婷亚洲视频| 亚洲V日韩V无码一区二区| 综合社区亚洲熟妇p| 欧美日韩一区二区三区四区在线观看 | 久久国产精品77777| 91午夜福利在线观看精品| 狠狠亚洲五月天| 26uuu国产精品视频| 久久综合国产乱子免费| 久久这里只精品国产99热8| 婷婷亚洲最大| 国产精品手机在线播放| 久久人人爽人人爽人人片aV东京热| 国产精品白浆在线播放| 午夜欧美理论2019理论| 99久久免费精品特色大片| 国产原创演绎剧情有字幕的| 日本不卡免费高清视频| 欧美国产视频| 九九香蕉视频| 99视频全部免费| 99视频国产精品| a级毛片网| 综合色婷婷| 99久久精品视香蕉蕉| 国产在线一区视频| 高清无码一本到东京热| 国产男女XX00免费观看| 在线看国产精品| 亚洲中文字幕在线观看| 国产资源站| 亚洲天堂.com| 国内精自线i品一区202| 久久99国产精品成人欧美| 国产黑丝视频在线观看| 2021国产精品自产拍在线| 乱人伦99久久| 午夜激情婷婷| 亚洲综合第一页| 国产精品极品美女自在线| 毛片基地美国正在播放亚洲| 欧美日韩亚洲综合在线观看| 久久窝窝国产精品午夜看片| 青青草综合网| 久久人人97超碰人人澡爱香蕉| 波多野结衣一区二区三区88| 亚洲第一视频网| 免费无码网站| 91国语视频| 国产网友愉拍精品| www亚洲天堂| 草草线在成年免费视频2| 免费毛片全部不收费的| 91福利免费视频| 欧美日本在线播放| 天天激情综合| 午夜久久影院| 亚洲中文无码h在线观看| 日韩欧美国产三级| 91精品国产91欠久久久久| 免费黄色国产视频| 国产极品美女在线| 中文字幕无码av专区久久| 免费大黄网站在线观看| 久久免费视频6| 九九视频免费在线观看| 最新午夜男女福利片视频| 黑色丝袜高跟国产在线91| 激情综合五月网| 99在线免费播放| 亚洲女同欧美在线| 欧美日韩一区二区在线播放| 67194亚洲无码| 亚洲视频在线网| 欧洲极品无码一区二区三区|