首页 / 动态自适应编程

动态自适应编程有效专利 发明

技术领域

[0001] 本申请涉及动态自适应编程,尤其涉及创建和执行平台便携式代码的方法。

相关背景技术

[0002] 计算机和计算系统已经影响了现代生活的几乎每个方面。计算机通常在工作、消遣、保健、运输、娱乐、家政管理等中都有涉猎。
[0003] 便携式程序(即可在多个平台上运行的程序)当其在特定平台上运行时通常需要执行平台专用指令。不同的平台表示软件所运行的环境或底层系统的不同,并可通过作为或具有不同设备、不同操作系统、或者甚至相同操作系统的不同版本来表征。作为源代码分发的便携式程序可例如用#ifdefs相当容易地实现这一点。#ifdefs是用于编译器的标记。开发者为不同的平台提供多种版本的指令。编译器确定平台并从多个版本中选择适合该平台的代码。然后将所选择的代码编译成二进制代码。#ifdefs导致单个源代码文档和多个经编译二进制代码。
[0004] 然而,当二进制代码需要是便携式时,执行这种平台专用指令将困难得多。这对静态编译语言和具有加载时间验证的运行时环境尤其如此。静态编译语言是在编译时设法检测编程错误的语言。如果开发者尝试包括多个版本的指令,那么将产生错误,因为除了一个版本之外的所有版本将被编译器标记为错误。具体而言,编译器通常产生平台专用二进制代码,并将为其它平台编写的代码检测为错误。类似地,加载时间验证系统将尝试在运行时检查代码中的错误。用于其它平台的代码版本将被检测为错误。这些语言和运行时通常需要使用平台自适应层(PAL)来提供在所有目标平台中呈现的抽象,即使某些平台不支持这些抽象的有意义的实现。PAL可使用面向对象的继承来防止错误被检测出。具体而言,不同的库加载在不同的平台,使得不会为特定平台工作的代码版本也不被部署到该平台,从而不会有对平台专用API的不适当的调用。在开发者需要确保继承是适当的并且库被部署的情况下,PAL的实现是复杂的。
[0005] 在此要求保护的主题不限于解决任何缺点或仅在诸如上述环境中操作的各个实施方式。相反,提供该背景仅用以示出在其中可实践在此描述的部分实施方式的一个示例性技术领域。

具体实施方式

[0016] 此处描述的某些实施方式使用静态语言中定义的动态对象。动态对象可包括对存在于某些平台中但不存在于其它平台中的对象的依赖调用。这可以出于多个不同理由来实现。例如,在某些实施方式中,某些平台可支持在其它平台上不支持的特定功能。或者,不同平台可支持相同功能,但可使用不同对象形式的机制来提供支持。通过在静态语言中使用动态对象,某些实施方式能够方便单个源代码/单个二进制代码解决方案,而不是单个源代码/多个二进制代码解决方案。通过这种方法,单个二进制代码可被分发至多个不同平台,由此减少对为多个不同平台创建、存储和传递多个二进制代码的需求。
[0017] 在编译时不静态地细查动态对象,因此静态语言编译器不会导致由于包括与给定平台不兼容的代码的动态对象而产生的错误,例如对不存在的对象的调用。具体而言,动态语言允许开发者创建在编译时不静态地细查的代码。相反,在运行时,如果在代码中做出不适当的调用,则程序将抛出异常。本质上,开发者可编码他们想要的任何事物,而不必担心非运行时编译器错误。因此,各实施方式可在静态语言代码中使用动态对象,使得在静态编译期间不细查动态对象。
[0018] 在此处所示的示例中,示出了各种替换方式。具体而言,一个实施方式包括“if supported(是否支持)”方法,该方法只在“if supported”调用中引用的对象存在于“if supported”方法在其上被调用的平台上时才完全运行。“if supported”方法可用于实施方式以实现在某些平台上功能上可用,而在其它平台上不可用。该情况的一个示例在图1A中示出。图1A示出执行对象映射形式的平台便携式代码。图1A示出调用第一对象102。第一对象102调用代理对象104,代理对象104是在静态编译便携式代码程序中的动态编译对象,如以下将要更详细解释的。代理对象104包括IsSupported(受到支持)方法106。该IsSupported方法是对另一对象108的条件调用。该调用只在其它对象108在执行平台便携式代码的平台上可用且可执行时进行。如果其它对象108不可用,那么代理对象104(使用IsSupported方法)将用作确定对其它对象的调用是否安全的门,从而防止抛出运行时异常。
[0019] 通过使用多个“ifsupported(如果支持)”方法,各实施方式可支持具有类似功能的不同平台,而使用不同机制,如不同对象。该情况的一个示例在图1B中示出。图1B示出调用代理对象112的第一对象110。代理对象112是动态对象,它是静态编译的平台便携式代码的一部分(不同于以下将详细解释的动态对象)。代理对象包括IsSupported方法114,它用作确定在代理对象112上调用其它方法是否安全的门。IsSupported方法可包括对诸如对象116、118和120的对象的条件调用。这些对象116、118和120的每一个可以是支持类似功能但位于不同平台的对象。IsSupported方法114允许为适当平台调用适当对象。这防止调用不支持的方法在平台上被调用,从而防止运行时异常。
[0020] 在替换实施方式中,可运行对于不同框架具有替换路径的方法。该情况的一个示例在图1C中示出。图1C示出第一方法122。第一方法调用代理对象124。代理对象124是动态对象,它是静态编译的平台便携式代码的一部分(不同于以下将详细解释的动态对象)。代理对象124包括两个替换方法,IsRunningOnPlatformX(在平台X上运行)126and IsRunningOnPlatformY(在平台Y上运行)128。这些方法各自包括使对对象130和132的调用分别依赖于平台便携式代码正运行于哪个平台的功能。
[0021] 现在示出这些实施方式的更详细的示例。
[0022] 来自华盛顿州雷德蒙市的微软公司的CLR 4.0 for. 框架包括对静态语言中的动态对象的支持。具体而言,该框架包括可用于静态语言中的动态对象类型(DynamicObject)。因此,某些实施方式使用静态语言(C#and VB是静态语言的示例)的动态特征来编写使用动态调用的自适应代码。静态语言通常在编译时检查错误,并且错误检查通常依赖于平台,而动态语言就在执行前检查代码中的错误。在静态语言中使用动态对象允许开发者在设计时调用可能不存在于某些支持平台上的任意API,而不必担心编译时错误。
[0023] 例如,第一API可存在于第一平台上而不存在于第二平台上,而第二API可存在于第二平台上而不存在于第一平台上。因此,如果使用在静态语言中实现的动态对象来进行对第一和第二API的调用,对第一平台的编译将不会由于对第二API的调用而导致错误,并且对第二平台的编译将不会由于对第一API的调用而导致错误。然而,在运行时,如果第一平台调用第二API或者第二平台调用第一API,则将抛出运行时异常。因此,各实施方式可实现可防止平台对不支持的对象的调用的专门类型,即使这些调用存在于经编译的二进制代码中。
[0024] 一个示意性实施方式包括特殊类型,它在本示例中是CLR 4.0 for. 框架中的DynamicObject(动态对象)的子类型。如上所述,DynamicObject是CLR 4.0中的不被静态编译器细查的对象。DynamicObject表示对任意API的动态代理。在本示例中,该特殊类型对象在此被称为LightupDynamicObject(点亮动态对象,在下文中称为“LDO”)。虽然“点亮”表示当在特定平台上可用时点亮特征的能力,但是LDO也可用于使用不同机制在不同平台上实现类似功能。当创建了这种类型的实例时,开发者提供描述该LDO表示哪个平台专用API的信息。
[0025] 例如,以下示出使用语音合成器功能的LDO的一示例,其类似于图1A所示示例。值得注意的是,为了说明的目的,语音合成器API存在于可从华盛顿州雷德蒙市的微软公司获得的. 框架上,但是不存在于也可从微软公司获得的 中。因此,这
两个平台可用于示出如何在各种平台中使用LDO以及如何在可用时将LDO用于点亮语音功能。以下代码创建表示语音合成器API的LDO的示例:
[0026] dynamic speech=new
[0027] LightupDynamicObject(“System.Speech.SpeechSynthetizer,System.Speech”);
[0028] 这将字符串传递给包括类型名称(“System.Speech.SpeechSynthetizer”)和dll(“System.Speech”)的构造函数。现在,语音对象可使用如下(即使在运行在诸如的不支持语音的平台上的程序中):
[0029] if(speech.IsSupported){
[0030] speech.Speak(“Hi!”);
[0031] }
[0032] IsSupported是LDO的方法,且用于确定在语音对象所用的平台上是否支持语音API。对“Speak(说话)”的调用是动态调用,所以它在编译时或加载时不失效,象如果调用不是动态的那样。
[0033] 如上所述,在LDO的所示示例中,LDO包括对实例的称为“IsSupported”动态成员。该成员允许代码查询平台是否支持在构造期间所指示的API。如果没有“if(是否)”检查,对Speak的调用可能在运行时在某些平台上失效。
[0034] 虽然上述示例示出如何通过防止动态成员在不支持该成员的平台上被调用来保护动态成员以免运行时异常,但是可用静态成员来实现类似功能。例如,以下示出使用LDO对静态成员的代理调用。
[0035] dynamic console = new LightupDynamicObject(“System.Console,mscorlib”);
[0036] if(console.IsSupported)console.WriteLine(“Hi!”);
[0037] 在上述示例中,“WriteLine(写入行)”是静态成员。
[0038] “IsSupported”(或其它实施方式中具有类似功能的方法)也可用于支持具有类似功能的平台,但使用如图1B所示的不同的机制实现。例如,不同的平台可都包括初始化功能,但可使用不同的API来实现初始化功能。以下示例示出在虚构平台X和Y上的该功能,每个平台的平台初始化方法为:
[0039]
[0040] 虽然上述示例已示出使用方法来确定API是否支持平台然后执行API,但是其它实施方式可使用允许替换调用的方法,如以上图1C中所示。例如,方法可能能够具体识别二进制代码正运行在哪个平台,并且然后调用适当的API。以下示出使用允许用于不同平台的替换方法调用的方法的示例。具体而言,以下示例示出在虚构平台X和Y上的该功能,每个平台的平台初始化方法为:
[0041]
[0042] 在上述示例中,确定二进制代码正在哪个平台上执行。如果平台X正执行二进制代码,则调用platInit.PlatformXSpecificMethodCall(...)。如果平台Y正执行二进制代码,则调用platInit.PlatformYSpecificMethodCall(...)。
[0043] 某些实施方式在允许自适应代码调用任意API方面是有用的,而先前的方案要求为自适应代码具体指定平台专用API。此外,某些实施方式允许具有强加载时间验证的静态类型语言(如CLR或Java VM)中的自适应二进制代码。
[0044] 以下讨论现在涉及多种方法以及可以执行的方法动作。虽然用特定次序讨论或用以特定次序发生的流程图示出了各个方法动作,但除非明确规定否则不需要特定次序,或因为一动作依赖于另一动作在执行该动作之前完成而需要特定次序。
[0045] 现在参考图2,示出了方法200。该方法可以在包括静态编译语言的计算环境中实施。静态编译语言规定动态编译元素。该方法包括用于创建平台便携式代码的动作。该方法包括声明对象是程序中的动态对象(动作202)。程序是使用静态语言编译的程序。声明对象为动态对象使得被声明为动态对象的对象在程序被编译时被排除在对对象的静态分析之外。动态对象包括对平台专用API的依赖调用。平台专用API在对其部署程序的经编译版本的一个或多个平台上是可用的,但是在对其部署程序的经编译版本的一个或多个其它平台上是不可用的。
[0046] 方法200还包括将程序静态编译为平台便携式代码,并同时将动态对象排除在静态分析之外(动作204)。然后将平台便携式代码部署至不同平台,并在不同平台上成功执行。如上所述,将程序静态编译成平台便携式代码包括将动态对象明确排除在编译期间对程序中的未被声明为动态的其它对象执行的静态分析之外,作为将对象声明为动态对象的结果。
[0047] 可实施方法200的实施方式,其中对平台专用API的依赖调用依赖于经编译程序中包括的动态对象确定支持平台专用API的方法。例如,图1A和1B以及上述其它示例示出使用IsSupported方法106和114,该方法可用于确定在平台上是否支持特定功能、对象和/或API。对平台专用API的调用依赖于确定是否支持API结果。
[0048] 在方法200的替换实施方式中,可实施方法200,其中对平台专用API的依赖调用依赖于经编译程序中包括的动态对象确定经编译程序正在其上运行的平台的方法。例如,如图1C所示和上述其它实施方式所示,方法126和128可用于确定正在使用哪个平台,并且可基于正在使用的平台做出对平台专用API的适当调用。
[0049] 可实施方法200的实施方式,其中该方法创建作为平台便携式二进制代码的平台便携式代码。在该实施方式中,从单个源代码程序中创建单个二进制代码,其不同于单个源/多个二进制代码方案。单个二进制代码可分发至多个不同平台。如上所述,不同平台可包括具有不同操作系统的平台;不同平台可包括具有操作系统的不同版本的平台;不同虚拟机(如桌上CLR对 运行时对移动电话运行时等),不同设备;和/或软件所运行的环境或底层系统的不同,例如硬件或软件配置的不同。
[0050] 可实施方法200的实施方式,其中对平台专用API的依赖调用方便在对其部署经编译程序的一个或多个平台上启用功能的点亮功能,被启用的功能在对其部署经编译程序的一个或多个其它平台上不存在。以上示出了该情况的示例,其中语音功能在某些平台上可用而在其它平台上不可用。可测试是否支持,并在支持时点亮语音功能。
[0051] 可实施方法200的实施方式,其中对平台专用API的依赖调用方便使用替换机制来在对其部署经编译程序的不同平台上实现类似功能,其中每个平台具有类似功能但使用不同API来实现该功能。该情况的示例在图1B和1C和上述其它示例中示出。
[0052] 现在参考图3,示出了方法300。方法300可以在包括静态编译语言的计算环境中实施。静态编译语言规定动态编译元素。该方法包括用于执行平台便携式代码的动作。该方法包括访问从静态语言程序编译的经编译程序中包括的动态对象(动作302)。动态对象被排除在经编译程序的编译期间的静态分析之外。动态对象包括用作代理对象的功能,代理对象被配置成在平台专用对象在运行时在执行经编译程序的平台上是可访问的情况下在运行时加载平台专用对象。
[0053] 该方法还包括测试代理对象,以确定平台专用对象是否成功加载(动作304)。可实施实施方式,其中测试代理对象以确定平台专用对象是否成功加载包括经编译程序中包括的动态对象确定支持平台专用对象的方法。例如,图1A和1B示出使用IsSupported方法来确定是否支持平台专用对象。或者,可实施实施方式,其中测试代理对象以确定平台专用对象是否成功加载包括经编译程序中包括的动态对象确定经编译程序正在其上执行的平台的方法。例如,图1C示出确定动态对象正在哪个平台上执行的方法。
[0054] 方法300还包括,作为测试代理对象的结果,确定平台专用对象成功加载,并因此调用平台专用对象API(动作306)。
[0055] 此外,该方法可以由包括一个或多个处理器和诸如计算机存储器等计算机可读介质的计算机系统来实施。具体而言,计算机存储器可以存储计算机可执行指令,计算机可执行指令在由一个或多个处理器执行时使得执行各种功能,如在各实施方式中所述的那些动作。
[0056] 本发明的各实施方式可以包括或利用包含计算机硬件的专用或通用计算机,这将在下文中更详细地讨论。本发明范围内的各实施方式还包括用于承载或存储计算机可执行指令和/或数据结构的物理计算机可读介质和其他计算机可读介质。这样的计算机可读介质可以是可由通用或专用计算机系统访问的任何可用介质。存储计算机可执行指令的计算机可读介质是物理存储介质。承载计算机可执行指令的计算机可读介质是传输介质。由此,作为示例而非限制,本发明的各实施方式可包括至少两种完全不同的计算机可读介质:物理计算机可读存储介质和传输计算机可读介质。
[0057] 物理计算机存储介质包括RAM、ROM、EEPROM、CD-ROM或其他光盘存储(如CD、DVD等)、磁盘存储或其他磁存储设备、或可用于存储计算机可执行指令或数据结构形式的所需程序代码装置且可由通用或专用计算机访问的任何其他介质。
[0058] “网络”被定义为允许在计算机系统和/或模块和/或其他电子设备之间传输电子数据的一个或多个数据链路。当信息通过网络或另一通信连接(硬连线、无线、或硬连线或无线的组合)传输或提供给计算机时,该计算机将该连接适当地视为传输介质。传输介质可包括可用于承载计算机可执行指令或数据结构形式的所需程序代码装置并可由通用或专用计算机访问的网络和/或数据链路。以上介质的组合也被包括在计算机可读介质的范围内。
[0059] 此外,在到达各种计算机系统组件之后,计算机可执行指令或数据结构形式的程序代码装置可从传输计算机可读介质自动转移到物理计算机可读存储介质(或者相反)。例如,通过网络或数据链路接收到的计算机可执行指令或数据结构可被缓存在网络接口模块(例如,“NIC”)内的RAM中,然后最终被传送到计算机系统RAM和/或计算机系统处的较不易失性的计算机可读物理存储介质。因此,计算机可读物理存储介质可被包括在同样(或甚至主要)利用传输介质的计算机系统组件中。
[0060] 计算机可执行指令例如包括,使通用计算机、专用计算机、或专用处理设备执行某一功能或某组功能的指令和数据。计算机可执行指令可以是例如二进制代码、诸如汇编语言或微软中间语言 的中间格式指令、或甚至源代码。尽管用结构特征和/或方法动作专用的语言描述了本主题,但可以理解的是,所附权利要求书中定义的主题不必限于上述特征或动作。相反,上述特征和动作是作为实现权利要求的示例形式而公开的。
[0061] 本领域的技术人员将理解,本发明可以在具有许多类型的计算机系统配置的网络计算环境中实践,这些计算机系统配置包括个人计算机、台式计算机、膝上型计算机、消息处理器、手持式设备、多处理器系统、基于微处理器的或可编程消费电子设备、网络PC、小型计算机、大型计算机、移动电话、PDA、寻呼机、路由器、交换机等等。本发明也可以在其中通过网络链接(或者通过硬连线数据链路、无线数据链路,或者通过硬连线和无线数据链路的组合)的本地和远程计算机系统两者都执行任务的分布式系统环境中实践。在分布式系统环境中,程序模块可以位于本地和远程存储器存储设备二者中。
[0062] 本发明可具体化为其他具体形式而不背离其精神或特征。所描述的实施方式在所有方面都应被认为仅是说明性而非限制性的。从而,本发明的范围由所附权利要求书而非前述描述指示。落入权利要求书的等效方案的含义和范围内的所有改变被权利要求书的范围所涵盖。

当前第1页 第1页 第2页 第3页