CN102385513B - 反应式编程的编程语言支持 - Google Patents
反应式编程的编程语言支持 Download PDFInfo
- Publication number
- CN102385513B CN102385513B CN201110308242.3A CN201110308242A CN102385513B CN 102385513 B CN102385513 B CN 102385513B CN 201110308242 A CN201110308242 A CN 201110308242A CN 102385513 B CN102385513 B CN 102385513B
- Authority
- CN
- China
- Prior art keywords
- pattern
- equations
- event
- data
- pushed away
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/542—Event management; Broadcasting; Multicasting; Notifications
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明涉及反应式编程的编程语言支持。提供程序语言支持以便于反应式编程。提供了在第一类模式和第二类模式之间开始转换的代码,其中模式相对于基于推的数据来操作。还提供了对根据例如迭代器模式来产生和消费基于推的数据的支持。
Description
技术领域
本发明涉及计算机编程,尤其涉及反应式编程的编程语言支持。
背景技术
数据处理是计算机编程的基本部分。可从各种编程语言中选择创建程序的编程语言。用于特定应用程序的所选语言可取决于应用程序上下文、开发者的偏好或公司政策等等。无论所选语言如何,开发者最终将必须处理数据,即查询和更新数据。
数据可以根据其获得方式被归类为或是基于拉或是基于推。基于拉的数据是主动检取的数据。例如,程序可以在一阵列内的条目集合上迭代以请求和检取条目。类似地,可以从本地或远程数据库拉出数据。相反,基于推的数据在任意时刻被提供给程序。一个经典示例是响应于诸如鼠标移动或条目选择这样的用户输入来推出值的用户界面。鉴于通信等待时间、潜在误差或超时,异步计算也可以被视为基于推的数据的源。例如,程序可以请求在远程机器上执行计算,并且在计算完成时获得关于结果的通知。然而,返回计算结果的确切时间对于程序而言是未知的,并且会根据网络等待时间以及远程机器处理能力和负载等因素而变化。
作用于基于拉的数据可被称为交互式编程,而作用于基于推的数据可被称为反应式编程。在交互式的基于拉的程序中,请求数据的程序代码受到控制,在继续执行之前,代码会在数据变得可用之前会一直等待或中断。或者,在反应式的基于推的程序中,环境(例如数据库、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=>newEventHandler(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可被具体化为网络接口,该网络接口使得能够诸如通过有线或无线通信链路与其他计算设备(未示出)通信。
以上所已经描述的内容包括所要求保护主题的各方面的示例。当然,出于描绘所要求保护主题的目的而描述每一个可以想到的组件或方法的组合是不可能的,但本领域内的普通技术人员应该认识到,所要求保护主题的许多进一步的组合和排列都是可能的。从而,所公开的主题旨在涵盖落入所附权利要求书的精神和范围内的所有这样的变更、修改和变化。
Claims (14)
1.一种便于反应式编程的方法,包括:
为程序生成使本机第二类模式被自动地转换成在基于推的数据上操作的第一类模式而无需显式地指定转换的支持代码,其中所述第二类模式是用不能作为参数被传递或被分配给变量的第二类对象来实现的设计模式,而所述第一类模式是用能作为参数被传递、作为结果被返回、或被返回给变量的第一类对象来实现的设计模式。
2.如权利要求1所述的方法,生成使第二类事件模式被转换成第一类事件模式的支持代码,其中所述第二类事件模式是用不能作为参数被传递或被分配给变量的第二类事件来实现的设计模式,所述第一类事件模式是用能作为参数被传递、作为结果被返回、或被返回给变量的第一类事件实现的设计模式。
3.如权利要求1所述的方法,还包括:在程序中标识指定第一类模式所支持的附加功能的语法。
4.如权利要求1所述的方法,生成使第二类异步模式被转换成具有第一类返回值的第一类模式的支持代码,所述第二类异步模式是用其结果不能作为参数被传递或被分配给变量的第二类异步计算实现的设计模式,所述第一类返回值是经转换成的第一类模式所使用的第一类异步计算的结果。
5.如权利要求1所述的方法,生成使第二类属性被转换成第一类属性的支持代码,其中所述第二类属性不能作为参数被传递或被分配给变量,所述第一类属性能作为参数被传递、作为结果被返回、或被返回给变量。
6.如权利要求1所述的方法,还包括生成使得产生基于推的数据的第一类模式的附加代码。
7.如权利要求1所述的方法,还包括生成使得用基于拉的数据模式来消费基于推的数据的附加代码。
8.如权利要求1所述的方法,还包括为程序生成使第一类模式被转换成第二类模式的附加支持代码。
9.一种便于反应式编程的方法,包括:
为程序生成支持代码,以便于利用一个库,该库提供支持异步的和基于推的计算的功能,其中所述支持代码自动地发起将第二类模式转换成第一类模式而无需显式地指定转换,其中所述第二类模式是用不能作为参数被传递或被分配给变量的第二类对象来实现的设计模式,而所述第一类模式是用能作为参数被传递、作为结果被返回、或被返回给变量的第一类对象来实现的设计模式。
10.如权利要求9所述的方法,其特征在于,所述支持代码开始事件的转换。
11.如权利要求9所述的方法,其特征在于,所述支持代码开始异步模式的转换。
12.如权利要求9所述的方法,其特征在于,所述支持代码开始属性的转换。
13.如权利要求9所述的方法,其特征在于,所述支持代码开始将第一类模式转换成第二类模式。
14.如权利要求9所述的方法,其特征在于,所述支持代码在基于推的数据上编码迭代器模式,其中所述迭代器模式是设法在基于推的数据集合上迭代的模式。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US12/896,688 US20120084749A1 (en) | 2010-10-01 | 2010-10-01 | Programming language support for reactive programming |
US12/896,688 | 2010-10-01 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102385513A CN102385513A (zh) | 2012-03-21 |
CN102385513B true CN102385513B (zh) | 2015-10-07 |
Family
ID=45824954
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201110308242.3A Active CN102385513B (zh) | 2010-10-01 | 2011-09-28 | 反应式编程的编程语言支持 |
Country Status (2)
Country | Link |
---|---|
US (1) | US20120084749A1 (zh) |
CN (1) | CN102385513B (zh) |
Families Citing this family (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9400638B2 (en) * | 2011-11-08 | 2016-07-26 | Microsoft Technology Licensing, Llc | Reactive expression generation and optimization |
US10574714B2 (en) | 2014-06-25 | 2020-02-25 | Microsoft Technology Licensing, Llc | Stream-based reactive programming platform |
US10958743B2 (en) | 2017-07-31 | 2021-03-23 | Fanplayr Inc. | Method and system for segmentation as a service |
US11108758B2 (en) | 2018-06-08 | 2021-08-31 | Pivotal Software, Inc. | Reactive programming subscription context |
CN109189475B (zh) * | 2018-08-16 | 2022-06-10 | 北京算能科技有限公司 | 可编程人工智能加速器指令集的构建方法 |
US11188593B1 (en) | 2018-12-28 | 2021-11-30 | Pivotal Software, Inc. | Reactive programming database interface |
US11340946B2 (en) * | 2019-02-14 | 2022-05-24 | Pivotal Software, Inc. | Reactive pooling |
US11080086B1 (en) | 2019-03-12 | 2021-08-03 | Pivotal Software, Inc. | Reactive transaction management |
US10871950B2 (en) | 2019-05-16 | 2020-12-22 | Microsoft Technology Licensing, Llc | Persistent annotation of syntax graphs for code optimization |
CN111523860B (zh) * | 2020-04-23 | 2023-05-23 | 北京思特奇信息技术股份有限公司 | 一种采用组件化管理农业产品生产过程的方法和系统 |
CN112270176B (zh) * | 2020-11-09 | 2022-05-03 | 北京百度网讯科技有限公司 | 深度学习框架中模式转换的方法、装置和计算机存储介质 |
CN112597133A (zh) * | 2020-12-29 | 2021-04-02 | 深圳复临科技有限公司 | 一种百人研发团队项目管理场景的数据应用管理系统 |
CN114741063B (zh) * | 2022-04-06 | 2023-08-22 | 山东赤子城网络技术有限公司 | 一种基于Lua语言的编程框架实现方法及系统 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6868541B1 (en) * | 1998-12-21 | 2005-03-15 | Microsoft Corporation | Asynchronous programming environment |
CN1804803A (zh) * | 2005-01-14 | 2006-07-19 | 微软公司 | 具有对异步程序流程建模的软件工具 |
Family Cites Families (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6405363B1 (en) * | 1998-03-11 | 2002-06-11 | International Business Machines Corporation | Class casting support for run-time extensible items in an object oriented framework |
US6018628A (en) * | 1998-06-16 | 2000-01-25 | Sun Microsystems, Inc. | Method of implementing parameterized types to be compatible with existing unparameterized libraries |
US7280558B1 (en) * | 2001-06-28 | 2007-10-09 | Microsoft Corporation | Asynchronous pattern |
US20040133445A1 (en) * | 2002-10-29 | 2004-07-08 | Marathon Ashland Petroleum L.L.C. | Generic framework for applying object-oriented models to multi-tiered enterprise applications |
US7076772B2 (en) * | 2003-02-26 | 2006-07-11 | Bea Systems, Inc. | System and method for multi-language extensible compiler framework |
US7694276B2 (en) * | 2003-02-28 | 2010-04-06 | Microsoft Corporation | Contracts and futures in an asynchronous programming language |
US7707566B2 (en) * | 2003-06-26 | 2010-04-27 | Microsoft Corporation | Software development infrastructure |
US20050097146A1 (en) * | 2003-08-21 | 2005-05-05 | Konstantinou Alexander V. | Methods and systems for autonomously managing a network |
US7937694B2 (en) * | 2004-02-13 | 2011-05-03 | Microsoft Corporation | Fast flattening of nested streams |
US7661096B2 (en) * | 2004-02-13 | 2010-02-09 | Microsoft Corporation | Interaction with nested and non-nested streams |
US20080301125A1 (en) * | 2007-05-29 | 2008-12-04 | Bea Systems, Inc. | Event processing query language including an output clause |
US8745580B2 (en) * | 2008-05-16 | 2014-06-03 | Microsoft Corporation | Transparent type matching in a programming environment |
US20100131556A1 (en) * | 2008-11-25 | 2010-05-27 | Microsoft Corporation | Unified event programming and queries |
US20110107392A1 (en) * | 2009-11-05 | 2011-05-05 | Microsoft Corporation | Management of observable collections of values |
US20110138403A1 (en) * | 2009-12-08 | 2011-06-09 | Microsoft Corporation | Push-based application program interface based on duals of a pull-based application program interface |
US20120072442A1 (en) * | 2010-09-22 | 2012-03-22 | Microsoft Corporation | Monadic type preservation for query operators |
-
2010
- 2010-10-01 US US12/896,688 patent/US20120084749A1/en not_active Abandoned
-
2011
- 2011-09-28 CN CN201110308242.3A patent/CN102385513B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6868541B1 (en) * | 1998-12-21 | 2005-03-15 | Microsoft Corporation | Asynchronous programming environment |
CN1804803A (zh) * | 2005-01-14 | 2006-07-19 | 微软公司 | 具有对异步程序流程建模的软件工具 |
Also Published As
Publication number | Publication date |
---|---|
US20120084749A1 (en) | 2012-04-05 |
CN102385513A (zh) | 2012-03-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102385513B (zh) | 反应式编程的编程语言支持 | |
CN101689112B (zh) | 后期绑定程序协助 | |
CN102708121A (zh) | 异构源上的动态分布式查询执行 | |
US11210072B2 (en) | System for generating a map illustrating bindings | |
CN102567457A (zh) | 对象模型到键值数据模型的映射 | |
CN102938135B (zh) | 缩略图缩放 | |
CN103493011A (zh) | 与库操作系统的应用兼容性 | |
US9841953B2 (en) | Pluggable components for runtime-image generation | |
CN101965561A (zh) | 用于异步方法的声明性支持 | |
CN102541992A (zh) | 用于高效地查询数据库的同态定理 | |
CN102236578A (zh) | 分布式工作流执行 | |
CN102929637A (zh) | 反应性表达式生成和优化 | |
KR101941641B1 (ko) | 동일한 타입의 다수의 메타데이터 표현을 효율적으로 제공하는 기법 | |
CN102609292B (zh) | 指令优化 | |
CN102591925A (zh) | 以多维数据为中心的服务协议 | |
CN102591710B (zh) | 共享对象表示 | |
CN102567044A (zh) | 代码部署协助 | |
CN103460192A (zh) | 具有增强的需求-能力定义的资源消耗 | |
US10489167B2 (en) | Dynamically binding data in an application | |
US20200065654A1 (en) | Neural network fusion apparatus and modular neural network fusion method and matching interface generation method for the same | |
CN102541993A (zh) | 用于分布式计算的电子表格模型 | |
CN103617055A (zh) | 一种在浏览器中启动应用程序的方法、装置和浏览器 | |
US20140215438A1 (en) | Dictionary-based dependency determination | |
Shunkevich et al. | Ontological approach to the development of a software model of a semantic computer based on the traditional computer architecture | |
CN102402420B (zh) | 解析可观察集合 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
ASS | Succession or assignment of patent right |
Owner name: MICROSOFT TECHNOLOGY LICENSING LLC Free format text: FORMER OWNER: MICROSOFT CORP. Effective date: 20150720 |
|
C41 | Transfer of patent application or patent right or utility model | ||
TA01 | Transfer of patent application right |
Effective date of registration: 20150720 Address after: Washington State Applicant after: Micro soft technique license Co., Ltd Address before: Washington State Applicant before: Microsoft Corp. |
|
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |