编译用于交互式电视的解释性语言的方法和装置的制作方法

文档序号:6355715阅读:180来源:国知局

专利名称::编译用于交互式电视的解释性语言的方法和装置的制作方法
技术领域
:本发明涉及交互式电视内容显示的领域,特别是涉及从例如HTML页的文本标记语言提取(extraction)例如JavaScript的解释性语言,以及在服务器上编译JavaScript,用于下载到客户机设备去执行由广播、因特网或者交互式电视显示空间中的高速缓存提供的内容显示。
背景技术
:交互式电视系统可被用来向观众(viewer)提供各种各样的服务。交互式电视系统能够传送典型的视频节目流、交互式电视应用、文本和图像、web页和其它类型的信息。交互式电视系统也能够记录观众的操作或响应并且能被用于诸如市场营销、娱乐和教育等目的。用户或观众可以通过订购广告产品或服务、在游戏节目中与对手竞争、请求关于特定节目的专门信息或者漫游信息页而与系统交互。一般来说,广播服务提供者或者网络运营商生成一个向观众的电视发送的交互式电视信号。交互式电视信号可包括一个由应用程序码或控制信息组成的交互部分,以及一个由电视节目或其它信息显示组成的音频/视频部分。广播服务提供者将音频/视频部分和交互部分组合成单一的信号,用于向连接到用户电视的接收器发送。该信号在发送前一般被压缩,并通过诸如有线电视(CATV)线路或直接卫星传送系统的典型广播频道被发送。一般来说,连接到电视机的机顶盒控制电视的交互功能。机顶盒接收由广播服务提供者发送的广播信号,把交互部分与音频-视频部分分离并解压信号的各部分。例如,机顶盒用交互信息来在音频-视频信息向电视机发送期间执行应用程序。机顶盒可以先将音频/视频信息与由交互应用程序生成的交互图像或声音组合,然后向电视机发送信息。交互图像和声音可以把额外信息展示给观众,或者可提示用户输入。机顶盒可以通过调制解调器连接或者电缆将观众的输入或其它信息提供给广播服务提供者。按照它们的聚集(aggregate)特性,交互电视系统提供最好能以被客户机或观众理解的各种不同通信协议提供内容,这些客户机和观众从广播服务提供者/网络运营商接收信息。客户机一般是一个带有具有有限处理能力和通信带宽的处理器的机顶盒。各种协议的翻译超出了一般机顶盒处理器具有的有限处理能力。此外,存在利用多个web作者工具(authoringtools)产生内容的多个源。这些源倾向于用超文本标记语言(HTML)作为处理HTML页面中嵌入的JavaScript的标准。JavaScript一般是被解释的。客户机设备一般具有有限的处理能力和通信带宽,不能快速有效地解释和执行解释性语言。因此,需要一种具有鲁棒性(robust)的客户机和服务器体系结构,它不需要对HTML码中嵌入的JavaScript进行解释,就能使HTML编码的内容被客户机或机顶盒处理器显示,从而不需要大量的处理能力和通信带宽。
发明内容本发明针对以上讨论的交互式电视环境的需要。本发明提供一种包含软件和硬件的方法和装置,用于从诸如HTML的输入语言中接收和提取诸如JavaScript的解释性语言,并编译该解释性语言供在客户机设备上显示。多个页共用的一个编译的JavaScript页只被发送一次,并被编译的页作为一个外部页引用,因此减少了要传送的数据量以及相关的带宽。观众或客户机可以是机顶盒处的观众、移动电话用户、数字助理、袖珍PC或任何其它电子接收设备。本发明与已知系统相比有突出的优点。本发明提供用于从HTML页提取脚本(scripts)并在服务器上编译脚本,用于在客户机设备上执行,这是对已知系统的改进,在已知系统中,浏览器在同一个机器上解释并执行脚本。本发明也从HTML文档中收集每个语言一例如JavaScript或任何其他脚本语言--的脚本,以便将这些脚本合成一个包,用于将该包传送给编译器,使得一些脚本或所有脚本在一起编译。脚本是以多种方式嵌入在HTML文档中的。例如,在一对<SCRIPT>和</SCRIPT>标签之间,或者作为事件处理程序(handler)的属性(attribute)值。本发明分析HTML文档,将(例如JavaScript的特定语言的)脚本聚集成一个包(package),然后调用编译器。可以将有些脚本(例如包含脚本)段单独编译成不同的模块。所有模块都被发送到客户机设备去执行。这允许例如编译的脚本(compiledscripts)在不同的HTML页上被共享。这意味着编译器有一个可能与用于编译主文档脚本的接口不同的、用于编译包含脚本(includedscripts)的接口。创建单一编译的模块(compiledmodule)因此更容易和更简单。客户机设备知道如何像对单一脚本那样链接和执行编译的脚本段。可以将编译脚本高速缓存起来,使得如果脚本已经在高速缓存中就不进行编译。本发明也在脚本中提供编译时间标记器(marker),以便只在常用的HTML浏览器上执行代码(即永远不在客户机设备上执行)。现有系统使脚本能在浏览器(InternetExplorer、Netscape等)正在运行时的执行时间检测。在本发明中,优选的编译器识别一个关键词,例如”JS2O”。在”if(JS2O)DO_A;elseDO_B”的这样一段代码中,编译器将不编译”DO_B”,因为它知道”if(JS2O)”总是真的。因此,整段代码将被编译成”DO_A;”。脚本编译器不编译永远不在客户机设备上执行的代码,因此减少了编译代码大小,改善代码执行时间。编译器用编译时间绑定(bindings)代替一些迟绑定引用(latebindingreferences),以便在客户机设备上更快速执行。现有技术系统在执行时间解析引用。例如,在JavaScript中,当访问标识符”foo”时,脚本引擎将在范围链(scopechain)中查找名字”foo”。这当然花费时间。这里,编译器(在有些情况下)把标识符”foo”连接到一个特定地址,以便在运行时快速访问。例如,在JS2O中,(有些)属性(properties)与C语言中的常规全局变量一样被分配到内存空间中,而(有些)属性则与C语言中的常规局部变量一样被分配到堆栈中的槽(slot)中。编译器用绝对值替换一些迟绑定引用,以便在客户机设备上快速执行。在这个实施例中,编译器不是把标识符连接到一个地址,而是把标识符直接用一个值替换。例如,在JavaScript中,标识符”NaN”是某对象的一个属性。这里,直接用其值替换到”NaN”的引用。优选的编译器支持一个定义新的对象类的接口。这使编译器能访问和/或优化那些对象的创建和操作,并允许运行时(runtime)与该类的代码连接。该类代码可以以一个OpenTV模块实现。在优选实施例中,H2O定义一个说明新的对象类的HTML语法。编译器支持一个定义预定义的/外部的对象实例的接口,这使编译器能访问和/或优化那些对象的操作,并允许运行时访问那些对象。那些对象是在脚本执行的外部创建的。在优选实施例中,H2O定义一个说明预定义的/外部的对象实例的HTML语法。通过阅读以下的详细说明并参看各附图,本发明的其它目的和优点将显而易见。图1是向客户机设备提供内容的前端(head-end)的示意图;图2是向客户机设备提供内容的前端的示意图;图3是向客户机设备提供内容的前端的示意图;图4是向客户机设备提供内容的前端的示意图;图5是H2OHTML代码转换器体系结构图;图6是H2O浏览器处理和数据流图;图7表示H2O和JS2O之间的接口;图8表示JS2O编译器的组件;图9表示作为JS2O命令行编译器的编译器;图10表示客户机上的编译的JS主代码模块的执行;图11表示一个优选数据段(segment);图12表示一个优选堆栈段。尽管本发明可以有各种修改和可替换形式,在附图中举例表示它们的特定实施例,这些实施例将在本文中作详细说明。然而应当明白,附图和对附图的详细说明并非是要把本发明限制到所公开的特定形式,相反,本发明旨在包括落在如后附权利要求书所定义的本发明的精神和范围内的所有修改和可替换形式。具体实施例方式现在转到图1,服务平台50包含一组应用,它们被粗略划分成三个类别内容转换204、事务处理控制/商务功能206和传输转换207。服务平台使服务(services)200与客户机212交互。服务200通过通信链路202与服务平台50进行通信。服务平台50又与客户机212通信。客户机212可以是机顶盒(STB)、数字助理、移动电话或任何能通过通信链路230与服务平台通信的其它通信设备。内容转换204和传输转换207服务提供传输和通信功能,商务功能服务则提供商务控制功能。如图2中所示,事务处理控制/商务功能206分布在服务平台和客户机212之间。例如,某客户机能执行一些商务功能(例如执行广告运作规则和广告/商务过滤器来选择被观看的广告)和选择内容,它们更适合客户机212(例如选择一个符合用户特征的广告或节目)。图2的功能在图3中被扩展。如图3中所示,商务功能206包含4个主要功能组件服务管理器238、观众管理器240、事务处理管理器242和广告(Ad)管理器244。接着是一个优选实施例的一例高级操作流程。现在参看图3,服务200与网络运营商谈判,以通过前端运营商的服务平台向订户提供服务。网络或前端运营商用服务管理器238来登记服务和与服务相关联的协商过的商务规则222(例如时间安排、带宽要求、有权访问观众信息的服务)。服务管理器238存储服务数据216(例如URL地址、内容)。根据商务规则222和服务数据216,服务管理器238与广播通信234功能通信,以从内容提供商提取内容。当内容被从服务200提取时,它可以被内容转换204和内容过滤器224处理,以将内容转换成适合客户机设备212的形式。广播234功能将内容转换成适合广播234网络的形式。客户机212在广播链路211上接收转换后的内容。客户机212和服务200通过点对点链路210和点对点功能组件232进行交互,其作为传输转换207的一部分。服务200可包含购物、音频/视频、游戏、投票、广告、消息发送或任何其它服务。客户机212通过点对点232通信链路与服务平台50和服务200通信。负载平衡器236与商务功能206交互,以确定广播234通信链路211和点对点232通信链路210之间的最优负载分布。平台商务代理226用商务规则222来控制服务200与客户机212之间的交互和信息交换。例如,网络运营商可以选择阻止服务200对用户信息的访问。服务200最好要根据商务规则222和服务数据216付费来访问用户信息。观众管理器240在用户数据220中存储客户机/用户信息。平台商务代理226控制去往服务200的观众信息流。事务处理管理器242记录在服务200和客户机212之间交换的事务处理信息。根据商务规则222和用户数据220,广告管理器244确定将哪个广告和哪类广告通过广播链路211和点对点链路210呈现给客户机。图4表示服务平台50的优选实施例的另一个例子。服务200通过因特网或者通过网络运营商可接入的另一个网络或通信通道提供购物、聊天和其它服务。使用该服务平台,网络运营商访问这些服务。包含服务管理器238的商务功能206与轮流传送(Carousel)管理器254交互,以从服务200提取内容。轮流传送包含一个从服务平台50到客户机的重复的音频/视频/互动数据流。轮流传送管理器254、事物处理管理器242和服务管理器238控制对广播轮流传送的内容插入和删除。服务内容被提取后,被H2O248转换成一个适合客户机的格式。H2O248是内容转换204和内容过滤器224的一种可能的实现。H2O将HTML内容转换成服务平台/客户机可读的内容。转换的内容被格式化成数据轮流传送并被开放式流(openstreamer)256多路转换,用于向客户机212广播。客户机212与服务交互,必要的话与服务平台和服务200通信。点对点通信要经过服务网关246。服务网关246进行传输转换,以把STB协议转换成平台商务代理226和H2O248期待和理解的形式。负载平衡器236与商务功能206、轮流传送管理期254和服务网关246交互,以确定广播链路241与点对点通信链路210之间的最优负载。商务功能206与平台商务代理226交互,以控制服务200与客户机212之间的访问和信息交换。在本发明的优选实施例中,H2O是一个客户机/服务器解决方案,它使因特网内容开发者能为运行服务平台的网络运行商建立交互式电视应用和服务。服务平台使观众能访问向大规模增长的交互式电视应用的世界市场开放的更大的因特网才能(talent)和内容库。H2O服务器处理将因特网内容(HTML页、ECMA脚本和HTML页格式)转换成服务平台资产。H2O客户机处理提供这些资产并与客户机212交互。在T-商务/E-商务案例情形中,H2O使E-商务商店能用现有的Web工具来建立购物服务和用标准Web协议与优选的服务平台(运营商)接合。H2O充当作为服务网关和广播工具以转换Web内容的代理(proxy)。H2O从广播源和在线资源(onlinesources)接收HTML。本发明使网站能用它们当前的HTTP服务器和应用服务器来生成交互式电视内容。在优选实施例中,H2O将HTML、JavaScript和因特网图像转换成客户机可兼容的代码,最好是Ocode,这是一种在机顶盒的虚拟机上运行的基于C的OpenTV代码。可以将任何其他已知或开发的协议添加到H2O的功能中。H2O使服务平台能与不完全是浏览器的客户机机顶盒通信,并创建初始用户界面。H2O使服务平台能连接到任何只使用HTML的商务引擎。H2O负责将诸如HTML页、JPG图像、波音频文件(waveaudiofile)等Web内容转换成能在客户机上以最小的处理能力和带宽就能使用的对客户机友好的资源。H2O的服务器侧是一个HTTP代理H2OS。为了其它目的,可以将它打包为DLL或批量工具(batchtool)。H2O的客户机侧是一个STBOCOD应用,即H2OC。H2OC建立在诸如服务网关库或轮流传送加载库的其它服务平台客户机组件的顶上。H2O使URLs能被用来对文档和服务寻址。H2O使得能够在广播和在线环境中进行跟踪。H2O提供HTTP代理功能。服务平台应用通过H2O请求文档。H2O检索文档,分析文档,编译文档,然后把文档返回到请求者。这一H2O功能使得能把同一个引擎用于在线及广播的不同用途,便于扩展,并使得能够灵活地使用H2O。分析与文档的类型有关,例如,H2O分析可以是HTML分析、GIF图像、或者JPEG图像等等。为了使其可扩展,H2O提供“插入”和运行新的第三方过滤器的功能。H2O支持特殊标签,这些标签包含A/V控制、信道控制、屏幕显示(OSD)控制和触发器(Triggers)。H2O支持W3C标签,包含图像元素(x,y,z)的受控定位。JavaScript库包含数学(Math)、域(DOM)和日期(Date)。H2O的客户机侧H2OC在客户机或STB中构造图像资产。H2O使得能够用户观看的页在接收时被更新显示。H2OC使用其它服务平台组件提供的库(通信、轮流传送等等)。H2O使得能在单一更新中刷新一页,但是也提供选择,以在资产被加载时在部分更新之间选择,而不是等待所有或一些资产加载。H2O使得能够对第三方类进行动态链接/解除链接。在广播方式中,优选地提供一个在开始一个新页时不被清除的全局永久对象。永久对象保持页之间的前后关系。在变换时也将服务平台所提供的其它基础(base)对象永久化(例如站控制OSD)。小配件(gadgets)是客户机定义的方法。小配件是通过接口定义语言被定义的,以便使得能创建新的小配件、修改小配件,以及使得能在不修改本发明的JS2O编译器4000的情况下添加方法。现在转至图5和6,接着讨论主要的H2O组件。H2O代码转换器2001将HTML输入2062转换成H2O译码(transcodes),后者能被在例如OpenTV机顶盒的客户机设备中的H2O浏览器有效地和交互地显示。H2O浏览器以有限的动态HTML4方式阅览H2O译码。诸如HTTP代理2003的宿主(host)调用H2O代码转换器2001。H2O代码转换器2001与MIME处理程序2036和MIMEinfo2028接合,用于非HTML的MIME类型的内容信息。JS2O编译器4000是多线程安全的。H2O代码转换器调用H2OJavaScript处理程序2000来把脚本作为输入,提取外部脚本或类URL,并调用JS2O编译器和预链接JavaScript。JS处理程序2000处理JS定制类2070和JS共享脚本2066。现在转至图6,H2O浏览器2100与JS2OJavaScript运行时2129接合以支持JavaScript。H2O代码转换器以任务的形式运行,通过宿主HTTP代理提取MIME内容,并按请求处理MIME内容。最好提供一个接口与代理宿主,以处理高速缓存机构,提高效率。H2O代码转换器同步地执行。H2O代码转换器支持HTML4.01W3标准的一个选择的子集。H2O代码转换器支持一个文本子集段落、行、短语;列表子集;表子集和链接子集。H2O代码转换器支持一个对象和图像元素子集。H2O代码转换器也支持过滤器制作侧(authoring-side)对象(例如IE(InternetExplorer)定制对象)并支持STB的运行时定制对象;制作侧(PC)和STB定制对象类开发;图像映射的子集(客户机侧、服务器侧);表单和表单控件的子集;脚本元素;以及JavaScript子集。在H2O代码转换器中,HTML节点含有在元素节点中计算过一次的CSS信息。额外的CSS即使被保留也是非常有限的。这与CSS的动态级联规则是根本不同的。由于样式(style)改变最好只应用到一个节点,因此动态样式是有限的。这意味着,要通过DOM查询特定元素的样式属性并期待它返回一个有效值,就要明确地在内联样式(inlinestyle)内为该元素规定样式属性(例如style=color:red),或者明确地在JavaScript代码中创建该样式属性,以便PC模拟可以类似的进行。本发明调用一个H2OJavaScript处理程序任务来处理Script元素数据。JavaScript处理程序任务提取脚本URI并调用JS2OJavaScript编译器。JS2O返回一个含有编译的JavaScript代码模块的数据包。JS2O可以将编译的JavaScript脚本高速缓存起来并匹配重复的类似和相同的JavaScript脚本。本发明用客户机兼容的资源从具有布局和有限样式信息的分析器引擎内部数据模型生成H2O译码,并生成JavaScript代码。H2O译码格式的一般说明包含代表客户机或STB的文档和JavaScript代码的客户机兼容的资源的译码部分。译码格式含有关于树形结构的文档的信息。该格式是高效的、紧凑的和可扩展的。该格式提供一个版本号来保证在客户机或STB中的一致性。例如,在优选实施例中,提供一个客户机可兼容的对象模型,即OTV对象模型(OOM),供开发者用于创建定制类。OOM提供一种机制,用于开发定制对象类、加载/登记/未登记/卸载类,并用于访问类接口代码,以操作定制对象。OOM的设计和实现用JavaScript对象模型来避免重复劳动。OOM提供一个接口,使JavaScript和C程序能操作对象。HTML、OOM和C程序没有JavaScript也能工作。本发明提供具有选择的命名方案的轻量级客户机侧注册表(registry)。注册表使得能将一个类模块与一个名字和查找相关联。OOM加载一个类模块并注册该模块。一个类只有一个接口。接口只含有方法。每个方法与一个在这个接口范围内唯一的串名字相关联。OOM提供一种从一个类创建一个对象实例的机制,并提供一个提供类引用机制。OOM处理类卸载。OOM定义H2OHTML和JavaScript引擎之间的控制流和数据流。OOM为JavaScript引擎实例化浏览器对象。OOM向JavaScript引擎暴露DOM对象的访问。类的对象是其方法属性是类接口的方法的对象。OOM为定制对象定义接口、准则和一个SDKAPI子集,以便能集成到观看结构、观看更新、事件处理、焦点中和对共享系统资源的访问中。一个控制器指导浏览器行为和组件,并处理事件。控制器提供快速启动时间响应,这是由诸如在启动时图像显示等各种技术实现的。本发明的优选控制器使用事件、下载、mpeg、osd、A/V等系统资源,并控制数据模型和查看。控制器也处理原始的并处理客户机(最好是OpenTV)事件2146。控制器处理原始对象事件,后者又生成DOM事件2140、2134。本发明支持处理DOM事件冒泡(bubbling)2138并用焦点节点作为起始节点。DOM事件可被JavaScript事件处理程序2128代码处理。优选控制器预定义元素类并因此比定制类更有效。控制器使用URI检索器(retriever),获得URI内容,使得HTTP得到和发送(表单发送)请求、获得响应并提供文档打开和后退/前进功能。在优选实施例中,数据模型主要是运行时HTMLDOM,以及其它类别的运行时数据模型。HTMLDOM也含有反映它们预期效果的查看信息。查看最好支持不同的颜色样式,并把颜色表当作一个共享资源。在优选实施例中,根据配置提供一个有限的MIME类型处理程序集合以节省内存。用于PC环境的流行的HTML浏览器一般为JavaScript运行时暴露浏览器特定的宿主对象以便操作。本发明支持用于JavaScript运行时的微软InternetExplorer5(IE5)宿主对象的一个子集。本发明调用H2OJavaScript类型处理程序(JS处理程序)。JS处理程序遍历元素树,以收集JavaScript全局代码、函数(function)、对外部脚本的链接引用、对象类链接引用和宿主代码(来自时间处理程序属性)。H2O调用H2OJavaScript处理程序并将这个收集传送给它。JavaScript处理程序任务提取脚本和类MIME内容,调用JS2OJavaScript编译器,后者返回一个含有编译的JavaScript代码的客户机兼容的代码模块。这个脚本集带回句柄给代码。该函数按软件附录中所示那样被调用。代码转换器遍历元素节点树并用内部客户机兼容的资源生成器生成客户机兼容的例如OTVH2O译码。本发明配置组件、显示、启动等等。静态和动态配置是在编译时静态地确定的。现在转至图7和8,JS2O编译器3904将H2O3900引擎与3902接合,以将JS代码编译成客户机兼容的代码模块3906,最好编译成OpenTVocode模块。JS编译器4000用下面描述的C/C++API与H2O引擎接合。JS2O编译器是可重入的,被划分为以下组件JS2O页元素编译器4002、JS2O高速缓存4004、JS2O前端4006和JS2O后端4008Ocode二进制汇编器4010和代码模块生成器4012。所有编译器组件都是可重入的,并用内存缓冲器互相传送数据。现在转至图8,也参看图5,H2O过滤器2064从输入HTML页2062提取输入JavaScript,并将它们发送到页元素编译器4002,用于在单一显示页内聚集。H2O从广播链路以及从在线连接二者中接收HTML页。页元素编译器4002从H2O2030接收(来自某个HTML页的)JS元素,在内部为一个HTML页将所有元素聚集成一个JS代码块,然后调用JS编译器4000将该JS页编译成一个代码模块。一个JS页是来自一个或多个HTML页的所有JS代码的聚集。H2O和JS2O页元素编译器之间的接口3902、3906在下面作描述。JS2O的可选高速缓存4004接收一个JS页,将该页与其它被高速缓存的编译页比较。如果被高速缓存,则使用被高速缓存的页。如果还没有被高速缓存,JS2O就调用JS编译器4006。最好对最后100个编译的页进行高速缓存。所有JS2O编译器线程共享该高速缓存,因此,访问高速缓存是受到保护的。JS编译器前端4006首先将JS代码编译成一个中间格式,然后用专用于JS2O的代码生成器将其编译成客户机兼容的代码。JS编译器后端4008接收整个JS页作为预分析和预编译的树。JS编译器后端利用来自二进制汇编器4010的输出直接生成二进制格式的客户机兼容的操作码(opcode),例如Ocode操作码。JS编译器后端在代码模块生成器4012中生成客户机兼容的代码模块。客户机兼容的二进制汇编器4010-例如Ocode(特定于OTV的)二进制汇编器提供一个用于生成客户机兼容的二进制操作码的API。这个汇编器支持JS编译器所需要的操作码。本发明也在指定了选择时创建一个源汇编文件。这个文件含有所有调试(debug)信息(.stabs)和与二进制编译器完全相同的代码/数据。能为那些想要调试JS页源代码的人单独编译这个汇编文件。代码模块生成器4012提供一个用于输入二进制操作码和输出客户机兼容的代码模块4102的API。优选地,本发明也生成一个用于存放元(Meta)信息的客户机兼容的模块标头(在内存中)。JS2O编译器使得能测试和验收JS编译器,并且也使得能测试客户机兼容的Ocode生成器和页元素编译器4002。现在转至图9,在一个操作方式中,JS2O命令行编译器4100按一个简单命令行接口操作,该命令行接口以JS源文件作为输入,并输出客户机兼容的Ocode汇编文件4112。JS2O编译器也能可选地输入一个外部对象类定义。命令行接口4104与具有和H2O相同的API-即(如在JS2OFFS中所定义的js2o_compile...API)-的JS2O页元素编译器4004通信。以下选项是命令行JS2O编译器可用的。Js2o-g-O-iinputfile-ooutputfile-cclassmodule-pnameclassmodule-i输入文件,-o输出文件,-g生成调试信息,-O优化,-c定义外部对象类,“classmodule”是具有特殊标头信息的客户机兼容的代码模块,-p定义一个名字为”name”的并且是属于由“classmodule”代码模块所定义的类的预定对象。输出文件被用一个例如是OpenTV软件开发工具包(SDK#)中的一个Ocode汇编器的客户机兼容的编译器,或者用一个C编译器前端(例如gcco)编译。Ocode二进制汇编器和代码模块生成器按相同的二进制对象格式工作。SDK工具为ocode对象文件提供一个”a.out”格式。H2O运行时4202和JS2O运行时4204可以是同一个客户机兼容的代码模块的一部分。在优选实施例中,预定类模块4200是用于内置OOM和DOM对象类的代码。JS2O运行时包括内置JS类。JS2O编译器4000生成JS主代码模块4206和JS外部代码模块4208。外部类模块4210和其它模块最好是C模块。JS2O提供一个与所有JS编译的代码模块链接的、客户机兼容的例如Ocode库。这个库由小函数组成。大函数被存储在JS2O运行时模块中。例如,”addtwointegers(加两个整数)”函数在Ocode库中,但是任何类型的”genericadd(类加)”函数都在JS运行时模块中。所有入栈的值最好都是js2o类型的,以适应垃圾收集(garbagecollection)。在有些情况中有可能压入某些非js2o类型的值,当肯定这些值是在任何垃圾收集可能发生之前被弹出的。当如软件附录中所示的编译器输出一个原子指令(atomicinstructions)集时,就是这样的。垃圾收集垃圾收集(GC)为JS2O动态对象和串管理内存分配。每一次启动一个新页时GC开始新的(所有以前分配的内存最好都丢弃)。GC使用一个标记清扫(markandsweep)算法。每一次启动一个新的垃圾收集时,标记值递增1。因此,GC不需要一个第二回合来清除标记。JS2O运行时引擎动态地创建对象和串。它们是被当垃圾收集的。动态创建的对象和串是通过变量(局部的或全部的)、通过堆栈中的临时值、以及通过对象属性被引用的。标记清扫算法必须遍历它们全部来标记被使用过的项。页持久对象是在多个页上保持有效状态的对象。页持久对象最好不保存对JS值(对象或串或其它)的引用,以免在模块未链接时切换页时发生问题。页持久对象最好制作它们自己的数据备份。现在转至图11和12,页中使用的JS全局变量和页中引用的对象(甚至预定义对象)(在编译时)被在JS代码主代码模块的数据段4300中分配一个槽(slot)。局部变量和参数每个都在执行堆栈中有一个槽。编译器也在堆栈中生成中间值或”临时值(tempvalues)”。标记算法遍历所有那些槽并标记所有动态对象和串,以及递归地标记在任何对象的属性中被引用的所有对象和串。垃圾收集器提供一个API,例如voidjs2o_mark_val(js2o_valjsval,intmarkvalue);voidjs2o_gc_mark(int*js2o_fp,int*js2o_sp,int*js2o_first_fp,intmarkvalue)。js2o_mark_val函数用指定值标记js2o值。如果该值是个对象,这个函数负责调用对象MarkPropertiesvtable函数,并负责标记原型(prototype)值-如果有的话。js2o_gc_mark函数遍历所有JS全局变量(globals)和所有JS调用栈(callstack)并标记所有临时值、局部变量(locals)、自变量(arguments)和全局变量,如图12中所示。GC也检查“自变量(args)数”槽,但是这在GC中无关紧要,因为它们是js2o_int类型。本发明提供一个通用API来存储单一串中的动态属性。API包括该串中的属性名和属性下标(index),用于对二者的快速访问。这个代码假设最多255个属性,属性名最大长度127个字节(不包括最后的零字符)。每个属性名被以”N-name/”的格式存储在一个单字符串中,其中N是一个单字节,含有下标属性号+1。Name是属性名本身。这个格式假设’/’和’-’对于名字来说是非法字符。N含有一个从1到255的下标。字符’/’和’-’可以被不在有效的名字和数字中使用的任何字符替换。以下函数将一个属性名设定为一个指定值。如果该属性不存在,就增加。voidprop_set(js2o_prop*prop,char*name,js2o_valval);以下函数取得一个指定名字的属性。如果该属性不存在,就返回JS2O_NULL。Js2o_valprop_get(Js2o_prop*prop,char*name);以下函数去除一个指定名字的属性。如果该属性不存在,什么都不发生。voidprop_remove(js2o_prop*prop,char*name);以下函数取得一个指定下标(0到n)的属性名。如果该下标不存在,就返回JS2O_NULL。该函数假设它被以从0开始的连续下标数调用。js2o_valprop-index_get_name(js2o_prop*prop,intindex);以下函数用指定的标记值标记所有属性,用于垃圾收集。voidprop_mark(js2o_prop*prop,intmarkvalue);以下函数释放被这个属性列表内部使用的所有内存。voidprop_free(js2o_prop*prop)。Js2o运行时提供下列APIjs2o_obj*js2o_funcobj_create(js2o_obj*this,void*func);这个函数创建一个具有指定的”this”指针和函数地址的函数对象。每次调用这个函数时,该指定的”this”指针被作为第一个参数传递。voidjs2o_funcobj_delete(js2o_obj*objf);这个函数删除一个函数对象。它并不实际删除这个函数对象。如果这个对象不被引用,以后将由垃圾收集来删除。该函数把对象重新设定成空值,这样访问这个对象是安全的(可选地生成运行时警告或错误,但如果执行不存在的代码将不会死机)。voidjs2o_to_null_object(js2o_obj*obj,size_tsize);这个函数被用来将一个现有的对象改变成类型为JS2O_NULL_OBJECT的对象。其大小保证原始对象足够大足以被转换成一个空对象。这个函数也能被用来安全地“去除”一个可能被一些变量引用的对象。js2o_valjs2o_dstr_create(char*str);这个函数创建一个具有指定的串字符的JS2O串类型。该串在这里被复制。js2o_valjs2o_dstr_create_static(char*str);这个函数创建一个带有指定的串字符的JS2O串类型。该串在这里不被复制。假设str指针是有效的。JS2O中的JavaScript语言是ECMAScript语言ECMA-262的子集。有些在JS2O中不被支持的特征(features)是要求在客户机设备上编译的特征。其它特征支持考虑是运行时速度,包括编译器最优化可能性、运行时大小、和STB/客户机设备环境中的有用性。以下的JS特征在优选实施例中的本例中的JS2O中不被支持。RegExp类、Eval函数、嵌套函数定义、调用对象、自变量对象、”with”语句、具有动态自变量或体的函数构造器、监视/非监视(Watch/unwatch)方法、_parent_and_proto_(导航器特征)、ImplicitThis属性、ImplicitParents属性、Try/Catch/Throw语句和所有错误对象、其他选择的方法和预定义JS对象的属性。在优选实施例中,在JS2O中实行以下限制,然而,可以按照需要选择不同的参数或限制值。属性名最大长度127字节(不含最后的空字符);每个单一对象的最大属性个数255;整数值是29个有符号位(-268435456,#+268435455);浮点值是31位。如果构造器不返回一个不同的对象,则丢弃构造器的返回值(如果有的话)。动态对象不覆盖(overshadow)预定义的对象。那些预定义对象的名字是保留字。静态定义的函数不能被其它函数覆盖(意味着那些方法是全局对象的只读属性)。保留一个有限的名字集合。保留所有以JS2O开始的、带有或没有下划线前缀的名字。有些函数将不能作为JS对象被访问,例如预定义全局函数。JS2O脚本的运行时(runtime)执行的首选行为是例外处理一个运行时错误或者没执行任何操作,或者停止JS执行,或者甚至停止页提交。计算溢出运行时不检测整数的溢出。以下JS对象受JS2O支持。对象;算术(Math);串;数;布尔;数组;和函数。JS2O包括对OSD、通道(Channel)之类的预定义的客户机兼容的特定对象的支持。窗口对象有本身就是对象的“事件”、“文档”和“导航器”(navigator)属性。窗口对象有许多方法(例如back())。窗口对象的所有属性和方法都是可直接访问的。H2O(HTML至客户机兼容的代码,例如Ocode)引擎将多个HTML页转换成客户机兼容的格式,例如并行的OpenTV格式。具有可重入的JS编译器简化了接口并改善了性能。编译器是可重入的,为了进行尽可能多的优化,编译器在一次编译中编译来自单一HTML页的所有JS代码。为了对JS2O和其它功能进行优化,编译器具有下列特点编译器对不受支持的特性和限制给出特定的错误消息,并在开始代码生成之前分析整个文件(对被定义前就被调用的函数来说尤其需要)。编译器对一个函数的引用,最好在在当前编译中定义的函数与全局定义的函数或其它函数之间作出区分。函数对象为了区别对对象的访问和对函数的调用,对变量的引用被区分为局部变量、全局变量和其它变量。编译器能确定一个名字指的是一个已知函数还是已知变量。最好提供一个调试选项,以打开或关闭调试消息。提供优化选项,以打开或关闭各种编译优化。如果某函数调用缺失某些自变量,则编译器发出警告。变量类型在有些情况下,编译器知道正在被使用的变量的类型。编译器在代码中维持变量的类型。类型也可能是“未知的”。编译器维持元数据(源文件、行号等等),以便代码生成器能输出程序和数据的调试信息。特别地,编译器提供对下列的静态编译的访问局部变量、(在当前编译中定义的)全局变量、(在当前编译中定义的)函数、以及预定义对象和它们的属性。编译器提供一个用于输入预定义对象定义的接口。注意到因为JS函数内没有“块范围”(函数中定义的所有局部变量在整个函数中都是有效的,不管它们是在哪里被说明的),编译器为函数前言(prologue)内的所有局部变量保留空间。所有变量具有缺省值JS2O_UNDEFINED。编译器前言设置所有局部变量的指。所有“未初始化的”全局变量被设置为该值。JS2O编译器提供一个具有H2O分析器的API,如软件附录中所示。这个API是多线程安全的。这些API被调用的次序对于保证有序的代码生成来说显然是重要的。方法”js2o_compile_create”创建一个编译处理程序;文件名(filename)是JavaScript源文件的名字。这个filename只被用于错误消息。为编译器提供编译的选项(例如优化、外部文件、调试等等)。如果出错,函数返回空(NULL)。方法”js2o_compile_destroy”破坏该处理并释放所有相关的内存。方法”js2o_compile_generate”对注册到一个编译块中的所有段进行实际编译。然后,只调用js2o_compile_error_msg或js2o_compile_destroy。编译的数据最好包含一个OpenTV代码模块(二进制格式的)。方法”js2o_compile_error_msg”返回适合于stderr上fprintf的最近的错误消息。该错误消息在一个对js2o_compile_destroy的调用后被释放。方法”js2o_compile_warning_callback”注册一个用于警告消息的回调(callback)函数,‘callback’是一个指向一个回调函数的指针,’data’是一个将被传递到回叫函数的值。回调函数的原型是‘voidfunc(void*data,char*msg,js2o_handlejh)’。警告消息在回调后被销毁。注册一个空回调以去除一个回调。缺省设置中没有回调函数。方法”js2o_compile_add_src”向编译添加一段文字代码,”linenum”是这个代码的第一行的行号,我们假设这是来自在js2o_compile_create中指定的文件。句柄(handle)参数被用于事件处理程序代码在这种情况下句柄是一个被用于返回一个句柄值的指针。这个局柄值最好被用来在运行时执行这个代码(也见js2o_execute)。在其它情况中,即不是一个事件处理程序时,句柄是空的(null)。这个函数保持代码的一个内部拷贝。优化对于多个使用相同代码的时间处理程序,js2o生成处理程序代码的一个实例。代码最好有原始源文件中的所有新行(\ncharacters),以便行号有意义。方法”js2o_compile_add_bin”包括一个预编译的js2o文件。在运行时该预编译文件中的任何全局语句都在这个位置被执行。该名字被JS2O在运行时用来定位外部模块。如果相同的文件包含在一个HTML页中的几个位置,则最好每次用相同的名字调用这个API。该模块指向客户机兼容的代码,例如OpenTV代码模块(包括标头)。方法”js2o_compile_add_obj”定义一个可用的预定义对象。”objname”是对象的名字。类是由客户机兼容代码定义的,例如由”classmodule”所指向的.otv模块(包括标头)。该模块在运行时不被JS2O引用(对象是由H2O创建的)。注意这个API不定义一个可从JS源代码访问的新类。方法”js2o_compile_add_class”定义一个可用的预定义类。该类是由客户机兼容代码定义的,例如由classmodule所指向的.otv模块。类名字(要在‘新’JS语句中被使用)也在该模块内指定(模块标头)。类名字被JS2O在运行时用来获得这个类的函数构造器。方法”js2o_compile_add_element”定义一个新DOM元素。这将增加一个具有指定名字的全局变量。函数返回一个变量句柄。这个句柄在运行时被H2O用来初始化该对象的地址。可以将外部JavaScript源文件包括在HTML页中。H2O在编译HTML页本身之前编译这个JS源文件。H2O最终在js2o_compile_add_binAPI中传递的(用于编译HTML页内的JS代码的)是已编译的JS文件。要编译外部源文件,H2O引擎以下列说明调用js2o_compile_API在js2o_compile_create中使用特殊选项’externalref’。该API不包括外部文件(没有对js2o_compile_add_bin的调用)。JS2O编译器最好保持一个高速缓存,存放(内存中的)以前编译的JS页,例如最后100页。高速缓存在JS2O内进行,这是因为有些页会有不同的HTML但是在HTML中嵌入了相同的JS脚本。因此本发明将这种JS代码的编译高速缓存在JS2O内。这里,JS页就是一个HTML页中的所有JS代码的聚集。注意H2O内的http代理也实行高速缓存。JS页的高速缓存使得能够在多个显示页之间使用共同的JS。这减少了需要向STB或客户机发送的数据的量。JS代码被封装在客户机兼容代码模块内,例如OpenTV代码模块内。就HTML+JS而言,最好将例如OpenTV代码模块的客户机兼容代码模块嵌入在H2O资源内(作为一个“bigchar”数组)。代码模块格式使得能进行源代码调试。编译器在一个.odb文件中输出调试信息。然而注意,调试程序不知道JS2O类型。最好在gdbo中提供对JS2O类型的支持。JavaScript代码以几种方式在HTML页内被使用可以在HTML页内用一对或多对<SCRIPT></SCRIPT>标签使用JavaScript代码。语法最好是<SCRIPTLANGUAGE=”JavaScript”>任何JavaScript语句...</SCRIPT>将一页的所有内嵌代码和事件处理程序编译成一个单一的主客户机兼容的例如OpenTV模块。H2O和JS2O支持对外部JavaScript文件的引用。在H2O中,将外部JS源文件单独编译、存储和加载,以提高性能。这使得能够发送单一一段代码,即使这个文件在许多页中被使用。允许在单一HTML页中包括相同的文件。J2O在编译主JS代码之前预编译外部JS文件。外部文件被编译成DDL客户机兼容的例如OpenTV模块。对应的HTML语法是<SCRIPTSRC=”URI”LANGUAGE=”JavaScript”></SCRIPT>,其中”URI”指向一个JavaScript源文件。一个外部JavaScript源文件可含有任何有效的JS语句,然而,也可能与其它运行的JS模块有名字冲突。例如,从冲突的观点来看,多个“varyx;”语句是有问题的,但是多个”x=value”则没有问题。全局代码链接将文件编译成一个模块。该模块输出一个含有所有全局代码的函数。这个函数在运行时被调用,正如外部代码是”内嵌”的一样。变量链接预编译文件最好输出正在被其代码使用的所有全局变量,不管是外部的(例如y=5)还是内部的(例如varx=4)。编译的主JS代码在其全局变量中为所有那些输出变量保留一些槽。预编译代码也包括用于其输出的全局变量的槽,但是那些槽实际上含有指向在主代码中的实际变量的指针。地址在运行时被初始化。模块链接在运行时,H2O加载预编译模块,创建JS2O前后关系,然后初始化预编译模块(见js2o_dll_init)。这个初始化进行从主JS代码向预编译模块的变量地址更新。在js2o_compile_add_bin中指定的名字被用来在运行时引用该模块。H2O和JS2O支持对外部预编译文件的引用。对应的HTML语法是<SCRIPTSRC=”URI”LANGUAGE=”OpenTV”></SCRIPT>,其中”URI”指向一个客户机兼容的例如OpenTVJS代码模块文件。这个代码模块定义并支持特定的JS2O要求。链接与对外部JS源文件的相同。可以指定JS代码的一个段作为要在特定事件发生时被执行的HTML属性(例如onClick)的值。按照ECMA术语,这是一个“宿主代码“。语法是OnAttribute=“任何JavaScript语句”将一页的所有内嵌代码和事件处理程序编译成一个单一的主客户机兼容的模块,例如OpenTV模块。事件处理程序可返回True(真)、False(假)或其他状态值。对于链接来说,JS2O在编译时,js2o_compile_add_src为该事件处理程序向H2O返回一个句柄。这个句柄在运行时被用来引用事件处理程序代码。JS代码能访问客户机兼容的对象,例如OpenTV预定义对象(包括DOM对象)。在HTML也中不需要声明(declaration)。对于链接来说,在运行时,H2O最好向JS传递一个预定义对象地址数组。该数组中的预定义对象的列表和次序是预定义的(对H2O和JS2O都是已知的)。H2O最好也传递一个全局函数数组。这些全局函数能为预定义对象执行方法(例如SetVisibility方法)。以下语法例子可被用来声明一个要在JavaScript中使用的新对象类。JS代码能用”新”JS运算符来创建该类的一个实例,”<OBJECTCLASSID=otv_module_uriDECLARE></OBJECT>”在这个例子中,=otv_module_uri指向一个OpenTV代码模块。这个代码模块最好符合JS类对象模块定义。H2O层最好确保这个.otv模块在从该页开始任何JS脚本之前被加载。对于链接来说,在运行时,JS2O用类名字向H2O询问该模块的地址。类名字是内置在OpenTV代码模块中的(在编译时被传递到JS2O)。参见js2o_compile_add_class。唯一的ID标识DOM元素,例如<anchorid=”foo”...>、<src=”xxx.otv”id=”glop”>。DOM元素在JS代码中是用该ID名作为常规全局变量被访问的。在两种情况中,对象都是由H2O而不是JS2O创建的。链接在编译时,H2O用JS2O注册这个元素,其返回一个句柄。这个句柄在运行时被H2O用来告诉JS2O该对象的地址。JS2O提供其自己的数据类型(int,bool,float,objects等等)它们不是标准C类型。JavaScript值的类属C类型是”js2o_val”。它包括所有其它JS类型js2o_int整数值;js2o_float浮点值;js2o_bool布尔值;js2o_ptr指向对象、串等的指针。为了快速和高效的执行,本发明提供单一的32位字来代表堆栈中的所有JS2O数据类型。下面是所有JS2O变量的6个基本类型。任何JS2O值最好都要与这6个基本类型其中之一兼容。为了简便,所有按值传递的类型都适合这个单一的32位数据。优选的浮点格式是seeeeeeeeffffffffffffffffffffff,1位的s是符号位,0表示正,1表示负。8位e是指数域,指数偏差值是127。23位f是分数域。这意味着优选的浮点用一个22位的分数域而不是23位。宏在软件附录中定义。所有JS对象类具有共同的结构。对象结构定义从相同的域开始,类的所有vtable都以相同的基本函数开始。为了快速访问JS2OAPIs和方法,编译器知道所有小配件(gadgets)的结构或者至少知道结构的开始。因为优选的Ocode‘vcall’操作码,虚拟表指针是该结构的第一个域。vtable本身含有对于每个小配件来说是强制性的(mandatory)所有函数的地址,可能还跟着特定于该类的函数的地址。JS2O运行时也需要一个类型和一个指向每个小配件结构的”原型”指针。在软件附录中提供对JS2O对象的开始定义。vtable指向对任何JS2O对象类来说是强制性的函数的数组。强制性函数在软件附录中提供。这些APIs只在类C的前后关系中被JS编译器内部调用。有些参数是C类型(例如intindex,char*name),有些是JS2O类型(例如’this’和返回值),注意参数的次序反映了JS编译器所用的次序。提供以下vtable函数js2o_valGetProperty(js2o_obj*this,char*name)函数返回指定属性的属性值。如果属性存在,但是没有定义值,则返回JS2O_UNDEFINED。如果属性不存在,则返回JS2O_NULL。该函数不彻底察看原型指针,必要时这将由JS2O运行时引擎自动进行。这个函数可假设“原型”属性是由JS2O编译器直接处理的。然而,ValueOf和ToString属性是由这个函数处理的。参看下面的ValueOf和ToStringAPI。如果属性对应于某方法,则返回值是函数js2o类型。小配件类能决定只支持一些公知的属性名,并且只带字面上的名字。在那样的情况下,属性是用GetNumberProperty/SetNumberPropertyAPIs访问的,GetPropertyAPI返回JS2O_UNDEFINED。名字最好是属性名。如果对象是数组类型,’name’也可以是数组中的下标。如果名字代表一个有效的串号(例如“1”)则它是一个下标。如果对象支持数组并且名字是个下标,该函数返回对应的项目号。函数voidSetProperty(js2O_obj*this,char*name,js2o_valvalue)用值设定指定属性。如果属性不存在,小配件可要么创建之(用该值)要么什么也不做。该函数不返回值。该函数可假设“原型”属性是由JS2O编译器直接处理的。然而,ValueOf和ToString属性是由这个函数处理的。名字一般是属性名。如果对象是数组类型,’name’也可以是数组中的下标。如果名字代表一个有效的串号(例如“1”)则它是一个下标。如果对象支持数组并且名字是个下标,该函数应当设置对应的项目号,(如果合适的话)更新其‘length’属性。函数void*GetMethod(js2o_obj*this,char*name)返回这个方法的函数地址。如果属性不存在,或者不含函数,则产生一个运行时例外(见js2o_runtime_error)。该方法返回一个js2o_val值。该方法被用以下自变量调用js2o_obj*this,js2o_intnbarg,js2o_valarg1,...js2o_valargN名字一般是属性名。如果对象是数组类型,’name’也可以是数组中的下标。如果名字代表一个有效的串号(例如“1”)则它是一个下标。如果对象支持数组并且名字是个下标,该函数返回对应于项目号的函数地址。函数js2o_valGetIndexPropertyName(js2o_obj*this,intindex)返回具有下标(0至N)的属性/方法的名字。如果该属性/方法不存在,该函数返回JS2O_NULL。否则返回一个JS2O串值。这个函数主要被’for/in’JavaScript语句使用。该函数假设是按下标序列0、1、2...被调用的。函数js2o_valValueOf(js2o_obj*this)返回对象的值。对象的值是特定于对象的。所返回的类型可以是数字、布尔、串、函数甚至对象。这个API是对GetProperty(this,”ValueOf”),然后对该方法调用的快捷方式。函数js2o_strToString(js2o_obj*this)返回对象值的串表示。这个函数是对GetProperty(this,”ToString”),然后对该方法调用的快捷方式。函数void*GetCall(js2o_obj*this)返回要被执行的函数的地址。这一般只为函数对象而被调用。为其它对象调用这个函数可以认为是个运行时错误。参看js2o_runtime_error。对函数来说,这个API是对Valueof()+得到函数地址的快捷方式。函数voidDeleteProperty(js2o_obj*this,char*name)删除指定的属性。如果属性不存在或者不能被删除,则什么也不发生。函数voidMarkProperty(js2o_obj*this,intmarkvalue)被JS2O垃圾收集器用来标记所有被这个小配件引用的js2o_val值(除了’prototype’域中的被JS2O引擎自动完成的值)。在多数情况下,js2o_val值只是在小配件属性中存储的值。该小配件调用js2o_mark_val函数来标记每个js2o_val。如果操作失败会导致(仍然被小配件引用的)js2o_val被释放。函数js2o_valGetNumberProperty(js2o_obj*this,intproperty_number)与GetProperty相同,除了指定属性号而不是属性名。该API被用于具有预定义属性的预定义对象。该属性号来自公知的名称列表。函数voidSetNumberProperty(js2o_obj*this,intproperty_number,js2o_valvalue)与SetProperty相同,除了指定属性号而不是属性名。该API被用于具有预定义属性的预定义对象。属性号来自一个公知的名称列表。函数void*GetNumberProperty(js2o_obj*this,intproperty_number)返回这个方法的函数地址。如果该属性不存在,或者不含函数,则发生一个运行时错误(参看js2o_runtime_error)。函数voidDeleteObject(js2o_obj*this)释放被该对象在内部分配的所有资源。这与对象类的object_new函数相反。这个函数释放对象本身。当发现某个对象不再被使用时,垃圾收集器调用这个函数。小配件方法一般通过GetMethodAPI被访问。小配件返回函数地址。每个方法都是在JS2O前后关系中被执行的。每个方法的实现带有下列限制每个输入参数都是’js2o_val’类型的,而不是常规的C类型。返回值是强制性的(可以是JS2O_NULL)。返回值也必须是js2o类型的,并且每个方法具有至少以下的头两个参数’this’对象指针和所传递的参数个数。例如,一个具有两个参数x和y的JS2O方法“foo”可以用C语言声明如下js2o_valfoo(js2o_obj*this,js2o_intnbarg,js2o_valx,js2o_valy,...);在定义一个外部对象或内部对象类时,有可能声明一些预定义属性和方法。预定义的“vtable”方法是按名字和按下标定义的。下标是类的vtable中的函数号。因为在任何vtable的开始所需要的函数,第一个可用的下标是13。编译器在可能时将优化对那些预定义方法的访问。在定义一个具有例如show的预定义函数的例如OSD的对象时,JS代码”OSD.show();”将被优化(但是”x.show();”则不优化,即使x等于OSD)。JS2O+H2O定义一个公知属性名列表。每个名字与一个串号码相关联。编译器通过调用对象的GetNumeberProperty和SetNumeberPropertyAPI优化对那些公知属性的访问。如果某方法不是定义为“预定义的vtable方法”,它可能仍然是公知属性名。在这种情况下,编译器通过调用GetNumeberMethodAPI优化该get方法地址。当访问作为属性的该方法时,编译器使用GetNumeberProperty和SetNumeberPropertyAPI。如果某方法也能被定义为一个”预定义全局方法”,该方法是实现该方法的全局函数。该函数查验对象类对于该方法是正确的,然后执行实际的功能。如果对象属于一个错误类则产生错误。”预定义全局方法”列表众所周知是由所有H2O组件共享的。那些方法的地址在运行时由H2O传递(单一地址数组)。有一个公知属性名列表。这个列表被编译器和对象所公知。这个列表包括(包括DOM对象在内的)预定义对象的大多数(即使不是全部)的属性(和方法)名。这个列表只用于被编译器访问的方法和属性,但不用于其它串。为了优化对CSS属性的访问,公知属性名可包括”.”字符。例如,”style.color”能作为单一的属性名被声明。JS2O运行时包括对动态创建的对象和动态创建的串的垃圾收集。为垃圾收集实行一个标记清扫(Mark&Sweep)机制。就运行时速度而言这比引用计数器(ReferenceCounters)成本更低。垃圾收集最好也跟踪被串和对象(例如vtable、函数、静态串等等)引用的模块(类定义、外部代码模块)。当改变页(即,上载模块)时,持久对象将为清除外部引用提供复位函数。H2O提供一个例如用于高速缓存模块的内存管理器。JS2O和其垃圾收集器与H2O协作工作。JS2O分配许多小块(对象、串),而H2O分配少数较大的块。JS2O向H2O提供一个等待(idle)函数,以便在没有事情发生(没有用户输入)时执行。这个等待函数调用垃圾收集。函数名字将对在相同文件中定义的函数的访问优化成对函数地址的直接调用。这尤其意味着函数不能被动态改变。局部变量被编译堆栈中的直接槽。全局变量被编译成数据段存储器内的直接变量。所有预定义对象都是JS全局范围的一部分。预定义对象被直接引用,它们的预定义方法和属性也是如此。窗口对象和其所有属性/方法都直接是全局范围的一部分。例如,”window.document”属性能简单地被”document”访问。(某页的)主JS代码和所有JS事件处理程序被编译成一个单一的代码模块。H2O层调用该模块的一个初始化函数。这个初始化函数返回一个JS2O前后关系指针。js2o_cx*js2o_cx_create(void*module,int**DOMObjectHandle,js2o_obj**DOMObjects,js2o_obj**PredefinedObjects,void**GlobalMethods);参数是一个指向主模块的指针和指向被创建的DOM对象(句柄和地址)的指针、一个指向预定义对象地址数组的指针和一个指向预定义全局函数数组的指针。DOM对象句柄是由js2o_compile_add_element返回的句柄。如果出错则该函数返回NULL。参数‘module’最好指向与由js2o_compile_generate返回的数据相同的数据。JS2O不对该数据作备份,因此它最好保持有效,一直到破坏(destroy)函数去除它。也注意该数据是只读的(JS2O不写入该数据)。注意至少”window”对象被定义。JS2O前后关系通过调用js2o_cx_destroyvoidjs2o_cx_destroy(js2o_cx*context)被破坏(当不再需要时);为执行主JS代码,H2O层调用下列APIintjs2o_main(js2o_cx*context);如果不出错,或者没有表示运行时错误的负数,这个函数返回0。为执行事件处理程序,H2O层调用下列API来执行处理程序intjs2o_execute(js2o_cx*context,js2o_obj*this,inthandle);句柄(handle)值由js2o_compile_add_srcAPI在编译时提供。函数js2o_execute返回下列值如果处理程序返回真,则JS2O_TRUE;如果处理程序返回假,则JS2O_FALSE;如果发生运行时错误,则JS2O_NULL;如果没有错误并且处理程序不返回值,则为任意js2o_val。注意JS执行引擎最好不是可重入的。在优选实施例中,函数js2o_main和js2o_execute不能在另一个JS处理程序在执行时被调用。将外部JS文件编译成OpenTVDDL代码模块。H2O层调用该模块的初始化函数。这个初始化函数接收JS2O的前后关系作为输入。因此,主JS代码如下地被首先初始化intjs2o_dll_init(js2o_cx*context,char*name,void*module)。该名称参数是在编译时被传递的参数(在js2o_compile_add_bin中)。在这个调用后,在该模块中定义的函数就可用于JS前后关系。外部JS代码模块也有一个API来执行这个文件的全局JS语句。在优选实施例中,外部JS代码模块是OpenTV代码模块,带有存储在OpenTV模块标头中的JS2O特定的信息。对象类模块定义一个新的对象类。这个模块在HTML页中用OBJECT声明来声明,并用js2o_compile_add_classAPI向编译器声明。JS2O引擎调用下列由这个模块提供的CAPI,以得到该对象类的函数构造器。js2o_obj*module_class_get_constructor(js2o_cx*context,char*classname)函数是输出函数#0。在优选实施例中,对象类模块是OpenTV代码模块,带有存储在OpenTV模块标头的JS2O特定的信息。JS运行时访问下列由H2O运行时架构提供的函数js2o_obj*h2o_get_class_constructor(js2o_cx*context,char*classname)。这个函数最好返回所指定的类的函数构造器对象。类名与在OBJECT声明中的CLASSID中传递的具有相同值。这个函数内部地定位类模块并调用module_class_get_constructor函数。以下语句可用于JS,用来创建外部类的对象。名字与在OBJECT声明中的CLASSID中传递的名字上指定的名字具有相同值。以下CAPI可用于开发对象类和库。voidjs2o_runtime_error(js2o_cx*context)函数在小配件方法或vtable函数内部发生运行时错误时,以及在js2o库内发生错误条件时被执行。char*js2o_get_number_property_string(intpropertyNumber)函数返回与公知属性号相关联的串。本发明是在优选实施例中的交互式电视环境中作说明的,然而,本发明也可以体现在包含服务器和客户机设备的分布式计算机系统中。在另一个实施例中,本发明以计算机可读介质上的一个指令集实现,介质包含ROM、RAM、CDROM、闪存或任何其他计算机可读介质,无论是现在已知的还是未知的,当该指令集被执行时,使计算机执行本发明的方法。尽管上面展示了本发明的优选实施例,这仅仅是为了举例而不是要限制由下列权利要求所定义的本发明的范围。权利要求1.计算机可读介质,含有在被计算机执行时使计算机执行以下步骤的指令从服务器上的服务提供者中接收一个含有至少一个脚本的HTML页;从过滤器中的HTML页中提取脚本;将脚本编译成用于在客户机设备上执行的客户机兼容的代码;将编译的脚本传送至客户机设备;和在客户机设备上执行编译的脚本。2.权利要求1的介质,进一步包含在被计算机执行时使计算机执行以下步骤的指令将HTML页中的某语言的脚本页元素汇集成至少一个包;和将汇集的脚本页元素的至少一个包传送到脚本编译器,使得HTML页的脚本元素在一起被编译。3.权利要求1的介质,其中,只把将要在客户机设备上执行的一部分脚本提取、编译并传送到客户机设备。4.权利要求1的介质,进一步包含在被计算机执行时使计算机执行以下步骤的指令高速缓存HTML页的编译脚本;检查编译器中的一个输入HTML页脚本以确定该输入页脚本是否已经在高速缓存中;如果在高速缓存中找不到该输入HTML页脚本,编译输入HTML页的脚本并高速缓存该输入HTML页的编译脚本;和如果在高速缓存中找到该编译页,从高速缓存中取回该编译页并将该编译页发送到客户机设备。5.权利要求1的介质,进一步包含在被计算机执行时使计算机执行以下步骤的指令将输入HTML页的脚本编译成一个中间格式;然后将该中间格式编译成客户机兼容的代码。6.权利要求1的介质,进一步包含在被计算机执行时使计算机执行以下步骤的指令在服务器中生成一个脚本元素树;和从该脚本元素树生成客户机兼容的操作码。7.权利要求6的介质,进一步包含在被计算机执行时使计算机执行以下步骤的指令将客户机兼容的操作码发送到二进制汇编器,用于汇编一个汇编表示。8.权利要求7的介质,进一步包含在被计算机执行时使计算机执行以下步骤的指令从该汇编表示中生成至少一个客户机兼容的代码模块;和将客户机兼容的代码模块传送到客户机设备供执行。9.权利要求1的介质,进一步包含在被计算机执行时使计算机执行以下步骤的指令编译一份复制脚本的拷贝;和将编译的这份复制脚本的拷贝发送到客户机供多个HTML页作为外部对象使用。10.权利要求1的介质,进一步包含在被计算机执行时使计算机执行以下步骤的指令提供一个用于定义一个预定义对象的接口。11.权利要求10的介质,其中,预定义对象包含OSD和通道的至少之一。12.权利要求1的介质,进一步包含在被计算机执行时使计算机执行以下步骤的指令提供一个客户机兼容的对象模型脚本接口,用于操作客户机定义的对象。13.权利要求1的介质,进一步包含在被计算机执行时使计算机执行以下步骤的指令从HTML页提取和汇集某语言的脚本,其中只有将在客户机设备上执行脚本被提取,然后将汇集的脚本传送到脚本编译器,供将汇集的脚本编译成至少一个客户机兼容的模块;高速缓存HTML页的编译脚本,并检查一个输入HTML页脚本以确定该输入页是否已经在编译脚本高速缓存中,如果在高速缓存中找不到,编译该HTML页的脚本并高速缓存该编译脚本,如果在高速缓存中找到该编译脚本,从高速缓存中取回该编译脚本并将该编译脚本发送到客户机设备;和在客户机设备上执行该编译脚本。14.权利要求1的介质,进一步包含生成一个脚本元素树,并从该脚本元素树中生成客户机兼容的操作码;将输入HTML页的脚本编译成一个中间格式,然后将该中间格式编译成客户机兼容的代码;将客户机兼容的操作码发送到二进制汇编器,用于汇编一个汇编表示;和从该汇编表示中生成一个客户机兼容的代码模块,用于在客户机设备上执行。15.权利要求1的介质,进一步包含在被计算机执行时使计算机执行以下步骤的指令编译一份复制脚本拷贝并将编译的这份复制脚本拷贝发送到客户机设备供多个HTML页作为外部对象使用;提供一个用于定义预定义对象的接口,其中,预定义对象为OSD或通道的至少之一;和提供一个客户机兼容的对象模型脚本接口,用于操作客户机定义的对象。16.权利要求1的介质,其中HTML页被从前端发送到服务器。17.权利要求16的介质,其中HTML是服务提供者与客户机设备上的用户之间的电子商务交易的一部分。18.一种用于编译在分布式计算机系统中的客户机设备上执行的脚本的方法,包含从服务器上的服务提供者中接收一个含有至少一个脚本的HTML页;从过滤器中的HTML页中提取脚本;将脚本编译成用于在客户机设备上执行的客户机兼容的代码;将编译脚本传送到客户机设备;和在客户机设备上执行编译的脚本。19.权利要求18的方法,进一步包含将HTML页中的某语言的脚本页元素汇集成至少一个包;将汇集的脚本页元素的至少一个包传送到脚本编译器,使得HTML页的所有脚本元素在一起被编译。20.权利要求的方法,其中,只把将要在客户机设备上执行的一部分脚本提取、编译并传送到客户机设备。21.权利要求18的方法,进一步包含高速缓存HTML页的编译脚本;检查编译器中的一个输入HTML页脚本以确定该输入页脚本是否已经在高速缓存中;如果在高速缓存中找不到该输入HTML页,编译输入HTML页的脚本并高速缓存该输入HTML页的编译脚本;和如果在高速缓存中找到该编译页,从高速缓存中取回该编译页并将该编译页发送到客户机设备。22.权利要求18的方法,进一步包含将输入HTML页的脚本编译成一个中间格式;和将该中间格式编译成客户机兼容的代码。23.权利要求18的方法,进一步包含在服务器中生成一个脚本元素树;和从该脚本元素树中生成客户机兼容的操作码。24.权利要求23的方法,进一步包含将客户机兼容的操作码发送到二进制汇编器,用于汇编一个汇编表示。25.权利要求24的方法,进一步包含从该汇编表示中生成至少一个客户机兼容的代码模块;和将客户机兼容的代码模块传送到客户机设备供执行。26.权利要求18的方法,进一步包含编译一份复制脚本拷贝;和将编译的这份复制脚本拷贝发送到客户机供多个HTML页作为外部对象使用。27.权利要求18的方法,进一步包含提供一个用于定义一个预定义对象的接口。28.权利要求27的方法,其中,预定义对象包含OSD和通道的至少之一。29.权利要求18的方法,进一步包含提供一个客户机兼容的对象模型脚本接口,用于操作客户机定义的对象。30.权利要求18的方法,进一步包含从HTML页提取和汇集某语言的脚本,其中只有将在客户机设备上执行的脚本被提取,然后将汇集的脚本传送到脚本编译器,供将汇集的脚本编译成至少一个客户机兼容的代码模块;高速缓存HTML页的编译脚本,并检查一个输入HTML页脚本以确定该输入页是否已经在编译脚本高速缓存中,如果在高速缓存中找不到,编译该HTML页的脚本并高速缓存该编译脚本,如果在高速缓存中找到该编译脚本,从高速缓存中取回该编译脚本并将该编译脚本发送到客户机设备;和在客户机设备上执行该编译脚本。31.权利要求18的方法,进一步包含生成一个脚本元素树,并从该脚本元素树中生成客户机兼容的操作码;将输入HTML页的脚本编译成一个中间格式,然后将该中间格式编译成客户机兼容的代码;将客户机兼容的操作码发送到二进制汇编器,用于汇编一个汇编表示;和从该汇编表示中生成一个客户机兼容的代码模块用于在客户机设备上执行。32.权利要求18的方法,进一步包含编译一份复制脚本拷贝并将编译的这份复制脚本拷贝发送到客户机设备供多个HTML页作为外部对象使用;提供一个用于定义预定义对象的接口,其中,预定义对象是OSD或通道的至少之一;和提供一个客户机兼容的对象模型脚本接口,用于操作客户机定义的对象。33.权利要求18的方法,其中HTML页被从前端发送到服务器。34.权利要求33的方法,其中HTML是服务提供者与客户机设备上的用户之间的电子商务交易的一部分。35.权利要求1的介质,进一步包含使计算机执行以下步骤的指令在编译时将一个脚本变量名连接到一个含有在运行时在客户机设备上的变量名值的存储器位置。36.权利要求1的介质,进一步包含使计算机执行以下步骤的指令在编译时将一个脚本变量名连接到一个值,用于在客户机设备上在运行时执行。37.权利要求18的方法,进一步包含使计算机执行以下步骤的指令在编译时将一个脚本变量名连接到一个含有在运行时在客户机设备上的变量名值的存储器位置。38.权利要求18的方法,进一步包含在编译时将一个脚本变量名连接到一个值,用于在客户机设备上在运行时执行。39.权利要求3的介质,进一步包含使计算机执行以下步骤的指令检查脚本中的一个关键字,以确定该部分脚本是否将在客户机设备上执行。40.权利要求20的方法,进一步包含检查脚本中的一个关键字,以确定该部分脚本是否将在客户机设备上执行。41.一种用于编译在分布式计算机系统中的客户机设备上执行的脚本的装置,包含服务器存储器,用于从服务器上的服务提供者中接收一个含有至少一个脚本的HTML页;提取组件,用于从过滤器中的HTML页中提取脚本;编译器组件,用于将脚本编译成用于在客户机设备上执行的客户机兼容的代码;通信链路,用于将编译的脚本传送到客户机设备;和客户机设备,用于执行编译的脚本。42.权利要求41的装置,进一步包含程序组件,用于将HTML页中某语言的脚本页元素汇集成至少一个包;和存储器,汇集脚本页元素用于被脚本编译器访问,使得HTML页的所有脚本元素在一起被编译。43.权利要求41的装置,其中,只把将要在客户机设备上执行的一部分脚本提取、编译并传送到客户机设备。44.权利要求41的装置,进一步包含高速缓存,用于高速缓存HTML页的编译脚本;编译器进一步包含一个程序组件,用于检查编译器中的一个输入HTML页脚本以确定该输入页脚本是否已经在高速缓存中,其中如果在高速缓存中找不到该输入HTML页,编译输入HTML页的脚本并高速缓存该输入HTML页的编译脚本,而如果在高速缓存中找到该编译页,则从高速缓存中取回该编译页并将该编译页发送到客户机设备。45.权利要求41的装置,进一步包含编译器组件,用于将输入HTML页的脚本编译成一个中间格式;和编译器组件,用于将该中间格式编译成客户机兼容的代码。46.权利要求41的装置,进一步包含存储器,用于包含在服务器中的一个脚本元素树;和程序组件,用于从该脚本元素树中生成客户机兼容的操作码。47.权利要求46的装置,进一步包含二进制汇编程器,用于接收客户机兼容的操作码到二进制汇编器,用于汇编一个汇编表示。48.权利要求47的装置,进一步包含至少一个从该汇编表示生成的客户机兼容的代码模块,用于向客户机设备传送供执行。49.权利要求41的装置,进一步包含用于发送到客户机供多个HTML页作为外部对象使用的一份编译的复制脚本拷贝。50.权利要求41的装置,进一步包含用于定义一个预定义对象的接口。51.权利要求50的装置,其中,预定义对象包含OSD和通道的至少之一。52.权利要求41的装置,进一步包含客户机兼容的对象模型脚本接口,用于操作客户机定义的对象。53.权利要求41的装置,进一步包含程序组件,用于从HTML页提取和汇集某语言的脚本,其中只有将在客户机设备上执行的脚本被提取,然后将汇集的脚本传送到脚本编译器,供将汇集的脚本编译成至少一个客户机兼容的代码模块;高速缓存,用于存储HTML页的编译脚本,并检查一个输入HTML页脚本以确定该输入页是否已经在编译脚本高速缓存中,如果在高速缓存中找不到,编译该HTML页的脚本并高速缓存该编译脚本,如果在高速缓存中找到该编译脚本,从高速缓存中取回该编译脚本并将该编译脚本发送到客户机设备;和用于执行该编译脚本的客户机设备。54.权利要求41的装置,进一步包含脚本元素树,用于从该脚本元素树中生成客户机兼容的操作码;中间格式组件,用于将输入HTML页的脚本编译成一个中间格式,然后将该中间格式编译成客户机兼容的代码;二进制汇编器,用于将客户机兼容的操作码汇编成一个汇编表示,并从该汇编表示中生成一个客户机兼容的代码模块用于在客户机设备上执行。55.权利要求41的装置,进一步包含编译一份复制脚本拷贝并将编译的这份复制脚本拷贝发送到客户机供多个HTML页作为外部对象使用;提供一个用于定义预定义对象的接口,其中,预定义对象是OSD或通道的至少之一;和提供一个客户机兼容的对象模型脚本接口,用于操作客户机定义的对象。56.权利要求41的装置,其中HTML页被从前端发送到服务器。57.权利要求56的装置,其中HTML是服务提供者与客户机设备上的用户之间的电子商务交易的一部分。58.权利要求41的装置,进一步包含编译器组件,用于在编译时将一个脚本变量名连接到一个含有在运行时在客户机设备上的变量名值的存储器位置。59.权利要求43的装置,进一步包含一个关键字,用于在脚本中指示该脚本的一部分将在客户机设备上被执行。全文摘要一种用于提取和编译解释性语言的方法和装置,用于在交互式电视环境中实现诸如以嵌入在HTML页中的脚本的形式编写的功能。HTML页是从广播和在线中接收的。编译器在服务器上运行。编译的脚本运行速度更快,而且只需较少的处理能力就能执行。编译器在服务器上运行。从存储在服务器上的HTML表示内容中提取脚本。然后将编译的脚本代码通过广播或在线从服务器传送到客户机设备,供在客户机设备上进行内容显示期间执行。编译的脚本运行速度更快,而且只需较少的处理能力就能执行,并且能在不需要该语言的解释器的客户机设备上运行。文档编号G06F17/00GK1529849SQ02807550公开日2004年9月15日申请日期2002年2月1日优先权日2001年2月2日发明者P·维拉,P维拉申请人:开放电视公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1