專利名稱:壓縮用腳本語言編寫的源代碼的制作方法
壓縮用腳本語言編寫的源代碼背景傳統(tǒng)因特網(wǎng)瀏覽應(yīng)用(瀏覽器)被配置成允許其用戶訪問在因特網(wǎng)上可用的信息。另外,常規(guī)瀏覽器可被配置成訪問和利用借助因特網(wǎng)(web應(yīng)用)可用的應(yīng)用。在傳統(tǒng)web應(yīng)用中,對與瀏覽器窗口有關(guān)的代碼的執(zhí)行完全發(fā)生在服務(wù)器側(cè)上,使得由在客戶機(jī)計算設(shè)備上執(zhí)行的瀏覽器中的個體作出的每次更新觸發(fā)至服務(wù)器的往返行程消息,接下來是瀏覽器窗口整體的刷新(將數(shù)據(jù)下載到瀏覽器允許瀏覽器刷新瀏覽窗口)。此往返行程消息接發(fā)以及將數(shù)據(jù)下載到客戶機(jī)會花費相當(dāng)數(shù)量的時間,特別是在利用相對復(fù)雜的web應(yīng)用(諸如電子郵件應(yīng)用、地圖應(yīng)用等)時,以及還特別是在相當(dāng)數(shù)量的數(shù)據(jù)需要被傳送到客戶機(jī)計算設(shè)備時。最近幾年,已產(chǎn)生更復(fù)雜的分布式web應(yīng)用,并使得其可為用戶所用。這些更復(fù)雜的應(yīng)用是至少部分地基于瀏覽器執(zhí)行客戶機(jī)側(cè)代碼(諸如JaYaScdpf )的能力來啟用的,以在響應(yīng)于用戶動作和客戶機(jī)服務(wù)器交互動態(tài)更新所呈現(xiàn)的網(wǎng)頁的同時,提供平滑、高 響應(yīng)性的用戶體驗。然而,隨著此類web應(yīng)用的技巧和特征集繼續(xù)增長,下載用于在客戶機(jī)上執(zhí)行的代碼越來越成為初始啟動時間和后繼應(yīng)用反應(yīng)時間兩者中的瓶頸。例如,一些復(fù)雜web應(yīng)用被配置成從服務(wù)器向客戶機(jī)傳送超過一兆字節(jié)的未壓縮源代碼,其中該代碼需要由在客戶機(jī)上運行的應(yīng)用來執(zhí)行。清楚地,在代碼執(zhí)行之前要求用戶進(jìn)行等待直至與復(fù)雜web應(yīng)用相對應(yīng)的整個代碼部分已被傳送到客戶機(jī)不會導(dǎo)致響應(yīng)性非常好的用戶體驗,特別是在低帶寬連接時。一種用于減少此類瓶頸的機(jī)制是壓縮需要從服務(wù)器向客戶機(jī)傳送的可執(zhí)行代碼。例如,一些工具被用來通過移除源代碼中的多余空白(tab(空白分隔符)、空格等)來縮減源代碼。也可采用其他縮減形式。在代碼被縮減之后,此類代碼可用諸如gzip之類的壓縮模式來壓縮。經(jīng)壓縮源代碼隨后被傳送到客戶機(jī),在那里,在客戶機(jī)上運行的應(yīng)用對經(jīng)壓縮源代碼進(jìn)行解壓,并解析此類代碼以準(zhǔn)備用來在客戶機(jī)計算設(shè)備上執(zhí)行的代碼。概要以下是在本文詳細(xì)描述的主題的簡要的發(fā)明內(nèi)容。本發(fā)明內(nèi)容不旨在是關(guān)于權(quán)利要求的范圍的限制。本文中詳細(xì)地描述了與以下有關(guān)的各種技術(shù)生成以腳本語言編寫的源代碼的基于抽象句法樹(AST)的表示、壓縮源代碼的此類基于AST的表示、通過網(wǎng)絡(luò)將源代碼的經(jīng)壓縮的基于AST的表示傳送到客戶機(jī)、以及在客戶機(jī)處解壓源代碼的經(jīng)壓縮的基于AST的表示。可能希望經(jīng)由網(wǎng)絡(luò)連接將以遵循諸如JavaScript 之類的ECMAscript標(biāo)準(zhǔn)的腳本語言編寫的源代碼從諸如服務(wù)器、路由器之類的第一計算設(shè)備轉(zhuǎn)移到諸如客戶機(jī)計算設(shè)備之類的第二計算設(shè)備,以使得第二計算設(shè)備可執(zhí)行源代碼中的指令。如本文中更詳細(xì)描述的,源代碼可被解析成此類源代碼的基于AST的表示,并在之后在第一計算設(shè)備上進(jìn)行壓縮。此經(jīng)壓縮的基于AST的表示可在隨后通過網(wǎng)絡(luò)連接傳送到第二計算設(shè)備,其中該第二計算設(shè)備可被配置成解壓基于AST的表示,并生成與原始源代碼相對應(yīng)的AST。第二計算設(shè)備可在隨后被配置成執(zhí)行包括在AST中的至少一個指令。由于在第二計算設(shè)備處接收到的代碼是基于AST的格式的,因此第二計算設(shè)備無需解析此代碼。相反,第二計算設(shè)備可直接解釋AST或?qū)⒃揂ST轉(zhuǎn)換成可執(zhí)行代碼,并在之后執(zhí)行此代碼。在本文中更詳細(xì)地描述的一個方面中,第一計算設(shè)備可將源代碼解析成多個不同的數(shù)據(jù)流。這多個數(shù)據(jù)流可包括產(chǎn)品(production)流,其表示用于生成源代碼的腳本語言的語法規(guī)則;標(biāo)識符流,其表示源代碼中的變量;以及文字流,其表示源代碼中的常數(shù)和字符串。產(chǎn)品流可通過例如至少部分地基于部分匹配預(yù)測(PPM)技術(shù)的壓縮技術(shù)來以基于AST的格式來壓縮。可通過利用帶有指向特定全局符號或特定作用域中的符號的偏移量的局部和全局符號表來壓縮標(biāo)識符流。另外,可通過至少部分地基于標(biāo)識符在源代碼中的使用頻度對符號表中的標(biāo)識符進(jìn)行排序,來壓縮標(biāo)識符流。此外,可通過利用內(nèi)建符號表、通過利用可變長度編碼、以及通過利用重命名局部符號表中的標(biāo)識符來壓縮標(biāo)識符流??衫缤ㄟ^利用符號表、按類型對文字進(jìn)行編組、消去已知前綴和后綴、或者通過任何其他合適的技術(shù)來壓縮文字流。依據(jù)一示例,這三個經(jīng)壓縮流可被放置在數(shù)據(jù)分組中并被傳送到第二計算設(shè)備。例如,第二計算設(shè)備可包括在此設(shè)備上執(zhí)行的瀏覽器,并且該瀏覽器可被配置成具有可執(zhí)行代碼,該可執(zhí)行代碼被用來解壓三個分開的流以生成與源代碼相對應(yīng)的AST。 此AST可在隨后由第二計算設(shè)備來執(zhí)行。依據(jù)本文中描述的另一方面,在傳送三個經(jīng)壓縮流之前,這些流可通過利用諸如gzip之類的壓縮模型來進(jìn)一步壓縮。因而,第一計算設(shè)備上的源代碼可通過利用多級壓縮系統(tǒng)來壓縮,而第二計算設(shè)備可被配置成具有多級解壓系統(tǒng)。在閱讀并理解了附圖和描述后,可以明白其他方面。附圖簡述圖I是便于傳送源代碼的經(jīng)壓縮的基于AST的表示的示例系統(tǒng)的功能框圖。圖2描繪了腳本語言形式的源代碼至多個不同流的示例解析。圖3表不通過利用全局和局部符號表來壓縮標(biāo)識符流。圖4是便于接收和解壓以腳本語言編寫的源代碼的經(jīng)壓縮的基于AST的表示的示例系統(tǒng)的功能框圖。圖5是例示用于壓縮以腳本語言編寫的源代碼的基于AST的表示的示例方法的流程圖。圖6是例示用于利用多級壓縮系統(tǒng)來壓縮以腳本語言編寫的源代碼的基于AST的表示的示例方法的流程圖。圖7是例示用于解壓以腳本語言編寫的源代碼的基于AST的表示的示例方法的流程圖。圖8是例示用于利用多級解壓系統(tǒng)來解壓以腳本語言編寫的源代碼的基于AST的表示的示例方法的流程圖。圖9是不例計算系統(tǒng)。詳細(xì)描述現(xiàn)在將參照附圖來描述與傳送以腳本語言編寫的源代碼的經(jīng)壓縮的基于抽象句法樹(AST)的表示有關(guān)的各種技術(shù),其中類似附圖標(biāo)記貫穿全文地表示類似元素。另外,本文出于解釋的目的示出并描述了各示例系統(tǒng)的若干功能框圖;然而可以理解,被描述為由特定系統(tǒng)組件執(zhí)行的功能可以由多個組件來執(zhí)行。類似地,例如,一組件可被配置成執(zhí)行被描述為由多個組件執(zhí)行的功能。參照
圖1,其例示了便于壓縮以腳本語言編寫的源代碼的基于AST的表示的示例系統(tǒng)100。系統(tǒng)100包括數(shù)據(jù)源102,其可以是可借助網(wǎng)絡(luò)連接來與另一計算設(shè)備通信的任何合適的計算設(shè)備。例如,數(shù)據(jù)源102可以是服務(wù)器,諸如web服務(wù)器、應(yīng)用服務(wù)器、或其他合適的服務(wù)器。在另一示例中,數(shù)據(jù)源102可以是網(wǎng)絡(luò)設(shè)備,諸如路由器、橋接器等。在又一示例中,數(shù)據(jù)源102可以是參與到對等應(yīng)用中的客戶機(jī)計算設(shè)備(使得該客戶機(jī)計算設(shè)備相對于另一客戶機(jī)計算設(shè)備充當(dāng)服務(wù)器)。因而,數(shù)據(jù)源102可以是可被配置成執(zhí)行如以上所述的源代碼的壓縮的任何合適的計算設(shè)備。 數(shù)據(jù)源102包括解析器組件104,該解析器組件接收以腳本語言編寫的源代碼106,腳本語言諸如對應(yīng)于ECMA腳本編寫(例如,·丨avaScript )、Perl、VBscript、XUL、或一 些其他合適的腳本語言的腳本語言。如本文中所使用的,術(shù)語“腳本語言”旨在包括編程語言,該編程語言可被用來通過用在軟件內(nèi)運行的虛擬機(jī)實現(xiàn)并允許用腳本語言編寫的代碼控制此類軟件的各個方面來擴(kuò)展特定軟件的功能??杀豢刂频奶囟ǚ矫娴氖纠▓D形用戶界面、進(jìn)行計算、以及經(jīng)由網(wǎng)絡(luò)連接的通信。例如,腳本語言在現(xiàn)代計算機(jī)系統(tǒng)中特別重要,因為它們允許經(jīng)由網(wǎng)絡(luò)來遞送整個應(yīng)用以在web瀏覽器的上下文中執(zhí)行。解析器組件104可被配置成將源代碼106解析成此類源代碼106的基于AST的表示。如將容易理解的,AST是以特定編程語言編寫的源代碼的計算機(jī)實現(xiàn)的抽象句法結(jié)構(gòu)的樹表示。出于解釋而非限制的目的,本文中提供了解析JavaScripl#代碼以生成源代碼106的基于AST的表示的解析器組件104的示例。JavaScript 代碼被表示為必須遵循特定結(jié)構(gòu)來表示有效程序的字符序列。此字符序列可被拆解成稱為記號(token)的序列,這些記號包括關(guān)鍵字、預(yù)定義符號、空白、用戶提供的常數(shù)、以及用戶提供的名字。關(guān)鍵字包括諸如“while”和“if”之類的字符串。符號包括諸如-和++之類的操作符,以及分號、括號等。空白通常包括不可打印字符,并且最普遍地指代一個或多個空格或tab字符。用戶提供的常數(shù)包括硬編碼字符串、整數(shù)、和浮點數(shù)值。用戶提供的標(biāo)識符包括可變名稱、函數(shù)名稱等。前述記號被允許出現(xiàn)以作為有效程序的次序由執(zhí)行句法規(guī)則的JavaScript;) 語法來定義。例如,一個這樣的規(guī)則是關(guān)鍵字“while”之后必須跟隨開式括號,該開式括號任選地位于空白之后。此類句法迫使有效程序遵循嚴(yán)格結(jié)構(gòu)。換言之,隨機(jī)生成的文本文件將極少表示恰當(dāng)?shù)腏avaScript 程序。解析器組件104可通過將源代碼106拆成基于AST的表示以使得基于AST的節(jié)點表示包括以上提及的記號,來暴露.丨avaScripi 程序(或以某一其他腳本語言編寫的程序)??蓮幕贏ST的表示生成的AST指定語法規(guī)則必須被應(yīng)用以獲得所討論的程序的次序。此類規(guī)則在本文中被稱為產(chǎn)品(production),常數(shù)在本文中被稱為文字(literal),而變量和函數(shù)名在本文中被稱為標(biāo)識符。解析器組件104可提取并分隔表示源代碼106的產(chǎn)品、標(biāo)識符、和文字。簡要地參看圖2,例示了將示例JavaScript 函數(shù)解析成產(chǎn)品流、標(biāo)識符流、和文字流。與具有指定與之相關(guān)聯(lián)的語法規(guī)則的多個規(guī)則(例如,236)的腳本語言相對應(yīng)的示例函數(shù)202如下var y = 2 ;
function foo () {var x = “Comp” ;var z = 3 ;z = y+7 ;}X = ” Comp I ” ;在此示例中,與函數(shù)202相對應(yīng)的產(chǎn)品流204以線性化格式示出,并且包括與數(shù)字 (在示例中)1、46、7、38、25和138相對應(yīng)的規(guī)則的標(biāo)識符。另外,解析器組件104可生成包括函數(shù)202中的標(biāo)識符的標(biāo)識符流。在示例中,解析器組件104可生成標(biāo)識符流206,以使得標(biāo)識符流包括按標(biāo)識符在函數(shù)202中碰見的次序的標(biāo)識符。因而,在此示例中,標(biāo)識符流206包括標(biāo)識符Y、F00> X、Z、Z、Y、X。解析器組件104還可至少部分地基于示例函數(shù)202生成文字流208,其中文字流208包括按解析器組件104碰到文字的次序的文字序列。在圖2中所示的示例中,文字流208 包括文字 2、“C0MP”、3、7 和 “COMPI”。返回圖1,一級壓縮器組件108可接收由解析器組件104輸出的流,并且可被配置成分開且個別地壓縮每個流。雖然已將解析器組件104描述為產(chǎn)品、標(biāo)識符和文字的輸出流,但是應(yīng)當(dāng)理解,解析器組件104可被配置成輸出其它類型的流,包括但不限于包括注釋的流。如先前所提及的,一級壓縮器組件108可被配置成個別地壓縮由解析器組件104輸出的不同流。例如,一級壓縮器組件108可包括產(chǎn)品壓縮器組件110,該產(chǎn)品壓縮器組件被配置成接收由解析器組件104輸出的產(chǎn)品并壓縮此類產(chǎn)品。圖2的產(chǎn)品流204中示出的產(chǎn)品被示為是線性形式的。依據(jù)示例,產(chǎn)品壓縮器組件110可被配置成壓縮這樣的線性產(chǎn)品流。例如,產(chǎn)品壓縮器組件Iio可被配置成用整數(shù)來重命名產(chǎn)品。例如,產(chǎn)品program => SourceElements (程序= >源元素)可用整數(shù)225來表示,并且如果此類產(chǎn)品是產(chǎn)品流中的普通產(chǎn)品,則此類產(chǎn)品可被重命名為整數(shù)I。因此,產(chǎn)品壓縮器組件110可被配置成最小化大產(chǎn)品ID的頻度,同時最大化小產(chǎn)品ID的頻度。此外,產(chǎn)品壓縮器組件110可被配置成接收由解析器組件104輸出的線性產(chǎn)品流,并對此類產(chǎn)品執(zhí)行差分編碼。差分編碼基于僅幾個產(chǎn)品可跟隨特定給定的產(chǎn)品這樣的觀測來工作。因此,特定產(chǎn)品可基于此類觀測來重命名。在又一示例中,產(chǎn)品壓縮器組件110可接收解析器組件104輸出的線性產(chǎn)品流,并通過利用鏈規(guī)則來壓縮此類產(chǎn)品流。鏈規(guī)則指示就一些產(chǎn)品總是跟隨一個特定產(chǎn)品。對于此類產(chǎn)品鏈,產(chǎn)品壓縮器組件110可僅僅記錄第一產(chǎn)品(例如,從解析器組件104輸出的流移除后續(xù)產(chǎn)品)。在替換性實施例中,解析器組件104可被配置成以基于AST的表示的形式輸出產(chǎn)品流,而非線性流。在此類情形中,產(chǎn)品壓縮器組件Iio可被配置成壓縮由解析器組件104輸出的基于AST的表示。在示例中,取決于用于編寫源代碼106的語言,產(chǎn)品比起以樹格式配置時更可壓縮。例如,示例產(chǎn)品可在右手側(cè)具有兩個符號(例如,具有“then”和“else”塊的“if”聲明)。此類產(chǎn)品通常對應(yīng)于基于AST的表示中的一個節(jié)點和兩個孩子,而不管其中發(fā)生產(chǎn)品的上下文如何。在線性化形式中,第一孩子直接出現(xiàn)在父母的后面,但是第二孩子出現(xiàn)在與父母相距任意距離之處,其中此類任意距離取決于第一孩子之下的子樹的大小(在此示例中的“then”塊的大小)。這會致使數(shù)據(jù)模型難以預(yù)期符號,并由此致使數(shù)據(jù)模型難以達(dá)成適當(dāng)?shù)膲嚎s。產(chǎn)品壓縮組件110可被配置成緩和這個問題,因為節(jié)點的孩子總是在父母的上下文中被編碼,這使得預(yù)測和壓縮產(chǎn)品變得更容易??捎糜趬嚎s的附加信息塊是孩子的位置,因為節(jié)點的每個孩子具有相同的父母、祖父母等。換言之,產(chǎn)品壓縮器組件110可使用從根節(jié)點至一節(jié)點的路徑,并且關(guān)于節(jié)點將哪個孩子表示為用于壓縮這個節(jié)點的上下文的信
肩、O在具體示例中,產(chǎn)品壓縮器組件110可利用任何合適的基于上下文的數(shù)據(jù)壓縮技術(shù),諸如部分匹配預(yù)測或其變體。部分匹配預(yù)測(PPM)通過對每個碰到的上下文記錄什么符號跟隨這樣的上下文,以使得下次看到相同的上下文時,可執(zhí)行查找來提供很可能的接下來的符號以及它們的發(fā)生概率。最大允許上下文長度可決定查找表的大小。在一示例中,產(chǎn)品壓縮器組件110可利用上下文長度I (僅使用父母以及空上下文)來執(zhí)行部分匹配預(yù) 測。然而,由于查找表對于O階上下文和一階上下文可能產(chǎn)生不同的預(yù)測,因此產(chǎn)品壓縮器組件110可利用特殊算法來指定在此情形中做什么。例如,產(chǎn)品壓縮器組件110可被配置成利用結(jié)合PPMA和PPMC的部分的方案。具體地,產(chǎn)品壓縮器組件110可被配置成拾取在過去已出現(xiàn)過至少一次的最長上下文,并且如果先前尚沒有上下文出現(xiàn)過,則默認(rèn)為空上下文。例如,如果樹節(jié)點可具有高達(dá)四個孩子,則產(chǎn)品壓縮器組件110可利用四個不同的PPM表,每個位置一個(每個孩子一個)。對于每個上下文,表格記錄每個符號跟隨得有多頻繁。PPM可被用來預(yù)測具有與其頻度成比例的概率的下一符號,并且產(chǎn)品壓縮器組件110可利用算術(shù)代碼來緊致地編碼恰當(dāng)?shù)姆?。為了確保每個上下文可作出預(yù)測,產(chǎn)品壓縮器組件110可配置一階上下文以指示之前尚未見過當(dāng)前產(chǎn)品,以及應(yīng)當(dāng)查詢空上下文。在一示例中,“逸出(escape)”符號的頻度可被設(shè)為I。產(chǎn)品壓縮器組件110可用每個可能的產(chǎn)品來填充空上下文,也就是說每個可能的產(chǎn)品被初始化為頻度I。因此,逸出符號可能并非是必需的。與常規(guī)PPM實現(xiàn)中不同,在一階上下文被用于此目的的情形中,產(chǎn)品壓縮器組件110可使用O階上下文,因為其旨在相對快速地碰到最多產(chǎn)品。為了添加老化(該老化向當(dāng)前看到的產(chǎn)品給予更大的權(quán)重),只要計數(shù)中的一個達(dá)到預(yù)定義最大值,產(chǎn)品壓縮器組件110就可將頻度計數(shù)減小2倍。在一示例中,預(yù)定義最大值可以是127。產(chǎn)品壓縮器組件110還可采用更新排除,這意味著如果一階上下文能預(yù)測當(dāng)前產(chǎn)品,則空上下文不被更新。此外,產(chǎn)品壓縮器組件110無需編碼文件末尾的符號或記錄文件的長度,因為當(dāng)樹完成時,解壓自動終止。一級壓縮器組件108還可包括標(biāo)識符壓縮器組件112,標(biāo)識符壓縮組件112被配置成壓縮解析器組件104輸出的與源代碼106有關(guān)的標(biāo)識符流。如以下更詳細(xì)描述的,標(biāo)識符壓縮器組件112可生成全局符號表,一個或多個局部符號表,可利用內(nèi)建來表不符號,并且可按頻度對符號進(jìn)行排序,并且還可利用可變長度編碼來編碼符號以壓縮由解析器組件104輸出的標(biāo)識符流。依據(jù)一示例,標(biāo)識符壓縮器組件112可接收由解析器組件104輸出的標(biāo)識符流,并且可生成至少一個符號表,其中該至少一個符號表包括標(biāo)識符流中存在的每個唯一標(biāo)識符,以及與之相對應(yīng)的索引。因此,標(biāo)識符壓縮器組件112可將每個唯一標(biāo)識符記錄到符號表中,并用索引至此表來替代標(biāo)識符流。標(biāo)識符壓縮器組件112可在隨后任選地將符號表分割成全局作用域表以及一個或多個局部作用域表。每次僅一個局部作用域表可以是活躍的,并且可從產(chǎn)品流中的產(chǎn)品推導(dǎo)出的函數(shù)邊界信息可被用來確定何時切換局部作用域表。因而,相對較小數(shù)目個索引可被用來指定標(biāo)識符流中的標(biāo)識符。此外,標(biāo)識符壓縮 器組件112可按頻度對符號表中的符號進(jìn)行排序,由此使得小的偏移量更為頻繁。具體地,由于并非所有標(biāo)識符都是均等頻繁地出現(xiàn)的,因此標(biāo)識符壓縮器組件112可將每個符號表按從最頻繁地使用標(biāo)識符到最不頻繁地使用標(biāo)識符進(jìn)行排序。因此,結(jié)果經(jīng)壓縮標(biāo)識符流將包括大部分小的值,這使得當(dāng)使用可變長度編碼(其也可由標(biāo)識符壓縮器組件112進(jìn)行)時使得標(biāo)識符流更可壓縮。此外,標(biāo)識符壓縮器組件112可重命名局部變量。這是因為在解壓和執(zhí)行期間,局部作用域中的變量的名稱無需被再次產(chǎn)生。標(biāo)識符壓縮器組件112可任意地重命名局部變量,只要唯一性得以保持,并且就關(guān)鍵字或全局標(biāo)識符而言沒有沖突。因而,局部變量可被賦予極短的名字,諸如“a”、“b”、“c”等。此外,標(biāo)識符壓縮器組件112可利用內(nèi)建的公共變量名稱表來消除對顯式地存儲此類名稱的需要。因此,許多局部作用域變?yōu)榭?,并且單獨的索引流足以指定使用哪些?biāo)識符(本質(zhì)上,索引是可變名稱)。注意,在一些示例中,標(biāo)識符壓縮器組件112不對諸如函數(shù)名之類的全局標(biāo)識符應(yīng)用重命名,因為外部代碼可調(diào)用此類函數(shù),其中調(diào)用此類函數(shù)是通過名稱來進(jìn)行的。簡要地轉(zhuǎn)到圖3,其例示了與全局和局部符號表中的函數(shù)有關(guān)的標(biāo)識符300的示例布置。此示例與以下函數(shù)有關(guān)var y = 2 ;function foo () {var x = “ comp ” ;var z = 3 ;z = y+y ;}x = “compl”;解析器組件104可將函數(shù)302解析成標(biāo)識符流304,其中標(biāo)識符流304包括標(biāo)識符y、foo、x、z、z、y、y、x。全局符號表306將包括全局標(biāo)識符列表(y、foo和x),其對應(yīng)于索引(索引1、2和3)。如先前所指示的,標(biāo)識符壓縮器組件112可按出現(xiàn)的頻度對全局符號表306中的符號進(jìn)行排序。此外,函數(shù)302的作用域中的標(biāo)識符可包括標(biāo)識符X和z,它們可被放置在局部符號表308中。如局部符號表308中所示的,索引X和z可對應(yīng)于索引I和2。因此,標(biāo)識符流可用更加壓縮的標(biāo)識符流來替代,更加壓縮的標(biāo)識符流可包括與標(biāo)識符流中的標(biāo)識符相對應(yīng)的索引,以及指示標(biāo)識符屬于哪個表的值。例如,頭部可被用來指不屬于全局符號表306的標(biāo)識符和屬于局部表308的標(biāo)識符。因此,標(biāo)識符壓縮器組件112可輸出標(biāo)識符流310,該標(biāo)識符流包括全局和局部符號表306和308各自的索引,以及指示索引屬于特定全局或局部符號表的值。因此,已更新的標(biāo)識符流可被表示為如下1(全局)2(全局)1(局部)2(局部)2(局部)1(全局)1(全局)3(全局)。再次回到圖1,一級壓縮器組件108還可包括文字壓縮器組件114,該文字壓縮器文件114被配置成壓縮由解析器組件104輸出的文字流。依據(jù)一示例,文字壓縮器組件114可被配置成生成用于源代碼106中的文字的符號表,這類似于其中標(biāo)識符壓縮器組件112被配置成生成用于由解析器組件104輸出的標(biāo)識符流中的標(biāo)識符的符號表。在另一示例中,文字壓縮器組件112可被配置成按類型對由解析器組件104輸出的文字流中的文字進(jìn)行編組。在一示例中,文字壓縮器組件112可通過分析由解析器組件104輸出的產(chǎn)品流來確定文字的類型。因而,在一示例中,位置壓縮器組件112可被配置成將字符串與數(shù)字文字分開。因此,例如,文字壓縮器組件112可被配置成將數(shù)字文字分成浮點和整數(shù)文字。在又一示例中,文字壓縮器組件112可被配置成消除由解析器組件104輸出的文字流中的文字里的已知前綴和后綴。因而,在一示例中,文字壓縮器組件112可被配置成移 除字符串周圍的引號,并且作為新的一行/回車對的替代,使用單個字符分離器來描繪文字。在產(chǎn)品壓縮器組件110、標(biāo)識符壓縮器組件112和文字壓縮器組件114已分別壓縮了產(chǎn)品流、標(biāo)識符流、和文字流之后,一級壓縮器組件108可被配置成輸出產(chǎn)品、經(jīng)壓縮標(biāo)識符流、和經(jīng)壓縮文字流的基于AST的表示。二級壓縮器組件116可接收產(chǎn)品、經(jīng)壓縮標(biāo)識符流、和經(jīng)壓縮文字流的經(jīng)壓縮的基于AST的表示的子集,并且可進(jìn)一步壓縮該子集。例如,二級壓縮器組件116可被配置成僅接收經(jīng)壓縮標(biāo)識符流和經(jīng)壓縮文字流,因為由產(chǎn)品壓縮器組件110輸出的源代碼的基于AST的表示可能不能被二級壓縮器組件116進(jìn)一步壓縮。例如,二級壓縮器組件116可以是任何合適的壓縮模型,諸如gzip。這可允許將源代碼106的基于AST的表示(產(chǎn)品的經(jīng)壓縮的基于樹的表示、標(biāo)識符流和文字流)放置在適合用于在網(wǎng)絡(luò)連接上傳輸?shù)奈募?。因而,二級壓縮器組件116可被配置成輸出數(shù)據(jù)分組118,其中數(shù)據(jù)分組118包括源代碼106的經(jīng)壓縮的基于AST的表示120。例如,可借助任何合適的網(wǎng)絡(luò)連接將數(shù)據(jù)分組118傳送到客戶機(jī)計算設(shè)備。雖然圖I顯示了兩級壓縮系統(tǒng),但是應(yīng)當(dāng)理解,權(quán)利要求書旨在包括任何合適的多級壓縮和解壓系統(tǒng)(例如,其中三級或更多級被包括在這樣的系統(tǒng)中),其中本文中所描述的兩級可以是多級系統(tǒng)的部分?,F(xiàn)在轉(zhuǎn)到圖4,其例示了便于解壓和執(zhí)行與源代碼的經(jīng)壓縮的基于AST的表示有關(guān)的指令。系統(tǒng)400包括希望接收源代碼的經(jīng)壓縮的基于AST的表示并執(zhí)行由源代碼的經(jīng)壓縮的基于AST的表示代表的至少一個指令的數(shù)據(jù)接收方402。數(shù)據(jù)接收方402可以是可借助網(wǎng)絡(luò)連接接收數(shù)據(jù)的任何合適的計算設(shè)備。因而,數(shù)據(jù)接收方402可以是個人計算機(jī)、膝上型計算機(jī)、移動電話、激活某一其他移動計算設(shè)備。依據(jù)一示例,數(shù)據(jù)接收方402可具有在其上執(zhí)行的瀏覽器,其中該瀏覽器被配置成執(zhí)行以諸如JavaScript 之類的腳本語言編寫的代碼。數(shù)據(jù)接收方402包括被配置成接收由數(shù)據(jù)源102傳送的數(shù)據(jù)分組118的接收器組件404,其中該數(shù)據(jù)分組118包括以腳本語言編寫的源代碼的經(jīng)壓縮的基于AST的表示120。解壓器組件406可與接收器組件404處于通信中,且可接收數(shù)據(jù)分組118。解壓器組件406包括一級解壓器組件408,該一級解壓器組件408解壓由二級壓縮器組件116 (圖I)進(jìn)行的壓縮。因而,在一示例中,一級解壓器組件408可被配置成解壓通過gzip壓縮的文件。解壓器組件406還可包括二級解壓器組件410,該二級解壓器組件410被配置成進(jìn)一步解壓源代碼的基于AST的表示,以生成表示源代碼的AST。二級解壓器組件410可與一級壓縮器組件108 (圖I)相對應(yīng)。因而,二級解壓器組件410可生成產(chǎn)品流的基于樹的表示,并且可將標(biāo)識符和文字指派給樹的節(jié)點。解壓器組件406可在隨后導(dǎo)致將結(jié)果所得的經(jīng)解壓的AST放置在駐留于數(shù)據(jù)接收方402上的計算機(jī)可讀介質(zhì)412中。例如,計算機(jī)可讀介質(zhì)412可以是諸如RAM、閃存之類的存儲器。處理器414可訪問計算機(jī)可讀介質(zhì)412,并且可執(zhí)行以AST表示的被存儲在計算機(jī)可讀介質(zhì)412這還用的至少一個指令。在經(jīng)解壓的AST被存儲在計算機(jī)可讀介質(zhì)412中之前,可就AST執(zhí)行一個或多個分析。例如,AST可被分析以確保與AST相對應(yīng)的源代碼被很好地產(chǎn)品,并且AST尚未遭到篡改。另外,可以注意到,AST已被解析,以使得數(shù)據(jù)接收方402無需在數(shù)據(jù)接收方402上消耗處理資源來解析源代碼,這會導(dǎo)致代碼的執(zhí)行更快地進(jìn)行?,F(xiàn)在參考圖5-8,示出并描述了各示例方法。盡管各方法被描述為順序地執(zhí)行的一 系列動作,但可以理解,這些方法不受該順序的次序的限制。例如,一些動作能以與本文描述的不同的次序發(fā)生。另外,動作可以與另一動作同時發(fā)生。此外,在一些情況下,實現(xiàn)本文描述的方法并不需要所有動作。此外,本文描述的動作可以是可由一個或多個處理器實現(xiàn)的和/或存儲在一個或多個計算機(jī)可讀介質(zhì)上的計算機(jī)可執(zhí)行指令。計算機(jī)可執(zhí)行指令可包括例程、子例程、程序、執(zhí)行的線程等。另外,這些方法的動作的結(jié)果可以存儲在計算機(jī)可讀介質(zhì)中,顯示在顯不設(shè)備上,等等。參看圖5,其例示了便于生成源代碼的基于AST的表示以及壓縮此類源代碼的基于AST的表示的方法500。方法500始于502,而在504,接收以腳本語言編寫的源代碼。例如,腳本語言可對應(yīng)于某一特定標(biāo)準(zhǔn),諸如ECMAscript。在特定示例中,源代碼可以是JavaScript ο在506,解析源代碼以生成源代碼的基于AST的表示。例如,可解析源代碼以生成多個不同的數(shù)據(jù)流。如以上所指示的,多個流可以是產(chǎn)品、標(biāo)識符流、和文字流的樹表示。在508,壓縮源代碼的基于AST的表示,以生成源代碼的經(jīng)壓縮的基于AST的表示。例如,多級壓縮系統(tǒng)可被用來壓縮源代碼的基于AST的表示。在510,通過網(wǎng)絡(luò)連接將源代碼的經(jīng)壓縮的基于AST的表示傳送到客戶機(jī)計算設(shè)備。例如,經(jīng)壓縮的基于AST的表示可以在客戶機(jī)計算設(shè)備訪問網(wǎng)頁或與此類網(wǎng)頁執(zhí)行某一交互之際傳送。方法500在512完成?,F(xiàn)在參看圖6,其例示了便于利用多級壓縮系統(tǒng)來生成源代碼的經(jīng)壓縮的基于AST的表示的示例方法600。方法600始于602,而在604,接收腳本語言形式的源代碼。在606,解析源代碼以生成源代碼的基于AST的表示。例如,解析源代碼,以生成多個不同的數(shù)據(jù)流,其中這些數(shù)據(jù)流中的至少一個包括與源代碼相對應(yīng)的產(chǎn)品的基于樹的表示。在608,通過利用第一級壓縮器,個別地壓縮多個數(shù)據(jù)流中的每一個。以上已參照圖I描述了此類對數(shù)據(jù)流的個別壓縮。在610,利用第二級壓縮器來進(jìn)一步壓縮多個數(shù)據(jù)流的子集,以生成源代碼的經(jīng)壓縮的基于AST的表示。例如,第二級壓縮器可以是生成可通過網(wǎng)絡(luò)傳送的文件的gzip壓縮器。在612,通過網(wǎng)絡(luò)連接將由第二級壓縮器輸出的經(jīng)壓縮的基于AST的表示傳送到客戶機(jī)。例如,客戶機(jī)可能正執(zhí)行其上的瀏覽器,并且可能希望接收源代碼的經(jīng)壓縮的基于AST的表不,以在瀏覽器中執(zhí)行至少一個指令。方法600在614完成?,F(xiàn)在參看圖7,其例示了用于通過利用源代碼的經(jīng)壓縮的基于AST的表示執(zhí)行至少一個指令的示例方法700。例如,可將方法700配置成在諸如個人計算機(jī)、移動電話之類的客戶機(jī)計算設(shè)備上執(zhí)行。方法始于702,并且在704,通過網(wǎng)絡(luò)連接從外部源接收數(shù)據(jù)分組,其中該數(shù)據(jù)分組包括以腳本語言編寫的源 代碼的經(jīng)壓縮的基于AST的表示。在706,解壓源代碼的經(jīng)壓縮的基于AST的表示,以生成表示這樣的源代碼的經(jīng)解壓的AST。在源代碼的經(jīng)壓縮的基于AST的表示被解壓之后,在708,導(dǎo)致客戶機(jī)計算設(shè)備上的至少一個處理器執(zhí)行經(jīng)解壓的AST中表示的至少一個指令。方法700在710完成?,F(xiàn)在參看圖8,其例示了便于解壓源代碼的基于AST的表示以及使用結(jié)果所得的經(jīng)解壓的AST執(zhí)行指令的示例方法800。例如,方法800可被配置成在客戶機(jī)計算設(shè)備上執(zhí)行。方法800始于802,并且在804,接收數(shù)據(jù)分組,其中該數(shù)據(jù)分組包括源代碼的經(jīng)壓縮的基于AST的表示。源代碼的經(jīng)壓縮的基于AST的表示可包括多個壓縮流,其中這多個壓縮流可包括壓縮產(chǎn)品流、經(jīng)壓縮標(biāo)識符流、以及經(jīng)壓縮文字流。另外,這些流的至少一子集可由諸如gzip之類的壓縮算法來進(jìn)一步壓縮。在806,例如,通過利用第一解壓算法和第二解壓算法(多級解壓技術(shù))來解壓基于AST的表示。具體地,第一解壓算法可被用來解壓由壓縮模型進(jìn)行的壓縮,而第二解壓算法可被配置成解壓源代碼的基于AST的表示,以生成表示前述源代碼的經(jīng)解壓的AST。在808,經(jīng)解壓的AST被直接解釋或編譯以生成機(jī)器可執(zhí)行指令,并且使得這些機(jī)器可執(zhí)行指令被存儲在計算設(shè)備的存儲器中。在810,機(jī)器可執(zhí)行指令中的至少一個通過利用至少一個處理器來執(zhí)行。方法800在812完成。現(xiàn)在參考圖9,示出了可以根據(jù)本文公開的系統(tǒng)和方法使用的示例計算設(shè)備900的高級圖示。例如,計算設(shè)備900可被用在這樣的系統(tǒng)中該系統(tǒng)支持將源代碼壓縮成此類代碼的基于AST的表示,以及通過網(wǎng)絡(luò)連接將源代碼的經(jīng)壓縮的基于AST的表示傳送到客戶機(jī)。在另一示例中,計算設(shè)備900的至少一部分可被用在這樣的系統(tǒng)中該系統(tǒng)支持接收源代碼的經(jīng)壓縮的基于AST的表示,以及解壓源代碼的此類基于AST的表示,以生成經(jīng)解壓的AST;并且還可被用在這樣的系統(tǒng)中該系統(tǒng)支持執(zhí)行基于此類AST的指令。計算設(shè)備900包括執(zhí)行存儲在存儲器902中的指令的至少一個處理器904。這些指令可以是例如用于實現(xiàn)被描述為由上述一個或多個組件執(zhí)行的功能的指令或用于實現(xiàn)上述方法中的一個或多個的指令。處理器902可以通過系統(tǒng)總線904訪問存儲器906。除了存儲可執(zhí)行指令之外,存儲器904還可存儲源代碼、源代碼的經(jīng)壓縮的基于AST的表示、AST等。計算設(shè)備900還包括可由處理器908通過系統(tǒng)總線902訪問的數(shù)據(jù)存儲906。數(shù)據(jù)存儲908可包括可執(zhí)行指令、源代碼、AST、源代碼的經(jīng)壓縮的基于AST的表示等。計算設(shè)備900還包括允許外部設(shè)備與計算設(shè)備900進(jìn)行通信的輸入接口 910。例如,輸入接口 910可被用于從外部計算機(jī)設(shè)備、來自用戶等處接收指令。計算設(shè)備900也可包括使計算設(shè)備900和一個或多個外部設(shè)備相接口的輸出接口 912。例如,計算設(shè)備900可以通過輸出接口912顯不文本、圖像等。另外,盡管被示為單個系統(tǒng),但可以理解,計算設(shè)備900可以是分布式系統(tǒng)。因此,例如,若干設(shè)備可以通過網(wǎng)絡(luò)連接進(jìn)行通信并且可共同執(zhí)行被描述為由計算設(shè)備900執(zhí)行的任務(wù)。如此處所使用的,術(shù)語“組件”和“系統(tǒng)”旨在涵蓋硬件、軟件、或硬件和軟件的組合。因此,例如,系統(tǒng)或組件可以是進(jìn)程、在處理器上執(zhí)行的進(jìn)程、或處理器。另外,組件或系統(tǒng)可以位于單個設(shè)備上或分布在若干設(shè)備之間。此外,如本文中所使用的,“計算機(jī)可讀介質(zhì)”旨在指代非瞬時介質(zhì),諸如存儲器,包括RAM、ROM、EEPR0M、閃存、硬盤驅(qū)動器、諸如DVD、CD或其他合適的盤之類的盤,等等。
注意,出于解釋目的提供了若干示例。這些示例不應(yīng)被解釋為限制所附權(quán)利要求書。另外,可以認(rèn)識到,本文提供的示例可被改變而仍然落入權(quán)利要求的范圍內(nèi)。
權(quán)利要求
1.ー種方法,包括以下計算機(jī)可執(zhí)行的動作 在計算設(shè)備處,通過網(wǎng)絡(luò)連接從外部源接收數(shù)據(jù)分組,其中所述數(shù)據(jù)分組包括以腳本語言編寫的源代碼的經(jīng)壓縮的基于抽象句法樹(AST)的表示; 解壓所述源代碼的經(jīng)壓縮的基于AST的表示,以生成經(jīng)解壓的AST ; 在所述源代碼的所述經(jīng)壓縮的基于AST的表示被解壓之后,導(dǎo)致至少ー個處理器執(zhí)行所述經(jīng)解壓的AST中表示的至少ー個指令。
2.如權(quán)利要求I所述的方法,其特征在于,所述計算設(shè)備是移動電話。
3.如權(quán)利要求I所述的方法,其特征在于,所述腳本語言是hvaScripま'
4.如權(quán)利要求I所述的方法,其特征在于,所述AST的至少一部分由在所述計算設(shè)備上執(zhí)行的web瀏覽器來執(zhí)行。
5.如權(quán)利要求I所述的方法,其特征在于,解壓所述源代碼的經(jīng)壓縮的解壓AST的表示包括 對所述源代碼的所述經(jīng)壓縮的基于AST的表示執(zhí)行第一解壓算法,以生成所述源代碼的經(jīng)部分解壓的基于AST的表示;以及 對所述源代碼的所述經(jīng)部分解壓的基于AST的表示執(zhí)行第二解壓算法,以生成所述經(jīng)解壓的AST。
6.如權(quán)利要求5所述的方法,其特征在于,所述經(jīng)部分壓縮的AST包括經(jīng)壓縮文字流、經(jīng)壓縮標(biāo)識符流、以及產(chǎn)品的經(jīng)壓縮的基于樹的表示,并且其中執(zhí)行所述第二解壓算法包括利用多個不同解壓技術(shù)來個別地解壓經(jīng)壓縮文字流、經(jīng)壓縮標(biāo)識符流、以及產(chǎn)品的經(jīng)壓縮的基于樹的表不中的姆ー個。
7.如權(quán)利要求6所述的方法,其特征在干,所述第二解壓算法被配置成解壓所述經(jīng)壓縮標(biāo)識符流,其中所述經(jīng)壓縮標(biāo)識符流包括包含全局符號以及與之相對應(yīng)的索引的列表的至少ー個全局表,并且其中所述經(jīng)壓縮標(biāo)識符流還包括包含局部符號以及與之相對應(yīng)的索引的列表的至少ー個局部表。
8.如權(quán)利要求6所述的方法,其特征在干,所述第二解壓算法被配置成解壓所述經(jīng)壓縮標(biāo)識符流,其中所述經(jīng)壓縮標(biāo)識符流包括包含符號以及與之相對應(yīng)的索引值的列表的至少ー個表,其中所述符號列表是按在所述源代碼的部分中的出現(xiàn)頻度來排序的。
9.如權(quán)利要求6所述的方法,其特征在干,所述第二解壓算法被配置成解壓所述經(jīng)壓縮標(biāo)識符流,其中所述經(jīng)壓縮標(biāo)識符流包括被編碼成具有可變長度的多個符號。
10.如權(quán)利要求6所述的方法,其特征在于,所述第二解壓縮算法被配置成通過利用部分匹配預(yù)測(PPM)來解壓產(chǎn)品的經(jīng)壓縮的基于樹的表示。
11.如權(quán)利要求6所述的方法,其特征在干,所述經(jīng)壓縮文字流包括按類型區(qū)分的文字。
12.—種系統(tǒng),包括以下計算機(jī)可執(zhí)行組件 接收機(jī)組件,接收以腳本語言編寫的源代碼的經(jīng)壓縮的基于抽象句法樹(AST)的表示;以及 解壓器組件,解壓源代碼的基于AST的表示以生成AST,并且其中所述解壓器組件導(dǎo)致所述AST被保留在計算機(jī)可讀介質(zhì)中以供處理器來執(zhí)行。
13.如權(quán)利要求12所述的系統(tǒng),其特征在于,所述腳本語言是JavaScript 。
14.如權(quán)利要求12所述的系統(tǒng),其特征在于,所述源代碼的經(jīng)壓縮的基于AST的表示包括多個分開的流,其中所述多個分開的流中的每ー個由所述解壓器組件來解壓。
15.如權(quán)利要求14所述的系統(tǒng),其特征在于,所述多個分開的流包括包含與所述源代碼中的標(biāo)識符相對應(yīng)的數(shù)據(jù)的標(biāo)識符流、包含所述源代碼中的產(chǎn)品的基于樹的表示的產(chǎn)品流、以及包含所述源代碼中的文字的文字流。
全文摘要
本文中描述的方法包括在計算設(shè)備處,通過網(wǎng)絡(luò)連接從外部源接收數(shù)據(jù)分組,其中該數(shù)據(jù)分組包括以腳本語言編寫的源代碼的經(jīng)壓縮的基于抽象句法樹(AST)的表示。該方法還包括解壓源代碼的經(jīng)壓縮的基于AST的表示,以生成經(jīng)解壓的AST。該方法還包括在源代碼的經(jīng)壓縮的基于AST的表示被解壓之后,導(dǎo)致計算設(shè)備上的至少一個處理器執(zhí)行經(jīng)解壓的AST中表示的至少一個指令。
文檔編號G06F17/20GK102782647SQ201180011872
公開日2012年11月14日 申請日期2011年2月25日 優(yōu)先權(quán)日2010年3月2日
發(fā)明者B·G·佐恩, B·利夫希茨, G·辛哈, M·伯特謝爾 申請人:微軟公司