生产诊断中的历史控制流可视化的制作方法

文档序号:11450330阅读:301来源:国知局
生产诊断中的历史控制流可视化的制造方法与工艺



背景技术:

调试器是一种帮助在其他计算机程序中查找错误(error)(错误(bug))的计算机程序。由一些实时调试器(在执行程序上运行的调试器)提供的功能包括步进:逐步执行程序,中断:在某个条件或指定的指令下停止程序执行,以及检查:显示或以其他方式提供变量的值。



技术实现要素:

诊断工具可以在运行(执行)的生产应用中搜集历史控制流信息,而不中断(停止)程序的执行。实时调试诊断工具可以在附加有实时调试器的应用中搜集历史控制流信息。可以提供诸如控制流信息的可视化等表示。在生产中运行的程序可以被动态地检测(instrument)以在生产中搜集程序的实际控制流。信息搜集的性能结果可以是最小的。所搜集的控制流信息可以是单个特定函数调用的本地信息。也就是说,可以提供特定于对特定函数的单个调用的信息。可以显示被绑定到函数调用的堆栈框架的内容。通过堆栈框架到收集信息的点的控制流可以被可视化并且提供给用户。可以组合信息,使得可以提供全局控制流的可视化(特定函数的所有调用)。

可以收集生产应用中的历史异常(exception)信息。当发生诸如除以零等非法操作时发生异常。这样的事件可以发生在程序中的任何地方,并且通常需要改变程序执行的正常流程的特殊处理。可以提供不能由控制流分析确定的异常信息。所提供的异常信息可以包括在从函数导出的基本块中发生异常的位置。基本块内发生异常的位置可以被映射回源行,以在发生异常的基本块内引起指令。历史控制流的可视化可以由诊断工具提供。该信息可以使得用户(诸如但不限于开发者)能够在生产中获得关于程序的执行的更多信息,因此最小化证明或反驳假设所需的迭代次数。

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

附图说明

在附图中:

图1示出了根据本文中所描述的方案的方面的提供一个或多个历史控制流可视化的系统100的示例;

图2a示出了根据本文中所公开的方案的方面的功能和所得到的检测基本块的示例;

图2b示出了根据本文中所公开的方案的方面的使历史控制流可视化的方法201的示例;

图2c示出了根据本文中所公开的方案的方面的历史控制流的可视化的示例;

图2d示出了根据本文中所公开的方案的方面的历史控制流的可视化的另一示例;

图2e示出了根据本文中所公开的方案的方面的历史控制流的可视化的另一示例;

图2f示出了根据本文中所公开的方案的方面的历史控制流的可视化的另一示例;

图3是根据本文中所公开的方案的方面的计算环境的示例的框图;以及

图4是根据本文中所公开的方案的方面的集成开发环境的示例的框图。

具体实施方式

概述

诊断生产环境中的应用问题可能具有挑战性,因为将实时调试器附加到过程(诸如例如到服务器过程)使过程停止执行,从而阻止了对当前正在执行的请求的处理。如本文中所使用的“生产”或“生产环境”是指其中所使用的软件已经从开发和/或测试阶段退出并且是“正在生产”(即,用于执行实际工作而不是测试)的环境。由于将实时调试器附加到生产过程可能会中断软件执行工作的能力,因此很多开发者使用日志记录来调试生产应用。日志记录使用诸如printf等函数将过程中发生的事情写入日志文件中。用户必须猜测需要放置日志记录语句的位置和需要捕获哪些数据。每当添加新的日志记录语句时,都必须重新部署应用。重新部署应用需要将应用关闭,安装新版本的应用,并且将应用备份。

日志记录可能对应用的性能具有显著影响,因为它总是开启的:即使没有任何错误,应用也总是执行日志记录语句。此外,可用的唯一信息是日志记录的信息,例如,由日志记录语句记录的变量的值。一些信息可能不可用,例如,计算设备的架构可以防止调用堆栈的内容被日志记录。即使可以调用堆栈的内容可以被日志记录,走堆栈也很慢,并且可能对性能产生负面影响。控制流信息不能从日志文件中可用,因为当日志文件中出现的日志条目证明相关联的基本块被执行时,信息是全局的,而不是本地的,即它不是特定函数调用的本地信息。此外,日志文件中缺少条目不能证明相关联的基本块未被执行,因为除非基本块中存在日志语句,否则不会在日志文件中出现任何条目,无论基本块是否被执行。最后,发生的日志记录的量可能会失控,因为开发者在软件中留下日志记录代码,因此需要执行复杂的搜索以排除当前不感兴趣的日志语句。

如本文中所描述的,生产调试描述了使得用户能够定义例如但不限于断点和第一机会异常的事件的技术。当事件被触发时,可以得到该过程的快速快照,但是该过程不停止。在停止执行的传统的断点处理中,程序执行,直到遇到断点。当遇到断点时,程序的执行停止,并且执行控制被放置在用户的手中。程序保持停止,直到用户手动输入重新开始程序执行的命令。相反,根据本文中所描述的方案的方面,用户可以在遇到非停止断点的点处检查整个过程状态,而不停止过程。如本文中所描述的生产调试不会停止该过程。它是完全动态的(不需要重新部署软件)。断点很容易管理。不需要复杂的日志搜索。源代码没有源代码更改。该过程对运行的服务器过程具有最小的开销。

如本文中所描述的生产调试是一个迭代过程,其中开发者创建关于正在发生的内容的假设,并且使用非停止断点和/或异常事件来搜集提供关于假设的有效性的信息的生产转储。有利的是,收集尽可能多的数据以减少所需的迭代次数。根据本文中所描述的方案的方面,可以对通过包括生产调试事件(诸如但不限于非停止生产断点)的函数的历史控制流程(程序指令或表达式的执行顺序)可视化。用户(例如,开发者)可以看到设置断点的位置,在该时间点的所有程序数据包括变量值、以及通过该函数取得以到达断点的控制流路径。呈现的控制流数据特定于函数的当前实例,并且因此与特定调用相关。

根据本文中所描述的方案的方面,控制流数据可以包括:每个控制流基本块被执行的次数以及关于异步控制流事件的数据,包括但不限于在执行期间发生的异常。这使得能够显示信息,包括但不限于循环执行当前在什么迭代,是否采取导致断点的“if”或“else”路径,是否在基本块内抛出异常(因此,块的剩余部分未被执行)和/或抛出的任何异常的类型等。

生产诊断中的历史控制流可视化

根据本文中所描述的方案的方面,生产应用诊断工具可以检测应用以使用非停止生产断点来收集程序控制流信息。可以显示分析的程序控制流程信息。诸如但不限于clr(公共语言运行时)il(中间语言)重写机制等动态代码重写技术可以用于改变生产软件,而没有部署新的源代码。除了关于数据的信息之外,在非停止断点处收集的信息可以还包括生产应用的实例达到断点所采用的实际控制流。分析的控制流信息的表示或可视化可以由诊断工具提供,以使得用户能够看到程序的执行到达特定断点所采取的路径。

本文中所描述的检测技术可以使用任何合适的代码重写技术动态地实现(基于在程序运行时做出的决定)。或者,调试器也可以使用传统的停止断点来获得这样的信息。诸如开发者等用户不能与生产调试器交互,因此调试技术可以比使用实时调试器时更加迭代。在实时调试会话中,调试器被附加到正在执行的过程。当遇到断点时,该过程被停止,并且用户(例如,开发者)通常能够检查过程的状态。通常可以检查变量的当前值。通常可以检查调用堆栈。为了看到控制流数据,用户可以能够遍历代码,一次执行一行或一个表达式。用户输入的命令可以使程序的执行重新开始。在生产环境中,实时调试的后果是阻止用户与应用交互直到过程重新开始。因为阻止用户通常是不可接受的,所以历史调试通常用于在生产环境中调试程序。用户调试生产应用通常为问题的原因开发假设,并且使用已知的生产调试技术(如日志记录)搜集信息以证明或反驳假设。通常,控制流数据是不可用的。

根据本文中所公开的方案的方面,控制流程检测可以在运行时间对程序的指令执行基本块分析。可以为每个基本块分配迭代计数,迭代计数存储在所讨论的函数的局部变量中。基本块的指令地址也可以被存储在所讨论的函数的本地变量中。每次执行基本块时,可以增加基本块的执行计数本地变量,从而对特定函数调用的基本块的执行次数进行计数。

因为计数信息被存储在存储器中,所以当非停止生产断点被命中时,它可以被复制到诊断工件。诊断工件包括但不限于过程本身、过程的快照和过程转储。诊断工件可以用作诊断工具(例如但不限于调试器)的输入。快照可以是过程的轻量级副本,其中快照被有效地创建,而不需要创建过程的执行或存储器的完整跟踪。例如,操作系统可以在虚拟存储器模型之上实现轻量级快照机制,并且可以使用共享存储器页面和写时复制技术来避免创建过程的完整副本。写时复制使得操作系统能够将原始过程的整个地址空间的实际页面快速地映射到第二过程快照。创建快照之后,可以将调试器附加到它们。快照可以以类似于分析故障转储的方式来分析。或者,可以使用收集器过程从快照挖掘数据。通过创建多个快照,用户可以获得过程中随时间发生的事件的历史图片。例如,用户可以通过在不同位置处拍摄几个快照来模拟步进。用户可以通过分析从快照到快照的改变来诊断生产应用。

诊断工具可以从诊断工件获得保存基本块计数和指令地址的局部变量的值。可以使用诊断符号信息(例如,从通常在编译过程中产生的信息)将指令地址映射到相应的源代码中。然后,诊断工具可以提供实际控制流的一个或多个可视化和断点处的执行计数。

可视化可以包括对于函数的特定调用执行基本块的次数。可以提供在源代码中或在反汇编视图中的所讨论的基本块的内容。在“源视图”中,可以显示被编译到应用中的源代码。在反汇编视图中,可以显示编译器生成的机器代码。操作码的二进制值等可以用符号操作码名称替换。

图1示出了根据本文中所描述的方案的方面的可以提供历史控制流的可视化的系统100的示例。系统100的全部或部分可以驻留在一个或多个计算机或计算设备上,诸如下面参考图3描述的计算机。系统100或其部分可以被提供作为独立系统或作为插件或附件。系统100可以完全地或部分地在诸如ide104等ide中执行,或者可以完全地或部分地在ide外部执行。ide104可以是诸如关于图4所描述的ide等ide,或者可以是任何其他ide。系统100的全部或部分可以实现为插件或附件。

系统100或其部分可以包括从服务获得获得的信息(例如,在云中)或者可以在云计算环境中操作。云计算环境可以是其中计算服务不被拥有但是按需提供的环境。例如,信息可以驻留在联网云中的多个设备上和/或数据可以存储在云内的多个设备上。

系统100包括一个或多个计算设备,诸如例如计算设备102。所考虑的计算设备包括但不限于台式计算机、平板计算机、膝上型计算机、笔记本计算机、个人数字助理、智能电话、蜂窝电话、移动电话、服务器、虚拟机、包括数据库的设备、防火墙等。诸如计算设备102等计算设备可以包括诸如处理器142等一个或多个处理器、以及诸如与一个或多个处理器通信的存储器144等存储器。

系统100可以包括程序模块中的任何一个或任何组合,程序模块包括:检测引擎(例如检测引擎114)和/或调试器或诊断工具(诸如调试器124)。调试器或诊断工具(诸如调试器124)可以包括控制流可视化器,诸如控制流可视化器122。或者,控制流可视化器可以在诊断工具外部。诸如检测引擎114等检测引擎可以包括诸如控制流分析器116等控制流分析器。系统100可以包括诸如生产运行时环境106等运行时环境。运行时环境可以是开发、分级或测试环境。系统100可以包括第二环境,例如但不限于图1中用ide104表示的开发环境。

根据本文中所描述的主题的一些方面,用户可将例如但不限于非停止断点等调试语句插入到源代码(诸如源代码128)中。调试器124可以将调试语句转换成检测文件例如检测文件120。检测文件可以被提供给检测引擎114。检测引擎114可以动态地检测原始函数110以创建检测函数112,而不取消或停止执行过程108。下一次函数被调用时,可以执行检测函数112而不是原始函数110。根据本文中所描述的方案的一些方面,重写原始函数110以使用il重写机制来创建检测函数112。根据本文中所描述的方案的一些方面,原始函数110被重写以由检测引擎114创建检测函数112。

诸如控制流量分析器116等控制流量分析器可以分析控制流量。例如,现在参考图2a的示例200,假设诸如示例函数160等函数包括6个指令:指令1161a、指令2161b、指令3161c、指令4161d、指令5161e和指令6161f。在没有控制流影响的指令中,要执行的下一指令是序列中的下一指令。例如,如果指令1161a没有控制流影响,则执行的下一指令是指令2161b。诸如跳转、分支、调用等一些指令具有控制流影响。例如,如果指令1161a是调用,则要执行的下一指令通常不是指令2161b,它将是在某个其它位置的某个其他指令。基本块包括不具有控制流影响或具有相同控制流影响的指令范围。例如,如果指令1、2、3、4和5都按顺序执行,则指令1、2、3、4和5将被置于单个基本块中。如果指令6、7和8都强制控制在不同位置执行,则指令6、7和8被分组到不同的基本块中。指令跳转到另一位置的事实引起新的基本块在该位置开始。

根据本文中所描述的方案的一些方面,基本块的概念用于确定如何发生通过功能的流。控制流分析器116可以确定指令指令1161a、指令2161b和指令3161c顺序执行,但指令4161d将跳到另一位置。假设控制流分析器116确定指令指令4161d和指令5161e顺序执行,但是指令6161f跳到第三位置。指令指令1161a、指令2161b和指令3161c可以被放置在第一基本块——基本块1162中。指令指令4161d和指令5161e可以被放置在第二基本块——基本块2163中,指令6161f可以被放置在第三基本块——基本块3164中。可以向基本块添加附加指令(检测)。例如,每当执行基本块1162时,计数器(例如,计数器1)可以递增。保持用于基本块的计数器(例如,计数器1165)的值的局部变量因此可以包括基本块1的执行次数。类似地,每当执行基本块2163时,基本块2163的计数器(例如,计数器2166)可以递增,并且每当执行基本块3164时,基本块3164的计数器(例如计数器3168)可以递增。

异常也可以改变函数的控制流。任何时候都可能发生异常。每当不能执行正常控制流时,发生异常。相反,处理在捕捉(catch)块处继续以处理出错的事情。例如,假设当执行计算时,发生除零。这是一个非法操作,可以抛出异常。根据本文中所描述的方案的方面,可以显示关于以下各项的信息:在基本块中在何处抛出异常、异常被抛出的序列中的哪个指令、以及引起抛出异常的该指令的类型是什么。

再次参考图1,当在检测函数中遇到非停止断点时,或当发生诸如异常等异步控制流事件时,可以捕获控制流数据118。控制流数据118可以是包括用于过程108的存储器中的所有信息的快照。控制流数据118可以是包括过程的轻量级副本的一个或多个快照,其中有效地创建快照而不创建过程的执行或存储器的完整跟踪。当如本文中所描述的诊断工具附接到控制流数据118时,工具可以读取基本块的值,其包括指令序列中基本块开始和结束的位置以及基本块实际对于该调用执行的次数。可以提供聚合数据的可视化,使得可以可视化通过函数的流。控制流数据118可以由控制流可视化器122接收。根据本文中所描述的方案的一些方面,实时调试工具可以在每个基本块上设置内部实况(停止)断点以收集控制流信息。当遇到这样的断点时,实时调试工具可以增加基本块自己的计数器。如果调试器可以支持调试检测代码,则实时调试器也可以使用基于检测的模型。控制流可视化器122可以将控制流数据118格式化为各种可视化,例如可视化126,如图2c、2d、2e和2f所示。

图2b示出了用于分析控制流信息的方法201的示例。可以提供检测函数的控制流信息的可视化。图2b中所描述的方法可以由例如但不限于关于图1描述的系统的系统来实践。尽管方法201描述了按序列执行的一系列步骤或操作,但是应当理解,方法201不受所描绘的序列的顺序的限制。例如,一些操作可以以与所描述的顺序不同的顺序发生。另外,一个操作可以与另一操作同时发生。在一些情况下,没有执行所描述的所有操作。

在操作203,可以接收检测文件。可以从开发、测试或分段计算机接收检测文件。检测文件可以由在相同的计算设备上或在另一计算设备上的生产运行时环境接收。在操作205,可以如上所述分析函数的控制流。控制流可以由被加载到连接到计算设备的处理器的存储器中的程序模块来分析。根据本文中所描述的方案的一些方面,在该操作期间,可以检查组成函数的il的状态。可以确定对每个指令的控制流的影响。可以确定跳转到另一位置或对另一位置进行调用的所有指令。从该信息,可以将顺序执行的指令放置在相同的基本块中,并且可以将在不同位置(例如,由于调用语句或跳转)执行的指令放置在新的基本块中。

另一次当函数中的指令没有按顺序执行时,是抛出异常时。当遇到诸如除以零或解除引用空指针等非法操作时,引发异常。在被称为第一机会异常的异常的第一阶段中,执行对异常的处理程序(handler)的搜索。如果没有人捕捉到异常,则发生第二机会阶段。第二机会异常在生产环境中通常是罕见的。根据本文中所描述的方案的方面,可以捕获并且向用户显示基本块内异常被抛出的位置(例如,接收到第一机会通知的点)、异常的类型、以及捕捉块逻辑在哪里执行。异常的类型在某种程度上对用户是有用的,因为异常的类型通常与诸如对象类型等语言构造强烈相关。

在操作207,可以对函数进行检测以产生在下一次调用函数时执行的检测函数。该函数可以由被加载到连接到计算机器的处理器的存储器中的一个或多个程序模块来检测。在操作209,可以执行检测函数。检测函数可以由计算设备的处理器执行。检测函数可以执行多次,直到达到非停止断点。非停止断点可以导致在操作211收集控制流信息。控制流信息可以是过程的快照的形式。控制流信息可以由包括控制流可视化器的诊断工具或调试器接收。在操作213,可以生成控制流的可视化。可视化可以由被加载到连接到计算设备的处理器的存储器中的程序模块生成。可视化可以作为显示、报告、写入存储介质或通过本领域技术人员已知的任何手段提供。

图2c是根据本文中所描述的方案的方面的控制流信息的可视化220的示例。在可视化220中,响应于通过点击或以其他方式选择流计数指示(例如,点击“flowcount=33”流计数指示230)来选择流计数指示,可以突出显示相关联的基本块指令,其映射回导出编译后的代码的源代码。通过在代码段周围放置数字标记的框来引用代码段。在图2c中,在用附图标记224“enginedatadata”标记的框中的代码和在用附图标记226标记的框内的代码是与流计数指示230相关联的代码部分。根据本文中所描述的方案的方面,可以突出显示这些代码段。突出显示可以包括在彩色背景中显示代码,加粗代码或以任何方式将代码与不与所选择的流计数指示相关联的代码区分开。可视化220的突出显示的代码是在断点被命中之前执行了33次的代码行。

根据本文中所公开的方案的一些方面,用户界面手势可以开启对应于所执行的基本块的所有代码的突出显示。图2d的可视化232是控制流信息的这种可视化的示例。可视化232区分对应于被执行了各种次数的若干基本块的源代码。在图2d中,通过在代码部分周围放置数字标记的框来引用代码部分。例如,图2d中的一段代码被标记为部分234。这部分代码与流计数指示234a(流计数:1)相关联。与该基本块的执行相关联的源代码是在部分234中的斜体代码。根据本文中所描述的方案的方面,斜体代码可以在向用户显示的可视化中突出显示。例如,用斜体表示的代码可以通过用第一颜色(例如,黄色)的背景显示该代码来突出显示。

在部分236中,斜体的代码是对应于被执行33次的基本块代码的源代码的示例,如流计数指示236a所指示的。还与流计数指示236a相关联的是部分234的下划线代码(代码236b)。可以通过用第二颜色(例如,蓝色)显示与流计数指示236a相关联的代码来突出显示与流计数指示236a相关联的代码并且将其与和流计数指示234a相关联的代码区分开。代码的第三部分——部分238可以是与流计数指示238a“flowcount:1”相关联的代码。可以通过用第三颜色(例如,红色)显示与流计数指示238a相关联的代码来突出显示部分238中的代码并且将其与和流计数指示234a和流计数指示236a相关联的代码区分开。

最后,代码的第四部分——部分240可以是与流计数指示240a“flowcount:32”相关联的代码。可以通过用第四颜色(例如,绿色)显示与流计数指示240a相关联的代码来突出显示段240中的斜体代码并且将其与和流计数指示234a、流计数指示236a和流计数指示238a相关联的代码区分开。因此,与不同基本块相关联的代码可以用不同的颜色示出,以使得能够容易地看到每个基本块代码在哪里开始和结束。在图2e的可视化250中,响应于流计数指示256a和流计数指示258a的选择,与流计数指示256a和流计数指示258a相关联的代码被突出显示。当流计数指示256a(“flowcount:1”)指示时,与基本块256的if子句(“ifprevdata==null”)相关联的代码259被执行一次。如流计数指示258a(“flowcount:32”)所指示的,else子句256c被执行32次。代码259的“ifprevdata==nullstatement”从未被执行过。这是已知的,因为未显示流计数,并且块未被突出显示。因此,当非停止断点被命中时,总是采取第二else258e(流计数为32,流计数指示258d)。根据本文中所公开的方案的一些方面,所有基本块可以用一种颜色突出显示,其中颜色的渐变表示块被执行的频繁程度。

图2f的可视化260示出了在基本块的中间对异常进行可视化的示例。抛出异常的代码部分——部分261可以通过例如在诸如蓝色等颜色的背景中显示该代码来突出显示。在抛出异常之前执行该基本块的次数用流计数指示262(“flowcount:1”)来指示。在该特定可视化中,仅示出了流计数指示262和264。

本文中公开了一种系统,其包括至少一个处理器、连接到一个或多个处理器的存储器和诊断工具。诊断工具可以包括在被加载到存储器中时使得处理器能够提供与特定函数的调用相关联的控制流数据的可视化的一个或多个程序模块。该函数可以分解为多个基本块。可视化可以提供各种信息,包括在函数的调用中执行函数的每个基本块的次数。控制流数据的可视化可以包括异常信息,诸如当执行基本块时抛出的异常的类型。可视化可以包括基本块中异常被抛出的指令,该指令被映射到由基本块表示的源程序的行。

该系统可以包括从在运行的生产应用中搜集历史控制流信息的诊断工具接收信息的一个或多个程序模块。该系统可以包括从在实时调试会话中搜集控制流信息的诊断工具接收信息的一个或多个程序模块。权利要求1的系统可以包括聚集用于函数的调用次数的本地控制流信息以提供该函数的全局控制流的可视化的一个或多个程序模块。该系统可以包括创建指定要在函数的执行期间被动态地插入到函数中的指令的检测文件的一个或多个程序模块。该系统可以包括向生产环境发送检测文件的一个或多个程序模块。

一种使用诸如上述系统等系统的方法,其可以包括以下操作:包括将包括至少一个非停止断点的指令动态地插入到执行函数中,指令在仪器文件中指定,以及分析和收集控制流数据。控制流数据可以被提供给控制流可视化器。可以通过创建过程数据的快照来收集控制流数据。控制流数据可以是异常信息。异常信息可以包括异常的类型以及基本块中抛出异常的指令。控制流数据可以是特定功能调用的本地数据。

一种存储在计算机可读存储介质上的计算机可读指令,当其在计算机上被执行时,可以创建包括调试语句的检测文件,调试语句包括非停止断点。可以收集应用中特定功能调用的本地控制流信息,并且可以创建控制流信息的可视化。可视化可以包括与构成包括调用函数以及执行基本块的次数的一个或多个基本块的编译代码相对应的代码。应用中的函数可以被动态地检测以收集程序控制流信息,而不停止应用的执行。可以显示异常信息,包括基本块中抛出异常的位置和/或异常的类型。可以显示应用的执行到达特定断点所采取的路径。可以显示生产或非生产应用的调试信息。

合适的计算环境的示例

为了提供本文中所公开的方案的各个方面的上下文,图3和以下讨论旨在提供其中可以实现本文中所公开的方案的各种实施例的合适的计算环境510的简要一般描述。尽管在由一个或多个计算机或其他计算设备执行的诸如程序模块等计算机可执行指令的一般上下文中描述了本文中所公开的方案,但是本领域技术人员将认识到,本文中所公开的方案的各部分也可以结合其他程序模块和/或硬件和软件的组合来实现。通常,程序模块包括执行特定任务或实现特定数据类型的例程、程序、对象、物理工件、数据结构等。通常,在各种实施例中,可以根据需要组合或分布程序模块的功能。计算环境510仅是合适的操作环境的一个示例,而非旨在限制本文中所公开的方案的使用或功能的范围。

参考图3,描述了计算机512形式的计算设备。计算机512可以包括至少一个处理单元514、系统存储器516和系统总线518。至少一个处理单元514可以执行存储在例如但不限于系统存储器516等存储器中的指令。处理单元514可以是各种可用处理器中的任何一种。例如,处理单元514可以是图形处理单元(gpu)。指令可以是用于实现上述由一个或多个部件或模块执行的功能的指令或用于实现上述方法中的一个或多个的指令。双微处理器和其他多处理器架构也可以用作处理单元514。计算机512可以用在支持在显示屏上显示图形的系统中。在另一示例中,计算设备的至少一部分可以用在包括图形处理单元的系统中。系统存储器516可以包括易失性存储器520和非易失性存储器522。非易失性存储器522可以包括只读存储器(rom)、可编程rom(prom)、电可编程rom(eprom)或闪存。易失性存储器520可以包括可以用作外部高速缓存存储器的随机存取存储器(ram)。系统总线518将包括系统存储器516的系统物理工件耦合到处理单元514。系统总线518可以是几种类型中的任何一种,包括存储器总线、存储器控制器、外围总线、外部总线或局部总线,并且可以使用任何各种可用的总线架构。计算机512可以包括由处理单元514通过系统总线518可访问的数据储存库。数据储存库可以包括用于图形显示的可执行指令、3d模型、材料、纹理等。

计算机512通常包括各种计算机可读介质,诸如易失性和非易失性介质、可移除和不可移除介质。计算机可读介质可以以用于存储诸如计算机可读指令、数据结构、程序模块或其他数据等信息的任何方法或技术来实现。计算机可读介质包括计算机可读存储介质(也称为计算机存储介质)和通信介质。计算机存储介质包括物理(有形)介质,例如但不限于ram、rom、eeprom、闪存或其他存储器技术、cdrom、数字多功能盘(dvd)或其他光盘存储器、磁带盒、磁带、磁盘存储、或者可以存储所需数据并且由计算机512可访问的其它磁存储设备。通信介质包括各种介质,例如但不限于通信信号、调制载波、或者可以使用以传送期望的信息并且可以由计算机512访问的任何其它无形介质。

应当理解,图3描述了可以用作用户和计算机资源之间的中介的软件。该软件可以包括可以被存储在磁盘存储装置524上并且可以分配计算机512的资源的操作系统528。磁盘存储装置524可以是通过不可移除存储器接口(诸如接口526)连接到系统总线518的硬盘驱动器。系统应用530利用操作系统528通过存储在系统存储器516中或磁盘存储装置524上的程序模块532和程序数据534对资源的管理。应当理解,计算机可以用各种操作系统或操作系统的组合来实现。

用户可以通过(多个)输入设备536将命令或信息输入到计算机512中。输入设备536包括但不限于定点设备(pointingdevice),诸如鼠标、轨迹球、触笔、触摸板、键盘、麦克风、语音识别和姿势识别系统等。这些和其他输入设备经由接口端口538通过系统总线518连接到处理单元514。(多个)接口端口538可以表示串行端口、并行端口、通用串行总线(usb)等。(多个)输出设备540可以使用与输入设备所使用的相同类型的端口。提供输出适配器542以说明存在需要特定适配器的一些输出设备540,如显示器、扬声器和打印机。输出适配器542包括但不限于提供输出设备540和系统总线518之间的连接的视频和声卡。其他设备和/或系统或设备(诸如远程(多个)计算机544)可以提供输入和输出能力。

计算机512可以使用到一个或多个远程计算机(诸如(多个)远程计算机544)的逻辑连接在联网环境中操作。远程计算机544可以是个人计算机、服务器、路由器、网络pc、对等设备或其他公共网络节点,并且通常包括以上关于计算机512描述的很多或所有元件,但是在图3中仅示出了存储器存储设备546。(多个)远程计算机544可以经由(多个)通信连接550逻辑连接。网络接口548包括诸如局域网(lan)和广域网(wan)等通信网络,但是也可以包括其他网络。(多个)通信连接550是指用于将网络接口548连接到总线518的硬件/软件。(多个)通信连接550可以在计算机512内部或外部,并且包括内部和外部技术,诸如调制解调器(电话、电缆、dsl和无线)和isdn适配器、以太网卡等。

应当理解,所示的网络连接仅是示例,并且可以使用在计算机之间建立通信链路的其他手段。本领域普通技术人员可以理解,计算机512或其他客户端设备可以被部署为计算机网络的一部分。在这点上,本文中所公开的方案可以涉及具有任何数目的存储器或存储单元以及在任何数目的存储单元或卷上发生的任何数量的应用和过程的任何计算机系统。本文中所公开的方案的方面可以应用于具有部署在网络环境中的服务器计算机和客户端计算机的环境,其具有远程或本地存储。本文中所公开的方案的方面还可以应用于具有编程语言功能、解释和执行能力的独立计算设备。

本文中所描述的各种技术可以结合硬件或软件或在适当时与两者的组合来实现。因此,本文中所描述的方法和装置或其某些方面或部分可以采取在诸如软盘、cd-rom、硬盘驱动器或任何其它机器可读介质等有形介质中实施的程序代码(即指令)的形式,其中,当程序代码被加载到诸如计算机等机器中并且由机器执行时,机器变成用于实践本文中所公开的方案的方面的装置。如本文中所使用的,术语“机器可读存储介质”应当被理解为排除提供(即,存储和/或传输)任何形式的传播信号的任何机制。在可编程计算机上执行程序代码的情况下,计算设备通常将包括处理器、处理器可读的存储介质(包括易失性和非易失性存储器和/或存储元件)、至少一个输入设备、以及至少一个输出设备。可以例如通过使用数据处理api等来利用领域专用编程模型方面的创建和/或实现的一个或多个程序可以用高级过程或面向对象的编程语言来实现,以与计算机系统通信。然而,如果需要,(多个)程序可以用汇编或机器语言实现。在任何情况下,语言可以是编译或解释语言,并且与硬件实现结合。

图4示出了集成开发环境(ide)600和公共语言运行时环境602。ide600可以允许用户(例如开发者、程序员、设计者、编码器等)在计算机系统中设计、编码、编译、测试、运行、编辑、调试或构建程序、程序集、网站、web应用和web服务。软件程序可以包括用一种或多种源代码语言(例如visualbasic、visualj#、c++、c#、j#,javascript、apl、cobol、pascal、eiffel、haskell、ml、oberon、perl、python、scheme、smalltalk等)创建的源代码(部件610)。ide600可以提供本机代码开发环境、或者可以提供在虚拟机上运行的托管代码开发、或者可以提供其组合。ide600可以使用.net框架提供管理的代码开发环境。当应用被执行时,可以使用语言特定源编译器620从源代码部件610和本机代码部件611创建中间语言部件650,并且使用中间语言编译器660(例如,即时(just-in-time,jit)编译器)从中间语言部件650创建本机代码部件611(例如,机器可执行指令)。也就是说,当il应用被执行时,它被编译,同时被执行为用于其正被执行的平台的适当的机器语言,从而使代码在多个平台上可移植。或者,在其它实施例中,程序可被编译为适于其预期平台的本机代码机器语言(未示出)。

用户可以经由ide600中的用户界面640和源代码编辑器651根据已知的软件编程技术以及与特定源语言相关联的特定逻辑和语法规则来创建和/或编辑源代码部件。此后,源代码部件610可以经由源编译器620来编译,由此可以创建程序的中间语言表示,诸如组件630。组件630可以包括中间语言部件650和元数据642。

应用设计可以能够在部署之前被验证。

尽管已经用对结构特征和/或方法动作专用的语言描述了方案,但是应当理解,所附权利要求中定义的方案不一定限于上述具体特征或动作。相反,上面描述的具体特征和动作被公开作为实现权利要求的示例形式。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1