首页> 中国专利> 反应式编程的编程语言支持

反应式编程的编程语言支持

摘要

本发明涉及反应式编程的编程语言支持。提供程序语言支持以便于反应式编程。提供了在第一类模式和第二类模式之间开始转换的代码,其中模式相对于基于推的数据来操作。还提供了对根据例如迭代器模式来产生和消费基于推的数据的支持。

著录项

  • 公开/公告号CN102385513A

    专利类型发明专利

  • 公开/公告日2012-03-21

    原文格式PDF

  • 申请/专利权人 微软公司;

    申请/专利号CN201110308242.3

  • 申请日2011-09-28

  • 分类号G06F9/44;

  • 代理机构上海专利商标事务所有限公司;

  • 代理人黄嵩泉

  • 地址 美国华盛顿州

  • 入库时间 2023-12-18 04:38:40

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2015-10-07

    授权

    授权

  • 2015-08-12

    专利申请权的转移 IPC(主分类):G06F9/44 变更前: 变更后: 登记生效日:20150720 申请日:20110928

    专利申请权、专利权的转移

  • 2012-06-06

    实质审查的生效 IPC(主分类):G06F9/44 申请日:20110928

    实质审查的生效

  • 2012-03-21

    公开

    公开

说明书

技术领域

本发明涉及计算机编程,尤其涉及反应式编程的编程语言支持。

背景技术

数据处理是计算机编程的基本部分。可从各种编程语言中选择创建程序的 编程语言。用于特定应用程序的所选语言可取决于应用程序上下文、开发者的 偏好或公司政策等等。无论所选语言如何,开发者最终将必须处理数据,即查 询和更新数据。

数据可以根据其获得方式被归类为或是基于拉或是基于推。基于拉的数据 是主动检取的数据。例如,程序可以在一阵列内的条目集合上迭代以请求和检 取条目。类似地,可以从本地或远程数据库拉出数据。相反,基于推的数据在 任意时刻被提供给程序。一个经典示例是响应于诸如鼠标移动或条目选择这样 的用户输入来推出值的用户界面。鉴于通信等待时间、潜在误差或超时,异步 计算也可以被视为基于推的数据的源。例如,程序可以请求在远程机器上执行 计算,并且在计算完成时获得关于结果的通知。然而,返回计算结果的确切时 间对于程序而言是未知的,并且会根据网络等待时间以及远程机器处理能力和 负载等因素而变化。

作用于基于拉的数据可被称为交互式编程,而作用于基于推的数据可被称 为反应式编程。在交互式的基于拉的程序中,请求数据的程序代码受到控制, 在继续执行之前,代码会在数据变得可用之前会一直等待或中断。或者,在反 应式的基于推的程序中,环境(例如数据库、web服务、UI框架等)受到控制, 并且确定数据何时被传送至应用程序。这里,程序代码不需要等待或中断。相 反,代码可以继续执行并且在数据被异步地提供给它时做出适当反应。

反应式编程(也叫作异步和/或基于事件的编程)在现代计算机应用中变得 越来越普遍。特别是,在多核以及分布式或云计算的环境中,反应式编程是有 利的。在这些情况下,例如,工作可以被分布在两个或更多核或计算机上。然 而,反应式编程对于开发者来说会是繁重的。

发明内容

下面呈现了简化的发明内容,以便提供对所公开主题的某些方面的基本概 念。本发明内容不是广泛性的概观。它并不旨在标识关键/重要元素,也不旨在 划定所要求保护主题的范围。其唯一目的是以简化形式呈现一些概念,作为稍 后呈现的更详细描述的序言。

简言之,本发明一般涉及为反应式编程提供编程语言支持。库或类似的可 重用组件可以提供代码,所述代码用于在程序本身外部的基于推的数据集合之 上构成异步和基于事件的程序。向编程语言提供至少对这种库所提供的功能的 一个子集的支持,以便于库的使用以及反应式编程。按照本发明一方面,可以 为在包括事件、异步计算和属性在内的第一类和第二类模式之间的转换提供支 持。按照本发明另一方面,可以提供支持以帮助产生和消耗基于推的数据,例 如使用迭代程序。

为实现上述及相关目的,在此结合以下描述和附图描述了所要求保护主题 的某些说明性方面。这些方面指示可实践本主题的各种方式,它们均落在所要 求保护主题的范围之内。当结合附图阅读以下详细描述时,本发明的其他优点 和新颖特征将变得显而易见。

附图说明

图1是程序语言支持系统的框图。

图2是代表性支持组件的框图。

图3是代表性代码生成组件的框图。

图4是便于反应式编程的方法的流程图。

图5是将第二类模式转换成第一类模式的方法的流程图。

图6是将第一类模式转换成第二类模式的方法的流程图。

图7是便于创建和消耗基于推的数据的方法的流程图。

图8是示出用于本发明各方面的合适操作环境的示意性框图。

具体实施方式

以下细节一般针对为反应式编程添加编程语言支持。反应式库或类似的可 重用组件可以提供与异步和基于事件的编程(或者换言之,反应式编程)相关 联的功能。换句话说,库可以为基于推的数据提供支持。更具体地,反应式库 可以用第一类模式、实体等等(例如,IObservable、IProperty等)来展示这种 功能。常规的编程语言包括用于使用第二类模式、实体等的事件和异步编程的 功能。对反应式编程的支持可以被集成在编程语言中,以帮助使用并相应地较 少与例如反应式库相关联的学习曲线。特别是,可以在第一类模式和第二类模 式之间发起转换。而且,例如基于迭代程序模式,可以提供程序语言支持来产 生和消耗基于推的数据。

现在参考附图更详细地描述本公开的各个方面,在全部附图中用相似的标 记来指示相似或相应的元素。然而应该理解,附图及其相关详细描述不旨在将 所要求保护的主题限于所公开的具体形式。相反,其意图是覆盖落在所要求保 护主题的精神和范围之内的所有修改、等价物和替换的方案。

首先参考图1,示出了程序支持系统100。系统包括程序组件110和反应 式扩展组件120。程序组件110代表以特定编程语言指定的软件程序,该软件 程序在被执行时就执行指定了的操作。例如,程序组件110可以是由开发者以 高级编程语言(例如Visual等)创作的源代码。反应式库组件120 可以和向程序组件110提供服务的可重用代码和数据的集合相对应。更具体地, 通过在基于推的数据集合上展示第一类模式(例如IObservable、IProperty等), 反应式库组件120可以被实现为便于异步以及基于事件或基于推的编程(或换 言之,反应式编程)的软件库。尽管程序组件110可以支持反应性编程,它通 常用第二类模式来表示,或者误用现有的语言特征来模仿期望的行为。因而, 反应式库组件120可以对用于指定程序的程序语言的功能进行扩展,使其包括 基于推的数据之上的第一类模式等等。

第一类模式是用第一类对象或实体(例如程序语言概念)实现的设计模式 (用于解决问题或计算问题的方案或框架)。换言之,第一类模式可以用程序 性构造来实现,程序性构造可用于最大语言构造集合,一般因为将其视为对象 对待。这使这一构造能作为参数被传递(例如,用于在第一类对象上定义诸如 “运算符”这样的构造)、被作为结果返回、或者被分配给变量等等。换言之, 第一类表示没有其他构造比第一类实体有更多能力。相反,第二类表示构造以 某一方式受约束,例如使得实体不能作为参数被传递或被分配给一变量。

程序支持系统100还包括支持组件130,该组件相对于反应式库组件120 的使用而向程序组件110提供支持或帮助。例如,支持组件130至少可以发起 将程序组件110的一个或多个第二类模式转换成反应式库组件120的一个或多 个第一类模式。而且,例如,支持组件130可以以和基于拉的数据相同或类似 的方式,提供能产生和消耗基于推的数据的功能。概而言之,支持组件130可 以扩展编程语言,使用户更容易创作反应式程序,例如通过使用反应式库组件 120。尽管不限于此,但是根据一个实施例,支持组件130所提供的功能可由 编译器或类似组件来实现。

图2描述了代表性的支持组件130。如图所示,支持组件可包括分析组件 210和代码生成组件220。分析组件210可以分析程序,或更具体地说分析程 序语法,以标识各种指定的模式和/或实体,这些指定的模式和/或实体诸如但 不限于:事件、异步计算和属性。代码生成组件220可以生成也称为支持代码 的编程语言代码,所述编程语言代码至少引起或发起在第一类和第二类模式之 间的转换,即,从第一类模式转换成第二类模式、或从第二类模式转换成第一 类模式。另外或或者,代码生成组件220可以生成代码以便例如基于迭代程序 模式来支持产生和消耗基于推的数据。

图3是用于帮助澄清和理解本发明各方面的代表性代码生成组件220的框 图。如图所示,代码生成组件220包括事件组件310、异步组件320、属性组 件330、生产者组件340和消费者组件350。

事件组件310生成代码以便至少发起到或自第一类事件模式的转换。许多 编程语言具有事件的第二类表示。例如,事件可以如下定义:

public event EventHandler Click;

这一代码指令编译器生成以下代码(简化):

而且,可以向已编译代码(例如,中间语言代码(IL))添加附加的元数 据,使调用者知道此事件的可用性。事件可以从一个类中通过调用目前在后台 字段中的委托来激发:

if(Click!=null)Click.Invoke(o,e);

通过在事件上调用“+=(添加事件)”或“-=(移除事件)”,可以钩住 或者解除预订事件,“+=(添加事件)”或“-=(移除事件)”又可以转变成 前述的“添加”和移除方法。

然而,事件不是第一类对象,而是第二类对象或第二类模式。结果,存在 几个问题。首先,事件不能被单独传送。更具体地说,传送第二类事件的唯一 方式是传送其包含的对象。而且,第二类事件不是合成的,例如,过滤器或投 影不能写至其上、事件不能与其它事件联合、等等。此为,只有内部类才能激 发该事件(例如,通过后台字段)。而且,只能返回值。不能发信号通知错误, 因此没有完成的概念。还有,为了能脱钩事件,需要保存所添加的委托。

图2的反应式库组件120可以使用户能在基于推的数据上指定第一类事 件。例如:

public event IObservable<SomeType>Click;

这一代码可以指令编译器生成以下代码(简化):

为了预订该事件,用户可以写:

var subscription=object.Click.Subscribe(...);

为了稍后解除对该事件的预订,用户可以写:

subscription.Dispose();

为了激发事件,开发者可以在类中写:

Click.OnNext(value);

为了通知错误,用户可以写:

Click.OnError(error);

为了通知完成,开发者可以写:

Click.OnCompleted();

而且,如果开发者想要使外部代码能激发事件,开发者可以写:

public event ISubject<SomeType>Click;

能改变公有属性的特征,使外部调用者能调用“OnNext”、“OnError”、 或“OnCompleted”。当然,可以使用其它语法来指定第一类事件,第一类事 件然后可被编译器转换成适当的调用(例如“+=”和“-=”)。

第一类事件模式有许多好处。首先,第一类事件可以被传送。其次,事件 是合成的。而且,开发者可以指定是否允许外部的人来激发事件。此外,发信 号是更为昂贵的(例如,提供值、通知错误、通知已完成、等等)。还有,解 除对事件的预订不需要保存或保留委托。

常规的事件的程序表示和反应式库表示之间的差别清楚而繁多。事件组件 310提供功能来桥接这些差别。特别是,有许多实现第二类事件的现有代码。 因而,事件组件310可以帮助把这些事件带入反应式编程上下文。例如,假设 按钮类具有一事件点击,如同:

为了将这一现有事件转换成第一类事件,事件组件310可以添加以下代码:

var click=Observable.FromEvent<EventHandler,EventArgs>(e=>new  EventHandler(e),e=>button.Click+=e,e=>button.Click-=e);

click.Subscribe(...)

因而,用户能够在公有事件上直接调用“预订”:

button.Click.Subscribe(...);

当例如由图2的分析组件210检测到这种语法时,事件组件310可以自动 地注入以上代码来支持第一类事件的使用。任选地,事件组件310可以对这一 转换进行高速缓存,以避免转换若干次的开销。类似操作也可由事件组件310 在相反方向上执行,即,从第一类事件到第二类事件。

异步组件320可以生成代码以支持第一类异步计算或功能。更具体地,异 步计算或功能的结果可成为第一类对象。程序可使用各种模式来执行包括 BeginInvoke/EndInvoke的异步计算。例如,考虑以下伪代码片断:

var result=foo.BeginInvoke(“a”);

var x=foo.EndInvoke(result);

注意到,首先需要调用结果EndInvoke,再做其它。异步组件320可以生 成代码以如下地转换到第一类对象:

var asyncFoo=Observable.FromAsyncPattern(string,int)(foo.BeginInvoke, foo.EndInvoke)

这里,“var”是真正的“Func(string IObservable<int>)”。结果,用户可 以使用asyncFoo作为第一类对象,诸如:

var result=asyncFoo(“a”);

此外,因为反应式库组件120可允许返回错误以及值,因此通过异步计算 转换到第一类实体有助于处理异常,等等。当然,根据需要,异步组件320也 为相反方向上的转换提供支持,诸如从“Func<string,IObservable<int>>”到 “BeginInvoke/EndInvoke”。

而且,可以添加程序语言支持。例如且不加限制,可以如下提供程序语言 支持:

这里,关键词“asyncof”会触发生成对“Observable.FromAsyncPattern” 的正确调用。

就像事件一样,大多数现代编程语言中的属性不是第一类。也就是,属性 本身不能被传递。然而,包含属性的对象可以被传递。此外,外部代码不能容 易地获悉对属性的改变。为避免这一点,开发者通常实现 INotifyPropertyChanged模式,其中开发者必须仔细地编码每一个属性以便在改 变时激发事件。下面是关于属性的这种现有模式的一个例子:

在反应式库的上下文中,例如,属性如下地被表示为第一类实体:

有了这个类,可以实现某一语言的第一类属性。例如:

从以上可以生成下列代码:

像这个的第一类属性可以如下被读取或分配:

var x=somebody.CustomerName;

somebody.CustomerName=“somebody”;

该代码可以被自动如下重写以维持现有的语言语义:

var x=somebody.CustomerName.Value;

somebody.CustomerName.Value=“some body”

在一个程序中可以通过使用关键词“property(属性)”来访问第一类属 性:

var firstClass=property(Customer.CustomerName)

“firstCl ass”现在被键入为“Property<string>”,并且可以被预订或 获悉。

属性组件330可以生成代码以便如上简述地将第二类属性转换成第一类属 性。类似地,属性组件可以生成在期望时从第一类属性转换成第二类属性的代 码。

注意到,事件和属性是相关的。在一种实现中,属性可被转换成“Observable (可观察)”接口形式。类似地,事件可被转换成“Observable(可观察)” 接口形式。一旦属性被转换成第一类属性,则在属性和事件之间发现关系。更 具体地说,属性仅仅是特殊的事件,或换句话说,事件仅仅是特殊的属性。

代码生成组件220也可以便于通过生产者组件340和消费者组件350来与 第一类实体交互。计算机语言可以通过使用可枚举接口(例如IEnumerable)来 支持与基于拉的数据的交互。类似地,图1的反应式库组件120可以用可观察 接口(例如IObservable)来支持与异步或基于推的数据的交互。为了帮助程序 开发,可以使用单个接口来与基于推的数据和基于拉的数据两者进行交互。按 照一个实施例,为此可采用当前支持的可枚举接口。

为了启用这一功能,生产者组件340可以生成将可枚举特征映射为可观察 特征的代码。例如,IEnumerable可以包括用于“yield return(产生值)”、 “yield break(产生对调用者的控制)”和“throw(通知反常情况(如异常) 的出现)”的指令。这些指令可以被映射为关于基于推的数据的具有类似功能 的可观察指令,即“OnNext(从数据源提供下一值)”、“OnCompleted(通 知源已提供了值)”和“OnError(通知异常)”。

消费者组件350可以生成允许以和对基于拉的数据实现的迭代相同或相似 方式,对基于推的数据进行迭代的代码。换言之,IEnumerable迭代程序可以如 下用产生模式来实现:

尽管该代码在开发者看来是单个命令性方法,但在后台,生成代码以产生 状态机,以便将每次调用后的控制流改变为对可枚举/枚举器对的 “MoveNext()”的调用。这使程序开发容易得多,因为开发者可以为IEnumerable 提供各种实现,而无须考虑或处理状态机。同样的问题现在应用于可观察的、 基于推的数据序列。

作为消费者组件350所生成的代码的结果,可以扩展程序语言,以允许指 定以下内容:

为使其工作,可以使用从“yield return”到对“OnNext”调用的映射、从 “yield break”到对“OnCompleted”调用的映射、以及被发送至“OnError”的 任何隐式或显式抛出的异常。而且,消费者组件350可以被配置成将所有产生 调用嵌套在闭包中。为了支持“解除预订”的检测,消费者组件350也可以以 和当前对“IEnumerable”上的“IDisposable”所作的类似方式,对要对解除预 订执行的外部“最终尝试”指令块进行重写。因而,消费者组件350可以如下 生成代码:

由于这些操作仍可能中断,因此可允许用户生成非中断的控制流代码。这 可以通过引入诸如“start(启动)”的新关键词来完成。例如,以上代码可以 改变为下列代码:

关键词“start”可以指令在状态机内生成代码,所述代码将来到“asyncLine” 中的值高速缓存到在“results(结果)”变量内存储的对象中。一旦访问“results” 的数据,就可以在状态机中生成代码,以便释放执行控制,直到数据请求可用。 访问“results”的方式可以确定为了释放控制而使用哪个策略。考虑以下访问 模式和表1的代码生成策略:

表1

当然,也可以进行更为复杂的控制释放,例如,根据多个结果的联合(例 如results 1.Join(results2))。

关键词“start”既可用于使用返回IObservable<something>的产生迭代模式 的方法中,也可用于返回空的方法中。在后者的情况下,所生成的状态机可以 在第一次控制释放时产生对调用方法的控制。

尽管为简洁起见未示出,但是图2的分析组件210可以包括具有和相对于 图3的代表性代码生成组件220指定的子组件具有类似名称的子组件。更具体 地,分析可以关于每个实例而聚焦。例如,可以存在用于分析程序并标识第二 类事件或属性的子组件。而且,分析组件210可以识别例如显式转换,以及隐 式请求的转换。

参考若干组件之间的交互已经描述了上述系统、体系结构、环境等。应该 理解,这样的系统和组件可以包括这些组件或其中指定的子组件,某些指定的 组件或子组件,和/或附加的组件。子组件也可以被实现为在通信上被耦合到其 他组件而不是被包括在父组件中的组件。此外,一个或多个组件和/或子组件可 以结合成提供聚集功能的单个组件。系统、组件、和/或子组件之间的通信可以 根据推(push)和/或拉模型来实现。各组件也可以与一个或多个其他组件进行 交互,出于简要考虑在此未具体描述该组件但本领域的技术人员均已知。

此外,应该明白以上公开系统以及以下方法的各个部分可以包括或包含基 于人工智能、机器学习或知识或规则的组件、子组件、进程、装置、方法或机 制(例如,支持向量机、神经网络、专家系统、贝叶斯信任网络、模糊逻辑、 数据融合引擎、分类器等)。这样的组件和其它组件可以自动化执行某些机制 或进程,由此使得系统和方法的各部分更为自适应、高效及智能。通过示例但 非限制,支持组件130可以采用这样的机制来从程序确定或推断出用户意图, 并且生成代码以便在基于推的数据上实现该意图。

考虑到以上描述的示例性系统,参考图4-7的流程图将可以更好地理解依 照所公开的主题实现的方法。尽管为了说明简洁起见,作为一系列框示出和描 述了方法,但是,应该理解,所要求保护的主题不仅限于所描述框的顺序,一 些框可以按与此处所描绘和描述的不同的顺序进行和/或与其他框并发地进行。 此外,并非全部所示出的框都是实现下面所描述的方法所必需的。

参考图4,示出便于反应式编程的方法400。在参考数字410处,在关于 基于推的数据的程序中标识设计模式。例如,可以标识事件或异步计算模式。 在参考数字420处,自动地提供本机程序语言支持,以便于采用外部代码来在 基于推的数据集合之上构成异步和基于事件的程序。在一个特定的实现中,可 由编译器生成代码,以支持指定扩展的代码库的使用,代码库启用相对于基于 推的数据集合的反应式编程。

图5是描述将第二类模式转换成第一类模式的方法500的流程图。在参考 数字510处,标识第二类程序语言模式。例如,典型的第二类程序模式包括事 件、异步计算和属性。在数字520处,发起第二类程序模式到作用于基于推的 数据的第一类程序语言模式的转换。转换可以通过将模式或其元素转换成诸如 “IObservable”或“IProperty”等特殊的第一类类型来完成。到这一类型的转 换意味着模式现在是第一类,即可以将事件、属性或其它实体置于阵列中,或 者从方法返回它们,等等。转换的发起可以被实现为生成调用转换的代码。在 一个实例中,可存在转换方法或函数,并且相应地可以调用这一方法。或者, 可以生成并随后调用转换代码。

图6是将第一类模式转换成第二类模式的方法600的流程图。在参考数字 610处,标识作用于基于推的数据的第一类程序语言模式。这可以是这样的情 况,即语言最初支持第一类模式而非第二类模式。在数字620处,至少发起从 第一类程序语言模式到第二类程序语言模式的转换。例如,可以将异步计算的 “IObservable”表示变换成“BeginInvoke/EndInvoke”模式。类似于从第二类 到第一类模式的转换,该转换可被实现为代码生成。而且,代码可以仅仅调用 已知的转换方法等,或者生成代码以执行转换并调用该代码。

图7示出便于产生和消耗基于推的数据集合的方法700。在参考数字710 处,标识程序中的设法创建和/或消耗基于推的数据的模式。例如,模式可由用 户指定,该模式将在基于推的数据集合上迭代。在720,可以生成对该模式的 支持。例如,与基于拉的数据的迭代典型地相关联的代码模式可以,通过生成 将基于推的概念映射到基于拉的概念的代码并且产生状态机以便跨多次调用 而维持状态,从而在基于推的数据上被启用。

此处使用的术语“组件”和“系统”及其各种形式旨在表示与计算机相关 的实体,其可以是硬件、硬件和软件的组合、软件、或执行中的软件。例如, 组件可以是但不限于是,在处理器上运行的进程、处理器、对象、实例、可执 行程序、执行的线程、程序和/或计算机。作为说明,在计算机上运行的应用程 序程序和计算机都可以是组件。一个或多个组件可以驻留在进程和/或执行线程 中,并且组件可以位于一个计算机内和/或分布在两个或更多的计算机之间。

在本文中使用的词语“示例性”或其各种形式意味着用作示例、实例或说 明。在此被描述为“示例性”的任何方面或设计并不一定要被解释为相比其他方 面或设计更优选或有利。此外,各示例只是出于清楚和理解的目的来提供的并 且并不意味着以任何方式限制或约束所要求保护主题或本发明的相关部分。可 以理解,本来可呈现不同范围的多个附加或替换示例,但出于简明的目的已被 省略。

如此处所使用,术语“推论”或“推断”通常指的是从经由事件和/或数据捕捉 的一组观察结果来推理或推断系统、环境、和/或用户状态的过程。可以使用推 断来标识特定上下文或动作,也可以生成例如状态上的概率分布。推断可以是 概率性的,即,基于对数据和事件的考虑,计算在感兴趣状态上的概率分布。 推断也可以是指用于从一组事件和/或数据构成较高级别的事件的技术。这样的 推断导致从一组观察到的事件和/或存储的事件数据构建新的事件或动作,不 管事件在时间上是否紧密相关,以及事件和数据是来自一个还是多个事件和数 据源。可采用各种分类方案和/或系统(例如,支持向量机、神经网络、专家系 统、贝叶斯信任网络、模糊逻辑、数据融合引擎……)来执行关于所要求保护 的主题的自动化和/或推断的动作。

而且,对于在详细描述或权利要求书中使用术语“包括”、“包含”、“具 有”、“含有”或其它形式的变型而言,这样的术语旨在以类似于术语“包括” 的方式体现包含性,如同“包括”在用作权利要求书中的过渡词时所解释的那 样。

为了为所要求保护主题提供上下文,图8以及以下讨论旨在提供对其中可 以实现本主题的各方面的合适环境的简要、概括描述。然而,合适的环境只是 示例并且并非旨在对使用范围或功能提出任何限制。

尽管能够在可以在一台或多台计算机上运行的程序的计算机可执行指令 的一般上下文中描述以上公开的系统和方法,但是,本领域的技术人员将认识 到,各方面也可以与其他程序模块等相结合地实现。一般而言,程序模块包括 执行特定任务或实现特定抽象数据类型的例程、程序、组件和数据结构等。此 外,本领域技术人员可以理解,上述系统和方法可用各种计算机系统配置实现, 包括单处理器、多处理器或多核处理器计算机系统、小型计算设备、大型计算 机、以及个人计算机、手持式计算设备(例如,个人数字助理(PDA)、电话、 手表……)、基于微处理器或可编程消费者或工业电子设备等。各方面也可以 在其中任务由通过通信网络链接的远程处理设备执行的分布式计算环境中实 现。然而,所要求保护主题的某些方面,如果不是所有方面的话,可以在独立 计算机上实施。在分布式计算环境中,程序模块可以位于本地和远程存储器存 储设备中的一个或两者中。

参考图8,示出了示例性通用计算机810或计算设备(例如,台式机、膝 上型计算机、服务器、手持式设备、可编程消费或工业电子产品、机顶盒、游 戏系统……)。计算机810包括一个或多个处理器820、系统存储器830、系 统总线840、大容量存储850、以及一个或多个接口组件870。系统总线840与 至少上述系统组件通信地耦合。然而,可以理解,在其最简单的形式中,计算 机810可包括耦合到系统存储器830的一个或多个处理器820,该一个或多个 处理器执行各种计算机可执行动作、指令和/或组件。

处理器820可以用通用处理器、数字信号处理器(DSP)、应用程序专用 集成电路(ASIC)、现场可编程门阵列(FPGA)或其它可编程逻辑设备、分 立门或晶体管逻辑、分立硬件组件或被设计为执行此处描述的功能的其任意组 合来实现。通用处理器可以是微处理器,但在替换方案中,处理器可以是任何 处理器、控制器、微控制器、或状态机。处理器820还可被实现为计算设备的 组合,例如DSP和微处理器的组合、多个微处理器、多核处理器、结合一个 DSP核的一个或多个微处理器、或任何其它这种配置。

计算机810可包括各种计算机可读介质或以其他方式与各种计算机可读介 质交互以便于控制计算机810来实现所要求保护主题的一个或多个方面。计算 机可读介质可以是能由计算机810访问的任何可用介质,并包含易失性和非易 失性介质以及可移动、不可移动介质。作为示例而非限制,计算机可读介质可 包括计算机存储介质和通信介质。

计算机存储介质包括以用于存储诸如计算机可读指令、数据结构、程序模 块或其它数据这样的信息的任意方法或技术来实现的易失性和非易失性、可移 动和不可移动介质。计算机存储介质包括,但不限于,存储器设备(例如,随 机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器 (EEPROM)……)、磁存储设备(例如,硬盘、软盘、磁带盒、磁带……)、 光盘(例如,紧致盘(CD)、数字多功能盘(DVD)……)、以及固态设备 (例如,固态驱动器(SSD)、闪存驱动器(例如,卡、棒、键驱动器……)……)、 或者可用于存储所需信息并且可由计算机810访问的任何其他介质。

通信介质通常以诸如载波或其他传输机制等已调制数据信号来体现计算 机可读指令、数据结构、程序模块或其他数据,并包括任何信息传送介质。术 语“已调制数据信号”是指具有以在信号中编码信息的方式被设定或改变其一 个或多个特征的信号。作为示例而非限制,通信介质包括诸如有线网络或直接 线连接之类的有线介质,以及诸如声学、RF、红外及其他无线介质之类的无线 介质。上述的任意组合也应包含在计算机可读介质的范围内。

系统存储器830和大容量存储850都是计算机可读存储介质的示例。取决 于计算设备的确切配置和类型,系统存储器830可以是易失性的(例如RAM)、 非易失性的(例如ROM、闪存……)或是两者的某种组合。作为示例,基本 输入/输出系统(BIOS),包括诸如在启动期间在计算机810内的元件之间传 输信息的基本例程,可被存储在非易失性存储器中,而易失性存储器可担当外 部高速缓存存储器以便于处理器820的处理等。

大容量存储850包括相对于系统存储器830来说用于存储大量数据的可移 动/不可移动、易失性/非易失性计算机存储介质。例如,大容量存储850包括 但不限于,诸如磁盘或光盘驱动器、软盘驱动器、闪存存储器、固态驱动器、 或记忆棒的一个或多个设备。

系统存储器830和大容量存储850可包括或其中存储有操作系统860、一 个或多个应用程序862、一个或多个程序模块864和数据866。操作系统860 用于控制和分配计算机810的资源。应用程序862包括系统和应用程序软件中 的一个或两者,并且可通过存储在系统存储器830和/或大容量存储850中的程 序模块864和数据866来利用操作系统860对资源的管理以执行一个或多个动 作。因此,应用程序862可根据由此提供的逻辑来将通用计算机810变成专用 机器。

所要求保护主题的全部或各部分可以使用产生控制计算机以实现所公开 功能的软件、固件、硬件或其任意组合的标准编程和/或工程技术来实现。作为 示例而非限制,支持组件130可以是应用程序862或形成应用程序862的一部 分,并且包括存储在存储器和/或大容量存储850中的一个或多个模块864和数 据866,其功能可以在由所示的一个或多个处理器820执行时实现。

计算机810还包括通信地耦合到系统总线840并方便与计算机810的交互 的一个或多个接口组件870。作为示例,接口组件870可以是端口(例如,串 行、并行、PCMCIA、USB、火线……)或接口卡(例如,声音、视频……) 等等。在一个示例实现中,接口组件870可被具体化为用户输入/输出接口,该 用户输入/输出接口使得用户能够通过一个或多个输入设备(例如,诸如鼠标等 定点设备、跟踪球、指示笔、触摸垫、键盘、话筒、操纵杆、游戏手柄、圆盘 式卫星天线、扫描仪、照相机、其他计算机……)来将命令和信息输入到计算 机810中。在另一示例实现中,接口组件870可被具体化为输出外围接口,该 输出外围接口向显示器(例如,CRT、LCD、等离子……)、扬声器、打印机 和/或其他计算机等提供输出。此外,接口组件870可被具体化为网络接口,该 网络接口使得能够诸如通过有线或无线通信链路与其他计算设备(未示出)通 信。

以上所已经描述的内容包括所要求保护主题的各方面的示例。当然,出于 描绘所要求保护主题的目的而描述每一个可以想到的组件或方法的组合是不 可能的,但本领域内的普通技术人员应该认识到,所要求保护主题的许多进一 步的组合和排列都是可能的。从而,所公开的主题旨在涵盖落入所附权利要求 书的精神和范围内的所有这样的变更、修改和变化。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号