首页> 中国专利> 变量闭包

变量闭包

摘要

描述了一种用于从特定程序配置中的拉姆达表达式来访问闭包变量的系统和方法,其中当闭包函数是活动时访问闭包变量,且闭包变量位于与闭包函数的实例相对应的活动运行时框架栈之中。响应于进入闭包函数,将指向每个闭包变量的指针存储在栈指针表中。通过使用闭包变量指针来定位运行时栈上的闭包变量,来处理从拉姆达表达式对每个闭包变量的每个引用。程序代码可被插装以便在进入闭包函数的位置处以及在从拉姆达表达式对每个闭包变量的每个引用处插入对助手函数的调用。

著录项

  • 公开/公告号CN102200911A

    专利类型发明专利

  • 公开/公告日2011-09-28

    原文格式PDF

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

    申请/专利号CN201110080598.6

  • 发明设计人 I·任科夫斯基;H·坎恩塔姆那尼;

    申请日2011-03-23

  • 分类号G06F9/44;

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

  • 代理人顾嘉运

  • 地址 美国华盛顿州

  • 入库时间 2023-12-18 03:26:04

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2016-02-10

    授权

    授权

  • 2015-08-19

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

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

  • 2013-04-03

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

    实质审查的生效

  • 2011-09-28

    公开

    公开

说明书

技术领域

本发明涉及基于计算机的方法和系统,尤其涉及访问计算机程序函数中定义的闭包变量。

背景技术

一些计算机编程语言包括被称为闭包的概念。闭包是捕捉诸如程序变量之类的环境元素以供后续使用的的一种方式,即便原始元素已经改变或不再存在了。例如,内函数可以引用在外函数内定义的局部变量。内函数可分配到变量并被调用。概念上,内函数所引用的变量可以在赋值的时候被保存,并且这些已保存的变量可以在内函数的后续调用期间使用。一种实施方式可以将变量保存在所分配的堆存储器中,并在不再需要这些变量时解除这些堆存储器的分配。对内函数的多次调用引用所保存的变量的相同副本。引用外函数的局部变量的内函数被称为拉姆达(lambda)函数,或简称为拉姆达。

发明内容

提供本发明内容是为了以简化的形式介绍将在以下具体实施方式中进一步描述的一些概念。本发明内容并不旨在标识出所要求保护的主题的关键特征或必要特征,也不旨在用于限定所要求保护的主题的范围。

简要地,一种系统、方法和组件用于当对多个闭包变量中的一个的引用是在计算机程序的闭包函数的拉姆达表达式中时,访问在该闭包函数中定义的闭包变量。闭包变量可以是对闭包函数而言局部的并被存储在运行时栈上的栈框架中,该栈框架对应于闭包函数的一个实例。响应于进入闭包函数,可以将指向每一个闭包变量的指针存储在诸如堆存储器或其他类型的存储器之类的数据结构中。响应于提取变量值的指令(该指令在拉姆达表达式中),可以使用变量指针来定位运行时栈上的框架中的变量,并提取该变量值。

在一个实施方式中,响应于对闭包函数的实例的调用,可以生成对应于该实例的闭包对象,该闭包对象包括指向栈指针的指针。

在一个实施方式中,可以通过解析计算机程序并插入指令以便于提取闭包变量而插装(instrument)该计算机程序。这可包括:插入指令以创建闭包对象,并在调用该闭包函数时存储变量指针。这可包括插入指令以响应于拉姆达表达式中的引用而提取闭包变量。这可进一步包括插入指令以便在退出闭包函数时删除对象。

为了实现前述及相关目的,在这里结合以下描述及附图来描述该系统的某些说明性方面。然而,这些方面仅指示了可采用本发明的原理的各种方法中的少数几种,且本发明旨在包括所有这样的方面及其等效方面。通过结合附图考虑本发明的以下具体实施方式,本发明的其它优点以及新颖的特征将变得显而易见。

附图说明

参考下述附图描述了本发明的非限制性且非穷尽性实施方式。在这些附图中,相同的附图标记指代各附图中的相同部分,除非另外指明。

为了帮助理解本发明,将参考与附图相关联地阅读的具体实施方式,在附图中:

图1是采用在此描述的机制的计算机系统的框图。图2是可被用于实现在此描述的机制中的至少某一些的一组数据结构。

图3是示出实现变量闭包的过程的示例实施方式的流程图。图4是示出对拉姆达函数中的闭包变量进行处理的过程的示例实施方式的流程图。

图5是用于插装程序代码以便于图3和4的过程的过程的流程图;

图6示出了计算机设备的一个实施方式,示出了可被用于执行在此描述的功能的计算机设备的所选组件。

具体实施方式

下文中将参考附图来更全面地描述本发明的各示例实施方式,附图构成实施方式的一部分且在其中作为示例示出了可在其中实践本发明的各特定示例实施方式。然而,本发明可被实现为许多不同的形式并且不应被解释为被限于此处描述的各实施方式;相反,提供这些实施方式以使得本公开变得透彻和完整,并且将本发明的范围完全传达给本领域技术人员。特别地,本发明可被实现为方法或设备。因此,本发明可采用完全硬件实施方式、完全软件实施方式或者结合软件和硬件方面实施方式的形式。因此,以下详细描述并非是局限性的。

贯穿说明书和权利要求书,下列术语采用此处显式相关联的含义,除非该上下文在其他地方另有清楚指示。如此处所使用的,短语“在一个实施方式中”尽管它可以但不一定指前一实施方式。此外,如此处所使用的,短语“在另一个实施方式中”尽管它可以但不一定指前不同的实施方式。因此,可以容易地组合本发明的各实施方式而不背离本发明的范围或精神。类似地,如此处所使用的,短语“在一个实现中”尽管它可以但不一定指相同的实现,并且可以组合各种实现的技术。

另外,如此处所使用的,术语“或”是包括性“或”运算符,并且等价于术语“和/或”,除非上下文清楚地另外指明。术语“基于”并非穷尽性的并且允许基于未描述的其他因素,除非上下文清楚地另外指明。另外,在本说明书全文中,“a”、“an”和“the”的含义包括复数引用。“在……中”的含义包括“在……中”和“在……上”。

此处所描述的组件可以从其上具有数据结构的各种计算机可读介质来执行。组件可通过本地或远程过程诸如按照具有一或多个数据分组(例如,来自一个通过信号与本地系统、分布式系统中的另一组件交互或跨网络诸如因特网的其它系统交互的组件的数据)的信号来通信。例如,软件组件可被存储在非瞬态计算机可读存储介质上,包括但不限于根据本发明的各实施方式的以下计算机可读存储介质:专用集成电路(ASIC)、紧致盘(CD)、数字多功能盘(DVD)、随机存取存储器(RAM)、只读存储器(ROM)、软盘、硬盘、电可擦除可编程只读存储器(EEPROM)、闪存或记忆棒。

如此处所用的术语“计算机可读介质”既包括非瞬态存储介质又包括通信介质。通信介质一般用诸如载波或其他传输机制等已调制数据信号来体现计算机可读指令、数据结构、程序模块或其他数据,并且包括任何信息传递介质。作为示例而非限制,通信介质包括诸如有线网络和直接线连接等有线介质,以及诸如声学、无线电、红外线和其他无线介质等无线介质。

如此处所使用的,术语“应用程序”指计算机程序或其一部分并且可包括相关联的数据。应用程序可以是独立程序或者应用程序可被设计成向另一应用程序提供一个或多个特征。“附加件”和“插件”是与“主机”应用程序交互并向其提供特征的应用程序的示例。

应用程序由应用程序组件的任何组合构成,应用程序组件可包括程序指令、数据、文本、对象代码、图像或其他媒体、安全证书、脚本、或者可被安装在计算设备上以使该设备能够执行所需功能的其他软件组件。应用程序组件能够以文件、库、页面、二进制块或数据流的形式存在。

如此处所使用的,术语“指针”指对目标物理或逻辑存储器位置、数据结构、程序指令或程序分段的引用。指针“指向”目标并且可用于定位或获取目标。指针能够以各种方式实现,包括地址、偏移量、索引或标识符。

如此处所使用的,除非上下文另外指明,否则术语“功能”指执行特定任务的较大程序中的一部分代码,并且能够相对独立于该程序的其他部分执行。功能可以但不一定返回值。在各种计算机语言中,可使用不同的术语,诸如子例程、方法、过程或子程序。如此处所使用的,术语“功能”可以包括所有这些。

图1是其中可实现在此所描述的机制的计算机系统100的框图。图1只是合适的系统配置的一个示例,并且不旨在对本发明的使用范围或功能提出任何限制。因此,可采用各种系统配置而不背离本发明的范围或精神。

如图所示,系统100包括程序源代码102,该程序源代码可以是计算机程序的高级语言表示。高级语言的示例包括F-Sharp(F#)、Visual Basic或各种其他高级语言。作为语言和库扩展的组合的LINQ是程序源代码102的另一示例。在被编译成本机代码之前被编译成IL(中间语言)的语言有时被称为“托管语言”。程序可包括一个或多个函数。程序可以驻留在一个或多个文件或其他存储表示中。程序可包括一个或多个库,该一个或多个库能够以各种方式集成或分布。因此,程序源代码102可表示程序库或其一部分。

如图所示,系统100包括编译器前端104。在一个实施方式中,编译器前端包括词法分析器、句法分析器、以及语义分析器,但可以使用各种其他组件或配置。在一个实施方式中,编译器前端104处理程序源代码102,将其转换成中间语言模块106。在一个实现中,中间语言模块106可表示整个程序源代码102,并包括多个函数,但也可包括程序源代码102的仅仅一部分或函数的一部分。在一个实现中,中间语言模块106被存储为一个或多个文件。在一个实现中,中间语言模块106包括对应于程序源代码102的二进制指令序列或二进制流。

虽然没有示出,但一个实施方式中该系统可以包括运行时管理器,运行时管理器是管理计算机程序的执行的系统组件。在各种配置中,运行时管理器可执行多个动作中的一个或多个,包括加载通过执行计算机程序来调用的程序函数、翻译程序函数、定位并加载程序所采用用的库或其他资源、或调用或管理各种程序资源。运行时管理器可被成为实现向正在执行的计算机程序提供各种资源和服务的系统框架。

在一个配置中,运行时管理器包括即时(JIT)编译器或其一部分。通常,JIT编译器采用一机制,其中响应于第一次调用,程序函数的中间语言表示被加载并转换成本机语言表示。例如,当正在运行的程序第一次调用函数时,响应于检测到该调用,函数的中间语言表示可被快速编译为本机代码并随后运行。本机语言表示可被存储在存储器中,以便对于后续调用不需要进行翻译。运行时管理器的一个示例是华盛顿州雷德蒙市的微软公司制作的公共语言运行时(CLR)组件。CLR组件使用被称为公共中间语言(CIL)的中间语言表示。在一个配置中,运行时管理器的JIT编译器可响应于检测到对程序或函数的调用而紧靠在执行之前将IL转换为本机代码。在一个实施方式中,系统可使用多个进程,以使得JIT编译器可包括在执行另一个函数的同时加载或转换函数的进程。系统可在执行调用前检测到对函数的调用,以使得在执行调用前执行加载或转换的至少一部分。术语“检测”包括在执行调用前在运行时期间检测调用。在一个配置中,运行时管理器可在运行时之前将IL转换为本机代码。

如图1所示,代码插装组件(CIC)108可从IL模块106接收函数,并执行多种变换,诸如将指令插入特定位置。修改可包括:添加、删除、移动、或修改程序指令。插入或修改程序指令的过程被称为“插装”。该进程,以及这些修改的示例,将在下文中进行详细描述。

系统100可包括链接器110,该链接器执行组合并链接程序函数、修改或插入变量或函数引用等的各种操作。在一个实施方式中,链接器110可提取一个或多个助手函数112,并将这些函数与中间语言程序进行组合以产生链接程序。

系统100可包括代码生成器114,该代码生成器将中间代码表示转换为本机代码116。本机代码116可以是机器语言、虚拟机语言、或可以由物理或虚拟处理器执行的另一表示。处理器120可以提取本机代码116并执行程序指令,以产生执行结果122。在一个配置中,处理器120可包括一个或多个中央处理单元、一个或多个处理器核、ASIC、或其他硬件处理组件及相关程序逻辑。在一个配置中,处理器120可包括仿真硬件处理单元的软件组件。处理器120执行本机代码116形式的指令。

执行结果122是执行本机代码116的结果的逻辑表示。结果可包括对计算机存储或计算机存储器的修改、与其他进程或计算设备的通信、音频或视频输出、或对各种系统或外部组件的控制中的一个或多个。

系统100可以是开发系统的子系统。开发系统可包括由作为程序开发、测试、或文档编制的一部分的程序开发者或用户采用的一个或多个计算设备。系统100的组件可分布在一个或多个计算设备中,这些计算设备中的每一个可通过使用各种有线或无线通信协议(诸如IP、TCP/IP、UDP、HTTP、SSL、TLS、FTP、SMTP、WAP、蓝牙、WLAN等等)中的一种或多种与其他计算设备进行通信。

计算设备可以是专用或通用计算设备。简要地,可以被使用的计算设备的一个实施方式包括一个或多个处理单元、存储器、显示器、键盘和定点设备、以及通信接口。示例计算设备包括大型机、服务器、刀片服务器、个人计算机、便携式计算机、通信设备、消费电子产品等等。计算设备可包括通用或专用操作系统。华盛顿州雷德蒙市的微软公司制造的Windows@系列操作系统是可以在开发系统的计算设备上执行的操作系统的示例。

图1仅仅是适合的系统的一个示例,并且不旨在提出对本发明的使用范围或功能的任何限制。因此,可使用各种系统配置而不背离本发明的范围或精神。例如,CIC 108或链接器110可以与编译器前端104组合。一些系统可直接转换为本机代码而不需要中间语言。可以使用多种其他配置。

表1包括示出变量闭包的示例的代码片断。

表1

在该代码片断中,每一行都开头标有带有前缀“L”的行号,以避免与在此所使用的附图标号相混淆。在该示例性代码片断中,将创建一闭包,该闭包包括外函数FuncWithClosure()的变量varA和varB。外函数可以被称为是“闭包函数”。行L108到行L110创建一将被绑定到闭包的拉姆达表达式。更具体而言,行L108到行L110定义了拉姆达函数,其是拉姆达表达式的一种类型。术语“拉姆达”在此指拉姆达表达式。

行L108到L110的拉姆达使用闭包变量varA和varB。语句L112返回拉姆达至FuncWithClosure()的调用者。语句L101调用外函数,接收由调用创建的对拉姆达的引用。在语句L102,调用拉姆达,返回值350。具体而言,可以注意到拉姆达使用已保存的变量环境,并在行L111反映对局部变量varA的修改。即便外函数FuncWithClosure()在行L102处调用拉姆达时不再活动,已保存的环境变量仍然继续存在。

在闭包的一个实现中,由拉姆达函数访问的外函数的局部变量被复制到堆存储器中的一位置内。从拉姆达函数或外函数对这些变量的引用将被定向至该堆存储器位置。由拉姆达函数访问的外函数的局部变量被称为“封闭(closedover)”变量。术语“封闭变量”和“闭包变量”是同义词并且在此可以互换使用。

表2包括示出闭包的另一个示例的示例源代码片断。表2的示例与表1的不同之处在于拉姆达是在外函数仍然活动时调用的,并由此包括封闭变量的外函数的局部变量仍然处于活动栈框架中。

表2

在该示例代码片断中,将创建一闭包,该闭包包括外函数FuncWithClosure()的变量varA和varB。行L207到行L209创建一将被绑定到该闭包的拉姆达表达式。拉姆达使用变量varA和varB。语句L210在创建拉姆达之后修改varA。语句L201调用外函数。语句L211调用函数LambdaInvoker(),将拉姆达传递给该函数。LambdaInvoker()中的语句L214调用拉姆达,其引用varA的修改值并返回值350。在该代码片断中,当拉姆达在语句L214被调用时,外函数FuncWithClosure对于运行时栈上的活动框架是活动的。

可以注意到在该代码片断中,拉姆达函数和外函数两者均引用相同的varA。因此,外函数对varA的改变导致拉姆达函数使用改变的值。

表3包括示出用于实现表2中的代码片断的闭包的机制的示例源代码片断。在表3中,插入或修改指令以实现其中封闭元素仍旧位于运行时栈上的变量闭包。注意,表3的示例代码片断概念性地示出了插装过程的一个实施方式,但实际插装结果可以是有所不同的。

表3

如表3所示的,在一个实施方式中,运行时助手对象被用于执行实现闭包的操作。例如,行L305示出了创建闭包对象的对运行时助手函数的插装调用,向其传递将要被封闭的每个局部变量的地址。在行L316,在退出外函数之前,插入删除闭包对象的对助手函数的匹配的插装调用。外函数,即FuncWithClosure()的主体,被放置于“try”子句中(行L306),并且用于删除闭包的插装调用被放置于“finally”子句中(行L315),由此,即便当函数由于异常退出时闭包对象也被删除。

在一个实施方式中,助手函数被用于创建拉姆达对象。在表3中,行L309包括对该助手函数的插装调用。助手函数GetVariable()被用于提取每个封闭变量。在该示例中,每个变量均有一索引值,并且引用变量是通过传入对应的索引值来执行的。在该示例中,闭包变量varA和varB分别具有索引值0和1。

在表3所示的实施方式中,行312处的外函数对封闭变量varA的引用不被插装。这允许该语句以与非封闭的局部变量相类似的方式引用外函数栈框架中的封闭变量。

图2是可以被用于实现处理表2的示例代码片断的机制的数据结构200的框图。如上所述,在一个实施方式中,表2的代码片断可以如表3的代码片断所概念性地表示的那样被插装。图2对应于表3的插装代码片断。

在图2中,数据结构包括运行时栈202、栈指针表230、以及闭包对象236。运行时栈202包含栈条目206-218。每个栈条目属于与活动函数的实例相对应的栈框架。在图2的示例中,栈条目214、216和218属于与FuncWithClosure()的实例相对应的栈框架224;栈条目210和212属于与lambdaInvoker()的实例相对应的栈框架222;栈条目206和208属于与lambda()的实例相对应的栈框架220。虽然所示出的条目用于示出在此描述的至少一些机制的各方面,但运行时栈可包括更多或更少的栈框架,以及更多或更少的栈条目。

如图所示,栈框架224包括包含变量varA的数据的栈条目214、包含变量varB的数据的栈条目216、以及包含FuncWithClosure()的其他数据的栈条目218。栈框架222包括包含变量结果的数据的栈条目212以及包含函数lambdaInvoker()的其他数据的栈条目212。栈框架220包括包含拉姆达对象“myClosure”的栈条目206,拉姆达对象“myClosure”指向闭包对象236并被用于引用封闭变量varA和varB。

栈指针表230包括对应于每个闭包之内的元素的数据。具体而言,栈指针条目232包括指向栈条目214(varA)的指针而栈指针条目234包括指向栈条目216(varB)的指针。

在所示出的实施方式中,闭包对象236与FuncWithClosure()的闭包以及与拉姆达函数相关联。其包括指向栈指针条目232和234(分别对应于闭包变量varA和varB)的指针。

在下面的讨论中,对表3的各行的引用将被用于指定各操作与表3的插装代码之间的对应关系。一个实施方式以如下方式运作。在运行时期间,当进入实例FuncWithClosure()并将对应的框架224推送到运行时栈202上时,调用创建闭包的运行时助手函数(行L305)。栈指针条目232和234被加入栈指针表230,每个条目包含指向栈条目214或216的指针,栈条目214或216分别对应于闭包的局部变量。同样,创建带有指向栈指针条目232和234的指针的闭包对象236。在一个实施方式中,可以通过调用助手函数来创建拉姆达(行L309)。所得拉姆达被绑定到闭包对象236,这使得当调用拉姆达时,闭包对象236被传递至拉姆达(在该示例中作为“myClosure”自变量)。

当随后调用拉姆达函数时,诸如在行L320,使用闭包对象236来分别从栈条目214和216中提取变量varA和varB的值。这可通过如下步骤来执行:使用闭包对象中的变量索引,从栈指针条目232和234中提取相应的指针,并跟着栈指针到所述栈条目。由此,虽然遵从了闭包的语义,但在运行时栈202上而不是在堆存储器块中维护局部变量varA和varB的数据。在一些配置中,这种机制可避免对于闭包变量废弃(garbage)堆存储器的集合,并减少各种资源的执行时间或其他使用。

虽然图2示出了单个拉姆达函数,但在具有多个引用封闭变量varA和varB的拉姆达函数实例的程序中,在一个实施方式中每个实例可具有指向闭包变量236的拉姆达对象,以使得每个引用访问运行时堆栈202上的同一个对应变量。例如,上述情况会在如下情况下发生:在表2的行L202-L208处的拉姆达函数调用第二拉姆达函数,并且两个拉姆达函数均是对于对应的堆栈框架而活动的。在另一个示例中,上述情况会在如下情况下发生:一个或多个拉姆达函数的多个实例被顺序地调用,以使得在第二实例被被推送到栈上之前从运行时栈内移除一个实例。

图3是示出实现变量闭包的过程300的示例实施方式的流程图。在一个实施方式中,过程300的一些动作由图1的计算机系统100的组件来执行。

过程300所示出的部分可以在判定框302处启动,在那里可确定对闭包的变量的访问是否被限于变量范围的生存期。在一个实施方式中,判定框302的判定可例如通过开发程序代码的程序员手动进行。在一个实施方式中,该判定可诸如由计算机程序自动进行,该计算机程序分析程序代码以确定是否满足合适条件。

在判定框302,如果判定是否定的,则该过程进行到框318,在那里使用不同于在此所描述的机制的机制来实现闭包。该过程可退出或返回到调用程序。

在判定框302,如果判定是肯定的,则该过程进行到框304,在那里检测对具有变量闭包的函数的调用。该函数在此被称为“外”函数或闭包函数。如在此所讨论的,在一个实施方式中,框304的动作可包括对助手函数的使用,所插入的插装程序代码调用调用该助手函数来指示何时调用外函数。

该过程可进行到框306,在那里将指向闭包的变量的指针放置在指定位置。一个这样的位置可以是栈指针块,诸如表2的栈指针表230。一个实现可包括对应于每个闭包的每个封闭变量的条目。

该过程进行到框308,在那里创建对应于外函数闭包的闭包对象,以使得闭包对象引用框306所描述的指针。各种实现可包括对闭包的封闭变量指针的集合的单次引用,以及启用每个封闭变量指针的配置的对应配置。一些实现可包括从闭包对象到栈指针表的多次引用。

该过程进行到框310,在那里处理拉姆达函数中的一个或多个闭包变量引用,以便将每次引用与运行时栈上的对应的封闭变量相关联。框310的动作在图4中示出,并且将在下文中更详细地描述。

该过程进行到框312,在那里检测外部闭包函数的退出。如在此所讨论的,这可通过在退出外部闭包函数之前插装程序代码以包括助手函数调用来促进。响应于此检测,该过程可进行到框314,在那里可删除闭包对象,并且可从栈指针表中移除封闭变量指针。可以理解,在此所使用的删除可由多种方式来实现,包括标记将被后续进程删除的块。

该过程可进行到完成框316,并退出或返回到调用程序。图3的过程300可针对于多个闭包同时或顺序地执行一次或多次。

图4是用于处理拉姆达函数中的闭包变量引用的过程400的流程图。在一个实施方式中,过程400或其变形可以执行图3的块310的至少一部分动作。

过程400从循环402开始,该循环为每次对封闭变量的引用而进行迭代。例如,表2的行L208包括对封闭变量varA和varB的引用。在一个实施方式中,循环402可对变量varA迭代一次并且对变量varB迭代一次。在其中行L207的拉姆达被调用多次的实施方式中,循环402可对每次调用迭代两次。在所示实施方式中,循环402包括框404和406,并在框408处终止。

在框404,基于闭包变量指针和闭包对象来确定封闭变量在运行时栈上的位置。参考图2的示例结构,在一个实现中,变量varA在运行时栈上的位置被指示为栈条目214。闭包对象236可被用于定位栈指针条目232,其是指向变量varA的闭包变量指针。

该过程可进行到框406,在那里访问运行时栈上的封闭变量。该访问可以是读访问或写访问。在表2的行L208的示例中,在循环402的一次迭代期间提取变量varA的值,并在循环402的另一次迭代期间提取变量varB的值。一些计算机程序可以包括将值存储在封闭变量中的指令。在这样的情况下,框406的动作可包括将值存储在运行时栈上的封闭变量中。

该过程可进行到框408,在那里终止循环402。在循环402的最后一次迭代之后,过程400可进行到完成框410,并返回到调用程序,诸如图3的过程300。

图5是示出插装程序代码以便于过程300和400的过程500的流程图。在一个实现中,通过插入对方便在此描述的机制的助手函数的调用来插装该程序代码。

过程500的所示出的部分可在框502通过解析程序代码开始。程序代码可具有源代码、中间语言、或本机代码的形式。这可包括确定闭包函数的进入或退出位置,拉姆达函数的位置、或对封闭变量的引用。虽然解析动作是在框502中示出的,但在各种实现中,解析程序代码可结合过程504的其他动作在各部分中执行。因此,图5所示出的每个框可包括一些程序代码解析,或可在每一个框之前执行一定量的解析。

该过程进行到框504,在那里在外闭包函数的开始和结尾中插入语句,以指示该函数的调用和退出。如过程300所描述的,该语句可包括调用助手函数以创建闭包对象或将指向闭包变量的指针放置在栈指针表中并且删除该数据。在表3中,行L305提供了用于创建对应于变量varA和varB的闭包的插装函数调用的示例。行L316提供了用于在退出外函数之前删除闭包的插装函数调用的示例。

该过程进行到框506,在那里可插入程序代码以创建拉姆达对象。行L309提供了创建拉姆达对象的对助手函数的插装调用的示例。

该过程进行到循环509,其开始为拉姆达对象中的对闭包变量的每一次引用进行迭代的循环。例如,表2的行L208包括两个这样的引用:对varA的引用以及对varB的引用。

该过程进行到框510,在那里可以用访问运行时栈上的闭包变量的程序代码来替换当前迭代中的变量引用。在一个实现中,这可包括在运行时期间执行该动作的对助手函数的函数调用。访问闭包变量可包括提取变量值或将值存储在变量中。

该过程进行到框512,在那里终止循环508。当完成循环508的所有迭代时,该过程可进行到完成框514,并且退出或返回到调用程序。

图6示出计算设备600的一个实施方式,示出了可以被用于执行在此所描述的功能(包括过程300、400或500)的计算设备的所选组件。计算设备600可包括比所示出的要多得多的组件,或可包括比所示出的全部组件要少的组件。计算设备600可以是独立的计算设备或是集成系统的一部分,诸如是带有一个或多个刀片的机箱中的一个刀片。

如所示出的,计算设备600包括一个或多个处理器602,其进行动作以执行各种计算机程序的指令。在一个配置中,每个处理器602可包括一个或多个中央处理器、一个或多个处理器核、一个或多个ASIC、高速缓存存储器、或其他硬件处理组件以及相关程序逻辑。如所示出的,计算设备600包括操作系统604。操作系统604可以是通用或专用操作系统。华盛顿州雷德蒙市的微软公司制造的Windows@系列操作系统是可在计算设备600上执行的操作系统的示例。

存储器606可包括各种类型的非瞬态计算机存储介质中的一个或多个,包括易失性或非易失性存储器、RAM、ROM、固态存储器、盘驱动器、光存储、或可被用于存储数字信息的任何其他介质。

存储器606可存储在此描述的一个或多个组件或其他组件。在一个实施方式中,存储606存储CIC 108、运行时栈202、助手函数112、以及栈指针表230。这些组件中的任一个或多个可以被操作系统604或其他组件移动到RAM、非易失性存储器中的不同位置,或在RAM和非易失性存储器之间移动。

计算设备600可包括方便向用户显示本地化文本串的视频显示适配器612,以及将文本转换为音频语音并向用户呈现语音串的语音组件(没有示出)。虽然没有示出在图6中,但计算设备600可包括基本输入/输出系统(BIOS)以及相关联的组件。计算设备600也可包括网络接口单元610以用于与网络进行通信。计算设备600的实施方式可包括显示监视器614、键盘、定点设备、音频组件、话筒、语音识别组件、或其他输入/输出机制中的一个或多个。

可以理解,图3-5的流程图示中的每一个框,以及这些流程图示中的框的组合都可由软件指令来实现。这些程序指令可被提供给处理器以产生一机器,以使得在处理器上执行的指令创建用于实现一个或多个流程图框内指定的动作的装置。软件指令可以由处理器执行以提供用于实现在一个或多个流程图框内指定的动作的步骤。此外,流程图示中的一个或多个框或框的组合也可与其他框或框的组合一起同时被执行,或甚至以与所示的顺序不同的顺序被执行,而不背离本发明的范围或精神。

以上说明、示例和数据提供了对本发明的组成部分的制造和使用的全面描述。因为可以在不背离本发明的精神和范围的情况下做出本发明的许多实施方式,所以本发明落在所附权利要求的范围内。

去获取专利,查看全文>

相似文献

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

客服邮箱:kefu@zhangqiaokeyan.com

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

  • 服务号