陸敏
摘 要 近些年來(lái),隨著我國(guó)各類(lèi)嵌入式瀏覽器的不斷出現(xiàn),對(duì)JavaScript語(yǔ)言解釋器得到更廣泛的應(yīng)用和發(fā)展都是十分有利的。文章對(duì)JavaScript語(yǔ)言解釋器的總體結(jié)構(gòu)以及JavaScript語(yǔ)言解釋器實(shí)現(xiàn)的技術(shù)兩個(gè)方面的內(nèi)容進(jìn)行分析和探析,從而論述JavaScript語(yǔ)言解釋器的設(shè)計(jì)和實(shí)現(xiàn)工作。
關(guān)鍵詞 JavaScript語(yǔ)言解釋器;總體結(jié)構(gòu);實(shí)現(xiàn)技術(shù)
中圖分類(lèi)號(hào):TP314 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1671-7597(2014)01-0023-01
1 JavaScript語(yǔ)言解釋器的總體結(jié)構(gòu)
整個(gè)JavaScript語(yǔ)言解釋器在調(diào)用各個(gè)功能模塊時(shí)都是以總控程序?yàn)橹行牡模涓鱾€(gè)模塊的具體功能如下。
1)詞法分析。為了更有效的進(jìn)行語(yǔ)法分析,JavaScript腳本程序是嵌入在html文本中的,并且其是一類(lèi)輸入形成的具有雙向鏈表結(jié)構(gòu)的單詞鏈表。
2)語(yǔ)法分析。在JavaScript語(yǔ)法和語(yǔ)言的規(guī)則下,輸入形式為單詞鏈表,能夠形成中間數(shù)據(jù)結(jié)構(gòu),這樣就能夠清晰的顯示出程序語(yǔ)句描述的數(shù)據(jù)處理流程。
3)語(yǔ)句解釋器。其作用為有效的解釋和執(zhí)行各類(lèi)型的控制語(yǔ)句,同時(shí)還會(huì)調(diào)用解釋執(zhí)行器從而形成遞歸調(diào)用。
4)解釋執(zhí)行器。在控制語(yǔ)句解釋器的執(zhí)行時(shí),是以中間的數(shù)據(jù)結(jié)構(gòu)作為輸入的。
5)表達(dá)式規(guī)約器。其作用為在語(yǔ)句解釋器工作的過(guò)程中,能夠準(zhǔn)確的完成各類(lèi)表達(dá)式的賦值語(yǔ)句和運(yùn)算的執(zhí)行,同時(shí)由語(yǔ)句解釋器來(lái)調(diào)用。
6)與瀏覽器交互。在表達(dá)式的運(yùn)算過(guò)程中,此模塊能夠及時(shí)的修改當(dāng)前html文本和文檔對(duì)象中各種控件對(duì)象的屬性值,同時(shí)還能夠以瀏覽器輸出的形式將其表現(xiàn)出來(lái)。
2 JavaScript語(yǔ)言解釋器實(shí)現(xiàn)的技術(shù)
1)語(yǔ)言解釋器的總控程序。其主要負(fù)責(zé)整個(gè)JavaScript語(yǔ)言解釋器的運(yùn)行和控制,同時(shí)也是瀏覽器和解釋器間的接口。首先在詞法分析器的結(jié)構(gòu)處,解釋器中的JavaScript源程序會(huì)形成一個(gè)雙向的單詞鏈表,然后,在語(yǔ)法分析器的結(jié)構(gòu)處,雙向的單詞鏈表又會(huì)形成一個(gè)中間的數(shù)據(jù)結(jié)構(gòu),最后執(zhí)行器會(huì)根據(jù)各個(gè)語(yǔ)句進(jìn)行有效的執(zhí)行,各功能模塊調(diào)用時(shí)都會(huì)反饋結(jié)果,而總控程序就是以此為依據(jù)控制解釋器的運(yùn)行的。
2)中間數(shù)據(jù)結(jié)構(gòu)。作為整個(gè)JavaScript語(yǔ)言解釋器運(yùn)行的基礎(chǔ),中間數(shù)據(jù)結(jié)構(gòu)最主要的作用就是保存語(yǔ)法分析的中間結(jié)果,主要有程序語(yǔ)句、程序流程以及各變量的中間描述,這些工作都是在語(yǔ)法分析階段完成的,因此,我們只需要給出簡(jiǎn)單的結(jié)構(gòu)描述。對(duì)變量結(jié)構(gòu)VALUE-TYPE設(shè)計(jì)時(shí),我們應(yīng)充分的保證各個(gè)類(lèi)型的變量與邏輯存儲(chǔ)結(jié)構(gòu)的統(tǒng)一性。所以,JavaScript語(yǔ)言解釋器是用名稱(chēng)、類(lèi)型以及不同類(lèi)型的變量值來(lái)描述變量的。因?yàn)镴avaScript這類(lèi)語(yǔ)言的弱類(lèi)型性,所以我們并不需要明確的指定其類(lèi)型,在運(yùn)行的過(guò)程中確定其類(lèi)型就可以了。
3)解釋執(zhí)行控制器。其最重要的作用就是有效的控制程序語(yǔ)句的各個(gè)解釋執(zhí)行的流程,而解釋執(zhí)行控制器也是整個(gè)JavaScript語(yǔ)言解釋器的核心結(jié)構(gòu),進(jìn)行解釋執(zhí)行時(shí),其從第一條語(yǔ)句就開(kāi)始工作了,并且不同類(lèi)型的語(yǔ)句其單條語(yǔ)句的處理模塊也是不同的,舉例來(lái)說(shuō),在系統(tǒng)進(jìn)入deal-if-statement模塊的IF語(yǔ)句,只要前一句解釋成功就可以解釋下一語(yǔ)句了,當(dāng)前一語(yǔ)句沒(méi)有解釋成功時(shí),那么就無(wú)法解釋下一語(yǔ)句了,并且不同類(lèi)型的控制語(yǔ)句其都有對(duì)應(yīng)的解釋模塊,中間的描述結(jié)構(gòu)指針就是傳入?yún)?shù),在調(diào)用各個(gè)單獨(dú)的語(yǔ)句解釋模塊后就形成了各類(lèi)的復(fù)合語(yǔ)句等遞歸調(diào)用。
4)表達(dá)式規(guī)約器。作為整個(gè)JavaScript語(yǔ)言解釋器最核心的組成部分,表達(dá)式規(guī)約器的作用就是順利的完成各類(lèi)賦值語(yǔ)句和表達(dá)式的執(zhí)行和運(yùn)算。各種類(lèi)型的表達(dá)式組成了程序設(shè)計(jì)語(yǔ)言中的各類(lèi)語(yǔ)句,通常情況下,表達(dá)式含有函數(shù)、算符以及數(shù)據(jù)引用等調(diào)用模式。而調(diào)用對(duì)象的自身特點(diǎn)也決定了表達(dá)式的復(fù)雜性,對(duì)象的屬性、一般類(lèi)型的變量以及常量都可以是表達(dá)式的引用數(shù)據(jù),而函數(shù)調(diào)用則可以是對(duì)象的方法或是用戶(hù)自定義的調(diào)用。
為了更加有效并且準(zhǔn)確的控制解釋器的運(yùn)行狀態(tài),我們就必須保證所有表達(dá)式運(yùn)算的統(tǒng)一性。①由于在語(yǔ)法的分析階段只需要弄清構(gòu)成表達(dá)式的各個(gè)單詞串,而并不需要掌握表達(dá)式的語(yǔ)義,所以如果可以由規(guī)約器對(duì)表達(dá)式進(jìn)行操作和處理,那么整個(gè)解釋系統(tǒng)就變得十分簡(jiǎn)化了;②如果能夠保證各類(lèi)表達(dá)式的統(tǒng)一性,那么原來(lái)應(yīng)在主控程序中完成的復(fù)雜控制邏輯就被轉(zhuǎn)移到規(guī)約器中去操作完成了,因此在算符方法的基礎(chǔ)上,作者設(shè)計(jì)了算符優(yōu)先的分析算法,從而保證了JavaScript中所有表達(dá)式的統(tǒng)一性。其主要的設(shè)計(jì)思路就是充分的參考了基于對(duì)象的JavaScript語(yǔ)言的自身特點(diǎn):建立新的算符和產(chǎn)生式規(guī)則后,對(duì)象的屬性就被轉(zhuǎn)化成了表達(dá)式的運(yùn)算,這樣新的規(guī)則和原來(lái)的算符就都會(huì)參與到表達(dá)式的運(yùn)算中了,也方便了系統(tǒng)對(duì)表達(dá)式運(yùn)算進(jìn)行統(tǒng)一的處理。作為一類(lèi)特殊的表達(dá)式,所調(diào)用的函數(shù)名就像對(duì)象的屬性一樣,表達(dá)式先規(guī)約就是函數(shù)的參數(shù),從而形成最終的可規(guī)約串。首先應(yīng)建立新的算符和產(chǎn)生式,然后應(yīng)確定對(duì)象運(yùn)算符和原文法終結(jié)符之間的優(yōu)先關(guān)系。這種優(yōu)先關(guān)系是很容易確定,因?yàn)榉椒ê蛯?duì)象調(diào)用都被看作是數(shù)據(jù)引用;最后就是有效的解決規(guī)約沖突。由于順序表達(dá)式規(guī)約與函數(shù)參數(shù)規(guī)約是有沖突的,而原生產(chǎn)式與新的生產(chǎn)式也是有規(guī)約沖突的,所以,我們還必須準(zhǔn)確的判斷規(guī)約時(shí)所選擇的是哪一條規(guī)則。當(dāng)出現(xiàn)順序表達(dá)式和函數(shù)參數(shù)的沖突時(shí),應(yīng)先搜索規(guī)約棧,先確定順序表達(dá)式有沒(méi)有在函數(shù)調(diào)用的上下文中,而對(duì)于原生產(chǎn)式和新的生產(chǎn)式的沖突,應(yīng)立即規(guī)約變量,同時(shí)也要展望下一個(gè)輸入符號(hào),下一個(gè)符號(hào)是是的話(huà)就對(duì)新的生產(chǎn)式規(guī)約,如果不是,就對(duì)原生產(chǎn)式規(guī)約。
5)與瀏覽器交互。在這個(gè)功能模塊中,我們應(yīng)做好以下兩個(gè)方面的工作:①應(yīng)及時(shí)的改變改變當(dāng)前狀態(tài)下不同類(lèi)型控件對(duì)象和文檔對(duì)象的屬性,任何一個(gè)嵌入式的平臺(tái)都是有源代碼的,所以我們很容易就可以將一般類(lèi)型的變量與各種對(duì)象的存儲(chǔ)統(tǒng)一起來(lái),在參與表達(dá)式的運(yùn)算過(guò)程中,對(duì)象的屬性值也會(huì)被改變。其既準(zhǔn)確的定義了修改對(duì)象的接口,同時(shí)也能夠清晰的顯示出網(wǎng)頁(yè)的變化情況;②還能夠妥善的進(jìn)行事件處理工作。這項(xiàng)工作就是指處理好用戶(hù)和網(wǎng)頁(yè)交互時(shí)產(chǎn)生的操作,其是由相應(yīng)的程序完成的,一般情況下我們將其看作是一個(gè)解釋單元,而其在主控程序上就可以完成,從而保證用戶(hù)和網(wǎng)頁(yè)之間的交互工作順利完成。
參考文獻(xiàn)
[1]胡貫榮.淺談JavaScript語(yǔ)言解釋器的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與應(yīng)用,2003.
[2]孫永強(qiáng).程序設(shè)計(jì)語(yǔ)言編譯原理[M].國(guó)防工業(yè)出版社,1994.endprint