【技术实现步骤摘要】
【国外来华专利技术】协同程序的编译器优化
技术介绍
在计算中,协同程序可以被视为通用例程实体,对于该通用例程实体除了通常由例程支持的调用和返回操作之外,其还支持挂起和恢复操作。也就是说,协同程序可以被调用(call)或被激活(invoke),并且在完成时,可以向调用方返回值,并且在这个意义上像其他种类的例程实体(例如,函数、过程)相似地进行操作。但是,除此之外,协同程序可以挂起执行,将控制传递给另一代码片段(也可能产生值),然后在挂起点恢复执行。一些协同程序具有多个挂起点。一些挂起点是重入的,即,在完成较早调用之前,它们可以再次被调用(以便创建另一实例)。例如,在实现协同任务、异常、事件循环、迭代器、延续、无限列表和管道时,可以使用协同程序。
技术实现思路
一些实施例涉及减少协同程序使用的存储器的技术问题。在一些情形下,通过协同程序进行存储器分配的常规途径将耗尽可用存储器,这使得在给定系统上运行给定程序是不切实际或不可能的,但是使用本文中所描述的一个或多个优化有助于减少存储器使用,足以允许优化版本的相同程序在同一系统上运行。一些实施例标识作为优化其激活帧可以在调用方的栈上被分配而非如常规那样在堆上分配帧的协同程序。例如,当编译器确定协同程序C的寿命(lifespan)不能超过首先调用协同程序C的例程R的寿命时,编译器生成代码以在R的栈上分配C的激活帧,而非生成代码以从堆存储器分配C的帧。在一些情况下,作为另一优化,协同程序C的代码也与调用C的例程R的代码内联。所给出的示例仅是说明性的。本
技术实现思路
不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于限制所要求保护的主题的范围。 ...
【技术保护点】
1.一种用于实现可恢复函数的方法,包括:编译器在编译时确定所述可恢复函数是否具有将不超过由计算系统中的调用方作出的对所述可恢复函数的调用的寿命;当所述编译器确定所述可恢复函数寿命将不超过所述调用时,所述编译器生成代码,所述代码在被执行时,将从所述计算系统中的所述调用方的本地栈存储器分配所述可恢复函数的激活帧;以及当所述编译器确定所述可恢复函数寿命能够超过所述调用时,所述编译器生成代码,所述代码在被执行时,将从所述计算系统中的堆存储器分配所述激活帧。
【技术特征摘要】
【国外来华专利技术】2015.04.28 US 62/153,556;2015.06.26 US 14/751,2621.一种用于实现可恢复函数的方法,包括:编译器在编译时确定所述可恢复函数是否具有将不超过由计算系统中的调用方作出的对所述可恢复函数的调用的寿命;当所述编译器确定所述可恢复函数寿命将不超过所述调用时,所述编译器生成代码,所述代码在被执行时,将从所述计算系统中的所述调用方的本地栈存储器分配所述可恢复函数的激活帧;以及当所述编译器确定所述可恢复函数寿命能够超过所述调用时,所述编译器生成代码,所述代码在被执行时,将从所述计算系统中的堆存储器分配所述激活帧。2.根据权利要求1所述的方法,还包括:所述编译器生成代码,所述代码在被执行时,将恢复地址放置在所述激活帧中,所述恢复地址是所述可恢复函数的函数主体的可恢复部分的地址。3.根据权利要求1所述的方法,还包括:所述编译器生成代码,所述代码在被执行时,在所述激活帧中设置恢复索引,所述恢复索引是其值区分所述可恢复函数的函数主体中的多个执行恢复点的序数。4.根据权利要求1所述的方法,其中所述编译器至少部分地通过使用静态单赋值使用定义链,来确定所述可恢复函数寿命的范围。5.根据权利要求1所述的方法,其中所述可恢复函数包括以下各项中的至少一项:yield语句、await表达式。6.根据权利要求1所述的方法,其中所述编译器还在所述可恢复函数的所述调用方中内联所述可恢复函数的代码。7.根据权利要求1所述的方法,其中所述编译器还生成代码,所述代码在被执行时,初始化在所述激活帧中的保证数据结构。8.根据权利要求1所述的方法,其中所述编译器包括前端和后端,所述前端针对特定编程语言而执行词法分析和解析,所述后端将来自所述前端的输出转换成包括机器无关的操作码和符号操作数的元组,并且所述前端向所述后端标识以下各项:(a)所述可恢复函数的初始化点、(b)所述可恢复函数的至少一个挂起点、(c)针对每个挂起点的恢复点,所述恢复点指示执行已经在所述挂起点处被挂起之后,所述可恢复函数的执行将恢复的位置。9.根据权利要求1所述的方法,其中所述方法还包括以下各项中的至少一项:生成代码,所述代码在所述目标计算系统中被执行时,在基于在所述激活帧中指定的恢复地址值来传递控制之前,验证所述恢复地址值是否为有效值;...
【专利技术属性】
技术研发人员:J·J·拉迪甘,G·尼沙诺维,
申请(专利权)人:微软技术许可有限责任公司,
类型:发明
国别省市:美国,US
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。