协同程序的编译器优化制造技术

技术编号:19127182 阅读:65 留言:0更新日期:2018-10-10 08:30
作为存储器使用优化,一种编译器标识其激活帧可以在调用方的栈上被分配而非在堆上分配帧的协同程序。例如,当编译器确定协同程序C的寿命不能超过首先调用协同程序C的例程R的寿命时,编译器生成代码以在R的栈上分配C的激活帧,而非生成代码以从堆存储器分配C的帧。在一些情况下,作为另一优化,协同程序C的代码还与调用C的例程R的代码内联。还描述了协同程序激活帧内容变化和布局变化。

【技术实现步骤摘要】
【国外来华专利技术】协同程序的编译器优化
技术介绍
在计算中,协同程序可以被视为通用例程实体,对于该通用例程实体除了通常由例程支持的调用和返回操作之外,其还支持挂起和恢复操作。也就是说,协同程序可以被调用(call)或被激活(invoke),并且在完成时,可以向调用方返回值,并且在这个意义上像其他种类的例程实体(例如,函数、过程)相似地进行操作。但是,除此之外,协同程序可以挂起执行,将控制传递给另一代码片段(也可能产生值),然后在挂起点恢复执行。一些协同程序具有多个挂起点。一些挂起点是重入的,即,在完成较早调用之前,它们可以再次被调用(以便创建另一实例)。例如,在实现协同任务、异常、事件循环、迭代器、延续、无限列表和管道时,可以使用协同程序。
技术实现思路
一些实施例涉及减少协同程序使用的存储器的技术问题。在一些情形下,通过协同程序进行存储器分配的常规途径将耗尽可用存储器,这使得在给定系统上运行给定程序是不切实际或不可能的,但是使用本文中所描述的一个或多个优化有助于减少存储器使用,足以允许优化版本的相同程序在同一系统上运行。一些实施例标识作为优化其激活帧可以在调用方的栈上被分配而非如常规那样在堆上分配帧的协同程序。例如,当编译器确定协同程序C的寿命(lifespan)不能超过首先调用协同程序C的例程R的寿命时,编译器生成代码以在R的栈上分配C的激活帧,而非生成代码以从堆存储器分配C的帧。在一些情况下,作为另一优化,协同程序C的代码也与调用C的例程R的代码内联。所给出的示例仅是说明性的。本
技术实现思路
不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于限制所要求保护的主题的范围。相反,提供本
技术实现思路
以简化形式介绍下文在具体实施方式中进一步描述的一些技术概念。创新由权利要求限定,并且在本
技术实现思路
与权利要求冲突的情况下,应当以权利要求为准。附图说明参考附图给出更具体的描述。这些附图仅仅说明所选择的方面,因此不完全确定覆盖范围或范围。图1是图示了具有在软件控制下彼此交互的至少一个处理器和至少一个存储器的计算机系统,以及可能存在于多个网络节点上的操作环境中的其他项,并且还图示了所配置的存储介质(与纯信号相反)实施例的框图;图2是图示了示例体系架构中的协同程序、协同程序激活帧内容以及协同程序编译和/或运行时间环境的方面的框图;图3是图示了一些过程的步骤和所配置的存储介质的流程图;图4是图示了协同程序帧分配的存储器优化的数据流程图;图5图示了协同程序的初始化和恢复点的示例元组列表;图6和图7共同示出了示例元组列表,其图示了使用编译器内嵌原语函数来标识协同程序恢复点;图8图示了被注释成以图示使用定义链接的示例元组列表;图9是图示了协同程序激活帧存储器布局和访问的示例的图;以及图10是图示了栈布局的图。具体实施方式缩略词下文对一些缩略词进行定义,但是其他缩略语可以在本文中别处定义,或者不需要定义就可以被技术人员所理解。ABI:应用二进制接口ALU:算术和逻辑单元API:应用程序接口BE:后端(编译器的后端,负责优化和降低到特定体系架构机器代码的编译器部件)CD:光盘CFG:控制流保护CIL:通用中间语言(以前的MSIL-Microsoft中间语言)CPU:中央处理单元CX:C++扩展DVD:数字通用盘或数字视频盘EBX:x86体系架构寄存器EH:异常处理,异常处理程序FPGA:现场可编程门阵列FPU:浮点处理单元GPU:图形处理单元GUI:图形用户接口IDE:集成开发环境,有时也被称之为“交互式开发环境”IL:中间语言IR:中间表示(例如,以CIL或另一IL)JIT:准时制PC:程序计数器(也称之为指令指针)PPL:并行模式库RAM:随机存取存储器RBP:x64体系架构寄存器ROM:只读存储器SSA:静态单赋值(IR形式,以该形式每个变量被精确赋值一次并且每个变量在使用前被定义)STD:标准C++命名空间STL:标准模板库UDT:用户定义类型UTC:通用元组编译器关于超链接的注释本公开的部分包含可以被认为是浏览器可执行代码的URL、超链接和/或其他项。为了帮助描述一些实施例,这些项被包括在本公开中,而不是被包括以引用它们标识的网站的内容。申请人不打算将这些URL、超链接或其他此类代码作为活动链接。这些项都不旨在通过引用位于本披露文件之外的材料,来用作并入。因此,本文中不应反对包括这些项。在这些项尚未被禁用的情况下,专利局将在准备将本文档的文本加载到其官方web数据库时禁用它们(即,使它们作为链接无效)。MPEP§608.01(VII)。概述在一些实施例中,通过允许多个入口点在某些位置处挂起和恢复执行,协同程序将子例程一般化以用于协同(即,非抢占式)多任务处理。协同程序可以用于实现协同任务、异常、事件循环、迭代器、延续、无限列表和管道。协同程序也可以在C++/CX中替换“.then”,这极大减少代码大小。本文中的一个示例示出了使用新C++关键字“yield”的代码生成器。还提供了一个“await”的C++关键字示例。还讨论了编译器中的从前端读入的IL,到寄存器分配以及代码的最终发出中的步骤。还讨论了安全性和优化。所给出的一些细节是用于AMD64处理器体系架构,但是可以为其他处理器体系架构提供类似的功能和优化,这些其他处理器体系架构包括例如x86、AMD64、ARM32和ARM64体系架构。可以在更广泛的上下文中查看本文中所描述的一些实施例。比如,诸如分配存储器、调用例程、编译代码和恢复执行之类的概念可能与具体实施例相关。然而,从广泛的上下文的可用性来看,本文中并不寻求抽象概念的排他性权利;它们并非抽象概念。相反,本公开集中于提供适当特定的实施例,其技术效果完全或部分地解决具体技术问题,例如,有限堆存储器空间、协同程序不安全性。涉及分配存储器、调用例程、编译代码和恢复执行之类的其他介质、系统和方法在本范围之外。因而,在适当理解本公开内容的情况下,还避免了模糊性、纯粹的抽象性、缺乏技术性和伴随的证明问题。本文中所描述的实施例的技术特点对于本领域普通技术人员将是显而易见的,并且对于广泛的关注读者而言也将以几种方式显而易见。首先,一些实施例解决了技术问题,诸如由于使用其激活帧在堆上分配的大量协同程序而耗尽堆存储器,以及如何确定协同程序激活帧何时能够安全地在堆以外的别处上分配。第二,一些实施例包括技术部件,诸如以与通用计算机内的典型交互之外的方式与软件进行交互的计算硬件。例如,除了诸如通常存储器分配、通常存储器读取和写入、通常指令执行以及某种I/O之类的正常交互之外,本文中所描述的一些实施例根据协同程序的寿命的范围在协同程序的编译时生成栈分配或堆分配代码。第三,一些实施例提供的技术效果,包括在一些情况下以两倍、或三倍,或五倍、甚至更多增加可以在给定系统上运行的协同程序的数目,而不会由于存储器不足而崩溃。第四,一些实施例包括技术适应性,诸如实现并发过程的协同(即,非抢占式)调度的yield语句和/或await表达式。第五,一些实施例基于诸如使用定义分析之类的技术考虑,通过添加协同程序激活帧分配优化来修改编译器的技术功能。第六,一些实施例的技术优点包括并行处理的可靠性提高、使用协同程序的程序的开发简化以及存储器硬件要求减少。现在将参考示例性实施例本文档来自技高网
...
协同程序的编译器优化

【技术保护点】
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

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1