本申請(qǐng)涉及計(jì)算機(jī)領(lǐng)域,更具體地說,涉及一種JS引擎容錯(cuò)方法和裝置。
背景技術(shù):
JavaScript是一種直譯式腳本語言,是一種動(dòng)態(tài)類型、弱類型、基于原型的語言。它的解釋器被稱為JavaScript引擎,為瀏覽器的一部分,是一個(gè)專門處理JavaScript腳本的虛擬機(jī)。
參見圖1示出了JavaScript引擎的工作原理示意圖。JavaScript引擎先將腳本代碼進(jìn)行詞法分析和語法分析。
詞法分析(lexer),其實(shí)就是一個(gè)掃描器,依據(jù)語言的定義,提取出源文件中的內(nèi)容變?yōu)橐粋€(gè)個(gè)語法可以識(shí)別的token,比如關(guān)鍵字,操作符,常量等。
語法分析(paser),它的功能就是根據(jù)語法(token的順序組合),識(shí)別出不同的語義(目標(biāo)操作)。這是輸入文本轉(zhuǎn)為一種它可以理解的語義形式(抽象語法樹),或者更進(jìn)一步生成供后續(xù)使用的中間代碼(字節(jié)碼),解釋器就是負(fù)責(zé)執(zhí)行解析輸出的結(jié)果。
比如一段JavaScript腳本:
var a=1;
經(jīng)過詞法lexer可能被識(shí)別為以下的tokens:
VARIABLE EQUAL CONSTANT END
經(jīng)過語法parser一分析,就了解這是一個(gè)“賦值操作,向變量a賦值常量1”。隨后再調(diào)用對(duì)應(yīng)的操作加以執(zhí)行。
在現(xiàn)有技術(shù)中,當(dāng)JavaScript的某條腳本錯(cuò)誤時(shí),JS引擎則會(huì)中斷程序執(zhí)行,無法讀取下一條腳本。
技術(shù)實(shí)現(xiàn)要素:
有鑒于此,本申請(qǐng)?zhí)峁┮环NJS引擎容錯(cuò)方法和裝置,以在JavaScript腳本的某條語句有誤時(shí),仍可以讀取下一條腳本。
為了實(shí)現(xiàn)上述目的,現(xiàn)提出的方案如下:
一種JS引擎容錯(cuò)方法,包括:
獲取所有JavaScript腳本,并將所述JavaScript腳本進(jìn)行解析生成所述JS引擎可識(shí)別的token代碼;
對(duì)所述token代碼進(jìn)行檢測(cè),確定所述token代碼中的異常代碼,并記錄所述異常代碼的起始位置和長度,以確定錯(cuò)誤JavaScript腳本的所在位置;
根據(jù)所述異常代碼的起始位置和長度,確定下一條正常JavaScript腳本的起始位置。
優(yōu)選的,所述對(duì)所述token代碼進(jìn)行檢測(cè),確定所述token代碼中的異常代碼,并記錄所述異常代碼的起始位置和長度,以確定錯(cuò)誤JavaScript腳本的所在位置,之后還包括:
確定所述錯(cuò)誤JavaScript腳本的錯(cuò)誤類型,并采用錯(cuò)誤碼進(jìn)行標(biāo)識(shí)。
優(yōu)選的,所述確定所述錯(cuò)誤JavaScript腳本的錯(cuò)誤類型,并采用錯(cuò)誤碼進(jìn)行標(biāo)識(shí),之后還包括:
對(duì)所述異常代碼進(jìn)行處理,以使所述異常代碼可正常執(zhí)行。
一種JS引擎容錯(cuò)裝置,包括:
腳本獲取解析單元,用于獲取所有JavaScript腳本,并將所述JavaScript腳本進(jìn)行解析生成所述JS引擎可識(shí)別的token代碼;
錯(cuò)誤腳本位置確定單元,用于對(duì)所述token代碼進(jìn)行檢測(cè),確定所述token代碼中的異常代碼,并記錄所述異常代碼的起始位置和長度,以確定錯(cuò)誤JavaScript腳本的所在位置;
正常腳本執(zhí)行單元,用于根據(jù)所述異常代碼的起始位置和長度,跳過所述錯(cuò)誤JavaScript腳本,以執(zhí)行下一條正常JavaScript腳本。
優(yōu)選的,還包括:錯(cuò)誤腳本類型確定單元,用于確定所述錯(cuò)誤JavaScript腳本的錯(cuò)誤類型,并采用錯(cuò)誤碼進(jìn)行標(biāo)識(shí)。
優(yōu)選的,還包括:錯(cuò)誤腳本處理單元,用于對(duì)所述錯(cuò)誤腳本對(duì)應(yīng)的所述異常代碼進(jìn)行處理,以使所述異常代碼可正常執(zhí)行。
經(jīng)由上述技術(shù)方案可知,本申請(qǐng)公開一種JS引擎容錯(cuò)方法和裝置。JS引擎在獲取JavaScript腳本后并將JavaScript腳本進(jìn)行解析生成JS引擎可識(shí)別的token代碼。進(jìn)而,對(duì)解析生成token代碼進(jìn)行檢測(cè),確定token代碼中的異常代碼,并記錄所述異常代碼的起始位置和長度,從而確定JavaScript腳本中錯(cuò)誤腳本的所在位置。進(jìn)一步,根據(jù)異常代碼的起始位置和長度,確定下一條正常腳本的起始位置,從而跳過錯(cuò)誤腳本而繼續(xù)執(zhí)行正常腳本。
附圖說明
為了更清楚地說明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)提供的附圖獲得其他的附圖。
圖1示出了JavaScript引擎的工作原理示意圖;
圖2示出了本發(fā)明一個(gè)實(shí)施例公開的一種JS引擎容錯(cuò)方法的流程示意圖;
圖3示出了本發(fā)明另一個(gè)實(shí)施例公開的一種JS引擎容錯(cuò)方法的流程示意圖;
圖4示出了本發(fā)明另一個(gè)實(shí)施例公開的一種JS引擎容錯(cuò)裝置的結(jié)構(gòu)示意圖;
圖5示出了本發(fā)明另一個(gè)實(shí)施例公開的一種JS引擎容錯(cuò)裝置的結(jié)構(gòu)示意圖。
具體實(shí)施方式
下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例。基于本發(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
參見圖2示出了本發(fā)明一個(gè)實(shí)施例公開的一種JS引擎容錯(cuò)方法的流程示意圖。
由圖2可知,本發(fā)明包括:
S201:獲取所有JavaScript腳本,并將所述JavaScript腳本進(jìn)行解析生成所述JS引擎可識(shí)別的token代碼。
JavaScript引擎先將腳本代碼進(jìn)行詞法分析,依據(jù)語言的定義,提取出源文件中的內(nèi)容變?yōu)橐粋€(gè)個(gè)語法可以識(shí)別的token,比如關(guān)鍵字,操作符,常量等。
S202:對(duì)所述token代碼進(jìn)行檢測(cè),確定所述token代碼中的異常代碼,并記錄所述異常代碼的起始位置和長度,以確定錯(cuò)誤JavaScript腳本的所在位置。
JavaScript腳本報(bào)錯(cuò)的原因其實(shí)有很多種,比如變量、函數(shù)沒定義,break、return語句使用不當(dāng),各種筆誤等等。當(dāng)JavaScript腳本出現(xiàn)錯(cuò)誤時(shí),JavaScript腳本所對(duì)應(yīng)的token代碼也會(huì)出現(xiàn)錯(cuò)誤,通過對(duì)token代碼進(jìn)行檢測(cè)即可確定出現(xiàn)錯(cuò)誤的JavaScript腳本。
S203:根據(jù)所述異常代碼的起始位置和長度,確定下一條正常JavaScript腳本的起始位置。
記錄異常代碼的起始位置start_position,根據(jù)異常代碼的長度計(jì)算出偏移量offect,最后start_position+offect得出下一條正常JavaScript腳本的開始位置。
由上述實(shí)施例可知,本申請(qǐng)公開一種JS引擎容錯(cuò)方法。JS引擎在獲取JavaScript腳本后并將JavaScript腳本進(jìn)行解析生成JS引擎可識(shí)別的token代碼。進(jìn)而,對(duì)解析生成token代碼進(jìn)行檢測(cè),確定token代碼中的異常代碼,并記錄所述異常代碼的起始位置和長度,從而確定JavaScript腳本中錯(cuò)誤腳本的所在位置。進(jìn)一步,根據(jù)異常代碼的起始位置和長度,確定下一條正常腳本的起始位置,從而跳過錯(cuò)誤腳本而繼續(xù)執(zhí)行正常腳本。
參見圖3示出了本發(fā)明另一個(gè)實(shí)施例公開的一種JS引擎容錯(cuò)方法的流程示意圖。
由圖3可知,該方法包括:
S301:獲取所有JavaScript腳本,并將所述JavaScript腳本進(jìn)行解析生成所述JS引擎可識(shí)別的token代碼。
JavaScript引擎先將腳本代碼進(jìn)行詞法分析,依據(jù)語言的定義,提取出源文件中的內(nèi)容變?yōu)橐粋€(gè)個(gè)語法可以識(shí)別的token,比如關(guān)鍵字,操作符,常量等。
S302:對(duì)所述token代碼進(jìn)行檢測(cè),確定所述token代碼中的異常代碼,并記錄所述異常代碼的起始位置和長度,以確定錯(cuò)誤JavaScript腳本的所在位置。
JavaScript腳本報(bào)錯(cuò)的原因其實(shí)有很多種,比如變量、函數(shù)沒定義,break、return語句使用不當(dāng),各種筆誤等等。當(dāng)JavaScript腳本出現(xiàn)錯(cuò)誤時(shí),JavaScript腳本所對(duì)應(yīng)的token代碼也會(huì)出現(xiàn)錯(cuò)誤,通過對(duì)token代碼進(jìn)行檢測(cè)即可確定出現(xiàn)錯(cuò)誤的JavaScript腳本。
S303:確定所述錯(cuò)誤JavaScript腳本的錯(cuò)誤類型,并采用錯(cuò)誤碼進(jìn)行標(biāo)識(shí)。
需要說明的是,為了腳本的執(zhí)行需要捕捉所有JavaScript腳本錯(cuò)誤,然后第一時(shí)間通知瀏覽器此處發(fā)生了什么錯(cuò)誤,繼而派發(fā)不同的消息,用不同錯(cuò)誤碼來區(qū)別JS腳本的不同錯(cuò)誤,并輸出具體是哪一行發(fā)生了什么錯(cuò)誤。
S304:對(duì)所述異常代碼進(jìn)行處理,以使所述異常代碼可正常執(zhí)行。
一旦捕捉到腳本某處出現(xiàn)錯(cuò)誤后,在新的機(jī)制下,JS引擎根據(jù)情況給予不同處理。
譬如,一個(gè)簡單的賦值語句var b=a,JS引擎首先在執(zhí)行環(huán)境的上下文中查找變量a,發(fā)現(xiàn)變量a并沒有定義,這時(shí)報(bào)出錯(cuò)誤,并將undefined賦給b。這樣最終變量b的值等于undefined。
其它還有條件語句、循環(huán)語句的異常代碼也類似,在新的機(jī)制下,經(jīng)過了JS引擎容錯(cuò)處理,使某處異常能夠正常執(zhí)行。
S305:根據(jù)所述異常代碼的起始位置和長度,確定下一條正常JavaScript腳本的起始位置。
參見圖4示出了本發(fā)明另一個(gè)實(shí)施例公開的一種JS引擎容錯(cuò)裝置的結(jié)構(gòu)示意圖。
由圖4可知,該裝置包括:腳本獲取解析單元1、錯(cuò)誤腳本位置確定單元2以及正常腳本執(zhí)行單元3。
其中,腳本獲取解析單元用于獲取所有JavaScript腳本,并將所述JavaScript腳本進(jìn)行解析生成所述JS引擎可識(shí)別的token代碼。
具體的,JavaScript引擎先將JavaScript腳本代碼進(jìn)行詞法分析,依據(jù)語言的定義,提取出源文件中的內(nèi)容變?yōu)橐粋€(gè)個(gè)語法可以識(shí)別的token代碼。
比如一段JavaScript腳本:
var a=1;
經(jīng)過詞法分析可能被識(shí)別為以下的token代碼:
VARIABLE EQUAL CONSTANT END。
錯(cuò)誤腳本位置確定單元,用于對(duì)所述token代碼進(jìn)行檢測(cè),確定所述token代碼中的異常代碼,并記錄所述異常代碼的起始位置start_position和長度offect,以確定錯(cuò)誤JavaScript腳本的所在位置。
正常腳本執(zhí)行單元用于異常代碼的位置start_position和長度offect,得出下一條正常腳本的開始位置,即start_position+offect。
參見圖5出了本發(fā)明另一個(gè)實(shí)施例公開的一種JS引擎容錯(cuò)裝置的結(jié)構(gòu)示意圖。與上一個(gè)裝置實(shí)施例不同的是,在本實(shí)施例中,該裝置包括:腳本獲取解析單元1、錯(cuò)誤腳本位置確定單元2、正常腳本執(zhí)行單元3、錯(cuò)誤腳本類型確定單元4和錯(cuò)誤腳本處理單元5。
其中,其中,腳本獲取解析單元1用于獲取所有JavaScript腳本,并將所述JavaScript腳本進(jìn)行解析生成所述JS引擎可識(shí)別的token代碼。
具體的,JavaScript引擎先將JavaScript腳本代碼進(jìn)行詞法分析,依據(jù)語言的定義,提取出源文件中的內(nèi)容變?yōu)橐粋€(gè)個(gè)語法可以識(shí)別的token代碼。
錯(cuò)誤腳本位置確定單元2,用于對(duì)所述token代碼進(jìn)行檢測(cè),確定所述token代碼中的異常代碼,并記錄所述異常代碼的起始位置start_position和長度offect,以確定錯(cuò)誤JavaScript腳本的所在位置。
進(jìn)而,錯(cuò)誤腳本類型確定單元4,進(jìn)一步確定所述錯(cuò)誤JavaScript腳本的錯(cuò)誤類型,并采用錯(cuò)誤碼進(jìn)行標(biāo)識(shí),并輸出具體是哪一行發(fā)生了什么錯(cuò)誤。
一旦捕捉到腳本某處出現(xiàn)錯(cuò)誤后,在新的機(jī)制下,錯(cuò)誤腳本處理單元5會(huì)對(duì)所述錯(cuò)誤腳本對(duì)應(yīng)的所述異常代碼進(jìn)行處理,以使所述異常代碼可正常執(zhí)行。
譬如,一個(gè)簡單的賦值語句var b=a,JS虛擬機(jī)首先在執(zhí)行環(huán)境的上下文中查找變量a,發(fā)現(xiàn)變量a并沒有定義,這時(shí)報(bào)出錯(cuò)誤,并將undefined賦給b。這樣最終變量b的值等于undefined。
進(jìn)一步,正常腳本執(zhí)行單元3根據(jù)異常代碼的位置start_position和長度offect,得出下一條正常腳本的開始位置,即start_position+offect。
需要說明的是該系統(tǒng)實(shí)施例與方法實(shí)施例相對(duì)應(yīng),其執(zhí)行過程和執(zhí)行原理相同,在此不作贅述。
最后,還需要說明的是,在本文中,諸如第一和第二等之類的關(guān)系術(shù)語僅僅用來將一個(gè)實(shí)體或者操作與另一個(gè)實(shí)體或操作區(qū)分開來,而不一定要求或者暗示這些實(shí)體或操作之間存在任何這種實(shí)際的關(guān)系或者順序。而且,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者設(shè)備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者設(shè)備所固有的要素。在沒有更多限制的情況下,由語句“包括一個(gè)……”限定的要素,并不排除在包括所述要素的過程、方法、物品或者設(shè)備中還存在另外的相同要素。
本說明書中各個(gè)實(shí)施例采用遞進(jìn)的方式描述,每個(gè)實(shí)施例重點(diǎn)說明的都是與其他實(shí)施例的不同之處,各個(gè)實(shí)施例之間相同相似部分互相參見即可。
對(duì)所公開的實(shí)施例的上述說明,使本領(lǐng)域?qū)I(yè)技術(shù)人員能夠?qū)崿F(xiàn)或使用本發(fā)明。對(duì)這些實(shí)施例的多種修改對(duì)本領(lǐng)域的專業(yè)技術(shù)人員來說將是顯而易見的,本文中所定義的一般原理可以在不脫離本發(fā)明的精神或范圍的情況下,在其它實(shí)施例中實(shí)現(xiàn)。因此,本發(fā)明將不會(huì)被限制于本文所示的這些實(shí)施例,而是要符合與本文所公開的原理和新穎特點(diǎn)相一致的最寬的范圍。