CN102859489A - 可恢复的方法 - Google Patents

可恢复的方法 Download PDF

Info

Publication number
CN102859489A
CN102859489A CN2011800209045A CN201180020904A CN102859489A CN 102859489 A CN102859489 A CN 102859489A CN 2011800209045 A CN2011800209045 A CN 2011800209045A CN 201180020904 A CN201180020904 A CN 201180020904A CN 102859489 A CN102859489 A CN 102859489A
Authority
CN
China
Prior art keywords
code
restoration methods
compiler
class
reference mark
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.)
Granted
Application number
CN2011800209045A
Other languages
English (en)
Other versions
CN102859489B (zh
Inventor
H·J·M·梅杰
M·托格森
N·M·加夫特
N·古斯塔夫松
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Microsoft Technology Licensing LLC
Original Assignee
Microsoft Corp
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Microsoft Corp filed Critical Microsoft Corp
Publication of CN102859489A publication Critical patent/CN102859489A/zh
Application granted granted Critical
Publication of CN102859489B publication Critical patent/CN102859489B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • G06F8/314Parallel programming languages

Abstract

提供了API,所述API处于编程语言的外部但是提供可插入到语言编译器中的功能。所提供的API调节与使用通用基于模式的方案进行的异步编程、迭代器或编写对称协同例程相关联的功能。在API中提供了若干类型的可恢复方法,所述可恢复方法可以应用于以传统程序代码编写的方法主体。以传统编程代码编写的方法主体中的在句法上可区分的控制点通过编译器使用外部API来调用该代码的变换。经变换的代码实现夹在经变换的代码的控制点之间的代码的暂停和恢复。里面具有控制点的方法内所包括的源代码被变换为使得该方法内的代码可以在分立的部分中执行,每个部分都在经变换的代码中的控制点处开始和结束。

Description

可恢复的方法
背景技术
多核处理器是一种包括两个或更多单独的处理器(核)的处理系统。众核(many-core)处理器是一种如下的处理器:在所述处理器中,核的数目大得足以使得传统的多处理器编程技术不再为高效的。
为众核处理器开发软件的程序员必须调整他们编写他们的程序的方式。也就是说,为了为这些类型的计算环境编写高效的程序,程序员必须编写异步代码、一种可以与其他代码并发执行而不对其产生干扰的代码。在没有语言支持的情况下编写无阻塞异步代码是困难的,因为程序员必须以连续传递样式(continuation passing style,CPS)、例如通过使用基于回调的代码来编写代码。在传统同步编程中为隐式的事物在CPS编程中变为显式的。例如,在传统编码中,当函数被调用时,其返回某值。在CPS中,函数采取显式连续变元(argument)、一种接收在原始函数内执行的计算的结果的函数。类似地,当子例程在CPS函数内被调用时,主调函数必须提供将用子例程返回值来调用的过程(procedure)。
诸如例如C#之类的一些语言确实提供了某种形式的借助于迭代器构造改写的编译器支持的连续传递。这种类型的语言支持对于递归而言以及对于异步编程所需的其他类型的编码技术而言不是特别优化的。
概述
尽管针对迭代器的内建语言支持可以帮助解决与被惰性地评估的集合相关联的一些问题,并且尽管在某些语言中在某种程度上不存在针对异步编程的内建语言支持,但是在此所公开的主体针对一种统一方案,其抽象出这些领域的各个方面的特性并且提供通用的外部机制,所述外部机制可以解决与异步编程、通过迭代器惰性地生成集合、编写对称协同例程等等相关联的大量问题。
提供了API(程序模块),所述API处于编程语言的外部但是提供可插入到语言编译器中的功能。所提供的API调节与使用通用基于模式的方案进行的异步编程、迭代器或编写对称协同例程相关联的功能。在API中提供了若干类型的可恢复方法,所述可恢复方法可以应用于以传统程序代码编写的方法主体。以传统编程代码编写的方法主体中的在句法上可区分的控制点通过编译器使用外部API来调用该代码的变换。经变换的代码实现夹在经变换的代码的控制点之间的代码的暂停和恢复。也就是说,里面具有控制点的代码的本体(例如方法)中所包括的源代码被变换为使得该方法内的代码可以在分立的部分中执行,每个部分都在经变换的代码中的控制点处开始和结束。
无论控制点位于代码中的何处,该代码都可以要么直接地、要么作为暂停的递归调用的一部分而暂停。该代码可以从其暂停的点处恢复。不同类型的可恢复方法可以通过该方法在暂停后如何以及何时恢复、以及通过在代码暂停、返回和终止以后来回流动的变元和返回值的类型来区分。暂停控制点可以任选地向调用者返回值,并且可以使用yield(控制权转移)表达式从恢复模块接收值。递归调用控制点可以递归地应用兼容的可恢复方法,其中所述可恢复的方法进行由该方法使用yield or yield-for-each表达式所确定的暂停。返回控制点在具有或不具有结果值的情况下用信号通知可恢复方法的终止。
提供本发明内容以便以简化形式介绍将在以下详细描述中进一步描述的一些概念。本发明内容并不旨在标识所要求保护主题的关键特征或必要特征,也不旨在用于限制所要求保护主题的范围。
附图说明
在附图中:
图1示出了根据在此公开的主题的各方面的系统100的示例,该系统100提供了处于编程语言外部的用于可恢复方法的机制;
图2a-2d是根据在此所公开的主题的各方面的驱动程序类的示例;
图2e是根据在此所公开的主题的各方面的源代码的示例;
图2f是根据在此所公开的主题的各方面的经变换代码的示例;
图2g是根据本文所公开主题的各方面的经改写方法的示例;
图2h-2j是根据在此所公开的主题的各方面的实现迭代器的可恢复方法的示例;
图2k是根据此处所公开的主题的各方面的用于使用外部API来实现可恢复方法的方法201的示例的流程图;
图3是示出了其中可以实现此处所公开的主题的各方面的计算环境的示例的框图;以及
图4是根据此处所公开的主题的各方面的集成开发环境的示例的框图。
具体实施方式
概览
在此公开的主题描述了语言编译器的特性与插入到编译器的基于模式的应用编程接口(API)插件之间的合约。API插件使该特性适应于异步编程、迭代器、对称协同例程等等,从而向编译器提供针对每个特定类型的可恢复方法要做些什么的细节。该特性重新构建输出代码(例如中间代码),从而移除了源代码与输出代码之间的一一对应。包括一个或多个控制点的源代码被变换为使得输出代码可以在分立的部分中执行,每个部分都在经变换的输出代码中的控制点处开始和结束。例如,最终用户可以编写传统的同步代码,直到他达到如下的点:在该点处,他想要他的代码能够暂停以等待某事物而不必停止所有处理。在该点处,最终用户可以在其代码中的任何位置、包括在深度嵌套在该语言的控制结构内的点处插入控制点。编译器对控制点的输入的识别将触发对通过源代码中的控制点表达的形式(签名)所标识出的API的编译器变换。被调用的API确定源代码中的语言句法的有效性,并且可以在后台编译器被使用的情况下展示异步编程特有版本的与编译器的语言特性的交互。
使用外部API来扩展编译器以实现可恢复的方法
图1示出了根据在此公开的主题的各方面的系统100的示例,该系统100提供了处于语言编译器外部的用于实现可恢复方法的机制。系统100的全部或某些部分可以驻留在诸如下面参考图3所描述的计算机之类的一个或多个计算机上。系统100的全部或某些部分可以驻留在诸如下面参考图4所描述的计算机之类的一台或多台软件开发计算机(例如,计算机102)上。系统100或其一些部分可以包括诸如下面参考图4所描述的和所示出的那些集成开发环境(例如,IDE 104)的一部分。替代地,系统100或其一些部分可以作为独立系统或作为插件或附加件来提供。
系统100可以包括以下中的一个或多个:处理器(比如处理器142)、存储器144、以及提供实现可恢复方法的机制的API或模块的库106。也可以包括本领域已知的其他组件,但此处未示出。能够理解,库106的一个或多个模块可以被加载到存储器144中以致使诸如处理器142之类的一个或多个处理器执行归因于如下API的动作:所述API提供了实现可恢复方法的机制,所述机制处于编程语言之外并且可以插入到语言编译器中。
系统100可以包括下列各项中的一个或多个:编译器114,比如后台编译器、并行编译器或增量编译器;解析器,比如后台解析器、并行解析器或增量解析器;或者插件、预处理器、或附件;或者对IDE、解析器、编译器或预处理器的扩展。在此所述API可被附连到、并入土诸如下列编译器或与诸如下列编译器相关联:编译器,比如后台编译器、并行编译器或增量编译器;解析器,比如后台解析器、并行解析器或增量解析器;或者插件、预处理器、或附件;或者对IDE、解析器、编译器或预处理器的扩展。编译器114可以包括与专用API交互的一个或多个模块。
在处于语言编译器外部的库中提供了特定种类的专用可恢复方法、比如但不限于异步或迭代器方法。应用程序员可以通过如下方式致使这些方法被应用于包含传统编程代码的方法主体:向该传统代码添加所述方法本体中的一个或多个在句法上可区分的控制点。包括包含这样的控制点112的方法108的输入源代码可以由编译器114使用来自库106的API来变换以生成诸如经变换方法110之类的经扩展方法,其使得经变换方法110在被执行时能够在夹在控制点之间的分立部分中执行,这将在下面予以更充分描述。控制点是一种如下的点:在该点处,方法中的代码的主体可以要么直接地暂停,要么因为该方法是暂停的递归方法调用的一部分而暂停。不同种类的可恢复方法的区别在于该方法在暂停后如何以及何时恢复,以及在暂停、返回和终止以后哪些变元和返回值来回流动。Yield表达式可以任选地向调用者返回值,并且从恢复器或恢复模块接收用于暂停控制点的值。yield或yieldforeach表达式可以递归地应用兼容的可恢复方法,其中所述可恢复方法正如该方法所确定的针对递归控制点而暂停。返回语句在具有或不具有返回控制点的最终结果值的情况下用信号通知可恢复方法的终止。
不同种类的可恢复方法的区别在于该方法在暂停后如何以及何时恢复,以及在暂停、返回和终止以后哪些变元和返回值来回流动。Yield返回表达式可以任选地向调用者返回值,并且从恢复器或恢复模块接收用于暂停控制点的值。yield或yieldforeach表达式可以递归地应用兼容的可恢复方法,其中所述可恢复方法正如该方法所确定的针对递归控制点而暂停。返回语句在具有或不具有返回控制点的最终结果值的情况下用信号通知可恢复方法的终止。活动的可恢复方法可以由从诸如可恢复(Resumable)类之类的可恢复方法类中派生(derive)的某种类型的帧(frame)对象来表示。该对象在方法被挂起时表示该方法的栈帧。当方法被挂起时,表示所挂起方法的栈帧可以被复制到另一数据结构并且可以从机器栈中移除。因此,所挂起的方法可以在物理上不驻留在栈上。可替代地,栈的整个状态可以被保存,从而无论该方法是活动还是挂起都将其维持在堆上。
在传统的不可恢复的控制流中,机器使用单个执行线程来执行当前正等待执行的方法的连续栈。栈上的每个方法都等待另一方法返回到该方法。栈通常不能直接被编译器访问。在实现可恢复方法的一些环境中,可恢复方法在遇到特定语句时暂停。此时,根据在此所公开的主体的各方面,所暂停方法的栈的帧可以被保存并且在该方法恢复时被放回到该栈上。关于什么可恢复方法调用了何种可恢复方法的信息被存储在单独的数据结构中,使得当方法返回时,该返回可以定向到由负责的驱动程序类指定的正确接收者。也就是说,驱动程序类的每个实例(即每个专用对象)都表示机器栈的所保存的表示中的方法调用。从特定驱动程序类中实例化的对象表示执行中的特定可恢复方法调用。专用对象的集合表示以前由该栈维护的控制链。执行中的方法调用是当前正在运行或已经暂停并还未结束的任何方法调用。当可恢复方法返回结构时,其将该结果提供给调用该方法的方法并且主调方法恢复。
根据在此所公开的主体的一些方面,编译器生成致使控制转移到所恢复方法的代码,从而变换输入源代码。当可恢复方法恢复时,可以调用Invoke方法或帧对象上的其他调用方法,所述调用方法将针对所恢复方法的真实激活记录放回到机器栈上。如果所暂停方法(第一可恢复方法)正递归地等待另一所挂起的可恢复方法(第二可恢复方法),则第二方法的帧对象可以类似地恢复,使得机器栈表示可恢复方法的实际调用顺序。因此,异常传播、调试等等自然可以构建在相应的内建机制上,比如、但不限于用于异常传播和调试的CLR机制。其他用于栈处理的机制也是可能的。
不同种类的可恢复方法可以由从抽象可恢复基类中派生的驱动程序类来定义。图2a示出了这样的抽象基类Resumable(可恢复)200的实例。特定的可恢复方法可以由作为派生的类编译器从这些驱动程序类中生成,从而将暂停逻辑实现为状态机。
可恢复方法的状态机改写可以被认为是发生在两个阶段中。第一阶段可以将方法主体放置到从驱动程序派生的由编译器生成的类中的调用方法的覆盖(override)中,其中控制点的任何出现都被改写成下列各项之一:
a)对驱动程序类中的“之前(before)”方法的调用,其中任何变元都被传递给控制点;
b)对特定的专用命令的调用以用于进一步改写;
c)对驱动程序类中的“之后(after)”方法的调用,其中该方法将任何所得到的值传递给出现控制点的上下文。
在第二阶段中,编译器生成的类和Invoke方法可以用状态机逻辑来扩充,并且所述专用命令可以被改写成用于状态变换和挂起的代码。
下面描述语言特性和库API可以如何使用驱动程序类来交互的实例。根据在此所述公开的主体的一些方面,驱动程序类实现了处于编程语言外部的专用部分。可以使用暂停控制点来暂停方法的执行。假定:特定的方法表达式了要随时间渐进地执行的工作的主体。为了使方法可返回,可以在方法本体中插入暂停控制点。例如如果集合的元素正在被生成,则可以将暂停控制点插入在生成下一元素的计算已经被执行的点处。在该点处,元素可以被yield返回。当集合的下一元素被请求时,该方法可以恢复并且可以在从中作出yield返回的点处返回。
递归控制点每当被调方法暂停时都暂停作出递归调用的方法。例如,假定第一迭代器可以yield3个元素(一次一个),并且第二迭代器可以yield 2个元素(一次一个),这两个迭代器可以通过创建可调用其他可恢复方法的可恢复方法被组装成能够顺序地yield全部5个元素的迭代器。所组装的迭代器方法可以首先调用第一迭代器并且使其一次一个地yield它的三个元素。当第一迭代器已经yield出了所有三个元素时,所组装的方法可以调用第二迭代器,所述第二迭代器yield出其他两个元素。当第一迭代器暂停时,所组装的迭代器方法被暂停。类似地,当第二迭代器暂停时,所组装的迭代器方法被暂停。返回控制点用信号通知可恢复方法的终止,并且被用于定义在工作完成时要做些什么。尽管可能在一路上发生了若干暂停和若干恢复,但是该工作最终完成。返回可以仅仅指示该工作完成,或者也可以包括已完成的工作的结果。
异步方法可以每当等待时间周期长时使用,例如在输入输出操作期间或者针对通过网络的通信来使用。例如假定:用户想要从网页下载某些信息,对所下载的信息执行某种计算,并且将计算结果发送给另一网页。当所述操作完成时,将返回指示成功或失败的布尔结果。为了同步地执行这些操作,通常使用调用两个助手方法的方法。所述助手方法之一通常导航到该网页并且提取所期望的内容。在内容被接收以后,执行该计算。第二助手方法通常被调用以将计算结果发送给另一网页。当完成时,该方法返回布尔结果。该情况中的同步处理尤其是在进行到该网页的连接并且所下载的内容被检索时以及还有在计算结果被发送给第二网页时导致等待时间段。根据连接速率、网络通信量以及所下载信息的大小,等待时间可以是显著的。
使用异步方法执行该系列动作将释放操作系统线程资源,这可以导致更好的用户体验。例如,在任何基于GUI的应用中,仅仅单个线程服务于用户输入事件,使得释放线程失败可能导致非常差的用户体验。然而,在没有语言支持的情况下实现异步方法是困难的,因为不能使用正常的控制结构。因此,程序员必须人工地编写和调试嵌套回调、一种困难和易错的任务,从而导致代码也难以阅读和维护。此外,代码的复杂度随着方法内的经“人工”(非程序性地)变换的控制点的数目增长而迅速增加。根据在此公开的主体的各方面,控制点可以以任意嵌套深度被放置在正常的控制结构内。可以在异步驱动程序类所支持的异步方法内进行递归调用。回调由编译器生成,其中回调该方法但是是对开发者透明的。在从网页下载的示例中,异步方法首先yield到从web读取的方法,计算被执行,然后对方法进行递归yield,该方法将计算结果发送给第二网页,并且最终布尔结果被返回。因此,控制流与在同步方法的情况下一样,但是处理器从不空闲。迭代器类似地工作,只是客户端触发集合的下一元素的生成、而不是来自网页的回调触发下一步骤。不同的环境组驱动由驱动类的特性描述的不同过程。
因此,上述不同类型的控制点实现了向传统方法那样的对可恢复方法的组装,而无须开发者应付可恢复方法的复杂度。可恢复的方法可以通过调用其他异步或可恢复方法或者通过该方法递归地调用其自身来组装。尽管一般而言,迭代器可以调用其他迭代器并且异步方法可以调用其他异步方法,但是根据在此所述的主体的各方面,驱动程序类规定何种可恢复方法可以从特定的可恢复方法中调用,使得可恢复方法不限于调用相同类型的另一可恢复方法。
如上所述,表示执行控制链(例如栈)的专用对象可以由编译器从专用抽象基类中生成。专用抽象基类包括特定行为和方法。例如,抽象类Asynch<T>(图2d中示出)可以被编译器用于作出包括Asynch<T>类的特定方法主体的所派生的类。所派生的Asynch<T>类被实例化成帧对象。该帧对象中的代码的一部分可以由来自库的专用基类来贡献,并且其一部分可以由可放入该方法特有的逻辑中的编译器来贡献。在经变换或扩充版本的方法中,将存在对从基类库中继承的专用方法的调用,上述方案的替代方案包括:创建两个对象,一个对象通过包含核帧对象的编译器来创建,一个对象由库来提供,其中所述对象通过它们的方法彼此通信。
根据在此所述的主体的各方面,在每个控制点处,编译器生成代码可以在驱动程序类上的方法暂停以前调用该方法,并且可以在驱动程序类上的方法恢复以后调用该方法,以向该方法提供执行其专用行为的机会。例如,对于yield控制点而言,存在编译器生成的代码将在基类上调用的之前yield方法和之后yield方法。对于返回的递归调用而言,存在之前yield返回方法和之后yield返回方法,并且对于返回而言,存在之前返回方法而不存在之后返回方法,因为方法在其完成时返回。之前和之后方法调用使得驱动程序类能够指定要执行的方法。如果驱动程序类未指定之前yield或之后yield方法,则编译器不能生成对它们的方法调用,使得使用这种控制点将在由该驱动程序类管理的可恢复方法中为非法的。因此,驱动程序类可以通过指定之前和之后方法或者通过未能指定之前和之后方法来指定这些控制点中的哪些是可用的。
附加于确定特定控制点是否为可用的,驱动程序类可以确定控制点对哪些情形可用。由于该交互是基于模式的并且该模式确定编译器生成的代码调用哪个方法,因此通过指定该方法采取哪些变元,驱动程序类可以指定哪些方法可以被递归地调用。可以存在方法的多个过载(overload),使得例如异步方法可以被允许调用多种类型的异步方法,这可以实现不同模型之间的互操作。类似地,变元类型化的指定可以用于调用由当前处于库中的任务类表示的方法。
最后,驱动程序类可以确定:该方法的本体中有些什么,也就是说,驱动程序特有的行为在yield以前是什么样的。例如,一些数据可以在帧类之间转移,或者处理可以被执行以使数据表示为恢复做好准备。关于迭代器,之前yield返回方法调用可以指定集合的下一元素值如何被yield,并且如何将该值传输给客户端。之前和之后方法是开放式的,并且可以用于实现迭代器、异步方法及其变型。例如,各个异步方法可以由参数化的驱动程序类来表示,所述驱动程序类可以由最终用户创建以用于任何命令性的编程语言。
图2a-2d示出了实现上述方面的驱动程序类的非限制性示例。能够理解,尽管所提供的示例使用按照名称标识出方法的特定句法形式,但是可以使用不限于命名方法的其他句法形式。图2a示出了可从中派生服务特有的驱动程序类的可恢复方法(类Resumable 200)的系统范围的基类的示例。图2b示出了抽象类AsyncResumable 210的示例,所述抽象类从类Resumable 200中派生并且是异步特有的。图2c和2d中示出了抽象类AsyncResumable 210的两个变型。从抽象类AsyncResumable 210派生的类Async 220、以及也是从抽象类AsyncResumable 210派生的类Async<T>230。类Async 220被用于创建表示不具有结果的异步操作的对象。类Async<T>230是通用类,其用于创建表示具有类型T的结果的异步操作的对象。
AsyncResumable 210的主体包括BeforeYield(之前Yield)方法212和AfterYield(之后Yield)方法214。之前方法(例如BeforeYield方法212)和之后方法(例如AfterYield方法214)的签名描述了可以递归地调用的方法的类型,并且保证返回值被正确地生成和消费。当在类定义中缺少之前返回方法的类型时,调用那种返回是非法的(例如在类Async 220的定义和类Async<T>的定义中缺少BeforeYieldReturn方法意味着在这些异步方法中调用YieldReturn是非法的)。BeforeYield和AfterYield方法在AsyncResumable 210的类定义中的存在指示:从AsyncResumable方法中,yield是可能的。由于缺少BeforeYieldReturn方法和AfterYieldReturn,因此yield返回控制点不能用在AsyncResumable方法中。可以yield其他异步方法,除了异步方法以外的方法不能被yield。
类Async 220和Async<T>230的定义包括其他返回方法。类Asynch 220的BeforeReturn方法222指示:在没有结果值的情况下仅能进行返回,因此其不采取变元。类Asynch<T>230的BeforeReturn方法232指示:该方法返回类型T的值,因此BeforeReturn方法232采取类型T的变元。因此,如果“返回7”被包括在返回Async<int>的可恢复方法的主体中,则编译器生成的利用变元7对BeforeReturn的调用将无问题地解析到BeforeReturn方法232。然而,如果方法尝试向Async<int>方法返回字符串,则编译器将发现签名不匹配并且将返回编译时错误。
图2e示出了最终用户可以编写的包括异步可恢复方法240的代码的代码段的示例。该方法可以通过返回Async<int>(上述驱动程序类之一)的语句staticAsync<int>M()242而被确定为异步的。处于可恢复方法240内的是正常控制流代码,该代码将“之前(before)”写入控制台(console),并且然后yieldx(int x=yield Wait(10);语句244)。该行代码的控制点是“yield”表达式,其触发方法240到图2f中所示方法250的转换。方法250被改写以生成如图2g方法260中所示的MFrame类的实例。编译器生成称为MFrame的从Async<int>中派生的类,并且如图2f所示扩充yield和返回的出现。能够理解,经扩充的方法250覆盖所调用方法(public override void Invoke(){)(语句251)并且现在具有用户编写的代码以及通过其中的编译器生成的附加代码。Console.WriteLine(“之前”)和Console.WriteLine(“之后”)语句仍然在那里,但是在这两个语句之间,方法240的语句int x=yield Wait(10)语句244已经被扩充到调用Wait(10)语句252并且然后调用BeforeYield语句253的代码中。
调用BeforeYield的结果是,该方法的执行暂停,这由行CALL(tmp2);语句254中的“CALL”来指示。“CALL”和“返回”在调用方法的主体中的出现用信号向编译器通知:状态机控制代码必须被插入在这些点处。对Before(之前)和After(之后)方法的调用是从原始源代码的句法中生成的。编译器可以对照Async<T>中提供的方法使用方法绑定规则和技术来检查调用,并且在方法未被正确使用时提出错误。因此,递归调用被充分强地类型化。当方法恢复时,方法AfterYield被调用(在行var tmp3=AfterYield(tmp2);语句255中)。调用AfterYield的结果可以被放入变量tmp3中。tmp3变量的内容通过下列用户编写代码被分配给变量x:x=tmp3;statement 256,“之后”被写入到控制台中(语句259),x通过调用BeforeReturn(x)被返回(语句258),并且返回行语句259被执行。
图2h-j示出了实现迭代器的可恢复方法的示例。图2h中所示的驱动程序类270声明了称为Iterator(迭代器)的抽象类,该抽象类是从抽象类Resumable派生的并且实现IEnumerator接口(abstract class Iterator;Resumable,IEnumerator)。IEnumerator接口具有称为MoveNext的方法,该方法移动到集合中的下一元素。IEnumerator接口还具有Current(当前)属性,其中存储了集合中的当前元素(MoveNext所移动到的元素)的值。每当MoveNext方法在Iterator上被调用时,该方法的具有其中的控制点的下一部分可以被执行。驱动程序类270为YieldReturn、YieldForeach、YieldBreak(return)提供与针对Async类的类似方法不同的“Before”和“After”方法。该示例中的YieldForeach的过载的数目展示了该方法的强大。例如,一个过载的YieldForeach从可枚举(enumerable)获得枚举器并且将其变换成迭代器并且递归地调用该迭代器。“PAUSE(暂停)”命令可以用于改写YieldReturn控制点。
图2i示出了简单的迭代器、即静态迭代器F 280。迭代器F 280包括控制点、即yield返回语句(“yield return 1;”语句282),其直接生成集合的元素并且然后暂停。迭代器F 280还包括控制点“yield foreachF();”语句284,其递归地调用迭代器F直到F用完了集合中的元素。因此,多个值可以利用yield之间的暂停来yield。语句“yield return 2;”语句286返回其他值。“yield break;”
125085  1PWCN
语句288在集合的所有元素都已经被yield时执行。
迭代器F 280可以由编译器来翻译,这如图2j中所示。从图2j中可以得知,Iterator F()中的每个控制点都可以被转换成对“之前”和“之后”方法的调用(例如图2j中所示语句“yield return 1”语句282被变换成如图2j中所示的对BeforeYieldReturn(1)的调用语句292、如语句294中所示对PAUSE的调用、以及如语句296中所示对AfterYieldReturn的调用)。类似地,YieldForeachF();语句284被翻译成图2j中的单个语句298中所示的BeforeYieldForeach语句、CALL语句和After YieldForeach语句。当迭代器F 280被执行时,具有值的yield返回被返回(语句292),PAUSE语句294致使方法挂起执行,并且当该方法恢复时,该方法将如语句296中所示调用AfterYieldReturn方法。如图2h语句272中所示,BeforeYieldReturn从Iterator类继承,从而将当前值设置为对象o,使得当对MoveNext的调用完成时,当前值将被返回。
三个语句298中所示的语句对语句284的YieldForeach控制点类似地操作以用于递归调用,并且达到三个过载、即过载274、过载276和过载278。这三个不同的过载允许不同的YieldForeach方法采取不同的变元并且通过集合的不同表示来实现yield。第一过载、即过载274递归地调用另一迭代器。针对第二过载、即过载276,Enumerable(可枚举)表示对象的集合并且具有称为Get Enumerator的方法。当Get Enumerator被调用时,该集合的新元素被获得。当到达该集合的结尾时,不再能获得元素。最后一个过载、即过载278使得能够获得该集合的新实例。
将调用方法最终变换成状态机类似于在此所述的迭代器和异步方法的变换。每个PAUSE和CALL都被分配状态。在方法的开始处和每个尝试块的开始处添加逻辑以分叉到该代码中与当前状态相关联的点。PAUSE点暂停或挂起方法的执行并且将状态推进到紧接在PAUSE以后并且返回。后面的恢复将重新调用该调用方法,从而分叉到紧接在PAUSE命令之后的点。CALL点不挂起执行。相反,其开始对被调用的可恢复方法的执行。被调用的可恢复方法可以包括诸如PAUSE之类的控制点,使得被调用的可恢复方法本身可以暂停或挂起,从而致使整个栈被暂停(包括主调方法)。
通过组合迭代器和异步方法,可以创建诸如IAsyncEnumerator之类的用户定义的驱动程序类,其中IEnumerator MoveNext方法是异步的。这样的组合方法可以递归地调用异步方法和同步迭代器二者,从而实现各种附加的控制点。对称协同例程可以通过创建协作方法实现,其中所述协作方法彼此传递控制(而不是返回到彼此),同时保留每次恢复之间的执行状态。与异步方法的某些实施方式不同,协作方法可以不增加调用栈的深度。相反,调用栈的叶帧可以被换出。
图2k是用于使用外部API来扩展编译器以实现可恢复方法的方法201的示例。在203,可以由编译器接收源代码。该编译器可以是诸如参照图1所述的编译器之类的编译器。响应于识别在句法上可区分的控制点(比如上述暂停、递归调用和返回控制点),在205,编译器可以调用由控制点表达式的签名确定的外部API。如上所述,被调用的API可以是专用方法并且可以驻留在编译器外部的库中。如上所述,表示控制链(例如栈)的专用对象可以由编译器从库中的专用抽象基类中生成。可替代地,替代于调用抽象基类,可以调用符合控制点表达式的签名的任何代码,包括但不限于:非抽象基类、接口、具有扩展方法的静态类等等。专用抽象基类或其他代码可以包括专用行为以及诸如异步和迭代器方法之类的方法。例如,抽象类Asynch<T>(图2b中示出)可以被编译器用于作出包括Asynch<T>类的特定方法主体的派生的类。
派生的可恢复类可以被实例化成诸如例如帧对象之类的对象。该对象中的代码的一部分可以由来自库的专用基类来贡献。该对象中的代码的一部分可以由编译器来贡献,其中该编译器放入该方法特有的逻辑。在209,所接收的源代码可以被变换成经扩充的代码,使得在所接收的源代码中的每个控制点处,编译器生成代码可以在驱动程序类上的方法暂停以前调用该方法,并且可以在驱动程序类上的方法恢复以后调用该方法,以向该方法提供执行其专用行为的机会。例如,编译器生成的代码可以调用基类上的之前yield方法和之后yield方法。针对返回的递归调用,编译器生成的代码可以调用之前yield返回方法和之后yield返回方法。类似地,对于返回,编译器生成的代码可以调用之前返回方法、但不是之后返回方法,因为方法在其完成时返回。之前和之后方法调用使得驱动程序类能够指定要执行的方法、以及由此哪些种类的控制点在特定可恢复方法中是合法的、以及控制点对哪些情形可用。由于该交互是基于模式的并且该模式确定编译器生成的代码调用哪个方法,因此通过指定该方法采取哪些变元,驱动程序类可以指定哪些方法可以被递归地调用。可以存在方法的多个过载,使得例如异步方法可以被允许调用多种类型的异步方法,这可以实现不同模型之间的互操作。驱动程序类可以确定与对象相关联的特定行为。在211,可以创建可执行代码。
合适的计算环境的示例
为了提供有关本文所公开的主题的各个方面的上下文,图3以及以下讨论旨在提供其中可以实现各实施例的合适的计算环境510的简要概括描述。尽管本文所公开的主题是在诸如程序模块等由一个或多个计算机或其它计算设备执行的计算机可执行指令的通用上下文中描述的,但本领域技术人员将认识到,本文所公开的主题的各部分还能够结合其它程序模块和/或硬件和软件的组合来实现。通常,程序模块包括执行特定任务或实现特定数据类型的例程、程序、对象、物理人为产物、数据结构等。通常,程序模块的功能可在各个实施例中按需进行组合或分布。计算环境510只是合适的操作环境的一个示例,并且不旨在对此处所公开的主题的使用范围或功能提出任何限制。
参照图3,描述了计算机512形式的用于线性栈上高效恢复协同例程的计算设备。计算机512可包括处理单元514、系统存储器516和系统总线518。处理单元514可以是各种可用处理器中的任何一种。也可以使用双微处理器及其他多处理器体系结构作为处理单元514。系统存储器516可包括易失性存储器520和非易失性存储器522。非易失性存储器522可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)或闪存。易失性存储器520可包括可充当外高速缓冲存储器的随机存取存储器(RAM)。系统总线518将包括系统存储器516的系统物理人为产物耦合到处理单元514。系统总线518可以是几种类型的总线结构中的任何一种,包括存储器总线、存储控制器、外围总线、外总线或局部总线,并且可以使用各种可用总线体系结构中的任一种。
计算机512通常包括各种计算机可读介质,诸如易失性和非易失性介质、可移动和不可移动介质。计算机存储介质可以通过用于存储诸如计算机可读指令、数据结构、程序模块或其它数据等信息的任何方法或技术来实现。计算机存储介质包括但不限于,RAM、ROM、EEPROM、闪存或其它存储器技术、CDROM、数字多功能盘(DVD)或其它光盘存储、磁盒、磁带、磁盘存储或其它磁存储设备、或可以用来储存所期望的信息并可由计算机512访问的任何其他瞬态或非瞬态介质。
将理解,图3描述了可充当用户与计算机资源之间的媒介的软件。该软件可以包括可存储在盘存储524上的操作系统528,该操作系统可控制并分配计算机系统512的资源。盘存储524可以是通过诸如接口526的不可移动存储器接口连接到系统总线518的硬盘驱动器。系统应用程序530利用由操作系统528通过存储在系统存储器516或者存储在盘存储524上的程序模块532和程序数据534对资源的管理。可以理解,计算机可用各种操作系统或操作系统的组合来实现。
用户可通过输入设备536向计算机512输入命令或信息。输入设备536包括但不限于定点设备,诸如鼠标、跟踪球、指示笔、触摸垫、键盘、话筒等。这些及其他输入设备通过系统总线518经由接口端口538连接到处理单元514。接口端口538可表示串行端口、并行端口、通用串行总线(USB)等。输出设备540可与输入设备使用相同类型的端口。提供输出适配器542以举例说明存在像监视器、扬声器、以及打印机的需要特定适配器的一些输出设备540。输出适配器542包括但不限于,在输出设备540和系统总线518之间提供连接的视频卡和声卡。其他设备和/或系统和/或设备,诸如远程计算机544,可提供输入和输出两种能力。
计算机512可以使用到诸如远程计算机544之类的一个或多个远程计算机的逻辑连接来在联网环境中操作。远程计算机544可以是个人计算机、服务器、路由器、网络PC、对等设备或其它常见的网络节点,并且通常包括许多或所有以上相对于计算机512所描述的元件,尽管在图4中仅示出了存储器存储设备546。远程计算机544可经由通信连接550逻辑地连接。网络接口548涵盖诸如局域网(LAN)和广域网(WAN)这样的通信网络,但也可包括其他网络。通信连接550是指用来将网络接口548连接到总线518的硬件/软件。连接550可以在计算机512内或外并且包括诸如调制解调器(电话、电缆、DSL和无线)和ISDN适配器、以太网卡等内和外技术。
可以理解,所示网络连接仅是示例,并且可以使用在计算机之间建立通信链路的其它手段。本领域的普通技术人员可以理解,计算机512或其它客户机设备可作为计算机网络的一部分来部署。在这一点上,本文所公开的主题涉及具有任意数量的存储器或存储单元以及在任意数量的存储单元或卷上发生的任意数量的应用和进程的任何计算机系统。本文所公开的主题的各方面可应用于具有部署在网络环境中的具有远程或本地存储的服务器计算机和客户计算机的环境。本文所公开的主题的各方面也可应用于具有编程语言功能、解释和执行能力的独立计算设备。
图4示出集成开发环境(IDE)600和通用语言运行时环境602。IDE 600可允许用户(例如,开发者、程序员、设计者、编码者等)在计算机系统中设计、编码、编译、测试、运行、编辑、调试或构建程序、程序集、网站、web应用和web服务。软件程序可包括以一种或多种源代码语言(例如,VisualBasic、Visual J#、C++、C#、J#、Java Script、APL、COBOL、Pascal、Eiffel、Haskell、ML、Oberon、Perl、Python、Scheme、Smalltalk等)创建的源代码(组件610)。IDE 600可提供本机代码开发环境,或者可提供在虚拟机上运行的托管代码开发,或者可提供其组合。IDE 600可提供使用.NET框架的托管代码开发环境。可使用语言专用源编译器620从源代码组件610和本机代码组件611创建中间语言组件650,并且在执行应用时使用中间语言编译器660(例如,即时(JIT)编译器)从中间语言组件650创建本机代码组件611(例如,机器可执行指令)。即,当IL应用被执行时,其在被执行的同时被编译成适合正在其上执行它的平台的合适机器语言,藉此使代码能跨若干平台便携。替代地,在其他实施例中,程序可被编译成适合其目标平台的本机代码机器语言(未示出)。
用户可根据已知软件编程技术以及与特定源语言相关联的特定逻辑和句法规则经由IDE 600中的用户接口640和源代码编辑器651来创建和/或编辑源代码组件。此后,源代码组件610可经由源编译器620被编译,藉此可创建该程序的中间语言表示,诸如汇编630。汇编630可包括中间语言组件650和元数据642。应用设计可以能够在部署前被验证。
本文所述的各种技术可结合硬件或软件,或在适当时以其组合来实现。由此,本文所公开的方法和装置或其特定方面或部分可采取包含在诸如软盘、CD-ROM、硬盘驱动器或任何其它机器可读存储介质等有形介质中的程序代码(即,指令)的形式,其中当程序代码被加载到诸如计算机等机器内并由其执行时,该机器成为用于实现本文所公开的主题的各方面的装置。在程序代码在可编程计算机上执行的情况下,计算设备通常将包括处理器、该处理器可读的存储介质(包括易失性和非易失性的存储器和/或存储元件)、至少一个输入设备、以及至少一个输出设备。可例如通过使用数据处理API等来利用域专用编程模型各方面的创建和/或实现的一个或多个程序可用高级过程语言或面向对象的编程语言来实现以与计算机系统通信。然而,如果需要,该程序可以用汇编语言或机器语言来实现。在任何情形中,语言可以是编译语言或解释语言,且与硬件实现相结合。
虽然已结合附图描述了本文所公开的主题,但是应理解,可作出修改以按不同方式执行相同功能。

Claims (15)

1.一种系统,包括:
处理器和存储器;以及
编译器,所述编译器被配置为致使所述处理器:
接收包括可恢复方法的源代码,所述可恢复方法包括在句法上可区分的控制点表达式,所述控制点表达式具有签名,其中所述编译器调用多个程序模块中的程序模块,被调用的程序模块是由所述控制点表达的签名确定的,其中所述编译器从被调用的程序模块中创建至少一个专用对象;以及
加载处于所述编译器外部的库,所述库包括所述多个程序模块。
2.如权利要求1所述的系统,其特征在于,由所述编译器创建的多个专用对象表示执行控制链。
3.如权利要求1所述的系统,其特征在于,被调用的程序模块包括专用行为和专用方法,并且其中所述专用方法包括可恢复方法,所述可恢复方法包括异步方法或迭代器方法或对称协同例程方法。
4.如权利要求1所述的系统,其特征在于,所述编译器将所接收的源代码中的控制点表达式中的控制点改写成对在所述可恢复方法暂停之前执行的方法的调用、以及对在所述可恢复方法恢复之后执行的方法的调用。
5.如权利要求4所述的系统,其特征在于,用状态机逻辑扩充派生的类,并且将专用命令改写成用于状态变换和挂起的派生的类。
6.一种方法,包括:
在软件开发计算机上的编译器中接收源代码,所述源代码包括可恢复方法,所述可恢复方法包括在句法上可区分的控制点表达,其中所述编译器调用基于基于模式的交互的代码,所述代码处于所述编译器外部的库中,所述编译器从所述代码中派生专用驱动程序类;
从派生的专用驱动程序类中实例化对象,所述对象表示包括异步方法或迭代器或对称协同例程的可恢复方法。
7.如权利要求6所述的方法,其特征在于,所述专用驱动程序类包括专用行为和专用方法。
8.如权利要求8所述的方法,其特征在于,还包括:
将所接收的源代码变换成经扩充的输出代码,其中所述经扩充的输出代码包括对从符合所述基于模式的交互的模式的类中继承的专用方法的回调,其中所述回调被所述编译器插入到所述经扩充的源代码中,所插入的回调包括对在所述可恢复方法暂停之前执行的方法的调用、以及对在所述可恢复方法恢复之后执行的方法的调用。
9.如权利要求6所述的方法,其特征在于,所述在句法上可区分的控制点表达被嵌套在编写所述源代码的编程语言的控制结构内。
10.如权利要求6所述的方法,其特征在于,所述可恢复方法被改写成状态机,其中用状态机逻辑扩充所述可恢复方法的调用方法,并且把与所述可恢复方法相关联的专用命令改写成用于状态变换和挂起的代码。
11.一种包括当执行时使至少一个处理器执行下列操作的计算机可执行指令的计算机可读存储介质:
接收源代码,所述源代码包括与模式相关联的可恢复方法,所述可恢复方法包括在句法上可区分的控制点表达,其中编译器调用符合与所述可恢复方法相关联的模式的代码,所述代码处于所述编译器外部的库中,所述编译器从所述代码中创建专用驱动程序类;
从派生的专用驱动程序类中实例化对象,所述对象表示包括异步方法或迭代器或对称协同例程的可恢复方法。
12.如权利要求11所述的计算机可读存储介质,其特征在于,进一步包括当执行时使所述至少一个处理器执行下列操作的计算机可执行指令:
将专用行为和专用方法添加到来自被调用的代码的派生的专用驱动程序类。
13.如权利要求11所述的计算机可读存储介质,其特征在于,进一步包括当执行时使所述至少一个处理器执行下列操作的计算机可执行指令:
将所接收的源代码变换成经扩充的源代码,其中所述经扩充的源代码包括对从被调用的代码中继承的专用方法的回调,其中所述回调被所述编译器插入到所述经扩充的输出代码中,所插入的回调包括对在所述可恢复方法暂停之前执行的方法的调用、以及对在所述可恢复方法恢复之后执行的方法的调用。
14.如权利要求10所述的计算机可读存储介质,其特征在于,进一步包括当执行时使所述至少一个处理器执行下列操作的计算机可执行指令:
为嵌套在编写所接收的源代码的编程语言的控制结构内的回调创建控制点。
15.如权利要求10所述的计算机可读存储介质,其特征在于,进一步包括当执行时使所述至少一个处理器执行下列操作的计算机可执行指令:
将包括所述可恢复方法的所接收的源代码变换成经扩充的输出代码,使得所述经扩充的输出代码能够在分立的部分中执行,每个分立的部分都在所述经扩充的输出代码中的控制点处开始和结束。
CN201180020904.5A 2010-04-27 2011-04-26 可恢复的方法 Active CN102859489B (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US12/767,811 2010-04-27
US12/767,811 US8549506B2 (en) 2010-04-27 2010-04-27 Resumable methods
PCT/US2011/034006 WO2011139722A2 (en) 2010-04-27 2011-04-26 Resumable methods

Publications (2)

Publication Number Publication Date
CN102859489A true CN102859489A (zh) 2013-01-02
CN102859489B CN102859489B (zh) 2016-06-29

Family

ID=44816874

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201180020904.5A Active CN102859489B (zh) 2010-04-27 2011-04-26 可恢复的方法

Country Status (5)

Country Link
US (1) US8549506B2 (zh)
EP (1) EP2564316B1 (zh)
CN (1) CN102859489B (zh)
HK (1) HK1178622A1 (zh)
WO (1) WO2011139722A2 (zh)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106716349A (zh) * 2014-04-22 2017-05-24 甲骨文国际公司 特化类的手动精炼
CN110413207A (zh) * 2018-04-28 2019-11-05 伊姆西Ip控股有限责任公司 降低存储系统的数据恢复时间的方法、设备和程序产品
CN110520857A (zh) * 2017-04-17 2019-11-29 微软技术许可有限责任公司 使用虚拟化数据迭代器对神经网络进行数据处理性能增强
CN111771186A (zh) * 2018-02-28 2020-10-13 微软技术许可有限责任公司 编译器生成的异步可枚举对象

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8302078B2 (en) * 2008-03-10 2012-10-30 The Boeing Company Lazy evaluation of geometric definitions of objects within procedural programming environments
US10747511B2 (en) 2015-04-28 2020-08-18 Microsoft Technology Licensing, Llc Compiler optimization of coroutines
US10489122B1 (en) * 2015-09-02 2019-11-26 Devin Abbott Inline text editor elements as an abstraction layer for graphical code editing
US11579855B2 (en) * 2017-12-15 2023-02-14 Microsoft Technology Licensing Llc Reduced memory consumption of compiler-transformed asynchronous methods
US11645082B2 (en) 2020-06-26 2023-05-09 Microsoft Technology Licensing, Llc Programming language trigger mechanisms for parallel asynchronous enumerations

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1438576A (zh) * 2003-03-21 2003-08-27 清华大学 基于操作栈记录的恢复的Java线程迁移的方法
US20090183162A1 (en) * 2008-01-15 2009-07-16 Microsoft Corporation Priority Based Scheduling System for Server

Family Cites Families (18)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP3601341B2 (ja) 1999-02-09 2004-12-15 株式会社日立製作所 並列プログラム生成方法
US5301331A (en) 1990-03-19 1994-04-05 Fujitsu Limited Interruption handling system
US5625821A (en) 1991-08-12 1997-04-29 International Business Machines Corporation Asynchronous or synchronous operation of event signaller by event management services in a computer system
CA2115464C (en) 1994-02-11 1998-12-15 William G. O'farrell Concurrent processing in object oriented parallel and near parallel systems
US5987495A (en) 1997-11-07 1999-11-16 International Business Machines Corporation Method and apparatus for fully restoring a program context following an interrupt
US6308318B2 (en) 1998-10-07 2001-10-23 Hewlett-Packard Company Method and apparatus for handling asynchronous exceptions in a dynamic translation system
US7162718B1 (en) 2000-12-12 2007-01-09 International Business Machines Corporation Language extension for light weight threading in a JVM
FI20010592A (fi) 2001-03-22 2002-09-23 Ssh Comm Security Ltd Menetelmä ohjelman hallintakaavion kääntämiseksi
US7765532B2 (en) 2002-10-22 2010-07-27 Oracle America, Inc. Inducing concurrency in software code
US20050246692A1 (en) 2004-04-28 2005-11-03 Convey Development, Inc. Asynchronous compilation
GB0601566D0 (en) 2006-01-26 2006-03-08 Codeplay Software Ltd A parallelization system and compiler for use in such a system
US8402503B2 (en) * 2006-02-08 2013-03-19 At& T Intellectual Property I, L.P. Interactive program manager and methods for presenting program content
US8789028B2 (en) * 2006-06-30 2014-07-22 International Business Machines Corporation Memory access monitoring
US8281299B2 (en) * 2006-11-10 2012-10-02 Purdue Research Foundation Map-closure: a general purpose mechanism for nonstandard interpretation
US8051426B2 (en) * 2007-01-04 2011-11-01 Microsoft Corporation Co-routines native to a virtual execution environment
US8321842B2 (en) * 2008-06-27 2012-11-27 Vmware, Inc. Replay time only functionalities in a virtual machine
US8843938B2 (en) 2008-07-02 2014-09-23 International Business Machines Corporation Methods, systems, and computer program products for asynchronous resumption of a dataflow
US9547511B2 (en) * 2009-06-05 2017-01-17 Microsoft Technology Licensing, Llc Language-based model for asynchronous operations

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1438576A (zh) * 2003-03-21 2003-08-27 清华大学 基于操作栈记录的恢复的Java线程迁移的方法
US20090183162A1 (en) * 2008-01-15 2009-07-16 Microsoft Corporation Priority Based Scheduling System for Server

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
REIN RAUDJARV: "Blocking Calls in Java", 《UNIVERSITY OF TARTU FACULTY OF MATHEMATICS AND COMPUTER SCIENCE INSTITUTE OF COMPUTER SCIENCE》, 31 May 2007 (2007-05-31) *

Cited By (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106716349A (zh) * 2014-04-22 2017-05-24 甲骨文国际公司 特化类的手动精炼
CN106716349B (zh) * 2014-04-22 2020-08-11 甲骨文国际公司 特化类的手动精炼
CN110520857A (zh) * 2017-04-17 2019-11-29 微软技术许可有限责任公司 使用虚拟化数据迭代器对神经网络进行数据处理性能增强
CN110520857B (zh) * 2017-04-17 2023-07-28 微软技术许可有限责任公司 使用虚拟化数据迭代器对神经网络进行数据处理性能增强
CN111771186A (zh) * 2018-02-28 2020-10-13 微软技术许可有限责任公司 编译器生成的异步可枚举对象
CN110413207A (zh) * 2018-04-28 2019-11-05 伊姆西Ip控股有限责任公司 降低存储系统的数据恢复时间的方法、设备和程序产品
CN110413207B (zh) * 2018-04-28 2023-02-17 伊姆西Ip控股有限责任公司 降低存储系统的数据恢复时间的方法、设备和程序产品

Also Published As

Publication number Publication date
WO2011139722A2 (en) 2011-11-10
EP2564316A4 (en) 2014-02-26
US8549506B2 (en) 2013-10-01
HK1178622A1 (zh) 2013-09-13
EP2564316A2 (en) 2013-03-06
CN102859489B (zh) 2016-06-29
US20110265070A1 (en) 2011-10-27
WO2011139722A3 (en) 2012-02-16
EP2564316B1 (en) 2016-09-14

Similar Documents

Publication Publication Date Title
CN102859489A (zh) 可恢复的方法
CN104412229B (zh) 自适应可移植库
EP3971706B1 (en) Method, apparatus and electronic device for deploying operator in deep learning frame work
CN102222012B (zh) 针对外部数据源的静态类型检查
US8407667B2 (en) Inferring missing type information for reflection
CN102177502B (zh) 对中间码的逻辑扩展
US8239823B2 (en) Generating libraries for reflection without project compilation
CN102222039A (zh) 使用dsl来调用api以测试软件
JP5957006B2 (ja) 拡張可能なデータ並列セマンティクス
JP5396979B2 (ja) ソフトウェア開発支援装置、システム、ソフトウェア開発支援装置の機能拡張方法、及びプログラム
CN110187902A (zh) 基于spring boot的项目改造方法、装置、设备及存储介质
US11922151B2 (en) Compiler-generated asynchronous enumerable object
US10620916B2 (en) Read-only communication operator
Song et al. Applying MDE tools at runtime: Experiments upon runtime models
CN113778897A (zh) 接口的自动测试方法、装置、设备及存储介质
CN101021791A (zh) 实现分布式对象持久化的方法、装置及编译单元
KR101632027B1 (ko) 주석기반의 의사코드를 이용한 프로그램 변환 방법 및 그 방법을 구현하기 위한 프로그램이 기록된 컴퓨터 판독 가능한 기록매체
EP3044937A2 (en) Device and method for automating a process of defining a cloud computing resource
Sunitha et al. Translation of behavioral models to source code
JP6011712B2 (ja) 修正管理装置、修正管理方法、及び修正管理プログラム
Bodden et al. From Design to Reality: An Overview of the MontiThings Ecosystem for Model-Driven IoT Applications
Weng et al. Acceleration of a Python-based tsunami modelling application via CUDA and OpenHMPP
Kirchhof From Design to Reality: An Overview of the MontiThings Ecosystem for Model-Driven IoT Applications
KR20160004101A (ko) 빅데이터 스토리지 어댑터 시스템
Marburger et al. Behavioral analysis of telecommunication systems by graph transformations

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
REG Reference to a national code

Ref country code: HK

Ref legal event code: DE

Ref document number: 1178622

Country of ref document: HK

ASS Succession or assignment of patent right

Owner name: MICROSOFT TECHNOLOGY LICENSING LLC

Free format text: FORMER OWNER: MICROSOFT CORP.

Effective date: 20150722

C41 Transfer of patent application or patent right or utility model
TA01 Transfer of patent application right

Effective date of registration: 20150722

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
REG Reference to a national code

Ref country code: HK

Ref legal event code: GR

Ref document number: 1178622

Country of ref document: HK