WebKit Web Inspector增長覆蓋率分析和類型推斷功能

WebKit中的Web Inspector(Web檢查器)主要用於查看頁面源代碼、實時DOM層次結構、腳本調試、數據收集等,日前增長了兩個十分有用的新功能:覆蓋率分析和類型推斷。覆蓋率分析工具可以可視化地精確顯示JavaScript程序執行的部分。類型推斷工具則能夠直觀地給重要變量加上類型信息的註釋。這兩項功能使得在Web Inspector中理解和調試JavaScript程序變得更加簡便,編程體驗獲得了極大的提高。javascript

覆蓋率分析功能
理解程序如何工做是一件複雜而繁瑣的過程,須要知道在特定的輸入狀況下程序執行了哪些部分。在網頁應用中,一般須要關心用戶與網頁交互時程序執行的部分。Web Inspector如今就能夠準確地顯示程序正在運行的部分以及沒有運行的部分。java

一樣地,在理解程序的控制流程時,必須知道哪些函數正在執行,甚至須要深刻到函數內部的if-then條件分支中。查找bug時通常會監測某段程序有沒有執行,這也是協調整個程序工程各個功能模塊的必由之路。覆蓋率分析工具能夠幫助編程者找出程序中的細節問題。web

類型推斷功能
JavaScript類型推斷是Web Inspector中另外一個振奮人心的新功能。JavaScript中的全部變量都有類型,可是在閱讀JavaScript代碼或函數時,很難一會兒知道某個變量屬於什麼類型。如今,類型推進工具就能夠解決瀏覽JavaScript程序時,難以肯定重要變量類型的問題。編程

JavaScript屬於動態類型語言,相比於靜態類型語言(好比SwiftHaskell等)而言,編寫JavaScript程序時並不須要進行類型聲明。所以,JavaScript程序中的任意一個變量或表達式均可以是任意一種類型,函數也能夠返回任意類型的值。靜態類型語言可以避免混淆不匹配的類型,當類型檢查器發現類型匹配錯誤時,編譯器不會經過編譯。而JavaScript就沒有這樣的限制,只要JavaScript程序沒有語法錯誤,就能夠經過編譯。再比方說,在靜態類型語言中,不能把一個數賦值給一個數組變量,可是在JavaScript中就能夠。像這樣類型錯配的小例子看起來好像很容易避免,然而當JavaScript程序變得龐大複雜、擁有愈來愈多的類時,就很難記錄全部可能的類型,也不可避免地會出現錯配的狀況。雖然JavaScript不是靜態類型語言,但它的變量一般只會有一種特定的類型(單態性極大地促進了JIT編譯器成功優化JavaScript程序),JavaScript程序常常由於難以預料的類型泄漏而產生錯誤。有不少例子能夠說明這種缺乏強制類型保護的弊端,在這裏就不一一列舉了。數組

Web Inspector的類型推斷功能使得查找和解決這類問題更加快捷方便。類型相關的錯誤有時很容易定位,類型不匹配時會報出運行類型錯誤。但在大多數狀況下,類型不匹配問題並不會報錯,並且會很難定位,甚至難以復現。類型推斷工具這時就能夠輔助有效地查找這類微小的錯誤。在Web Inspector中開啓類型推斷功能後,JavaScript程序會在重要的變量和函數旁顯示類型提示。編程者能夠直接瀏覽JavaScript程序,不須要加載console.log文件或在調試時分步暫停。類型推斷工具十分適合反向查找類型相關的錯誤。正如類型推斷功能自身的名稱所說的那樣,它僅僅是依據程序中曾經出現過的數據類型進行推斷。它既不能有百分之百的把握顯示變量正確的類型,也不能基於已有的信息進行類型預測。另外,類型推斷工具會實時進行更新。當新的信息加入程序時,它就會更新註釋。使用類型推斷工具能夠幫助編程者更好地把握程序脈絡,也有助於更好地熟悉新代碼。架構

關於編譯的補充說明
類型推斷功能與JavaScriptCore's JIT編譯架構高度集成在一塊兒,下圖顯示了JSC編譯器的工做流程圖。ide

JSC首先將JavaScript代碼解析爲抽象語法樹(AST,Abstract Syntax Tree),然後生成字節碼。接下來JSC會翻譯字節碼,並在LLInt(Low Level Interpreter)中收集分析信息。若是一個函數已經執行了足夠的時間,JSC會在Baseline中直接將這部分字節碼編譯爲機器碼;若是這個函數繼續執行屢次,JSC會用DFG和FTL JIT進行優化。因爲類型推斷信息被編譯進了JSC的字節碼,JSC以後能夠調用它的多層編譯器對類型推斷進行優化。若是不進行優化,使用類型推斷工具進行調試會變得異常緩慢。具體的優化過程細節能夠參考官方說明函數

相關文章
相關標籤/搜索