欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

編譯用于交互式電視的解釋性語言的方法和裝置的制作方法

文檔序號:6355715閱讀:209來源:國知局

專利名稱::編譯用于交互式電視的解釋性語言的方法和裝置的制作方法
技術(shù)領(lǐng)域
:本發(fā)明涉及交互式電視內(nèi)容顯示的領(lǐng)域,特別是涉及從例如HTML頁的文本標(biāo)記語言提取(extraction)例如JavaScript的解釋性語言,以及在服務(wù)器上編譯JavaScript,用于下載到客戶機(jī)設(shè)備去執(zhí)行由廣播、因特網(wǎng)或者交互式電視顯示空間中的高速緩存提供的內(nèi)容顯示。
背景技術(shù)
:交互式電視系統(tǒng)可被用來向觀眾(viewer)提供各種各樣的服務(wù)。交互式電視系統(tǒng)能夠傳送典型的視頻節(jié)目流、交互式電視應(yīng)用、文本和圖像、web頁和其它類型的信息。交互式電視系統(tǒng)也能夠記錄觀眾的操作或響應(yīng)并且能被用于諸如市場營銷、娛樂和教育等目的。用戶或觀眾可以通過訂購廣告產(chǎn)品或服務(wù)、在游戲節(jié)目中與對手競爭、請求關(guān)于特定節(jié)目的專門信息或者漫游信息頁而與系統(tǒng)交互。一般來說,廣播服務(wù)提供者或者網(wǎng)絡(luò)運(yùn)營商生成一個向觀眾的電視發(fā)送的交互式電視信號。交互式電視信號可包括一個由應(yīng)用程序碼或控制信息組成的交互部分,以及一個由電視節(jié)目或其它信息顯示組成的音頻/視頻部分。廣播服務(wù)提供者將音頻/視頻部分和交互部分組合成單一的信號,用于向連接到用戶電視的接收器發(fā)送。該信號在發(fā)送前一般被壓縮,并通過諸如有線電視(CATV)線路或直接衛(wèi)星傳送系統(tǒng)的典型廣播頻道被發(fā)送。一般來說,連接到電視機(jī)的機(jī)頂盒控制電視的交互功能。機(jī)頂盒接收由廣播服務(wù)提供者發(fā)送的廣播信號,把交互部分與音頻-視頻部分分離并解壓信號的各部分。例如,機(jī)頂盒用交互信息來在音頻-視頻信息向電視機(jī)發(fā)送期間執(zhí)行應(yīng)用程序。機(jī)頂盒可以先將音頻/視頻信息與由交互應(yīng)用程序生成的交互圖像或聲音組合,然后向電視機(jī)發(fā)送信息。交互圖像和聲音可以把額外信息展示給觀眾,或者可提示用戶輸入。機(jī)頂盒可以通過調(diào)制解調(diào)器連接或者電纜將觀眾的輸入或其它信息提供給廣播服務(wù)提供者。按照它們的聚集(aggregate)特性,交互電視系統(tǒng)提供最好能以被客戶機(jī)或觀眾理解的各種不同通信協(xié)議提供內(nèi)容,這些客戶機(jī)和觀眾從廣播服務(wù)提供者/網(wǎng)絡(luò)運(yùn)營商接收信息??蛻魴C(jī)一般是一個帶有具有有限處理能力和通信帶寬的處理器的機(jī)頂盒。各種協(xié)議的翻譯超出了一般機(jī)頂盒處理器具有的有限處理能力。此外,存在利用多個web作者工具(authoringtools)產(chǎn)生內(nèi)容的多個源。這些源傾向于用超文本標(biāo)記語言(HTML)作為處理HTML頁面中嵌入的JavaScript的標(biāo)準(zhǔn)。JavaScript一般是被解釋的??蛻魴C(jī)設(shè)備一般具有有限的處理能力和通信帶寬,不能快速有效地解釋和執(zhí)行解釋性語言。因此,需要一種具有魯棒性(robust)的客戶機(jī)和服務(wù)器體系結(jié)構(gòu),它不需要對HTML碼中嵌入的JavaScript進(jìn)行解釋,就能使HTML編碼的內(nèi)容被客戶機(jī)或機(jī)頂盒處理器顯示,從而不需要大量的處理能力和通信帶寬。
發(fā)明內(nèi)容本發(fā)明針對以上討論的交互式電視環(huán)境的需要。本發(fā)明提供一種包含軟件和硬件的方法和裝置,用于從諸如HTML的輸入語言中接收和提取諸如JavaScript的解釋性語言,并編譯該解釋性語言供在客戶機(jī)設(shè)備上顯示。多個頁共用的一個編譯的JavaScript頁只被發(fā)送一次,并被編譯的頁作為一個外部頁引用,因此減少了要傳送的數(shù)據(jù)量以及相關(guān)的帶寬。觀眾或客戶機(jī)可以是機(jī)頂盒處的觀眾、移動電話用戶、數(shù)字助理、袖珍PC或任何其它電子接收設(shè)備。本發(fā)明與已知系統(tǒng)相比有突出的優(yōu)點(diǎn)。本發(fā)明提供用于從HTML頁提取腳本(scripts)并在服務(wù)器上編譯腳本,用于在客戶機(jī)設(shè)備上執(zhí)行,這是對已知系統(tǒng)的改進(jìn),在已知系統(tǒng)中,瀏覽器在同一個機(jī)器上解釋并執(zhí)行腳本。本發(fā)明也從HTML文檔中收集每個語言一例如JavaScript或任何其他腳本語言--的腳本,以便將這些腳本合成一個包,用于將該包傳送給編譯器,使得一些腳本或所有腳本在一起編譯。腳本是以多種方式嵌入在HTML文檔中的。例如,在一對<SCRIPT>和</SCRIPT>標(biāo)簽之間,或者作為事件處理程序(handler)的屬性(attribute)值。本發(fā)明分析HTML文檔,將(例如JavaScript的特定語言的)腳本聚集成一個包(package),然后調(diào)用編譯器。可以將有些腳本(例如包含腳本)段單獨(dú)編譯成不同的模塊。所有模塊都被發(fā)送到客戶機(jī)設(shè)備去執(zhí)行。這允許例如編譯的腳本(compiledscripts)在不同的HTML頁上被共享。這意味著編譯器有一個可能與用于編譯主文檔腳本的接口不同的、用于編譯包含腳本(includedscripts)的接口。創(chuàng)建單一編譯的模塊(compiledmodule)因此更容易和更簡單??蛻魴C(jī)設(shè)備知道如何像對單一腳本那樣鏈接和執(zhí)行編譯的腳本段??梢詫⒕幾g腳本高速緩存起來,使得如果腳本已經(jīng)在高速緩存中就不進(jìn)行編譯。本發(fā)明也在腳本中提供編譯時間標(biāo)記器(marker),以便只在常用的HTML瀏覽器上執(zhí)行代碼(即永遠(yuǎn)不在客戶機(jī)設(shè)備上執(zhí)行)。現(xiàn)有系統(tǒng)使腳本能在瀏覽器(InternetExplorer、Netscape等)正在運(yùn)行時的執(zhí)行時間檢測。在本發(fā)明中,優(yōu)選的編譯器識別一個關(guān)鍵詞,例如”JS2O”。在”if(JS2O)DO_A;elseDO_B”的這樣一段代碼中,編譯器將不編譯”DO_B”,因?yàn)樗馈眎f(JS2O)”總是真的。因此,整段代碼將被編譯成”DO_A;”。腳本編譯器不編譯永遠(yuǎn)不在客戶機(jī)設(shè)備上執(zhí)行的代碼,因此減少了編譯代碼大小,改善代碼執(zhí)行時間。編譯器用編譯時間綁定(bindings)代替一些遲綁定引用(latebindingreferences),以便在客戶機(jī)設(shè)備上更快速執(zhí)行?,F(xiàn)有技術(shù)系統(tǒng)在執(zhí)行時間解析引用。例如,在JavaScript中,當(dāng)訪問標(biāo)識符”foo”時,腳本引擎將在范圍鏈(scopechain)中查找名字”foo”。這當(dāng)然花費(fèi)時間。這里,編譯器(在有些情況下)把標(biāo)識符”foo”連接到一個特定地址,以便在運(yùn)行時快速訪問。例如,在JS2O中,(有些)屬性(properties)與C語言中的常規(guī)全局變量一樣被分配到內(nèi)存空間中,而(有些)屬性則與C語言中的常規(guī)局部變量一樣被分配到堆棧中的槽(slot)中。編譯器用絕對值替換一些遲綁定引用,以便在客戶機(jī)設(shè)備上快速執(zhí)行。在這個實(shí)施例中,編譯器不是把標(biāo)識符連接到一個地址,而是把標(biāo)識符直接用一個值替換。例如,在JavaScript中,標(biāo)識符”NaN”是某對象的一個屬性。這里,直接用其值替換到”NaN”的引用。優(yōu)選的編譯器支持一個定義新的對象類的接口。這使編譯器能訪問和/或優(yōu)化那些對象的創(chuàng)建和操作,并允許運(yùn)行時(runtime)與該類的代碼連接。該類代碼可以以一個OpenTV模塊實(shí)現(xiàn)。在優(yōu)選實(shí)施例中,H2O定義一個說明新的對象類的HTML語法。編譯器支持一個定義預(yù)定義的/外部的對象實(shí)例的接口,這使編譯器能訪問和/或優(yōu)化那些對象的操作,并允許運(yùn)行時訪問那些對象。那些對象是在腳本執(zhí)行的外部創(chuàng)建的。在優(yōu)選實(shí)施例中,H2O定義一個說明預(yù)定義的/外部的對象實(shí)例的HTML語法。通過閱讀以下的詳細(xì)說明并參看各附圖,本發(fā)明的其它目的和優(yōu)點(diǎn)將顯而易見。圖1是向客戶機(jī)設(shè)備提供內(nèi)容的前端(head-end)的示意圖;圖2是向客戶機(jī)設(shè)備提供內(nèi)容的前端的示意圖;圖3是向客戶機(jī)設(shè)備提供內(nèi)容的前端的示意圖;圖4是向客戶機(jī)設(shè)備提供內(nèi)容的前端的示意圖;圖5是H2OHTML代碼轉(zhuǎn)換器體系結(jié)構(gòu)圖;圖6是H2O瀏覽器處理和數(shù)據(jù)流圖;圖7表示H2O和JS2O之間的接口;圖8表示JS2O編譯器的組件;圖9表示作為JS2O命令行編譯器的編譯器;圖10表示客戶機(jī)上的編譯的JS主代碼模塊的執(zhí)行;圖11表示一個優(yōu)選數(shù)據(jù)段(segment);圖12表示一個優(yōu)選堆棧段。盡管本發(fā)明可以有各種修改和可替換形式,在附圖中舉例表示它們的特定實(shí)施例,這些實(shí)施例將在本文中作詳細(xì)說明。然而應(yīng)當(dāng)明白,附圖和對附圖的詳細(xì)說明并非是要把本發(fā)明限制到所公開的特定形式,相反,本發(fā)明旨在包括落在如后附權(quán)利要求書所定義的本發(fā)明的精神和范圍內(nèi)的所有修改和可替換形式。具體實(shí)施例方式現(xiàn)在轉(zhuǎn)到圖1,服務(wù)平臺50包含一組應(yīng)用,它們被粗略劃分成三個類別內(nèi)容轉(zhuǎn)換204、事務(wù)處理控制/商務(wù)功能206和傳輸轉(zhuǎn)換207。服務(wù)平臺使服務(wù)(services)200與客戶機(jī)212交互。服務(wù)200通過通信鏈路202與服務(wù)平臺50進(jìn)行通信。服務(wù)平臺50又與客戶機(jī)212通信??蛻魴C(jī)212可以是機(jī)頂盒(STB)、數(shù)字助理、移動電話或任何能通過通信鏈路230與服務(wù)平臺通信的其它通信設(shè)備。內(nèi)容轉(zhuǎn)換204和傳輸轉(zhuǎn)換207服務(wù)提供傳輸和通信功能,商務(wù)功能服務(wù)則提供商務(wù)控制功能。如圖2中所示,事務(wù)處理控制/商務(wù)功能206分布在服務(wù)平臺和客戶機(jī)212之間。例如,某客戶機(jī)能執(zhí)行一些商務(wù)功能(例如執(zhí)行廣告運(yùn)作規(guī)則和廣告/商務(wù)過濾器來選擇被觀看的廣告)和選擇內(nèi)容,它們更適合客戶機(jī)212(例如選擇一個符合用戶特征的廣告或節(jié)目)。圖2的功能在圖3中被擴(kuò)展。如圖3中所示,商務(wù)功能206包含4個主要功能組件服務(wù)管理器238、觀眾管理器240、事務(wù)處理管理器242和廣告(Ad)管理器244。接著是一個優(yōu)選實(shí)施例的一例高級操作流程?,F(xiàn)在參看圖3,服務(wù)200與網(wǎng)絡(luò)運(yùn)營商談判,以通過前端運(yùn)營商的服務(wù)平臺向訂戶提供服務(wù)。網(wǎng)絡(luò)或前端運(yùn)營商用服務(wù)管理器238來登記服務(wù)和與服務(wù)相關(guān)聯(lián)的協(xié)商過的商務(wù)規(guī)則222(例如時間安排、帶寬要求、有權(quán)訪問觀眾信息的服務(wù))。服務(wù)管理器238存儲服務(wù)數(shù)據(jù)216(例如URL地址、內(nèi)容)。根據(jù)商務(wù)規(guī)則222和服務(wù)數(shù)據(jù)216,服務(wù)管理器238與廣播通信234功能通信,以從內(nèi)容提供商提取內(nèi)容。當(dāng)內(nèi)容被從服務(wù)200提取時,它可以被內(nèi)容轉(zhuǎn)換204和內(nèi)容過濾器224處理,以將內(nèi)容轉(zhuǎn)換成適合客戶機(jī)設(shè)備212的形式。廣播234功能將內(nèi)容轉(zhuǎn)換成適合廣播234網(wǎng)絡(luò)的形式。客戶機(jī)212在廣播鏈路211上接收轉(zhuǎn)換后的內(nèi)容??蛻魴C(jī)212和服務(wù)200通過點(diǎn)對點(diǎn)鏈路210和點(diǎn)對點(diǎn)功能組件232進(jìn)行交互,其作為傳輸轉(zhuǎn)換207的一部分。服務(wù)200可包含購物、音頻/視頻、游戲、投票、廣告、消息發(fā)送或任何其它服務(wù)。客戶機(jī)212通過點(diǎn)對點(diǎn)232通信鏈路與服務(wù)平臺50和服務(wù)200通信。負(fù)載平衡器236與商務(wù)功能206交互,以確定廣播234通信鏈路211和點(diǎn)對點(diǎn)232通信鏈路210之間的最優(yōu)負(fù)載分布。平臺商務(wù)代理226用商務(wù)規(guī)則222來控制服務(wù)200與客戶機(jī)212之間的交互和信息交換。例如,網(wǎng)絡(luò)運(yùn)營商可以選擇阻止服務(wù)200對用戶信息的訪問。服務(wù)200最好要根據(jù)商務(wù)規(guī)則222和服務(wù)數(shù)據(jù)216付費(fèi)來訪問用戶信息。觀眾管理器240在用戶數(shù)據(jù)220中存儲客戶機(jī)/用戶信息。平臺商務(wù)代理226控制去往服務(wù)200的觀眾信息流。事務(wù)處理管理器242記錄在服務(wù)200和客戶機(jī)212之間交換的事務(wù)處理信息。根據(jù)商務(wù)規(guī)則222和用戶數(shù)據(jù)220,廣告管理器244確定將哪個廣告和哪類廣告通過廣播鏈路211和點(diǎn)對點(diǎn)鏈路210呈現(xiàn)給客戶機(jī)。圖4表示服務(wù)平臺50的優(yōu)選實(shí)施例的另一個例子。服務(wù)200通過因特網(wǎng)或者通過網(wǎng)絡(luò)運(yùn)營商可接入的另一個網(wǎng)絡(luò)或通信通道提供購物、聊天和其它服務(wù)。使用該服務(wù)平臺,網(wǎng)絡(luò)運(yùn)營商訪問這些服務(wù)。包含服務(wù)管理器238的商務(wù)功能206與輪流傳送(Carousel)管理器254交互,以從服務(wù)200提取內(nèi)容。輪流傳送包含一個從服務(wù)平臺50到客戶機(jī)的重復(fù)的音頻/視頻/互動數(shù)據(jù)流。輪流傳送管理器254、事物處理管理器242和服務(wù)管理器238控制對廣播輪流傳送的內(nèi)容插入和刪除。服務(wù)內(nèi)容被提取后,被H2O248轉(zhuǎn)換成一個適合客戶機(jī)的格式。H2O248是內(nèi)容轉(zhuǎn)換204和內(nèi)容過濾器224的一種可能的實(shí)現(xiàn)。H2O將HTML內(nèi)容轉(zhuǎn)換成服務(wù)平臺/客戶機(jī)可讀的內(nèi)容。轉(zhuǎn)換的內(nèi)容被格式化成數(shù)據(jù)輪流傳送并被開放式流(openstreamer)256多路轉(zhuǎn)換,用于向客戶機(jī)212廣播。客戶機(jī)212與服務(wù)交互,必要的話與服務(wù)平臺和服務(wù)200通信。點(diǎn)對點(diǎn)通信要經(jīng)過服務(wù)網(wǎng)關(guān)246。服務(wù)網(wǎng)關(guān)246進(jìn)行傳輸轉(zhuǎn)換,以把STB協(xié)議轉(zhuǎn)換成平臺商務(wù)代理226和H2O248期待和理解的形式。負(fù)載平衡器236與商務(wù)功能206、輪流傳送管理期254和服務(wù)網(wǎng)關(guān)246交互,以確定廣播鏈路241與點(diǎn)對點(diǎn)通信鏈路210之間的最優(yōu)負(fù)載。商務(wù)功能206與平臺商務(wù)代理226交互,以控制服務(wù)200與客戶機(jī)212之間的訪問和信息交換。在本發(fā)明的優(yōu)選實(shí)施例中,H2O是一個客戶機(jī)/服務(wù)器解決方案,它使因特網(wǎng)內(nèi)容開發(fā)者能為運(yùn)行服務(wù)平臺的網(wǎng)絡(luò)運(yùn)行商建立交互式電視應(yīng)用和服務(wù)。服務(wù)平臺使觀眾能訪問向大規(guī)模增長的交互式電視應(yīng)用的世界市場開放的更大的因特網(wǎng)才能(talent)和內(nèi)容庫。H2O服務(wù)器處理將因特網(wǎng)內(nèi)容(HTML頁、ECMA腳本和HTML頁格式)轉(zhuǎn)換成服務(wù)平臺資產(chǎn)。H2O客戶機(jī)處理提供這些資產(chǎn)并與客戶機(jī)212交互。在T-商務(wù)/E-商務(wù)案例情形中,H2O使E-商務(wù)商店能用現(xiàn)有的Web工具來建立購物服務(wù)和用標(biāo)準(zhǔn)Web協(xié)議與優(yōu)選的服務(wù)平臺(運(yùn)營商)接合。H2O充當(dāng)作為服務(wù)網(wǎng)關(guān)和廣播工具以轉(zhuǎn)換Web內(nèi)容的代理(proxy)。H2O從廣播源和在線資源(onlinesources)接收HTML。本發(fā)明使網(wǎng)站能用它們當(dāng)前的HTTP服務(wù)器和應(yīng)用服務(wù)器來生成交互式電視內(nèi)容。在優(yōu)選實(shí)施例中,H2O將HTML、JavaScript和因特網(wǎng)圖像轉(zhuǎn)換成客戶機(jī)可兼容的代碼,最好是Ocode,這是一種在機(jī)頂盒的虛擬機(jī)上運(yùn)行的基于C的OpenTV代碼??梢詫⑷魏纹渌阎蜷_發(fā)的協(xié)議添加到H2O的功能中。H2O使服務(wù)平臺能與不完全是瀏覽器的客戶機(jī)機(jī)頂盒通信,并創(chuàng)建初始用戶界面。H2O使服務(wù)平臺能連接到任何只使用HTML的商務(wù)引擎。H2O負(fù)責(zé)將諸如HTML頁、JPG圖像、波音頻文件(waveaudiofile)等Web內(nèi)容轉(zhuǎn)換成能在客戶機(jī)上以最小的處理能力和帶寬就能使用的對客戶機(jī)友好的資源。H2O的服務(wù)器側(cè)是一個HTTP代理H2OS。為了其它目的,可以將它打包為DLL或批量工具(batchtool)。H2O的客戶機(jī)側(cè)是一個STBOCOD應(yīng)用,即H2OC。H2OC建立在諸如服務(wù)網(wǎng)關(guān)庫或輪流傳送加載庫的其它服務(wù)平臺客戶機(jī)組件的頂上。H2O使URLs能被用來對文檔和服務(wù)尋址。H2O使得能夠在廣播和在線環(huán)境中進(jìn)行跟蹤。H2O提供HTTP代理功能。服務(wù)平臺應(yīng)用通過H2O請求文檔。H2O檢索文檔,分析文檔,編譯文檔,然后把文檔返回到請求者。這一H2O功能使得能把同一個引擎用于在線及廣播的不同用途,便于擴(kuò)展,并使得能夠靈活地使用H2O。分析與文檔的類型有關(guān),例如,H2O分析可以是HTML分析、GIF圖像、或者JPEG圖像等等。為了使其可擴(kuò)展,H2O提供“插入”和運(yùn)行新的第三方過濾器的功能。H2O支持特殊標(biāo)簽,這些標(biāo)簽包含A/V控制、信道控制、屏幕顯示(OSD)控制和觸發(fā)器(Triggers)。H2O支持W3C標(biāo)簽,包含圖像元素(x,y,z)的受控定位。JavaScript庫包含數(shù)學(xué)(Math)、域(DOM)和日期(Date)。H2O的客戶機(jī)側(cè)H2OC在客戶機(jī)或STB中構(gòu)造圖像資產(chǎn)。H2O使得能夠用戶觀看的頁在接收時被更新顯示。H2OC使用其它服務(wù)平臺組件提供的庫(通信、輪流傳送等等)。H2O使得能在單一更新中刷新一頁,但是也提供選擇,以在資產(chǎn)被加載時在部分更新之間選擇,而不是等待所有或一些資產(chǎn)加載。H2O使得能夠?qū)Φ谌筋愡M(jìn)行動態(tài)鏈接/解除鏈接。在廣播方式中,優(yōu)選地提供一個在開始一個新頁時不被清除的全局永久對象。永久對象保持頁之間的前后關(guān)系。在變換時也將服務(wù)平臺所提供的其它基礎(chǔ)(base)對象永久化(例如站控制OSD)。小配件(gadgets)是客戶機(jī)定義的方法。小配件是通過接口定義語言被定義的,以便使得能創(chuàng)建新的小配件、修改小配件,以及使得能在不修改本發(fā)明的JS2O編譯器4000的情況下添加方法。現(xiàn)在轉(zhuǎn)至圖5和6,接著討論主要的H2O組件。H2O代碼轉(zhuǎn)換器2001將HTML輸入2062轉(zhuǎn)換成H2O譯碼(transcodes),后者能被在例如OpenTV機(jī)頂盒的客戶機(jī)設(shè)備中的H2O瀏覽器有效地和交互地顯示。H2O瀏覽器以有限的動態(tài)HTML4方式閱覽H2O譯碼。諸如HTTP代理2003的宿主(host)調(diào)用H2O代碼轉(zhuǎn)換器2001。H2O代碼轉(zhuǎn)換器2001與MIME處理程序2036和MIMEinfo2028接合,用于非HTML的MIME類型的內(nèi)容信息。JS2O編譯器4000是多線程安全的。H2O代碼轉(zhuǎn)換器調(diào)用H2OJavaScript處理程序2000來把腳本作為輸入,提取外部腳本或類URL,并調(diào)用JS2O編譯器和預(yù)鏈接JavaScript。JS處理程序2000處理JS定制類2070和JS共享腳本2066?,F(xiàn)在轉(zhuǎn)至圖6,H2O瀏覽器2100與JS2OJavaScript運(yùn)行時2129接合以支持JavaScript。H2O代碼轉(zhuǎn)換器以任務(wù)的形式運(yùn)行,通過宿主HTTP代理提取MIME內(nèi)容,并按請求處理MIME內(nèi)容。最好提供一個接口與代理宿主,以處理高速緩存機(jī)構(gòu),提高效率。H2O代碼轉(zhuǎn)換器同步地執(zhí)行。H2O代碼轉(zhuǎn)換器支持HTML4.01W3標(biāo)準(zhǔn)的一個選擇的子集。H2O代碼轉(zhuǎn)換器支持一個文本子集段落、行、短語;列表子集;表子集和鏈接子集。H2O代碼轉(zhuǎn)換器支持一個對象和圖像元素子集。H2O代碼轉(zhuǎn)換器也支持過濾器制作側(cè)(authoring-side)對象(例如IE(InternetExplorer)定制對象)并支持STB的運(yùn)行時定制對象;制作側(cè)(PC)和STB定制對象類開發(fā);圖像映射的子集(客戶機(jī)側(cè)、服務(wù)器側(cè));表單和表單控件的子集;腳本元素;以及JavaScript子集。在H2O代碼轉(zhuǎn)換器中,HTML節(jié)點(diǎn)含有在元素節(jié)點(diǎn)中計(jì)算過一次的CSS信息。額外的CSS即使被保留也是非常有限的。這與CSS的動態(tài)級聯(lián)規(guī)則是根本不同的。由于樣式(style)改變最好只應(yīng)用到一個節(jié)點(diǎn),因此動態(tài)樣式是有限的。這意味著,要通過DOM查詢特定元素的樣式屬性并期待它返回一個有效值,就要明確地在內(nèi)聯(lián)樣式(inlinestyle)內(nèi)為該元素規(guī)定樣式屬性(例如style=color:red),或者明確地在JavaScript代碼中創(chuàng)建該樣式屬性,以便PC模擬可以類似的進(jìn)行。本發(fā)明調(diào)用一個H2OJavaScript處理程序任務(wù)來處理Script元素?cái)?shù)據(jù)。JavaScript處理程序任務(wù)提取腳本URI并調(diào)用JS2OJavaScript編譯器。JS2O返回一個含有編譯的JavaScript代碼模塊的數(shù)據(jù)包。JS2O可以將編譯的JavaScript腳本高速緩存起來并匹配重復(fù)的類似和相同的JavaScript腳本。本發(fā)明用客戶機(jī)兼容的資源從具有布局和有限樣式信息的分析器引擎內(nèi)部數(shù)據(jù)模型生成H2O譯碼,并生成JavaScript代碼。H2O譯碼格式的一般說明包含代表客戶機(jī)或STB的文檔和JavaScript代碼的客戶機(jī)兼容的資源的譯碼部分。譯碼格式含有關(guān)于樹形結(jié)構(gòu)的文檔的信息。該格式是高效的、緊湊的和可擴(kuò)展的。該格式提供一個版本號來保證在客戶機(jī)或STB中的一致性。例如,在優(yōu)選實(shí)施例中,提供一個客戶機(jī)可兼容的對象模型,即OTV對象模型(OOM),供開發(fā)者用于創(chuàng)建定制類。OOM提供一種機(jī)制,用于開發(fā)定制對象類、加載/登記/未登記/卸載類,并用于訪問類接口代碼,以操作定制對象。OOM的設(shè)計(jì)和實(shí)現(xiàn)用JavaScript對象模型來避免重復(fù)勞動。OOM提供一個接口,使JavaScript和C程序能操作對象。HTML、OOM和C程序沒有JavaScript也能工作。本發(fā)明提供具有選擇的命名方案的輕量級客戶機(jī)側(cè)注冊表(registry)。注冊表使得能將一個類模塊與一個名字和查找相關(guān)聯(lián)。OOM加載一個類模塊并注冊該模塊。一個類只有一個接口。接口只含有方法。每個方法與一個在這個接口范圍內(nèi)唯一的串名字相關(guān)聯(lián)。OOM提供一種從一個類創(chuàng)建一個對象實(shí)例的機(jī)制,并提供一個提供類引用機(jī)制。OOM處理類卸載。OOM定義H2OHTML和JavaScript引擎之間的控制流和數(shù)據(jù)流。OOM為JavaScript引擎實(shí)例化瀏覽器對象。OOM向JavaScript引擎暴露DOM對象的訪問。類的對象是其方法屬性是類接口的方法的對象。OOM為定制對象定義接口、準(zhǔn)則和一個SDKAPI子集,以便能集成到觀看結(jié)構(gòu)、觀看更新、事件處理、焦點(diǎn)中和對共享系統(tǒng)資源的訪問中。一個控制器指導(dǎo)瀏覽器行為和組件,并處理事件??刂破魈峁┛焖賳訒r間響應(yīng),這是由諸如在啟動時圖像顯示等各種技術(shù)實(shí)現(xiàn)的。本發(fā)明的優(yōu)選控制器使用事件、下載、mpeg、osd、A/V等系統(tǒng)資源,并控制數(shù)據(jù)模型和查看??刂破饕蔡幚碓嫉牟⑻幚砜蛻魴C(jī)(最好是OpenTV)事件2146??刂破魈幚碓紝ο笫录笳哂稚蒁OM事件2140、2134。本發(fā)明支持處理DOM事件冒泡(bubbling)2138并用焦點(diǎn)節(jié)點(diǎn)作為起始節(jié)點(diǎn)。DOM事件可被JavaScript事件處理程序2128代碼處理。優(yōu)選控制器預(yù)定義元素類并因此比定制類更有效??刂破魇褂肬RI檢索器(retriever),獲得URI內(nèi)容,使得HTTP得到和發(fā)送(表單發(fā)送)請求、獲得響應(yīng)并提供文檔打開和后退/前進(jìn)功能。在優(yōu)選實(shí)施例中,數(shù)據(jù)模型主要是運(yùn)行時HTMLDOM,以及其它類別的運(yùn)行時數(shù)據(jù)模型。HTMLDOM也含有反映它們預(yù)期效果的查看信息。查看最好支持不同的顏色樣式,并把顏色表當(dāng)作一個共享資源。在優(yōu)選實(shí)施例中,根據(jù)配置提供一個有限的MIME類型處理程序集合以節(jié)省內(nèi)存。用于PC環(huán)境的流行的HTML瀏覽器一般為JavaScript運(yùn)行時暴露瀏覽器特定的宿主對象以便操作。本發(fā)明支持用于JavaScript運(yùn)行時的微軟InternetExplorer5(IE5)宿主對象的一個子集。本發(fā)明調(diào)用H2OJavaScript類型處理程序(JS處理程序)。JS處理程序遍歷元素樹,以收集JavaScript全局代碼、函數(shù)(function)、對外部腳本的鏈接引用、對象類鏈接引用和宿主代碼(來自時間處理程序?qū)傩?。H2O調(diào)用H2OJavaScript處理程序并將這個收集傳送給它。JavaScript處理程序任務(wù)提取腳本和類MIME內(nèi)容,調(diào)用JS2OJavaScript編譯器,后者返回一個含有編譯的JavaScript代碼的客戶機(jī)兼容的代碼模塊。這個腳本集帶回句柄給代碼。該函數(shù)按軟件附錄中所示那樣被調(diào)用。代碼轉(zhuǎn)換器遍歷元素節(jié)點(diǎn)樹并用內(nèi)部客戶機(jī)兼容的資源生成器生成客戶機(jī)兼容的例如OTVH2O譯碼。本發(fā)明配置組件、顯示、啟動等等。靜態(tài)和動態(tài)配置是在編譯時靜態(tài)地確定的?,F(xiàn)在轉(zhuǎn)至圖7和8,JS2O編譯器3904將H2O3900引擎與3902接合,以將JS代碼編譯成客戶機(jī)兼容的代碼模塊3906,最好編譯成OpenTVocode模塊。JS編譯器4000用下面描述的C/C++API與H2O引擎接合。JS2O編譯器是可重入的,被劃分為以下組件JS2O頁元素編譯器4002、JS2O高速緩存4004、JS2O前端4006和JS2O后端4008Ocode二進(jìn)制匯編器4010和代碼模塊生成器4012。所有編譯器組件都是可重入的,并用內(nèi)存緩沖器互相傳送數(shù)據(jù)?,F(xiàn)在轉(zhuǎn)至圖8,也參看圖5,H2O過濾器2064從輸入HTML頁2062提取輸入JavaScript,并將它們發(fā)送到頁元素編譯器4002,用于在單一顯示頁內(nèi)聚集。H2O從廣播鏈路以及從在線連接二者中接收HTML頁。頁元素編譯器4002從H2O2030接收(來自某個HTML頁的)JS元素,在內(nèi)部為一個HTML頁將所有元素聚集成一個JS代碼塊,然后調(diào)用JS編譯器4000將該JS頁編譯成一個代碼模塊。一個JS頁是來自一個或多個HTML頁的所有JS代碼的聚集。H2O和JS2O頁元素編譯器之間的接口3902、3906在下面作描述。JS2O的可選高速緩存4004接收一個JS頁,將該頁與其它被高速緩存的編譯頁比較。如果被高速緩存,則使用被高速緩存的頁。如果還沒有被高速緩存,JS2O就調(diào)用JS編譯器4006。最好對最后100個編譯的頁進(jìn)行高速緩存。所有JS2O編譯器線程共享該高速緩存,因此,訪問高速緩存是受到保護(hù)的。JS編譯器前端4006首先將JS代碼編譯成一個中間格式,然后用專用于JS2O的代碼生成器將其編譯成客戶機(jī)兼容的代碼。JS編譯器后端4008接收整個JS頁作為預(yù)分析和預(yù)編譯的樹。JS編譯器后端利用來自二進(jìn)制匯編器4010的輸出直接生成二進(jìn)制格式的客戶機(jī)兼容的操作碼(opcode),例如Ocode操作碼。JS編譯器后端在代碼模塊生成器4012中生成客戶機(jī)兼容的代碼模塊??蛻魴C(jī)兼容的二進(jìn)制匯編器4010-例如Ocode(特定于OTV的)二進(jìn)制匯編器提供一個用于生成客戶機(jī)兼容的二進(jìn)制操作碼的API。這個匯編器支持JS編譯器所需要的操作碼。本發(fā)明也在指定了選擇時創(chuàng)建一個源匯編文件。這個文件含有所有調(diào)試(debug)信息(.stabs)和與二進(jìn)制編譯器完全相同的代碼/數(shù)據(jù)。能為那些想要調(diào)試JS頁源代碼的人單獨(dú)編譯這個匯編文件。代碼模塊生成器4012提供一個用于輸入二進(jìn)制操作碼和輸出客戶機(jī)兼容的代碼模塊4102的API。優(yōu)選地,本發(fā)明也生成一個用于存放元(Meta)信息的客戶機(jī)兼容的模塊標(biāo)頭(在內(nèi)存中)。JS2O編譯器使得能測試和驗(yàn)收J(rèn)S編譯器,并且也使得能測試客戶機(jī)兼容的Ocode生成器和頁元素編譯器4002?,F(xiàn)在轉(zhuǎn)至圖9,在一個操作方式中,JS2O命令行編譯器4100按一個簡單命令行接口操作,該命令行接口以JS源文件作為輸入,并輸出客戶機(jī)兼容的Ocode匯編文件4112。JS2O編譯器也能可選地輸入一個外部對象類定義。命令行接口4104與具有和H2O相同的API-即(如在JS2OFFS中所定義的js2o_compile...API)-的JS2O頁元素編譯器4004通信。以下選項(xiàng)是命令行JS2O編譯器可用的。Js2o-g-O-iinputfile-ooutputfile-cclassmodule-pnameclassmodule-i輸入文件,-o輸出文件,-g生成調(diào)試信息,-O優(yōu)化,-c定義外部對象類,“classmodule”是具有特殊標(biāo)頭信息的客戶機(jī)兼容的代碼模塊,-p定義一個名字為”name”的并且是屬于由“classmodule”代碼模塊所定義的類的預(yù)定對象。輸出文件被用一個例如是OpenTV軟件開發(fā)工具包(SDK#)中的一個Ocode匯編器的客戶機(jī)兼容的編譯器,或者用一個C編譯器前端(例如gcco)編譯。Ocode二進(jìn)制匯編器和代碼模塊生成器按相同的二進(jìn)制對象格式工作。SDK工具為ocode對象文件提供一個”a.out”格式。H2O運(yùn)行時4202和JS2O運(yùn)行時4204可以是同一個客戶機(jī)兼容的代碼模塊的一部分。在優(yōu)選實(shí)施例中,預(yù)定類模塊4200是用于內(nèi)置OOM和DOM對象類的代碼。JS2O運(yùn)行時包括內(nèi)置JS類。JS2O編譯器4000生成JS主代碼模塊4206和JS外部代碼模塊4208。外部類模塊4210和其它模塊最好是C模塊。JS2O提供一個與所有JS編譯的代碼模塊鏈接的、客戶機(jī)兼容的例如Ocode庫。這個庫由小函數(shù)組成。大函數(shù)被存儲在JS2O運(yùn)行時模塊中。例如,”addtwointegers(加兩個整數(shù))”函數(shù)在Ocode庫中,但是任何類型的”genericadd(類加)”函數(shù)都在JS運(yùn)行時模塊中。所有入棧的值最好都是js2o類型的,以適應(yīng)垃圾收集(garbagecollection)。在有些情況中有可能壓入某些非js2o類型的值,當(dāng)肯定這些值是在任何垃圾收集可能發(fā)生之前被彈出的。當(dāng)如軟件附錄中所示的編譯器輸出一個原子指令(atomicinstructions)集時,就是這樣的。垃圾收集垃圾收集(GC)為JS2O動態(tài)對象和串管理內(nèi)存分配。每一次啟動一個新頁時GC開始新的(所有以前分配的內(nèi)存最好都丟棄)。GC使用一個標(biāo)記清掃(markandsweep)算法。每一次啟動一個新的垃圾收集時,標(biāo)記值遞增1。因此,GC不需要一個第二回合來清除標(biāo)記。JS2O運(yùn)行時引擎動態(tài)地創(chuàng)建對象和串。它們是被當(dāng)垃圾收集的。動態(tài)創(chuàng)建的對象和串是通過變量(局部的或全部的)、通過堆棧中的臨時值、以及通過對象屬性被引用的。標(biāo)記清掃算法必須遍歷它們?nèi)縼順?biāo)記被使用過的項(xiàng)。頁持久對象是在多個頁上保持有效狀態(tài)的對象。頁持久對象最好不保存對JS值(對象或串或其它)的引用,以免在模塊未鏈接時切換頁時發(fā)生問題。頁持久對象最好制作它們自己的數(shù)據(jù)備份?,F(xiàn)在轉(zhuǎn)至圖11和12,頁中使用的JS全局變量和頁中引用的對象(甚至預(yù)定義對象)(在編譯時)被在JS代碼主代碼模塊的數(shù)據(jù)段4300中分配一個槽(slot)。局部變量和參數(shù)每個都在執(zhí)行堆棧中有一個槽。編譯器也在堆棧中生成中間值或”臨時值(tempvalues)”。標(biāo)記算法遍歷所有那些槽并標(biāo)記所有動態(tài)對象和串,以及遞歸地標(biāo)記在任何對象的屬性中被引用的所有對象和串。垃圾收集器提供一個API,例如voidjs2o_mark_val(js2o_valjsval,intmarkvalue);voidjs2o_gc_mark(int*js2o_fp,int*js2o_sp,int*js2o_first_fp,intmarkvalue)。js2o_mark_val函數(shù)用指定值標(biāo)記js2o值。如果該值是個對象,這個函數(shù)負(fù)責(zé)調(diào)用對象MarkPropertiesvtable函數(shù),并負(fù)責(zé)標(biāo)記原型(prototype)值-如果有的話。js2o_gc_mark函數(shù)遍歷所有JS全局變量(globals)和所有JS調(diào)用棧(callstack)并標(biāo)記所有臨時值、局部變量(locals)、自變量(arguments)和全局變量,如圖12中所示。GC也檢查“自變量(args)數(shù)”槽,但是這在GC中無關(guān)緊要,因?yàn)樗鼈兪莏s2o_int類型。本發(fā)明提供一個通用API來存儲單一串中的動態(tài)屬性。API包括該串中的屬性名和屬性下標(biāo)(index),用于對二者的快速訪問。這個代碼假設(shè)最多255個屬性,屬性名最大長度127個字節(jié)(不包括最后的零字符)。每個屬性名被以”N-name/”的格式存儲在一個單字符串中,其中N是一個單字節(jié),含有下標(biāo)屬性號+1。Name是屬性名本身。這個格式假設(shè)’/’和’-’對于名字來說是非法字符。N含有一個從1到255的下標(biāo)。字符’/’和’-’可以被不在有效的名字和數(shù)字中使用的任何字符替換。以下函數(shù)將一個屬性名設(shè)定為一個指定值。如果該屬性不存在,就增加。voidprop_set(js2o_prop*prop,char*name,js2o_valval);以下函數(shù)取得一個指定名字的屬性。如果該屬性不存在,就返回JS2O_NULL。Js2o_valprop_get(Js2o_prop*prop,char*name);以下函數(shù)去除一個指定名字的屬性。如果該屬性不存在,什么都不發(fā)生。voidprop_remove(js2o_prop*prop,char*name);以下函數(shù)取得一個指定下標(biāo)(0到n)的屬性名。如果該下標(biāo)不存在,就返回JS2O_NULL。該函數(shù)假設(shè)它被以從0開始的連續(xù)下標(biāo)數(shù)調(diào)用。js2o_valprop-index_get_name(js2o_prop*prop,intindex);以下函數(shù)用指定的標(biāo)記值標(biāo)記所有屬性,用于垃圾收集。voidprop_mark(js2o_prop*prop,intmarkvalue);以下函數(shù)釋放被這個屬性列表內(nèi)部使用的所有內(nèi)存。voidprop_free(js2o_prop*prop)。Js2o運(yùn)行時提供下列APIjs2o_obj*js2o_funcobj_create(js2o_obj*this,void*func);這個函數(shù)創(chuàng)建一個具有指定的”this”指針和函數(shù)地址的函數(shù)對象。每次調(diào)用這個函數(shù)時,該指定的”this”指針被作為第一個參數(shù)傳遞。voidjs2o_funcobj_delete(js2o_obj*objf);這個函數(shù)刪除一個函數(shù)對象。它并不實(shí)際刪除這個函數(shù)對象。如果這個對象不被引用,以后將由垃圾收集來刪除。該函數(shù)把對象重新設(shè)定成空值,這樣訪問這個對象是安全的(可選地生成運(yùn)行時警告或錯誤,但如果執(zhí)行不存在的代碼將不會死機(jī))。voidjs2o_to_null_object(js2o_obj*obj,size_tsize);這個函數(shù)被用來將一個現(xiàn)有的對象改變成類型為JS2O_NULL_OBJECT的對象。其大小保證原始對象足夠大足以被轉(zhuǎn)換成一個空對象。這個函數(shù)也能被用來安全地“去除”一個可能被一些變量引用的對象。js2o_valjs2o_dstr_create(char*str);這個函數(shù)創(chuàng)建一個具有指定的串字符的JS2O串類型。該串在這里被復(fù)制。js2o_valjs2o_dstr_create_static(char*str);這個函數(shù)創(chuàng)建一個帶有指定的串字符的JS2O串類型。該串在這里不被復(fù)制。假設(shè)str指針是有效的。JS2O中的JavaScript語言是ECMAScript語言ECMA-262的子集。有些在JS2O中不被支持的特征(features)是要求在客戶機(jī)設(shè)備上編譯的特征。其它特征支持考慮是運(yùn)行時速度,包括編譯器最優(yōu)化可能性、運(yùn)行時大小、和STB/客戶機(jī)設(shè)備環(huán)境中的有用性。以下的JS特征在優(yōu)選實(shí)施例中的本例中的JS2O中不被支持。RegExp類、Eval函數(shù)、嵌套函數(shù)定義、調(diào)用對象、自變量對象、”with”語句、具有動態(tài)自變量或體的函數(shù)構(gòu)造器、監(jiān)視/非監(jiān)視(Watch/unwatch)方法、_parent_and_proto_(導(dǎo)航器特征)、ImplicitThis屬性、ImplicitParents屬性、Try/Catch/Throw語句和所有錯誤對象、其他選擇的方法和預(yù)定義JS對象的屬性。在優(yōu)選實(shí)施例中,在JS2O中實(shí)行以下限制,然而,可以按照需要選擇不同的參數(shù)或限制值。屬性名最大長度127字節(jié)(不含最后的空字符);每個單一對象的最大屬性個數(shù)255;整數(shù)值是29個有符號位(-268435456,#+268435455);浮點(diǎn)值是31位。如果構(gòu)造器不返回一個不同的對象,則丟棄構(gòu)造器的返回值(如果有的話)。動態(tài)對象不覆蓋(overshadow)預(yù)定義的對象。那些預(yù)定義對象的名字是保留字。靜態(tài)定義的函數(shù)不能被其它函數(shù)覆蓋(意味著那些方法是全局對象的只讀屬性)。保留一個有限的名字集合。保留所有以JS2O開始的、帶有或沒有下劃線前綴的名字。有些函數(shù)將不能作為JS對象被訪問,例如預(yù)定義全局函數(shù)。JS2O腳本的運(yùn)行時(runtime)執(zhí)行的首選行為是例外處理一個運(yùn)行時錯誤或者沒執(zhí)行任何操作,或者停止JS執(zhí)行,或者甚至停止頁提交。計(jì)算溢出運(yùn)行時不檢測整數(shù)的溢出。以下JS對象受JS2O支持。對象;算術(shù)(Math);串;數(shù);布爾;數(shù)組;和函數(shù)。JS2O包括對OSD、通道(Channel)之類的預(yù)定義的客戶機(jī)兼容的特定對象的支持。窗口對象有本身就是對象的“事件”、“文檔”和“導(dǎo)航器”(navigator)屬性。窗口對象有許多方法(例如back())。窗口對象的所有屬性和方法都是可直接訪問的。H2O(HTML至客戶機(jī)兼容的代碼,例如Ocode)引擎將多個HTML頁轉(zhuǎn)換成客戶機(jī)兼容的格式,例如并行的OpenTV格式。具有可重入的JS編譯器簡化了接口并改善了性能。編譯器是可重入的,為了進(jìn)行盡可能多的優(yōu)化,編譯器在一次編譯中編譯來自單一HTML頁的所有JS代碼。為了對JS2O和其它功能進(jìn)行優(yōu)化,編譯器具有下列特點(diǎn)編譯器對不受支持的特性和限制給出特定的錯誤消息,并在開始代碼生成之前分析整個文件(對被定義前就被調(diào)用的函數(shù)來說尤其需要)。編譯器對一個函數(shù)的引用,最好在在當(dāng)前編譯中定義的函數(shù)與全局定義的函數(shù)或其它函數(shù)之間作出區(qū)分。函數(shù)對象為了區(qū)別對對象的訪問和對函數(shù)的調(diào)用,對變量的引用被區(qū)分為局部變量、全局變量和其它變量。編譯器能確定一個名字指的是一個已知函數(shù)還是已知變量。最好提供一個調(diào)試選項(xiàng),以打開或關(guān)閉調(diào)試消息。提供優(yōu)化選項(xiàng),以打開或關(guān)閉各種編譯優(yōu)化。如果某函數(shù)調(diào)用缺失某些自變量,則編譯器發(fā)出警告。變量類型在有些情況下,編譯器知道正在被使用的變量的類型。編譯器在代碼中維持變量的類型。類型也可能是“未知的”。編譯器維持元數(shù)據(jù)(源文件、行號等等),以便代碼生成器能輸出程序和數(shù)據(jù)的調(diào)試信息。特別地,編譯器提供對下列的靜態(tài)編譯的訪問局部變量、(在當(dāng)前編譯中定義的)全局變量、(在當(dāng)前編譯中定義的)函數(shù)、以及預(yù)定義對象和它們的屬性。編譯器提供一個用于輸入預(yù)定義對象定義的接口。注意到因?yàn)镴S函數(shù)內(nèi)沒有“塊范圍”(函數(shù)中定義的所有局部變量在整個函數(shù)中都是有效的,不管它們是在哪里被說明的),編譯器為函數(shù)前言(prologue)內(nèi)的所有局部變量保留空間。所有變量具有缺省值JS2O_UNDEFINED。編譯器前言設(shè)置所有局部變量的指。所有“未初始化的”全局變量被設(shè)置為該值。JS2O編譯器提供一個具有H2O分析器的API,如軟件附錄中所示。這個API是多線程安全的。這些API被調(diào)用的次序?qū)τ诒WC有序的代碼生成來說顯然是重要的。方法”js2o_compile_create”創(chuàng)建一個編譯處理程序;文件名(filename)是JavaScript源文件的名字。這個filename只被用于錯誤消息。為編譯器提供編譯的選項(xiàng)(例如優(yōu)化、外部文件、調(diào)試等等)。如果出錯,函數(shù)返回空(NULL)。方法”js2o_compile_destroy”破壞該處理并釋放所有相關(guān)的內(nèi)存。方法”js2o_compile_generate”對注冊到一個編譯塊中的所有段進(jìn)行實(shí)際編譯。然后,只調(diào)用js2o_compile_error_msg或js2o_compile_destroy。編譯的數(shù)據(jù)最好包含一個OpenTV代碼模塊(二進(jìn)制格式的)。方法”js2o_compile_error_msg”返回適合于stderr上fprintf的最近的錯誤消息。該錯誤消息在一個對js2o_compile_destroy的調(diào)用后被釋放。方法”js2o_compile_warning_callback”注冊一個用于警告消息的回調(diào)(callback)函數(shù),‘callback’是一個指向一個回調(diào)函數(shù)的指針,’data’是一個將被傳遞到回叫函數(shù)的值?;卣{(diào)函數(shù)的原型是‘voidfunc(void*data,char*msg,js2o_handlejh)’。警告消息在回調(diào)后被銷毀。注冊一個空回調(diào)以去除一個回調(diào)。缺省設(shè)置中沒有回調(diào)函數(shù)。方法”js2o_compile_add_src”向編譯添加一段文字代碼,”linenum”是這個代碼的第一行的行號,我們假設(shè)這是來自在js2o_compile_create中指定的文件。句柄(handle)參數(shù)被用于事件處理程序代碼在這種情況下句柄是一個被用于返回一個句柄值的指針。這個局柄值最好被用來在運(yùn)行時執(zhí)行這個代碼(也見js2o_execute)。在其它情況中,即不是一個事件處理程序時,句柄是空的(null)。這個函數(shù)保持代碼的一個內(nèi)部拷貝。優(yōu)化對于多個使用相同代碼的時間處理程序,js2o生成處理程序代碼的一個實(shí)例。代碼最好有原始源文件中的所有新行(\ncharacters),以便行號有意義。方法”js2o_compile_add_bin”包括一個預(yù)編譯的js2o文件。在運(yùn)行時該預(yù)編譯文件中的任何全局語句都在這個位置被執(zhí)行。該名字被JS2O在運(yùn)行時用來定位外部模塊。如果相同的文件包含在一個HTML頁中的幾個位置,則最好每次用相同的名字調(diào)用這個API。該模塊指向客戶機(jī)兼容的代碼,例如OpenTV代碼模塊(包括標(biāo)頭)。方法”js2o_compile_add_obj”定義一個可用的預(yù)定義對象。”objname”是對象的名字。類是由客戶機(jī)兼容代碼定義的,例如由”classmodule”所指向的.otv模塊(包括標(biāo)頭)。該模塊在運(yùn)行時不被JS2O引用(對象是由H2O創(chuàng)建的)。注意這個API不定義一個可從JS源代碼訪問的新類。方法”js2o_compile_add_class”定義一個可用的預(yù)定義類。該類是由客戶機(jī)兼容代碼定義的,例如由classmodule所指向的.otv模塊。類名字(要在‘新’JS語句中被使用)也在該模塊內(nèi)指定(模塊標(biāo)頭)。類名字被JS2O在運(yùn)行時用來獲得這個類的函數(shù)構(gòu)造器。方法”js2o_compile_add_element”定義一個新DOM元素。這將增加一個具有指定名字的全局變量。函數(shù)返回一個變量句柄。這個句柄在運(yùn)行時被H2O用來初始化該對象的地址。可以將外部JavaScript源文件包括在HTML頁中。H2O在編譯HTML頁本身之前編譯這個JS源文件。H2O最終在js2o_compile_add_binAPI中傳遞的(用于編譯HTML頁內(nèi)的JS代碼的)是已編譯的JS文件。要編譯外部源文件,H2O引擎以下列說明調(diào)用js2o_compile_API在js2o_compile_create中使用特殊選項(xiàng)’externalref’。該API不包括外部文件(沒有對js2o_compile_add_bin的調(diào)用)。JS2O編譯器最好保持一個高速緩存,存放(內(nèi)存中的)以前編譯的JS頁,例如最后100頁。高速緩存在JS2O內(nèi)進(jìn)行,這是因?yàn)橛行╉摃胁煌腍TML但是在HTML中嵌入了相同的JS腳本。因此本發(fā)明將這種JS代碼的編譯高速緩存在JS2O內(nèi)。這里,JS頁就是一個HTML頁中的所有JS代碼的聚集。注意H2O內(nèi)的http代理也實(shí)行高速緩存。JS頁的高速緩存使得能夠在多個顯示頁之間使用共同的JS。這減少了需要向STB或客戶機(jī)發(fā)送的數(shù)據(jù)的量。JS代碼被封裝在客戶機(jī)兼容代碼模塊內(nèi),例如OpenTV代碼模塊內(nèi)。就HTML+JS而言,最好將例如OpenTV代碼模塊的客戶機(jī)兼容代碼模塊嵌入在H2O資源內(nèi)(作為一個“bigchar”數(shù)組)。代碼模塊格式使得能進(jìn)行源代碼調(diào)試。編譯器在一個.odb文件中輸出調(diào)試信息。然而注意,調(diào)試程序不知道JS2O類型。最好在gdbo中提供對JS2O類型的支持。JavaScript代碼以幾種方式在HTML頁內(nèi)被使用可以在HTML頁內(nèi)用一對或多對<SCRIPT></SCRIPT>標(biāo)簽使用JavaScript代碼。語法最好是<SCRIPTLANGUAGE=”JavaScript”>任何JavaScript語句...</SCRIPT>將一頁的所有內(nèi)嵌代碼和事件處理程序編譯成一個單一的主客戶機(jī)兼容的例如OpenTV模塊。H2O和JS2O支持對外部JavaScript文件的引用。在H2O中,將外部JS源文件單獨(dú)編譯、存儲和加載,以提高性能。這使得能夠發(fā)送單一一段代碼,即使這個文件在許多頁中被使用。允許在單一HTML頁中包括相同的文件。J2O在編譯主JS代碼之前預(yù)編譯外部JS文件。外部文件被編譯成DDL客戶機(jī)兼容的例如OpenTV模塊。對應(yīng)的HTML語法是<SCRIPTSRC=”URI”LANGUAGE=”JavaScript”></SCRIPT>,其中”URI”指向一個JavaScript源文件。一個外部JavaScript源文件可含有任何有效的JS語句,然而,也可能與其它運(yùn)行的JS模塊有名字沖突。例如,從沖突的觀點(diǎn)來看,多個“varyx;”語句是有問題的,但是多個”x=value”則沒有問題。全局代碼鏈接將文件編譯成一個模塊。該模塊輸出一個含有所有全局代碼的函數(shù)。這個函數(shù)在運(yùn)行時被調(diào)用,正如外部代碼是”內(nèi)嵌”的一樣。變量鏈接預(yù)編譯文件最好輸出正在被其代碼使用的所有全局變量,不管是外部的(例如y=5)還是內(nèi)部的(例如varx=4)。編譯的主JS代碼在其全局變量中為所有那些輸出變量保留一些槽。預(yù)編譯代碼也包括用于其輸出的全局變量的槽,但是那些槽實(shí)際上含有指向在主代碼中的實(shí)際變量的指針。地址在運(yùn)行時被初始化。模塊鏈接在運(yùn)行時,H2O加載預(yù)編譯模塊,創(chuàng)建JS2O前后關(guān)系,然后初始化預(yù)編譯模塊(見js2o_dll_init)。這個初始化進(jìn)行從主JS代碼向預(yù)編譯模塊的變量地址更新。在js2o_compile_add_bin中指定的名字被用來在運(yùn)行時引用該模塊。H2O和JS2O支持對外部預(yù)編譯文件的引用。對應(yīng)的HTML語法是<SCRIPTSRC=”URI”LANGUAGE=”O(jiān)penTV”></SCRIPT>,其中”URI”指向一個客戶機(jī)兼容的例如OpenTVJS代碼模塊文件。這個代碼模塊定義并支持特定的JS2O要求。鏈接與對外部JS源文件的相同。可以指定JS代碼的一個段作為要在特定事件發(fā)生時被執(zhí)行的HTML屬性(例如onClick)的值。按照ECMA術(shù)語,這是一個“宿主代碼“。語法是OnAttribute=“任何JavaScript語句”將一頁的所有內(nèi)嵌代碼和事件處理程序編譯成一個單一的主客戶機(jī)兼容的模塊,例如OpenTV模塊。事件處理程序可返回True(真)、False(假)或其他狀態(tài)值。對于鏈接來說,JS2O在編譯時,js2o_compile_add_src為該事件處理程序向H2O返回一個句柄。這個句柄在運(yùn)行時被用來引用事件處理程序代碼。JS代碼能訪問客戶機(jī)兼容的對象,例如OpenTV預(yù)定義對象(包括DOM對象)。在HTML也中不需要聲明(declaration)。對于鏈接來說,在運(yùn)行時,H2O最好向JS傳遞一個預(yù)定義對象地址數(shù)組。該數(shù)組中的預(yù)定義對象的列表和次序是預(yù)定義的(對H2O和JS2O都是已知的)。H2O最好也傳遞一個全局函數(shù)數(shù)組。這些全局函數(shù)能為預(yù)定義對象執(zhí)行方法(例如SetVisibility方法)。以下語法例子可被用來聲明一個要在JavaScript中使用的新對象類。JS代碼能用”新”JS運(yùn)算符來創(chuàng)建該類的一個實(shí)例,”<OBJECTCLASSID=otv_module_uriDECLARE></OBJECT>”在這個例子中,=otv_module_uri指向一個OpenTV代碼模塊。這個代碼模塊最好符合JS類對象模塊定義。H2O層最好確保這個.otv模塊在從該頁開始任何JS腳本之前被加載。對于鏈接來說,在運(yùn)行時,JS2O用類名字向H2O詢問該模塊的地址。類名字是內(nèi)置在OpenTV代碼模塊中的(在編譯時被傳遞到JS2O)。參見js2o_compile_add_class。唯一的ID標(biāo)識DOM元素,例如<anchorid=”foo”...>、<src=”xxx.otv”id=”glop”>。DOM元素在JS代碼中是用該ID名作為常規(guī)全局變量被訪問的。在兩種情況中,對象都是由H2O而不是JS2O創(chuàng)建的。鏈接在編譯時,H2O用JS2O注冊這個元素,其返回一個句柄。這個句柄在運(yùn)行時被H2O用來告訴JS2O該對象的地址。JS2O提供其自己的數(shù)據(jù)類型(int,bool,float,objects等等)它們不是標(biāo)準(zhǔn)C類型。JavaScript值的類屬C類型是”js2o_val”。它包括所有其它JS類型js2o_int整數(shù)值;js2o_float浮點(diǎn)值;js2o_bool布爾值;js2o_ptr指向?qū)ο蟆⒋鹊闹羔?。為了快速和高效的?zhí)行,本發(fā)明提供單一的32位字來代表堆棧中的所有JS2O數(shù)據(jù)類型。下面是所有JS2O變量的6個基本類型。任何JS2O值最好都要與這6個基本類型其中之一兼容。為了簡便,所有按值傳遞的類型都適合這個單一的32位數(shù)據(jù)。優(yōu)選的浮點(diǎn)格式是seeeeeeeeffffffffffffffffffffff,1位的s是符號位,0表示正,1表示負(fù)。8位e是指數(shù)域,指數(shù)偏差值是127。23位f是分?jǐn)?shù)域。這意味著優(yōu)選的浮點(diǎn)用一個22位的分?jǐn)?shù)域而不是23位。宏在軟件附錄中定義。所有JS對象類具有共同的結(jié)構(gòu)。對象結(jié)構(gòu)定義從相同的域開始,類的所有vtable都以相同的基本函數(shù)開始。為了快速訪問JS2OAPIs和方法,編譯器知道所有小配件(gadgets)的結(jié)構(gòu)或者至少知道結(jié)構(gòu)的開始。因?yàn)閮?yōu)選的Ocode‘vcall’操作碼,虛擬表指針是該結(jié)構(gòu)的第一個域。vtable本身含有對于每個小配件來說是強(qiáng)制性的(mandatory)所有函數(shù)的地址,可能還跟著特定于該類的函數(shù)的地址。JS2O運(yùn)行時也需要一個類型和一個指向每個小配件結(jié)構(gòu)的”原型”指針。在軟件附錄中提供對JS2O對象的開始定義。vtable指向?qū)θ魏蜫S2O對象類來說是強(qiáng)制性的函數(shù)的數(shù)組。強(qiáng)制性函數(shù)在軟件附錄中提供。這些APIs只在類C的前后關(guān)系中被JS編譯器內(nèi)部調(diào)用。有些參數(shù)是C類型(例如intindex,char*name),有些是JS2O類型(例如’this’和返回值),注意參數(shù)的次序反映了JS編譯器所用的次序。提供以下vtable函數(shù)js2o_valGetProperty(js2o_obj*this,char*name)函數(shù)返回指定屬性的屬性值。如果屬性存在,但是沒有定義值,則返回JS2O_UNDEFINED。如果屬性不存在,則返回JS2O_NULL。該函數(shù)不徹底察看原型指針,必要時這將由JS2O運(yùn)行時引擎自動進(jìn)行。這個函數(shù)可假設(shè)“原型”屬性是由JS2O編譯器直接處理的。然而,ValueOf和ToString屬性是由這個函數(shù)處理的。參看下面的ValueOf和ToStringAPI。如果屬性對應(yīng)于某方法,則返回值是函數(shù)js2o類型。小配件類能決定只支持一些公知的屬性名,并且只帶字面上的名字。在那樣的情況下,屬性是用GetNumberProperty/SetNumberPropertyAPIs訪問的,GetPropertyAPI返回JS2O_UNDEFINED。名字最好是屬性名。如果對象是數(shù)組類型,’name’也可以是數(shù)組中的下標(biāo)。如果名字代表一個有效的串號(例如“1”)則它是一個下標(biāo)。如果對象支持?jǐn)?shù)組并且名字是個下標(biāo),該函數(shù)返回對應(yīng)的項(xiàng)目號。函數(shù)voidSetProperty(js2O_obj*this,char*name,js2o_valvalue)用值設(shè)定指定屬性。如果屬性不存在,小配件可要么創(chuàng)建之(用該值)要么什么也不做。該函數(shù)不返回值。該函數(shù)可假設(shè)“原型”屬性是由JS2O編譯器直接處理的。然而,ValueOf和ToString屬性是由這個函數(shù)處理的。名字一般是屬性名。如果對象是數(shù)組類型,’name’也可以是數(shù)組中的下標(biāo)。如果名字代表一個有效的串號(例如“1”)則它是一個下標(biāo)。如果對象支持?jǐn)?shù)組并且名字是個下標(biāo),該函數(shù)應(yīng)當(dāng)設(shè)置對應(yīng)的項(xiàng)目號,(如果合適的話)更新其‘length’屬性。函數(shù)void*GetMethod(js2o_obj*this,char*name)返回這個方法的函數(shù)地址。如果屬性不存在,或者不含函數(shù),則產(chǎn)生一個運(yùn)行時例外(見js2o_runtime_error)。該方法返回一個js2o_val值。該方法被用以下自變量調(diào)用js2o_obj*this,js2o_intnbarg,js2o_valarg1,...js2o_valargN名字一般是屬性名。如果對象是數(shù)組類型,’name’也可以是數(shù)組中的下標(biāo)。如果名字代表一個有效的串號(例如“1”)則它是一個下標(biāo)。如果對象支持?jǐn)?shù)組并且名字是個下標(biāo),該函數(shù)返回對應(yīng)于項(xiàng)目號的函數(shù)地址。函數(shù)js2o_valGetIndexPropertyName(js2o_obj*this,intindex)返回具有下標(biāo)(0至N)的屬性/方法的名字。如果該屬性/方法不存在,該函數(shù)返回JS2O_NULL。否則返回一個JS2O串值。這個函數(shù)主要被’for/in’JavaScript語句使用。該函數(shù)假設(shè)是按下標(biāo)序列0、1、2...被調(diào)用的。函數(shù)js2o_valValueOf(js2o_obj*this)返回對象的值。對象的值是特定于對象的。所返回的類型可以是數(shù)字、布爾、串、函數(shù)甚至對象。這個API是對GetProperty(this,”ValueOf”),然后對該方法調(diào)用的快捷方式。函數(shù)js2o_strToString(js2o_obj*this)返回對象值的串表示。這個函數(shù)是對GetProperty(this,”ToString”),然后對該方法調(diào)用的快捷方式。函數(shù)void*GetCall(js2o_obj*this)返回要被執(zhí)行的函數(shù)的地址。這一般只為函數(shù)對象而被調(diào)用。為其它對象調(diào)用這個函數(shù)可以認(rèn)為是個運(yùn)行時錯誤。參看js2o_runtime_error。對函數(shù)來說,這個API是對Valueof()+得到函數(shù)地址的快捷方式。函數(shù)voidDeleteProperty(js2o_obj*this,char*name)刪除指定的屬性。如果屬性不存在或者不能被刪除,則什么也不發(fā)生。函數(shù)voidMarkProperty(js2o_obj*this,intmarkvalue)被JS2O垃圾收集器用來標(biāo)記所有被這個小配件引用的js2o_val值(除了’prototype’域中的被JS2O引擎自動完成的值)。在多數(shù)情況下,js2o_val值只是在小配件屬性中存儲的值。該小配件調(diào)用js2o_mark_val函數(shù)來標(biāo)記每個js2o_val。如果操作失敗會導(dǎo)致(仍然被小配件引用的)js2o_val被釋放。函數(shù)js2o_valGetNumberProperty(js2o_obj*this,intproperty_number)與GetProperty相同,除了指定屬性號而不是屬性名。該API被用于具有預(yù)定義屬性的預(yù)定義對象。該屬性號來自公知的名稱列表。函數(shù)voidSetNumberProperty(js2o_obj*this,intproperty_number,js2o_valvalue)與SetProperty相同,除了指定屬性號而不是屬性名。該API被用于具有預(yù)定義屬性的預(yù)定義對象。屬性號來自一個公知的名稱列表。函數(shù)void*GetNumberProperty(js2o_obj*this,intproperty_number)返回這個方法的函數(shù)地址。如果該屬性不存在,或者不含函數(shù),則發(fā)生一個運(yùn)行時錯誤(參看js2o_runtime_error)。函數(shù)voidDeleteObject(js2o_obj*this)釋放被該對象在內(nèi)部分配的所有資源。這與對象類的object_new函數(shù)相反。這個函數(shù)釋放對象本身。當(dāng)發(fā)現(xiàn)某個對象不再被使用時,垃圾收集器調(diào)用這個函數(shù)。小配件方法一般通過GetMethodAPI被訪問。小配件返回函數(shù)地址。每個方法都是在JS2O前后關(guān)系中被執(zhí)行的。每個方法的實(shí)現(xiàn)帶有下列限制每個輸入?yún)?shù)都是’js2o_val’類型的,而不是常規(guī)的C類型。返回值是強(qiáng)制性的(可以是JS2O_NULL)。返回值也必須是js2o類型的,并且每個方法具有至少以下的頭兩個參數(shù)’this’對象指針和所傳遞的參數(shù)個數(shù)。例如,一個具有兩個參數(shù)x和y的JS2O方法“foo”可以用C語言聲明如下js2o_valfoo(js2o_obj*this,js2o_intnbarg,js2o_valx,js2o_valy,...);在定義一個外部對象或內(nèi)部對象類時,有可能聲明一些預(yù)定義屬性和方法。預(yù)定義的“vtable”方法是按名字和按下標(biāo)定義的。下標(biāo)是類的vtable中的函數(shù)號。因?yàn)樵谌魏蝪table的開始所需要的函數(shù),第一個可用的下標(biāo)是13。編譯器在可能時將優(yōu)化對那些預(yù)定義方法的訪問。在定義一個具有例如show的預(yù)定義函數(shù)的例如OSD的對象時,JS代碼”O(jiān)SD.show();”將被優(yōu)化(但是”x.show();”則不優(yōu)化,即使x等于OSD)。JS2O+H2O定義一個公知屬性名列表。每個名字與一個串號碼相關(guān)聯(lián)。編譯器通過調(diào)用對象的GetNumeberProperty和SetNumeberPropertyAPI優(yōu)化對那些公知屬性的訪問。如果某方法不是定義為“預(yù)定義的vtable方法”,它可能仍然是公知屬性名。在這種情況下,編譯器通過調(diào)用GetNumeberMethodAPI優(yōu)化該get方法地址。當(dāng)訪問作為屬性的該方法時,編譯器使用GetNumeberProperty和SetNumeberPropertyAPI。如果某方法也能被定義為一個”預(yù)定義全局方法”,該方法是實(shí)現(xiàn)該方法的全局函數(shù)。該函數(shù)查驗(yàn)對象類對于該方法是正確的,然后執(zhí)行實(shí)際的功能。如果對象屬于一個錯誤類則產(chǎn)生錯誤?!鳖A(yù)定義全局方法”列表眾所周知是由所有H2O組件共享的。那些方法的地址在運(yùn)行時由H2O傳遞(單一地址數(shù)組)。有一個公知屬性名列表。這個列表被編譯器和對象所公知。這個列表包括(包括DOM對象在內(nèi)的)預(yù)定義對象的大多數(shù)(即使不是全部)的屬性(和方法)名。這個列表只用于被編譯器訪問的方法和屬性,但不用于其它串。為了優(yōu)化對CSS屬性的訪問,公知屬性名可包括”.”字符。例如,”style.color”能作為單一的屬性名被聲明。JS2O運(yùn)行時包括對動態(tài)創(chuàng)建的對象和動態(tài)創(chuàng)建的串的垃圾收集。為垃圾收集實(shí)行一個標(biāo)記清掃(Mark&Sweep)機(jī)制。就運(yùn)行時速度而言這比引用計(jì)數(shù)器(ReferenceCounters)成本更低。垃圾收集最好也跟蹤被串和對象(例如vtable、函數(shù)、靜態(tài)串等等)引用的模塊(類定義、外部代碼模塊)。當(dāng)改變頁(即,上載模塊)時,持久對象將為清除外部引用提供復(fù)位函數(shù)。H2O提供一個例如用于高速緩存模塊的內(nèi)存管理器。JS2O和其垃圾收集器與H2O協(xié)作工作。JS2O分配許多小塊(對象、串),而H2O分配少數(shù)較大的塊。JS2O向H2O提供一個等待(idle)函數(shù),以便在沒有事情發(fā)生(沒有用戶輸入)時執(zhí)行。這個等待函數(shù)調(diào)用垃圾收集。函數(shù)名字將對在相同文件中定義的函數(shù)的訪問優(yōu)化成對函數(shù)地址的直接調(diào)用。這尤其意味著函數(shù)不能被動態(tài)改變。局部變量被編譯堆棧中的直接槽。全局變量被編譯成數(shù)據(jù)段存儲器內(nèi)的直接變量。所有預(yù)定義對象都是JS全局范圍的一部分。預(yù)定義對象被直接引用,它們的預(yù)定義方法和屬性也是如此。窗口對象和其所有屬性/方法都直接是全局范圍的一部分。例如,”window.document”屬性能簡單地被”document”訪問。(某頁的)主JS代碼和所有JS事件處理程序被編譯成一個單一的代碼模塊。H2O層調(diào)用該模塊的一個初始化函數(shù)。這個初始化函數(shù)返回一個JS2O前后關(guān)系指針。js2o_cx*js2o_cx_create(void*module,int**DOMObjectHandle,js2o_obj**DOMObjects,js2o_obj**PredefinedObjects,void**GlobalMethods);參數(shù)是一個指向主模塊的指針和指向被創(chuàng)建的DOM對象(句柄和地址)的指針、一個指向預(yù)定義對象地址數(shù)組的指針和一個指向預(yù)定義全局函數(shù)數(shù)組的指針。DOM對象句柄是由js2o_compile_add_element返回的句柄。如果出錯則該函數(shù)返回NULL。參數(shù)‘module’最好指向與由js2o_compile_generate返回的數(shù)據(jù)相同的數(shù)據(jù)。JS2O不對該數(shù)據(jù)作備份,因此它最好保持有效,一直到破壞(destroy)函數(shù)去除它。也注意該數(shù)據(jù)是只讀的(JS2O不寫入該數(shù)據(jù))。注意至少”window”對象被定義。JS2O前后關(guān)系通過調(diào)用js2o_cx_destroyvoidjs2o_cx_destroy(js2o_cx*context)被破壞(當(dāng)不再需要時);為執(zhí)行主JS代碼,H2O層調(diào)用下列APIintjs2o_main(js2o_cx*context);如果不出錯,或者沒有表示運(yùn)行時錯誤的負(fù)數(shù),這個函數(shù)返回0。為執(zhí)行事件處理程序,H2O層調(diào)用下列API來執(zhí)行處理程序intjs2o_execute(js2o_cx*context,js2o_obj*this,inthandle);句柄(handle)值由js2o_compile_add_srcAPI在編譯時提供。函數(shù)js2o_execute返回下列值如果處理程序返回真,則JS2O_TRUE;如果處理程序返回假,則JS2O_FALSE;如果發(fā)生運(yùn)行時錯誤,則JS2O_NULL;如果沒有錯誤并且處理程序不返回值,則為任意js2o_val。注意JS執(zhí)行引擎最好不是可重入的。在優(yōu)選實(shí)施例中,函數(shù)js2o_main和js2o_execute不能在另一個JS處理程序在執(zhí)行時被調(diào)用。將外部JS文件編譯成OpenTVDDL代碼模塊。H2O層調(diào)用該模塊的初始化函數(shù)。這個初始化函數(shù)接收J(rèn)S2O的前后關(guān)系作為輸入。因此,主JS代碼如下地被首先初始化intjs2o_dll_init(js2o_cx*context,char*name,void*module)。該名稱參數(shù)是在編譯時被傳遞的參數(shù)(在js2o_compile_add_bin中)。在這個調(diào)用后,在該模塊中定義的函數(shù)就可用于JS前后關(guān)系。外部JS代碼模塊也有一個API來執(zhí)行這個文件的全局JS語句。在優(yōu)選實(shí)施例中,外部JS代碼模塊是OpenTV代碼模塊,帶有存儲在OpenTV模塊標(biāo)頭中的JS2O特定的信息。對象類模塊定義一個新的對象類。這個模塊在HTML頁中用OBJECT聲明來聲明,并用js2o_compile_add_classAPI向編譯器聲明。JS2O引擎調(diào)用下列由這個模塊提供的CAPI,以得到該對象類的函數(shù)構(gòu)造器。js2o_obj*module_class_get_constructor(js2o_cx*context,char*classname)函數(shù)是輸出函數(shù)#0。在優(yōu)選實(shí)施例中,對象類模塊是OpenTV代碼模塊,帶有存儲在OpenTV模塊標(biāo)頭的JS2O特定的信息。JS運(yùn)行時訪問下列由H2O運(yùn)行時架構(gòu)提供的函數(shù)js2o_obj*h2o_get_class_constructor(js2o_cx*context,char*classname)。這個函數(shù)最好返回所指定的類的函數(shù)構(gòu)造器對象。類名與在OBJECT聲明中的CLASSID中傳遞的具有相同值。這個函數(shù)內(nèi)部地定位類模塊并調(diào)用module_class_get_constructor函數(shù)。以下語句可用于JS,用來創(chuàng)建外部類的對象。名字與在OBJECT聲明中的CLASSID中傳遞的名字上指定的名字具有相同值。以下CAPI可用于開發(fā)對象類和庫。voidjs2o_runtime_error(js2o_cx*context)函數(shù)在小配件方法或vtable函數(shù)內(nèi)部發(fā)生運(yùn)行時錯誤時,以及在js2o庫內(nèi)發(fā)生錯誤條件時被執(zhí)行。char*js2o_get_number_property_string(intpropertyNumber)函數(shù)返回與公知屬性號相關(guān)聯(lián)的串。本發(fā)明是在優(yōu)選實(shí)施例中的交互式電視環(huán)境中作說明的,然而,本發(fā)明也可以體現(xiàn)在包含服務(wù)器和客戶機(jī)設(shè)備的分布式計(jì)算機(jī)系統(tǒng)中。在另一個實(shí)施例中,本發(fā)明以計(jì)算機(jī)可讀介質(zhì)上的一個指令集實(shí)現(xiàn),介質(zhì)包含ROM、RAM、CDROM、閃存或任何其他計(jì)算機(jī)可讀介質(zhì),無論是現(xiàn)在已知的還是未知的,當(dāng)該指令集被執(zhí)行時,使計(jì)算機(jī)執(zhí)行本發(fā)明的方法。盡管上面展示了本發(fā)明的優(yōu)選實(shí)施例,這僅僅是為了舉例而不是要限制由下列權(quán)利要求所定義的本發(fā)明的范圍。權(quán)利要求1.計(jì)算機(jī)可讀介質(zhì),含有在被計(jì)算機(jī)執(zhí)行時使計(jì)算機(jī)執(zhí)行以下步驟的指令從服務(wù)器上的服務(wù)提供者中接收一個含有至少一個腳本的HTML頁;從過濾器中的HTML頁中提取腳本;將腳本編譯成用于在客戶機(jī)設(shè)備上執(zhí)行的客戶機(jī)兼容的代碼;將編譯的腳本傳送至客戶機(jī)設(shè)備;和在客戶機(jī)設(shè)備上執(zhí)行編譯的腳本。2.權(quán)利要求1的介質(zhì),進(jìn)一步包含在被計(jì)算機(jī)執(zhí)行時使計(jì)算機(jī)執(zhí)行以下步驟的指令將HTML頁中的某語言的腳本頁元素匯集成至少一個包;和將匯集的腳本頁元素的至少一個包傳送到腳本編譯器,使得HTML頁的腳本元素在一起被編譯。3.權(quán)利要求1的介質(zhì),其中,只把將要在客戶機(jī)設(shè)備上執(zhí)行的一部分腳本提取、編譯并傳送到客戶機(jī)設(shè)備。4.權(quán)利要求1的介質(zhì),進(jìn)一步包含在被計(jì)算機(jī)執(zhí)行時使計(jì)算機(jī)執(zhí)行以下步驟的指令高速緩存HTML頁的編譯腳本;檢查編譯器中的一個輸入HTML頁腳本以確定該輸入頁腳本是否已經(jīng)在高速緩存中;如果在高速緩存中找不到該輸入HTML頁腳本,編譯輸入HTML頁的腳本并高速緩存該輸入HTML頁的編譯腳本;和如果在高速緩存中找到該編譯頁,從高速緩存中取回該編譯頁并將該編譯頁發(fā)送到客戶機(jī)設(shè)備。5.權(quán)利要求1的介質(zhì),進(jìn)一步包含在被計(jì)算機(jī)執(zhí)行時使計(jì)算機(jī)執(zhí)行以下步驟的指令將輸入HTML頁的腳本編譯成一個中間格式;然后將該中間格式編譯成客戶機(jī)兼容的代碼。6.權(quán)利要求1的介質(zhì),進(jìn)一步包含在被計(jì)算機(jī)執(zhí)行時使計(jì)算機(jī)執(zhí)行以下步驟的指令在服務(wù)器中生成一個腳本元素樹;和從該腳本元素樹生成客戶機(jī)兼容的操作碼。7.權(quán)利要求6的介質(zhì),進(jìn)一步包含在被計(jì)算機(jī)執(zhí)行時使計(jì)算機(jī)執(zhí)行以下步驟的指令將客戶機(jī)兼容的操作碼發(fā)送到二進(jìn)制匯編器,用于匯編一個匯編表示。8.權(quán)利要求7的介質(zhì),進(jìn)一步包含在被計(jì)算機(jī)執(zhí)行時使計(jì)算機(jī)執(zhí)行以下步驟的指令從該匯編表示中生成至少一個客戶機(jī)兼容的代碼模塊;和將客戶機(jī)兼容的代碼模塊傳送到客戶機(jī)設(shè)備供執(zhí)行。9.權(quán)利要求1的介質(zhì),進(jìn)一步包含在被計(jì)算機(jī)執(zhí)行時使計(jì)算機(jī)執(zhí)行以下步驟的指令編譯一份復(fù)制腳本的拷貝;和將編譯的這份復(fù)制腳本的拷貝發(fā)送到客戶機(jī)供多個HTML頁作為外部對象使用。10.權(quán)利要求1的介質(zhì),進(jìn)一步包含在被計(jì)算機(jī)執(zhí)行時使計(jì)算機(jī)執(zhí)行以下步驟的指令提供一個用于定義一個預(yù)定義對象的接口。11.權(quán)利要求10的介質(zhì),其中,預(yù)定義對象包含OSD和通道的至少之一。12.權(quán)利要求1的介質(zhì),進(jìn)一步包含在被計(jì)算機(jī)執(zhí)行時使計(jì)算機(jī)執(zhí)行以下步驟的指令提供一個客戶機(jī)兼容的對象模型腳本接口,用于操作客戶機(jī)定義的對象。13.權(quán)利要求1的介質(zhì),進(jìn)一步包含在被計(jì)算機(jī)執(zhí)行時使計(jì)算機(jī)執(zhí)行以下步驟的指令從HTML頁提取和匯集某語言的腳本,其中只有將在客戶機(jī)設(shè)備上執(zhí)行腳本被提取,然后將匯集的腳本傳送到腳本編譯器,供將匯集的腳本編譯成至少一個客戶機(jī)兼容的模塊;高速緩存HTML頁的編譯腳本,并檢查一個輸入HTML頁腳本以確定該輸入頁是否已經(jīng)在編譯腳本高速緩存中,如果在高速緩存中找不到,編譯該HTML頁的腳本并高速緩存該編譯腳本,如果在高速緩存中找到該編譯腳本,從高速緩存中取回該編譯腳本并將該編譯腳本發(fā)送到客戶機(jī)設(shè)備;和在客戶機(jī)設(shè)備上執(zhí)行該編譯腳本。14.權(quán)利要求1的介質(zhì),進(jìn)一步包含生成一個腳本元素樹,并從該腳本元素樹中生成客戶機(jī)兼容的操作碼;將輸入HTML頁的腳本編譯成一個中間格式,然后將該中間格式編譯成客戶機(jī)兼容的代碼;將客戶機(jī)兼容的操作碼發(fā)送到二進(jìn)制匯編器,用于匯編一個匯編表示;和從該匯編表示中生成一個客戶機(jī)兼容的代碼模塊,用于在客戶機(jī)設(shè)備上執(zhí)行。15.權(quán)利要求1的介質(zhì),進(jìn)一步包含在被計(jì)算機(jī)執(zhí)行時使計(jì)算機(jī)執(zhí)行以下步驟的指令編譯一份復(fù)制腳本拷貝并將編譯的這份復(fù)制腳本拷貝發(fā)送到客戶機(jī)設(shè)備供多個HTML頁作為外部對象使用;提供一個用于定義預(yù)定義對象的接口,其中,預(yù)定義對象為OSD或通道的至少之一;和提供一個客戶機(jī)兼容的對象模型腳本接口,用于操作客戶機(jī)定義的對象。16.權(quán)利要求1的介質(zhì),其中HTML頁被從前端發(fā)送到服務(wù)器。17.權(quán)利要求16的介質(zhì),其中HTML是服務(wù)提供者與客戶機(jī)設(shè)備上的用戶之間的電子商務(wù)交易的一部分。18.一種用于編譯在分布式計(jì)算機(jī)系統(tǒng)中的客戶機(jī)設(shè)備上執(zhí)行的腳本的方法,包含從服務(wù)器上的服務(wù)提供者中接收一個含有至少一個腳本的HTML頁;從過濾器中的HTML頁中提取腳本;將腳本編譯成用于在客戶機(jī)設(shè)備上執(zhí)行的客戶機(jī)兼容的代碼;將編譯腳本傳送到客戶機(jī)設(shè)備;和在客戶機(jī)設(shè)備上執(zhí)行編譯的腳本。19.權(quán)利要求18的方法,進(jìn)一步包含將HTML頁中的某語言的腳本頁元素匯集成至少一個包;將匯集的腳本頁元素的至少一個包傳送到腳本編譯器,使得HTML頁的所有腳本元素在一起被編譯。20.權(quán)利要求的方法,其中,只把將要在客戶機(jī)設(shè)備上執(zhí)行的一部分腳本提取、編譯并傳送到客戶機(jī)設(shè)備。21.權(quán)利要求18的方法,進(jìn)一步包含高速緩存HTML頁的編譯腳本;檢查編譯器中的一個輸入HTML頁腳本以確定該輸入頁腳本是否已經(jīng)在高速緩存中;如果在高速緩存中找不到該輸入HTML頁,編譯輸入HTML頁的腳本并高速緩存該輸入HTML頁的編譯腳本;和如果在高速緩存中找到該編譯頁,從高速緩存中取回該編譯頁并將該編譯頁發(fā)送到客戶機(jī)設(shè)備。22.權(quán)利要求18的方法,進(jìn)一步包含將輸入HTML頁的腳本編譯成一個中間格式;和將該中間格式編譯成客戶機(jī)兼容的代碼。23.權(quán)利要求18的方法,進(jìn)一步包含在服務(wù)器中生成一個腳本元素樹;和從該腳本元素樹中生成客戶機(jī)兼容的操作碼。24.權(quán)利要求23的方法,進(jìn)一步包含將客戶機(jī)兼容的操作碼發(fā)送到二進(jìn)制匯編器,用于匯編一個匯編表示。25.權(quán)利要求24的方法,進(jìn)一步包含從該匯編表示中生成至少一個客戶機(jī)兼容的代碼模塊;和將客戶機(jī)兼容的代碼模塊傳送到客戶機(jī)設(shè)備供執(zhí)行。26.權(quán)利要求18的方法,進(jìn)一步包含編譯一份復(fù)制腳本拷貝;和將編譯的這份復(fù)制腳本拷貝發(fā)送到客戶機(jī)供多個HTML頁作為外部對象使用。27.權(quán)利要求18的方法,進(jìn)一步包含提供一個用于定義一個預(yù)定義對象的接口。28.權(quán)利要求27的方法,其中,預(yù)定義對象包含OSD和通道的至少之一。29.權(quán)利要求18的方法,進(jìn)一步包含提供一個客戶機(jī)兼容的對象模型腳本接口,用于操作客戶機(jī)定義的對象。30.權(quán)利要求18的方法,進(jìn)一步包含從HTML頁提取和匯集某語言的腳本,其中只有將在客戶機(jī)設(shè)備上執(zhí)行的腳本被提取,然后將匯集的腳本傳送到腳本編譯器,供將匯集的腳本編譯成至少一個客戶機(jī)兼容的代碼模塊;高速緩存HTML頁的編譯腳本,并檢查一個輸入HTML頁腳本以確定該輸入頁是否已經(jīng)在編譯腳本高速緩存中,如果在高速緩存中找不到,編譯該HTML頁的腳本并高速緩存該編譯腳本,如果在高速緩存中找到該編譯腳本,從高速緩存中取回該編譯腳本并將該編譯腳本發(fā)送到客戶機(jī)設(shè)備;和在客戶機(jī)設(shè)備上執(zhí)行該編譯腳本。31.權(quán)利要求18的方法,進(jìn)一步包含生成一個腳本元素樹,并從該腳本元素樹中生成客戶機(jī)兼容的操作碼;將輸入HTML頁的腳本編譯成一個中間格式,然后將該中間格式編譯成客戶機(jī)兼容的代碼;將客戶機(jī)兼容的操作碼發(fā)送到二進(jìn)制匯編器,用于匯編一個匯編表示;和從該匯編表示中生成一個客戶機(jī)兼容的代碼模塊用于在客戶機(jī)設(shè)備上執(zhí)行。32.權(quán)利要求18的方法,進(jìn)一步包含編譯一份復(fù)制腳本拷貝并將編譯的這份復(fù)制腳本拷貝發(fā)送到客戶機(jī)設(shè)備供多個HTML頁作為外部對象使用;提供一個用于定義預(yù)定義對象的接口,其中,預(yù)定義對象是OSD或通道的至少之一;和提供一個客戶機(jī)兼容的對象模型腳本接口,用于操作客戶機(jī)定義的對象。33.權(quán)利要求18的方法,其中HTML頁被從前端發(fā)送到服務(wù)器。34.權(quán)利要求33的方法,其中HTML是服務(wù)提供者與客戶機(jī)設(shè)備上的用戶之間的電子商務(wù)交易的一部分。35.權(quán)利要求1的介質(zhì),進(jìn)一步包含使計(jì)算機(jī)執(zhí)行以下步驟的指令在編譯時將一個腳本變量名連接到一個含有在運(yùn)行時在客戶機(jī)設(shè)備上的變量名值的存儲器位置。36.權(quán)利要求1的介質(zhì),進(jìn)一步包含使計(jì)算機(jī)執(zhí)行以下步驟的指令在編譯時將一個腳本變量名連接到一個值,用于在客戶機(jī)設(shè)備上在運(yùn)行時執(zhí)行。37.權(quán)利要求18的方法,進(jìn)一步包含使計(jì)算機(jī)執(zhí)行以下步驟的指令在編譯時將一個腳本變量名連接到一個含有在運(yùn)行時在客戶機(jī)設(shè)備上的變量名值的存儲器位置。38.權(quán)利要求18的方法,進(jìn)一步包含在編譯時將一個腳本變量名連接到一個值,用于在客戶機(jī)設(shè)備上在運(yùn)行時執(zhí)行。39.權(quán)利要求3的介質(zhì),進(jìn)一步包含使計(jì)算機(jī)執(zhí)行以下步驟的指令檢查腳本中的一個關(guān)鍵字,以確定該部分腳本是否將在客戶機(jī)設(shè)備上執(zhí)行。40.權(quán)利要求20的方法,進(jìn)一步包含檢查腳本中的一個關(guān)鍵字,以確定該部分腳本是否將在客戶機(jī)設(shè)備上執(zhí)行。41.一種用于編譯在分布式計(jì)算機(jī)系統(tǒng)中的客戶機(jī)設(shè)備上執(zhí)行的腳本的裝置,包含服務(wù)器存儲器,用于從服務(wù)器上的服務(wù)提供者中接收一個含有至少一個腳本的HTML頁;提取組件,用于從過濾器中的HTML頁中提取腳本;編譯器組件,用于將腳本編譯成用于在客戶機(jī)設(shè)備上執(zhí)行的客戶機(jī)兼容的代碼;通信鏈路,用于將編譯的腳本傳送到客戶機(jī)設(shè)備;和客戶機(jī)設(shè)備,用于執(zhí)行編譯的腳本。42.權(quán)利要求41的裝置,進(jìn)一步包含程序組件,用于將HTML頁中某語言的腳本頁元素匯集成至少一個包;和存儲器,匯集腳本頁元素用于被腳本編譯器訪問,使得HTML頁的所有腳本元素在一起被編譯。43.權(quán)利要求41的裝置,其中,只把將要在客戶機(jī)設(shè)備上執(zhí)行的一部分腳本提取、編譯并傳送到客戶機(jī)設(shè)備。44.權(quán)利要求41的裝置,進(jìn)一步包含高速緩存,用于高速緩存HTML頁的編譯腳本;編譯器進(jìn)一步包含一個程序組件,用于檢查編譯器中的一個輸入HTML頁腳本以確定該輸入頁腳本是否已經(jīng)在高速緩存中,其中如果在高速緩存中找不到該輸入HTML頁,編譯輸入HTML頁的腳本并高速緩存該輸入HTML頁的編譯腳本,而如果在高速緩存中找到該編譯頁,則從高速緩存中取回該編譯頁并將該編譯頁發(fā)送到客戶機(jī)設(shè)備。45.權(quán)利要求41的裝置,進(jìn)一步包含編譯器組件,用于將輸入HTML頁的腳本編譯成一個中間格式;和編譯器組件,用于將該中間格式編譯成客戶機(jī)兼容的代碼。46.權(quán)利要求41的裝置,進(jìn)一步包含存儲器,用于包含在服務(wù)器中的一個腳本元素樹;和程序組件,用于從該腳本元素樹中生成客戶機(jī)兼容的操作碼。47.權(quán)利要求46的裝置,進(jìn)一步包含二進(jìn)制匯編程器,用于接收客戶機(jī)兼容的操作碼到二進(jìn)制匯編器,用于匯編一個匯編表示。48.權(quán)利要求47的裝置,進(jìn)一步包含至少一個從該匯編表示生成的客戶機(jī)兼容的代碼模塊,用于向客戶機(jī)設(shè)備傳送供執(zhí)行。49.權(quán)利要求41的裝置,進(jìn)一步包含用于發(fā)送到客戶機(jī)供多個HTML頁作為外部對象使用的一份編譯的復(fù)制腳本拷貝。50.權(quán)利要求41的裝置,進(jìn)一步包含用于定義一個預(yù)定義對象的接口。51.權(quán)利要求50的裝置,其中,預(yù)定義對象包含OSD和通道的至少之一。52.權(quán)利要求41的裝置,進(jìn)一步包含客戶機(jī)兼容的對象模型腳本接口,用于操作客戶機(jī)定義的對象。53.權(quán)利要求41的裝置,進(jìn)一步包含程序組件,用于從HTML頁提取和匯集某語言的腳本,其中只有將在客戶機(jī)設(shè)備上執(zhí)行的腳本被提取,然后將匯集的腳本傳送到腳本編譯器,供將匯集的腳本編譯成至少一個客戶機(jī)兼容的代碼模塊;高速緩存,用于存儲HTML頁的編譯腳本,并檢查一個輸入HTML頁腳本以確定該輸入頁是否已經(jīng)在編譯腳本高速緩存中,如果在高速緩存中找不到,編譯該HTML頁的腳本并高速緩存該編譯腳本,如果在高速緩存中找到該編譯腳本,從高速緩存中取回該編譯腳本并將該編譯腳本發(fā)送到客戶機(jī)設(shè)備;和用于執(zhí)行該編譯腳本的客戶機(jī)設(shè)備。54.權(quán)利要求41的裝置,進(jìn)一步包含腳本元素樹,用于從該腳本元素樹中生成客戶機(jī)兼容的操作碼;中間格式組件,用于將輸入HTML頁的腳本編譯成一個中間格式,然后將該中間格式編譯成客戶機(jī)兼容的代碼;二進(jìn)制匯編器,用于將客戶機(jī)兼容的操作碼匯編成一個匯編表示,并從該匯編表示中生成一個客戶機(jī)兼容的代碼模塊用于在客戶機(jī)設(shè)備上執(zhí)行。55.權(quán)利要求41的裝置,進(jìn)一步包含編譯一份復(fù)制腳本拷貝并將編譯的這份復(fù)制腳本拷貝發(fā)送到客戶機(jī)供多個HTML頁作為外部對象使用;提供一個用于定義預(yù)定義對象的接口,其中,預(yù)定義對象是OSD或通道的至少之一;和提供一個客戶機(jī)兼容的對象模型腳本接口,用于操作客戶機(jī)定義的對象。56.權(quán)利要求41的裝置,其中HTML頁被從前端發(fā)送到服務(wù)器。57.權(quán)利要求56的裝置,其中HTML是服務(wù)提供者與客戶機(jī)設(shè)備上的用戶之間的電子商務(wù)交易的一部分。58.權(quán)利要求41的裝置,進(jìn)一步包含編譯器組件,用于在編譯時將一個腳本變量名連接到一個含有在運(yùn)行時在客戶機(jī)設(shè)備上的變量名值的存儲器位置。59.權(quán)利要求43的裝置,進(jìn)一步包含一個關(guān)鍵字,用于在腳本中指示該腳本的一部分將在客戶機(jī)設(shè)備上被執(zhí)行。全文摘要一種用于提取和編譯解釋性語言的方法和裝置,用于在交互式電視環(huán)境中實(shí)現(xiàn)諸如以嵌入在HTML頁中的腳本的形式編寫的功能。HTML頁是從廣播和在線中接收的。編譯器在服務(wù)器上運(yùn)行。編譯的腳本運(yùn)行速度更快,而且只需較少的處理能力就能執(zhí)行。編譯器在服務(wù)器上運(yùn)行。從存儲在服務(wù)器上的HTML表示內(nèi)容中提取腳本。然后將編譯的腳本代碼通過廣播或在線從服務(wù)器傳送到客戶機(jī)設(shè)備,供在客戶機(jī)設(shè)備上進(jìn)行內(nèi)容顯示期間執(zhí)行。編譯的腳本運(yùn)行速度更快,而且只需較少的處理能力就能執(zhí)行,并且能在不需要該語言的解釋器的客戶機(jī)設(shè)備上運(yùn)行。文檔編號G06F17/00GK1529849SQ02807550公開日2004年9月15日申請日期2002年2月1日優(yōu)先權(quán)日2001年2月2日發(fā)明者P·維拉,P維拉申請人:開放電視公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1
兰考县| 莆田市| 呼伦贝尔市| 郧西县| 鄂托克旗| 恩平市| 沽源县| 海城市| 额尔古纳市| 文山县| 邯郸市| 开阳县| 澄迈县| 徐州市| 无极县| 宜良县| 方山县| 上林县| 桐城市| 凤山县| 秦皇岛市| 蕲春县| 深圳市| 湟中县| 健康| 兰西县| 康平县| 凤阳县| 永城市| 无棣县| 河曲县| 张掖市| 冷水江市| 大丰市| 南华县| 湾仔区| 和平区| 晋州市| 东方市| 邢台市| 确山县|