CN106471476A - 用于对经优化代码的编辑并继续以及增强的经优化调试的技术 - Google Patents
用于对经优化代码的编辑并继续以及增强的经优化调试的技术 Download PDFInfo
- Publication number
- CN106471476A CN106471476A CN201580034673.1A CN201580034673A CN106471476A CN 106471476 A CN106471476 A CN 106471476A CN 201580034673 A CN201580034673 A CN 201580034673A CN 106471476 A CN106471476 A CN 106471476A
- Authority
- CN
- China
- Prior art keywords
- function
- source code
- code
- dependence
- node
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3664—Environments for testing or debugging software
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3628—Software debugging of optimised code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/71—Version control; Configuration management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/73—Program documentation
Abstract
提供了使得代码的一部分能在源代码中被标记以对于代码的被标记部分禁用编译优化,而源代码的其余部分在有优化的情况下进行编译的方法、系统和计算机程序产品。以此方式,编辑并继续调试可按照增强的方式对已编译的源代码执行。对经标记的源代码(以及源代码的其余部分)进行的修改可按照增量方式来编译,使得源代码中受修改影响的部分被编译,而源代码中未受影响的部分不被重新编译。
Description
背景
存在着软件开发者可使用来开发软件的各种类型的开发应用。集成开发环境(IDE)是一种类型的在一个包中包含若干开发工具的软件开发应用。IDE可包括诸如源代码编辑器、构建自动化工具、以及调试器等工具。IDE的示例包括由加拿大渥太华的EclipseFoundation开发的EclipseTM、加拿大温哥华的ActiveStat开发的ActiveState KomodoTM、捷克共和国的JetBrains开发的IntelliJ IDEA、加利福尼亚雷德伍德市的Oracle公司开发的Oracle JDeveloperTM、Oracle公司开发的NetBeans、加利福尼亚旧金山市的Codenvy开发的CodenvyTM、加利福尼亚库珀蒂诺市的Apple公司开发的以及华盛顿州雷蒙德市的微软公司开发的Visual
“编辑并继续(Edit-and-Continue)”是一些IDE工具(诸如Visual调试器)中内置的节省时间的特性。编辑并继续允许用户在处于实况调试上下文的同时进行源代码编辑。编辑并继续在许多类型的应用的开发中非常有用,包括视频游戏的开发,其中开发者可生成日常使用的经优化构建(optimized build)(主要针对性能原因)。
对于本机代码(例如C/C++)启用编辑并继续极度困难,且如今IDE通常远离本机代码的编辑并继续,因为用户体验非常差。经优化构建带来在语义上等效于在未经优化的情况下生成的机器码的机器码,但是按照在经优化机器码的执行期间更少资源(例如,更少的存储器、更少的规程调用等)被使用的方式被配置。启用编辑并继续对于经优化的代码极富挑战性。对于本机的经优化代码,将经优化的机器码二进制代码中生成的指令与应用源代码中的指令互相关极度困难。这主要是由于可被执行的许多类型的优化(例如,内联(inlining)、寄存器分配、公共子表达式消除等)。
许多开发者还将经优化构建配置用于其日常开发者构建场景。这对于需要游戏按特定速度运行以添加视觉效果等的游戏开发者而言是非常常见的实践。由于上面提到的一些优化,对于正调试经优化代码的开发者而言,观察到跳动的程序计数器(程序计数器按照非顺序的方式跳来跳去)、交叉跳跃、以及熟知的飘忽不定的变量的现象(例如,变量可能已死而其寄存器被重用、对已被移动的变量的指定等)是很常见的,这使得调试经优化代码对于普通开发者而言难以理解。这也导致编辑并继续对于经优化代码不可行。
概述
提供本概述以便以简化的形式介绍以下在详细描述中进一步描述的一些概念。本概述并不旨在标识所要求保护主题的关键特征或必要特征,也不旨在用于限制所要求保护主题的范围。
提供了使得代码的一部分能在源代码中被标记以使得对于代码的被标记部分禁用编译优化,而源代码的其余部分在有优化的情况下进行编译的方法、系统和计算机程序产品。以此方式,编辑并继续调试可按照增强的方式对已编译的源代码执行。而且,对源代码的被标记部分(以及源代码的其余部分)进行的修改可按照增量方式来编译,使得源代码中受修改影响的部分被编译,而源代码中未受影响的部分不被重新编译。
下面将参考各个附图,详细描述本发明的进一步特点和优点,以及本发明的各实施例的结构和操作。值得注意的是,本发明不仅限于此处所描述的特定实施例。本文呈现这些实施例仅用于说明性的用途。基于本文所包含的描述,其它实施例对于相关领域的技术人员将是显而易见的。
附图说明
结合到本说明书并构成本说明书的一部分的附图示出了本发明的各个实施例,且与描述一起,进一步用于说明本发明的原理,并允许相关领域技术人员实施和使用这些实施例。
图1示出了根据一示例实施例的包括代码编辑器和编译器的计算设备的框图,该代码编辑器使得源代码能够被标记以避免编译优化,该编译器被配置成执行源代码的增量式编译。
图2示出了根据一示例实施例的提供禁用源代码的一部分的经优化编译以及编译该源代码的过程的流程图。
图3示出了根据一示例实施例的提供用于编译源代码的过程的流程图,其中源代码的某些函数的经优化编译被禁用。
图4示出了根据一示例实施例的配置成执行源代码的完整且增量式编译的编译器的框图。
图5示出了根据一示例实施例的用于生成存储关于源代码的信息的增量式程序数据库的过程。
图6示出了根据一示例实施例的提供用于使用依存关系图来确定要在优化被禁用的情况下被编译的函数的过程的流程图。
图7示出了根据一示例实施例的被配置成生成依存关系图的代码分析器的框图。
图8示出了根据一示例实施例的被配置成分析依存关系图的受影响函数确定器的框图。
图9示出了根据一示例实施例的提供用于生成依存关系图的过程的流程图。
图10示出根据一实施例的示例性依存关系图的一部分的图形表示。
图11示出了根据一示例实施例的提供用于分析依存关系图的过程的流程图。
图12示出了根据一示例实施例的提供用于执行在调试会话期间编辑的源代码的增量式编译的过程的流程图。
图13示出了根据一示例实施例的标记/编辑代码确定器的框图。
图14示出了根据一示例实施例的提供用于检测在源代码中被修改的功能的过程的流程图。
图15示出了根据一示例实施例的用于检测在源代码中被修改的变量的过程。
图16示出根据示例实施例的包括编译器和链接器的用于增量式编译的构建系统的框图。
图17示出可用于实现各实施例的示例性用户设备的框图。
图18示出可用来实现各个实施例的示例计算设备的框图。
当结合其中相同的附图标记标识对应的元素的附图时,本发明的特征和优点将从以下阐述的详细描述中变得更加显而易见。在附图中,相同的参考标号一般指相同的、功能上相似的和/或结构上相似的元素。其中元素第一次出现的附图由对应的参考标号中最左侧的数字指示。
详细描述
I.介绍
本说明书和附图公开了包括本发明的各特征的一个或多个实施例。本发明的范围不限于所公开的实施例。所公开的实施例仅仅例示本发明,并且所公开的实施例的经修改的版本也被本发明所构思。本发明的各实施例由附加的权利要求所限定。
说明书中对“一个实施例”、“一实施例”、“一示例实施例”等等的引用表示所描述的实施例可包括特定特征、结构或特性,但是,每一个实施例可不必包括该特定特征、结构,或特征。此外,这些短语不一定指相同的实施例。此外,当关于某一实施例描述特定特征、结构或特性时,不管是否被明确描述,关于其他实施例来实现该特征、结构或特性被认为是在本领域技术人员的知识范围内。
以下描述多个示例性实施例。应当注意,在此提供的任何章节/子章节标题不旨在限制。本文档中描述了各实施例,并且任何类型的实施例可被包括在任何章节/子章节下。此外,在任何章节/子章节中公开的各实施例可与在相同章节/子章节和/或不同章节/子章节中描述的任何其它实施例以任何方式组合。
II.用于增量式编译的示例环境
本文描述的实施例使得源代码的一部分(例如,一个或多个函数)能够被开发者标记以使得针对被标记部分的优化在编译时被禁用。源代码的其余部分可在启用优化的情况下被编译。以此方式,开发者能够对经部分优化的代码执行“编辑并继续”(EnC),其中使得开发者能够更好地将源代码的被标记部分中的指令与经优化代码互相关。开发者可标记源代码中在该特定时间开发者想要将其调试努力聚焦于其上的部分。
EnC在所有类型的应用的开发中被使用,包括游戏应用。在游戏行业中,经优化构建配置的使用是常见的。当今没有其它IDE提供用于在逐个功能的级别上对经优化代码成功执行EnC的方式。
从而,各实施例使得开发者更好地能够使用EnC调试经优化的经编译代码。因为编译器在其执行优化之前生成编译单元的调试表,所以优化转换可使得部分调试数据失效,从而使得传统形式的调试很困难。例如,如果在优化期间,循环被强度降低,则在所得到的经优化机器码中,循环控制变量可能被完全消除且从而不能在调试器工具中显示。“跳跃程序计数器”问题(重复的步骤或下一命令显示程序计数器在代码中来回跳跃)可能由于各种优化而出现,诸如公共子表达式消除(对于源代码计算若干次的数使用单一代码实例)、不变代码移动(移动在一循环内不改变的表达式到循环的开头)、指令调度等。“交叉跳跃”问题是其中两段相同代码被合并,且程序计数器突然跳到理应不执行的语句,仅是因为它(以及后面的代码)转换为与理应被执行的代码相同的事物。“飘忽不定的变量”问题(变量中的意外值)可能具有各种起因,包括死变量(且其寄存器被重用)、将值指定到可能已被移动的变量、或变量可能通过值传播或以其它手段被完全消除。通过在调试会话中让开发者选择不要被优化的特定代码,实施例减少了调试经优化代码中的这些困难。
而且,使得编译器(包括独立编译器和集成开发环境(IDE)的编译器)能够执行源代码的增量式编译。开发者(设计程序代码的人)被允许对源代码作出修改/修订,包括对源代码的被标记和/或未被标记的部分进行编辑,以及代替源代码整体被重新编译,只有源代码的受该修改/修订影响的部分被编译。如此,通过必须重新编译更少的代码,增量式编译减少了构建时间。这是相对于传统系统的重大改进,因为在“编辑-构建-调试”各循环之间所花的时间被大大减少。
相应地,在实施例中,初始完整构建可被执行,其中源代码的所有函数被编译。在完整构建期间,函数间依存关系和支持增量式编译所需的其它信息被收集并存储在数据库中,该数据库可被称为增量式程序数据库(IPDB)。
尽管在实况调试上下文中,在IDE中提供针对正开发/创建源代码的人(称为开发者(在本文中也被称为“用户”))的界面,以指示哪个代码部分或片段(函数或函数系列)将被启用EnC和/或其它改进的优化的调试体验。
用户输入所指示的(诸)函数被标记为“脏”函数且使用依存关系图(从IPDB创建)来执行分析以确定源代码的哪些函数需要被重新编译。依存关系图包括用于执行分析的以下信息:
(a)针对源代码中的每个函数的节点,其中关于该函数的信息被存储;针对每个函数存储的信息是影响该函数本身和其它函数的优化和代码生成的信息。例如,用于函数的表达式中间语言(IL)代码的校验和可被存储,其可被用于检测该函数是否已被编辑。
(b)针对源中的每个全局/模块静态变量的节点,其中变量的可能影响代码生成的属性被存储。
(c)两个函数节点之间的边被存储。从第一函数到第二函数的边表示第一函数的变化可能影响针对第二函数生成的代码。边可被配置成表示函数间的不同种类的依存关系。例如,如果在经优化的编译期间节点1的函数被内联到节点2的函数中,一种类型的边可以是从节点1到节点2的“内联”边。
(d)从全局变量节点到函数节点的边被存储。从变量到函数的边表示函数的属性中的变化影响针对该函数生成的机器码。
被标记为“脏”的函数以及被确定受被标记的函数影响的任意函数在禁用优化的情况下被重新编译,以允许启用编辑并继续和改进的优化调试体验。
被重新编译的函数被打补丁到现有经优化的机器码中。此补丁可在存储器中被执行,以使得用这些新函数实现(出于调试目的的构建)来附加现有函数实现。
调试器接着可还原应用状态并恢复初始地对旧函数定义的控制。当下次所选函数被调用时,调试器现在指向这些函数实体的可调试版本,从而允许ENC和经优化的调试的改进的体验。
假定没有对应用源代码本身做出源代码改变,则当下次该应用被编译器构建时,该应用可在针对整个代码库启用优化的情况下被构建。
下面的章节描述了用于标记用于禁用优化的代码以及用于执行增量式编译的数个示例性实施例。
A.针对高效代码编译的示例开发系统实施例
在实施例中,开发系统可按各种方式配置以针对所选择的源代码禁用经优化的编译,以及执行源代码的增量式编译。例如,图1示出了根据一示例实施例的开发系统100的框图。如图1所示,开发系统100包括源代码编辑器102、编译器104、以及调试器工具106。此外,编译器104包括增量式编译启用器108。系统100的这些特征被描述如下。
如图1所示,开发系统100可被实现在一个或多个计算设备118中。例如,源代码编辑器102、编译器104以及调试器工具106可被包括在同一计算设备中,或者源代码编辑器102、编译器104以及调试器工具106中的一者或多者可被实现在与源代码编辑器102、编译器104以及调试器工具106中的其他各者分开的一个或多个计算设备上。
计算设备118可以是任何类型的固定或移动计算设备,包括移动计算机或移动计算设备(例如,设备、个人数字助理(PDA)、膝上型计算机、笔记本计算机、平板计算机(诸如Apple iPadTM)、上网本,等等)、移动电话、可穿戴计算设备、或其他类型的移动设备,或者诸如台式计算机或PC(个人计算机)之类的固定计算设备。
开发者可与源代码编辑器102交互以在生成应用程序的源代码时录入和修改程序代码。例如,开发者可以诸如通过键入、通过语音输入、通过选择建议的代码块等使用源代码编辑器102来添加、修改、或删除程序代码文本。在完成时或在其他间隙时,用户能够通过与“保存”按钮或其他用户界面元素交互来保存程序代码。源代码编辑器102可以是基于浏览器的编辑器、集成在桌面或移动应用中的代码编辑器、或任何其他类型的代码编辑器。
例如,如图1所示,开发者可以与源代码编辑器102交互以生成源代码110。源代码110是使用人类可读计算机编程语言编写的计算机指令集合(可能带有注释)。合适的人类可读计算机编程语言的示例包括C、C++、Java,等等。源代码110可以按一个或多个文件或其他形式来被接收。例如,源代码110可以作为一个或多个“.c”文件(在使用C编程语言时)、作为一个或多个“.cpp”文件(在使用C++编程语言时)来接收。
编译器104可以按任何方式来被调用,诸如通过命令行、图形用户界面,等等。在编译器104被调用以执行全编译时,“-full(全)”开关或其他开关可被使用。编译器104被配置成接收并编译源代码110以生成经完全优化的机器码112。具体而言,编译器104被配置成将源代码110转换成另一计算机语言形式的经完全优化的机器码112,通常具有二进制形式,称为机器码或目标代码。在一些情况下,编译器104可包括多个阶段,并且可首先将源代码110转换成中间形式(例如,中间语言),该中间形式随后被转换成经完全优化的机器码112。
在生成经完全优化的机器码112时,编译器104对源代码110执行一种或多种类型的优化。优化构建带来在语义上等效于在未经优化的情况下生成的机器码的机器码,但是按照在优化机器码的执行期间更少资源(例如,更少的存储器、更少的规程调用等)被使用的方式被配置。可被执行的优化的示例包括循环优化、数据流优化、基于SSA的优化、代码生成器优化、函数语言优化、规程间优化、和/或相关领域的技术人员公知的其它类型的优化。存在许多具体类型的优化。例如,“内联”可被执行,其中调用者函数所调用的被调用者函数被复制到调用者函数体内。在具体优化的另一示例中,“公共子表达式消除”可被执行,其中单一代码实例被用于在源代码中被多次计算的数。
经完全优化的机器码112可被包括在文件(例如,目标或“.obj”文件)中,或者可以按另一形式来被创建/存储以形成可执行程序或应用程序。如图1中所示,经完全优化的机器码112可被存储在(诸)计算设备118的存储124中。
调试器工具106可接收经完全优化的机器码112。调试器工具106被配置成在由经完全优化的机器码112表示的应用上运行调试器(或“调试(debug)”、“正调试(debugging)”)会话。在调试器会话中,可使得开发者能够单步调试经完全优化的机器码112的代码的执行,同时查看经完全优化的机器码112的执行所生成的变量、数组、属性和/或输出的值(例如,寄存器的内容、GUI等)。以此方式,开发者可以能够测试源代码110或对其纠错(“调试”),基于调试器会话的结果使用内部代码编辑器122和/或代码编辑器102对源代码110进行编辑。源代码110的经修改版本可被编译器104编译并被调试器工具106接收以供进一步调试。调试器工具106可包括执行经完全优化的机器码112的一个或多个物理和/或虚拟的处理器(例如,中央处理单元(CPU))。
如图1中所示,代码编辑器102可包括标记器界面120。标记器界面120是代码编辑器102提供的让开发者标记源代码的界面。特别而言,标记器界面120可被配置成使得用户能够标记源代码110的要对其禁用经优化的编译的部分。在一实施例中,标记器界面120被配置成使得用户能够标记源代码以在源代码110中逐个函数地禁用经优化的编译。
标记器界面120可以是包括任何数量的用户界面元素的任何类型的用户界面,包括图形用户界面、触摸界面、语音控制界面、触觉界面、姿势界面等。在一实施例中,开发者可与标记器界面120交互来标记要对其禁用经优化的编译的函数。例如,标记器界面120可针对代码编辑器102所显示的源代码的函数显示诸如复选框、切换开关、按键、下拉菜单、或另一用户界面元素等用户界面元素。开发者可与用户界面元素交互来选择要在无优化的情况下进行编译的函数。
如此,源代码编辑器102可生成经标记的源代码114,其为源代码110的经标记版本,具有要对其禁用经优化的编译的一个或多个函数的指示。例如,评论、标签、专门的字符、属性、和/或其它标记可在经标记的源代码114中被插入和/或修改以指示该一个或多个被标记的函数。每个被标记的函数可在经标记的源代码114中单独标记,指示所有被标记函数的表格可在经标记的源代码114的头部或其它位置中维护,和/或被标记函数可以其它方式在经标记的源代码114中被指示。
编译器104被配置成接收并编译经标记的源代码114以生成经部分优化的机器码116。经部分优化的机器码116是经标记的源代码114的经部分优化编译表示,其具有与经标记的源代码114的被标记函数相对应的未经优化部分以及经完全优化的其余部分。编译器104可使用任何适当的编译技术以此方式编译经标记的源代码114,包括如本文所述的增量式编译。
如图1所示,编译器104包括增量式编译启用器108。增量式编译启用器108使得编译器104能够执行增量式编译,这是源代码的各部分(例如,被标记的部分、受对被标记部分修改影响的部分等)的编译,而非源代码的完全编译(这可花费显著更长时间)。
增量式编译启用器108使得编译器104能够比源代码110被原始编译以生成机器码112更快地将经标记的源代码114编译为机器码。这是因为,仅源代码114的被标记函数以及受被标记函数影响的任何其它函数被重新编译且被包括在经部分优化的机器码116中。经标记的源代码114的与被标记的函数无关的函数不需要被重新编译。相反,(经完全优化的机器码112中的)这些不相关函数的经优化的经编译版本可在经部分优化的机器码116中被使用。这导致从经标记的源代码114更快地生成经部分优化的机器码116。更快的编译增强了开发者生产力,因为更少的时间被花在开发者等待其代码编译上。
调试器工具106可接收经部分编译的机器码116。调试器工具106被配置成执行经部分优化的机器码116以在经部分优化的机器码116所表示的应用上运行调试器会话。对于经部分优化的机器码116的未被优化的部分,开发者具有增强的调试会话,其中开发者更容易地将经部分优化的机器码116中的指令与经标记的源代码114中的指令互相关。
作为对经部分优化的机器码116执行的调试会话的结果,开发者可决定编辑经标记的源代码114。相应地,开发者可与代码编辑器102交互来生成经修改的经标记的源代码126。开发者可以对经标记的源代码114中的变量和/或函数作出任何数量的修改以生成经修改的经标记的源代码126。编译器104可接收经修改的经标记的源代码126以进行编译,以生成经修改的经部分优化的机器码128。按照与上面描述的类似的方式,增量式编译启用器108可使得编译器104能够以更高效的方式将经修改的经标记的源代码126编译为经修改的经部分优化的机器码128。这是因为,仅有经修改的经标记的源代码126的被编辑的函数以及受经标记的函数影响的任何其它函数可被重新编译且被用于经修改的经部分优化的机器码128中。经修改的经标记的源代码126的与经标记的函数不相关的函数不需要被重新编译,且其经编译版本可从经部分优化的机器码116中被使用。
B.用于标记代码以及增量式编译被标记代码的进一步示例实施例
图1的开发系统100可允许按各种方式标记代码,以及按部分优化方式编译代码来增强代码的调试。例如,在一实施例中,开发系统100可根据图2来操作。图2示出了根据一示例实施例的提供禁用源代码的一部分的经优化编译以及编译该源代码的过程的流程图200。以下参考图1描述流程图200。基于以下描述,其他结构及操作的实施例对于相关邻域的技术人员将是显而易见的。
流程图200开始于步骤202。在步骤202中,提供被配置成使得用户能够标记源代码的要对其禁用经优化的编译的一部分的界面。如上面参考图1中所描述的,代码编辑器102可包括标记器界面120。标记器界面120是代码编辑器102提供的让开发者标记源代码的界面。特别而言,标记器界面120可被配置成使得用户能够标记源代码110的要禁用经优化的编译的部分。在一实施例中,标记器界面120被配置成使得用户能够标记源代码以在源代码110中逐个函数地禁用经优化的编译。如上所述,标记器界面120可被用来标记源代码110来生成经标记的源代码114。
在步骤204,源代码的经标记的版本的经部分优化编译的表示在至少针对经标记的源代码的被标记部分禁用优化以及针对其它部分启用优化的情况下被构建。在一实施例中,编译器104被配置成接收并编译经标记的源代码114以生成经部分优化的机器码116。经部分优化的机器码116是经标记的源代码114的经部分优化的经编译表示,其具有与经标记的源代码114的被标记函数相对应的未经优化部分以及经完全优化的其余部分。例如,编译器104可包括增量式编译启用器108,以使得能够执行增量式编译,其中源代码的各部分(例如,被标记的部分、受对其修改影响的部分等)被重新编译,而非源代码的完全编译(这可花费显著更长时间)。编译器104可将经重新编译的部分插入到经完全优化的机器码112中(取代被标记部分的经优化的机器码版本)以生成经部分优化的机器码116。
注意,经部分优化的机器码116可在调试器会话已在经完全优化的机器码112上被发起之后被生成,或者在无需调试器会话完全在经完全优化的机器码112上被发起的情况下被生成。例如,在一实施例中,编译器104可基于源代码110生成经完全优化的机器码112,调试器工具106可接收经完全优化的机器码112以开始调试会话,开发者在调试会话期间可编辑源代码110以生成经标记的源代码114,且经部分优化的机器码116随后可由编译器104根据经标记的源代码114和经完全优化的机器码112生成。替换地,在另一实施例中,开发者可在开始调试会话之前编辑源代码110以生成经标记的源代码114,编译器104可生成经完全优化的机器码112,且随后根据经标记的源代码114和经完全优化的机器码112生成经部分优化的机器码116,且调试器会话可由调试器工具106对经部分优化的机器码116发起。
在实施例中,编译器104可按各种方式被配置,且步骤204可按各种方式被执行。例如,图3示出了根据一示例实施例的提供用于编译源代码的过程的流程图300,其中源代码的某些函数的经优化编译被禁用。图3的流程图300是图2的步骤204的示例。此外,图4示出了根据一示例实施例的配置成执行源代码的完全且增量式编译的编译器400的框图。图4的编译器400是图1的编译器104的示例。如图4所示,编译器400通信耦合到存储402。此外,如图4所示,编译器400包括编译器前端404和编译器后端406。编译器后端406包括编译模块408和增量式编译启用器410。增量式编译启用器410是图1的增量式编译启用器108的示例。增量式编译启用器410包括经标记/编辑代码确定器412、受影响函数确定器414以及代码汇编器416。编译模块408包括代码分析器436。
出于说明的目的,参考流程图300来描述编译器400。基于以下有关流程图300和编译器400的描述,其他结构及操作的实施例对于相关领域的技术人员将是显而易见的。注意,流程图300的步骤不一定必须按所示次序发生,因为所示次序是为易于说明来提供的而非出于限制原因。
图3的流程图300以步骤302开始。在步骤302,对于源代码的整体构建启用了优化的源代码的经完全优化的经编译的表示。例如,参考图4,编译器前端404可接收源代码110。源代码110包含以编程语言(诸如高级编程语言(例如,C、C++、Java,等等))编写的程序代码。编译器前端404被配置成生成接收到的源代码(诸如源代码110)的中间语言(IL)表示418。编译器前端404可另外执行可任选功能,诸如验证句法和语法、执行类型检查、剔除注释等以生成IL表示418。
编译器前端404所生成的IL表示418是源代码110的包括相对于用于源代码110的高级编程语言的代码改进变换的IL版本。源代码110可由编译器前端404转换成任何合适的中间语言,包括C、的公共中间语言(CIL),等等。相应地,编译器前端404可按任何方式来配置以将源代码110转换成IL表示418,如相关领域技术人员已知的。
此外,如在图4中所示,编译器后端406接收IL表示418。编译器后端406被配置成执行接收到的IL代码的全编译以及接收到的IL代码的增量式编译。例如,关于IL表示418,编译器后端406使用编译模块408来执行全编译。具体而言,编译模块408接收IL表示418,并且被配置成在优化情况下将IL表示418的代码编译成经完全编译的机器码112。通过在本文别处描述或以其它方式已知的任何数量的优化,编译模块408可被配置成按任何方式将被接收的IL代码编译为经编译的机器码。经完全编译的机器码112可被包括在文件(例如,目标文件)中,或者可以按另一形式来被创建/存储以形成可由一个或多个处理器执行的可执行程序或应用程序。而且,图1的调试器工具106可接收并调试经完全编译的机器码112。
如图4所示,IL表示418和经完全编译的机器码112可被存储在存储402中。表402是图1的存储124的示例。存储402可包括用于存储数据的任何类型的存储介质/设备中的一个或多个,包括磁盘(例如,在硬盘驱动器中)、光盘(例如,在光盘驱动器中)、磁带(例如,在磁带驱动器中)、诸如RAM设备、ROM设备等的存储器设备、和/或任何其他合适类型的存储介质/设备。注意,IL表示418可任选地存储在存储402中。
在一实施例中,编译器后端406可被配置成生成关于源代码110的可被用于帮助增量式编译的信息。例如,步骤302可包括图5中示出的步骤502。在步骤502,生成增量式程序数据库,其至少指示源代码的经完全优化的经编译表示的函数间的依存关系。例如,步骤502可由代码分析器436执行。代码分析器436被配置成分析IL表示418来确定IL表示418的(以及由此确定源代码110的)受改变的函数和/或变量影响的函数。如在图4中所示,IPDB(增量式程序数据库)422可由代码分析器436生成。代码分析器436可以生成IPDB422以包括按本文描述的任何方式从IL表示418中确定的函数属性和变量属性。如图4所示,IPDB 422可被存储在存储402中(例如,以一个或多个文件、数据库和/或任何其他数据结构的形式)。
例如,IL表示418的属性可由代码分析器436确定并被存储在IPDB 422中。IL表示418的可被确定的属性的示例包括被认为所声明(“源”)函数属性和计算得到的函数属性的函数属性。所声明的属性是源代码110中存在的属性,并且所声明的函数属性的示例包括dllimport、dllexport、数个形式参数,等等。可被计算得到的函数属性的示例包括每一函数的校验和、函数是否可抛出任何异常的指示,等等。另外,可为变量确定所声明的属性和/或计算得到的属性并将其存储在IPDB 422中。计算得到的变量属性的示例是在执行函数时变量是否总是具有常数值的指示。IL表示418的属性的确定的进一步示例在本文别处被描述。
注意,尽管代码分析器436在图4中被示为被包括在(编译模块408中的)编译器后端406中,然而在替换实施例中,代码分析器436可被包括在编译器前段404中。
回头参考图3,在步骤304,源代码的要在禁用优化的情况下被重新编译的一个或多个函数被至少基于被标记的部分确定。如上面参考图1所述,开发者可与源代码编辑器102的标记器界面120交互以标记源代码110的一个或多个函数以使得被标记的函数不在进行优化的情况下被编译。经标记的源代码114包括被标记的函数。参考图4,编译器前端404可接收经标记的源代码114。编译器前端404被配置成生成被标记的源代码114的中间语言(IL)表示424。经标记/编辑代码确定器412接收经标记的源代码114。经标记/编辑代码确定器412被配置成确定在IL表示424中的(或直接地,在经标记的源代码114中的)被标记的函数。例如,经标记/编辑代码确定器412可被配置成在IL表示424(或经标记的源代码114)中解析出指示被标记的函数的评论、标签、专门的字符、被标记函数的表格等。被确定的被标记的函数将在不进行优化的情况下被编译模块408编译。如图4中所示,被标记/编辑的代码确定器412输出被标记的函数440,该函数指示被确定的被标记的函数。
而且,被标记的源代码114的受被标记的函数影响的函数被确定,以使得这些受影响的函数也在不被优化的情况下被编译模块408编译。这些受影响的函数可以按各种方式确定。
例如,图6示出了根据一示例实施例的提供用于使用依存关系图来确定要在优化被禁用的情况下被编译的函数的过程的流程图600。在一实施例中,流程图600可由图4的编译器400来执行。基于以下有关流程图600的讨论,其他结构及操作的实施例对于相关领域的技术人员将是显而易见的。注意,流程图600的步骤不一定必须以所示次序发生。
图6的流程图600以步骤602开始。在步骤602中,基于增量式程序数据库生成源代码的依存关系图。例如,图7示出了根据一示例实施例的代码分析器436的框图。如图7所示,代码分析器436包括依存关系图生成器702。依存关系图生成器702被配置成基于包括表示源代码110的函数和变量之间的依存关系的数据的IPDB 422生成依存关系图704。这些依存关系可被遍历以确定受经标记的源代码114中存在的被标记的函数影响的其他函数。依存关系图704可被存储在IPDB 422(例如,存储402中)或别处。依存关系图704可在任何时间被生成,包括在源代码110被编译和/或IPDB 422被生成(例如,在图5的步骤502期间)的时间或在另一时间。
依存关系图生成器702可按任何方式操作以执行其功能。例如,图9示出了根据一示例实施例的提供用于生成依存关系图的过程的流程图900。在一实施例中,依存关系图生成器702可根据流程图900来操作。出于说明的目的,参考流程图900来描述依存关系图生成器702。基于以下有关流程图900和依存关系图生成器702的讨论,其他结构及操作的实施例对于相关领域的技术人员将是显而易见的。注意,流程图900的步骤不一定必须以所示次序发生。
图9的流程图900以步骤902开始。在步骤902,节点与源代码的每一变量且与每一函数相关联以指定多个节点。在一实施例中,依存关系图生成器702解析IL表示418以寻找所有函数。依存关系图生成器702可以按任何方式标识IL表示418中的函数,包括通过标识函数的声明(例如,伴有“()”的函数名)、标识函数的主体(例如,封闭在括号“{”、“}”之间)、和/或通过标识函数的其他部分。依存关系图生成器702还可以按任何方式标识IL表示418中的全局变量,包括通过标识全局变量的声明(例如,“extern int globalvariable=1;”),等等。依存关系图生成器702被配置成至少使用依存关系图704中的对应节点(例如,带有节点标识符)来标识每一函数和每一变量。
例如,依存关系图704中的每个节点可与从IPDB 422得到的一个或多个属性(诸如名称、模块标识符以及符号索引)相关联。依存关系图704中的函数节点可进一步包括校验和、所采取的地址、元组计数、Dllimport(DLL导入)、函数签名、noexcept(无例外)、nothrow(无抛出)、dead catch(死捕捉)信息等的属性中的一个或多个。依存关系图704中的变量节点可进一步包括常数、只读、易失性、所采用的地址、大小、dllimport(dll导入)等的属性中的一个或多个。
在步骤904,确定第一有向边集合,第一集合的每一有向边从依存关系图的第一函数节点延伸到第二函数节点,以指示与第一函数节点相关联的函数的变化影响与第二函数节点相关联的函数。在一实施例中,依存关系图生成器702分析IL表示418以确定各函数之间的依存关系。例如,依存关系图生成器702可以确定第一函数(被调用函数)何时被第二函数(调用者函数)调用,使得第一函数中的变化影响第二函数。因而,依存关系图生成器702可被配置成解析IL表示418中每一函数的结构以确定该函数调用的其他函数(如果有的话)。依存关系图生成器702被配置成将每一函数调用标识成依存关系图704中的“有向边”(例如,带有边标识符)。每一有向边标识第一函数节点和第二函数节点,以指示与第二函数节点相关联的函数依赖于(例如,调用)与第一函数节点相关联的函数。而且,函数之间的有向边可指示函数间的依存关系的类型(例如,从第一函数节点到第二函数节点的内联边,其中与第二函数节点相关联的函数将该函数与该第一函数节点内联等)。
在步骤906,确定第二有向边集合,第二集合的每一有向边从依存关系图的变量节点延伸到第三函数节点,以指示与该变量节点相关联的变量的变化影响与第三函数节点相关联的函数。在一实施例中,依存关系图生成器702分析IL表示418以确定各变量和函数之间的依存关系。例如,依存关系图生成器702可以确定函数何时使用一变量,使得该变量中的改变(例如,对变量属性的改变)影响该函数。因而,依存关系图生成器702可被配置成解析IL表示418中每一函数的结构以确定该函数使用的各变量(如果有的话)。依存关系图生成器702被配置成将每一变量-函数关系标识成依存关系图704中的“有向边”(例如,带有边标识符)。每一有向边标识变量节点和函数节点,以指示与函数节点相关联的函数依赖于(例如,使用)与变量节点相关联的变量。
在步骤908,存储包括该多个节点、第一有向边集合以及第二有向边集合的依存关系图。如图7所示,依存关系图生成器702输出依存关系图704。依存关系图704可被存储在存储402中的IPDB 422中,如图4所示。
注意,依存关系图生成器702可以在任何时刻生成依存关系图704,包括在IL表示418被编译模块408编译成经完全编译的机器码112的时刻、生成IL表示424之前的时刻、或生成IL表示424之后的时刻。
出于解说的目的,图10示出根据一实施例的示例性依存关系图1000的一部分的图形表示。如图10所示,依存关系图1000包括节点和有向边,包括函数节点 1002a-1002c、变量节点 1004a-1004c以及有向边 1006a-1006c和1008a-1008e。函数节点1002-1002c中的每一者与IL表示418中包括的函数F1-F3中的对应一者相关联。变量节点1004-1004c中的每一者与IL表示418中包括的变量V1-V3中的对应一者相关联。函数节点1002-1002c以及变量节点1004-1004c可由依存关系图生成器702在流程图900的步骤902中标识。出于简明的目的,三个函数和三个变量在图10中示出,并且可存在更多数目的函数和变量(如虚线有向边1006c和1008e所指示的)。
此外,有向边1006a-1006c中的每一者从第一函数节点延伸到第二函数节点。例如,有向边1006a从函数节点1002a延伸到函数节点1002b,从而指示与函数节点1002a相关联的函数F1中的变化影响与函数节点1002b相关联的函数F2(F2依赖于F1)。有向边1006a-1006c可由依存关系图生成器702在流程图900的步骤904中标识。
有向边1008a-1008e中的每一者从变量节点延伸到函数节点。例如,有向边1008a从变量节点1004a延伸到函数节点1002a,从而指示与变量节点1004a相关联的变量V1的变化影响与函数节点1002a相关联的函数F1(F1依赖于V1)。有向边1008a-1008e可由依存关系图生成器702在流程图900的步骤906中标识。
回头参考图6,在步骤604,依存关系图被从被标记部分中所包括的任何函数和任何变量遍历以确定受影响函数的集合。在一实施例中,受影响函数确定器414被配置成确定源代码110中存在的受经标记的源代码114中的被标记函数440影响的函数的集合。受影响函数确定器414可以按任何方式作出这一确定。
例如,图8示出了根据一示例实施例的受影响函数确定器414的框图。如图8所示,受影响函数确定器414包括依存关系图分析器802。依存关系图分析器802被配置成分析依存关系图704来确定受被标记函数440影响的函数。
依存关系图分析器802可按任何方式操作以执行其功能。例如,图11示出了根据一示例实施例的提供用于分析依存关系图的过程的流程图1100。在一实施例中,依存关系图分析器802可根据流程图1100来操作。出于说明的目的,参考流程图1100来描述依存关系图分析器802。基于以下有关流程图1100和依存关系图分析器802的讨论,其他结构及操作的实施例对于相关领域的技术人员将是显而易见的。
图11的流程图1100以步骤1102开始。在步骤1102,从被标记部分中的每一函数的节点来遍历第一有向边集合中的有向边以确定第一受影响函数。在一实施例中,对于被标记函数440中指示的每一被标记函数,依存关系图分析器802被配置成找出依存关系图704中的对应函数节点。依存关系图分析器802从该函数节点遍历依存关系图704中指示的任何有向边以确定任何(从属)函数节点。这些从属函数节点在第一受影响函数集合中指示。
例如,参考图10,如果函数F1为被标记函数,则依存关系图分析器802标识并遍历分别到函数节点1002b和1002c的有向边1006a和1006b,以确定函数F2和F3依赖于函数F1。函数F2和F3因此被包括在第一受影响函数中。
回头参考图11,步骤1104不针对基于经标记的源代码确定受影响函数来执行。
回头参考图6,在步骤606,被标记部分中的任何函数和所确定的受影响函数集合中的任何函数被包括在要在禁用优化的情况下被重新编译的函数的集合中。如图8所示,依存关系图分析器802生成受影响函数集合430。受影响函数集合430包括在步骤1102中由依存关系图分析器802确定的第一受影响函数。图4还示出由受影响函数确定器414输出的第二函数集合430。如图4中所示,编译模块408接收被标记函数440和受影响函数430,其包括要在禁用优化的情况下被重新编译的函数的集合。
回头参考图3,在步骤306,所确定的一个或多个函数在禁用优化的情况下被重新编译。如图4中所示,编译模块408接收被标记函数440和受影响函数430。编译模块408被配置成在禁用优化的情况下编译被标记函数440和受影响函数430集合中包括的函数以生成经编译的函数432。编译模块408可被配置成以任何方式来编译被标记函数440和受影响函数430集合,包括根据本文其他部分描述的技术或其他已知技术。
注意,在一实施例中,代码分析器436可被配置成以与上面关于(图5的)步骤502针对IL表示418所描述的类似的方式生成被标记的源代码114的IL表示424的IPDB 422。针对经标记的源代码114的IL表示424生成的IPDB 422可被维持在存储器438中、存储402中、或别处。
在步骤308,被重新编译的一个或多个函数被打补丁到源代码的经完全优化编译的表示中以生成经部分优化编译的表示。如图4中所示,增量式编译启用器410的代码汇编器416接收经完全编译的机器码112和经编译函数432。代码汇编器416被配置成将经编译函数432插入到经完全编译的机器码112中以生成经部分优化编译的机器码116。特别而言,代码汇编器416可被配置成将经编译函数432插入到经完全编译的机器码112中取代被标记函数440中指示的函数(被开发者标记为不进行优化的函数)和第二函数集合430(受被标记函数影响的函数)。以此方式,经部分优化的机器码116被生成为经标记的源代码114的经部分编译的表示,而无需整体重编译经修改源代码114。
注意,在一实施例中,经部分优化的机器码116可被存储在存储器438(例如,存储器设备中的高速缓存存储器、或其它短期存储器)中且随后被用于如本文所述的调试操作。以此方式,在调试操作完成时,经部分优化的机器码116不被维持,且相反,经完全优化的机器码112被维持以供后续在需要时被用作应用。
C.用于在调试会话期间增量式编译经标记代码的进一步示例实施例
图1的开发系统100可启用经标记的源代码的调试,以及经标记的源代码的编辑和重新编译,以按各种方式增强源代码的调试。例如,在一实施例中,开发系统100可根据图12来操作。图12示出了根据一示例实施例的提供用于在调试会话期间执行源代码的增量式编译的过程的流程图1200。以下参考图1和4描述流程图1200。基于以下描述,其他结构及操作的实施例对于相关邻域的技术人员将是显而易见的。
流程图1200开始于步骤1202。在步骤1202,在经部分优化编译的表示上执行调试器会话。如上所述,图1的调试器工具106可接收经部分优化的机器码116。调试器工具106被配置成在经部分优化的机器码116上运行调试器会话。对于经部分优化的机器码116的未被优化的部分,开发者具有增强的调试会话,其中开发者更容易地将经部分优化的机器码116中的指令与经标记的源代码114中的指令互相关。
在步骤1204,在调试器会话期间对被标记部分中的函数的至少一个编辑被接收。如上所述,作为对经部分优化的机器码116执行的调试会话的结果,开发者可决定编辑经标记的源代码114。相应地,开发者可与代码编辑器102交互来生成经修改的经标记的源代码126。经修改的经标记的源代码126可包括对被标记(以禁用编译器优化)的一个或多个函数所做的编辑,和/或可包括对未被标记(并且因此启用编译器优化)的一个或多个函数所做的编辑。
在步骤1206,由于所接收的至少一个编辑,确定要在禁用优化的情况下被重新编译的源代码的经标记版本的函数集合。在一实施例中,由于相对于经标记的源代码114在经修改的经标记的源代码126中所做的编辑,图1的编译器104可确定要在禁用优化的情况下被重新编译的经标记的源代码114的被标记函数的集合。而且,图1的编译器104可确定经标记的源代码114中要在进行优化的情况下被重新编译的未标记函数的集合。例如,参考图4,增量式编译启用器406可被配置成确定要在禁用优化的情况下被重新编译的函数的集合和/或要在启用优化的情况下被重新编译的函数的集合。增量式编译启用器406可确定要以任何方式被重新编译的函数。
例如,参考图4,编译器前端404可接收经修改的经标记的源代码126。编译器前端404被配置成生成经修改的经标记的源代码126的IL表示424。编译器后端406接收IL表示424。增量式编译启用器406被配置成分析IL表示424来确定经标记的源代码114中要在禁用编译的情况下被重新编译的函数的集合。
例如,如图4所示,增量式编译启用器410的经标记/编辑代码确定器412可以接收经修订IL表示424。经标记/编辑代码确定器412被配置成确定经修订IL表示424中存在的相对于经修改的经标记源代码126的IL表示的改变,这指示开发者在经修改的经标记源代码126中所做的改变。具体而言,经标记/编辑代码确定器412可被配置成确定经修订IL表示424中的经修改变量和/或函数。
例如,图13示出了根据一示例实施例的经标记/编辑代码确定器412的框图。如图13所示,经标记/编辑代码确定器412包括经改变函数确定器1302和经改变变量确定器1304。经改变函数确定器1302被配置成将根据经修改源代码生成的IL代码的属性与根据(修改前)源代码生成的IL代码的属性相比较以确定在经修改源代码中改变的任何函数。经改变变量确定器1304被配置成将根据经修改源代码生成的IL代码的属性与根据(修改前)源代码生成的IL代码的属性相比较以确定在经修改源代码中改变的任何变量。取决于要搜索对函数、对变量还是对函数和变量两者的改变,经改变函数确定器1302和经改变变量确定器1304中的一者或两者可存在于各实施例中。
经改变函数确定器1302可按任何方式检测经改变的函数。例如,图14示出了根据一示例实施例的提供用于检测在源代码中被修改的函数的过程的流程图1400。在一实施例中,经改变函数确定器1302可根据流程图1400来操作。基于以下有关流程图1400的讨论,其他结构及操作的实施例对于相关领域的技术人员将是显而易见的。注意,流程图1400的步骤不一定必须以图14中所示的次序发生。
图14的流程图1400以步骤1402开始。在步骤1402,第一校验和集合被从增量式程序数据库确定,该增量式程序数据库包括针对源代码的经标记版本的中间语言版本中的每个函数计算的校验和。例如,如图13中所示,经改变函数确定器1302可被配置成根据针对经标记的源代码114存储的IPDB确定校验和,并将该校验和包括在第一集合中。在一实施例中,校验和被代码分析器436确定并被存储在针对经标记的源代码114的IPDB中,如本文别处所述的。
在步骤1404,确定包括为经修订中间语言表示中的每一函数所计算的校验和的第二校验和集合。如图13中所示,经改变函数确定器1302接收经修订IL表示424,其为经修改的经标记源代码126的IL表示。经改变函数确定器1302被配置成确定经修订IL表示424中的每一函数的校验和,并将这些校验和包括在第二集合中。另选地,校验和可由编译器前端404、代码分析器436或其他部分来确定。第二校验和集合可以按任何方式来被维护。
注意,校验和可按任何方式在步骤1402和1404中被确定。例如,在一实施例中,可通过计算函数的每一元组的校验并按任何方式来组合这些校验和(例如,通过相加,等等)来确定函数的校验和。可基于每一源和目的地元组的校验和以及指令操作码本身来计算指令元组的校验和。在其它实施例中,可按其它方式针对函数确定校验和。
在步骤1406,将第一校验和集合与第二校验和集合进行比较来确定在被编辑的源代码中被改变的至少一个函数。在一实施例中,经改变函数确定器1302被配置成将第一校验和集合与第二校验和集合相比较。如果任何函数被修改或删除,和/或任何新函数被添加(在相对于经标记的源代码114的经修改的经标记的源代码126中),则这些差异将在第一和第二校验和集合的比较中得到反映。
例如,如果函数被修改(例如,其源已被编辑的函数,等等),则其在第二集合中的校验和相对于第一集合将是不同的。这将指示经修改的函数。如果函数被删除,则该函数的校验和将存在于第一集合中,但不存在于第二集合中。如果函数被添加,则该函数的校验和将不存在于第一集合中,但将存在于第二集合中。因此,通过比较第一和第二集合的校验和,经改变函数确定器1302可以确定任何函数变化(修改、删除、添加)。被确定改变的函数在图4和13中所示的第一函数集合426中指示,被包括在(图3)流程图300的步骤308中确定的第一函数集合中。
经改变变量确定器1304可按任何方式检测经改变的变量。例如,图15示出了根据一示例实施例的用于检测在源代码中被修改的变量的步骤1502。在步骤1502,将所存储的增量式程序数据库的变量和相关联的属性与经修订中间语言表示的变量和相关联的属性相比较以确定任何经改变的变量。例如,如在图13中所示,经改变变量确定器1304接收与经标记源代码114相关联的IPDB 422和从经修改的经标记源代码126生成的经修订IL表示424。经改变变量确定器1304被配置成将IPDB中指示的任何被声明的变量与经修订IL表示424中声明的任何变量进行比较来确定任何被改变的变量。例如,如果任何变量被修改或删除,和/或任何新函数被添加(在相对于经标记源代码114的经修改的经标记源代码126中),则这些差异将在IPDB和经修订IL表示424的变量的比较中得到反映。
例如,如果变量被修改(例如,变量的所声明或所计算的属性的值被改变,新属性被添加到变量,属性被从变量移除,等等),当在IPDB和经修订IL表示424之间比较变量时,这一差异是明显的。这将指示经修改的变量。如果变量被删除,则该变量将存在于IPDB中但不存在于经修订IL表示424中。如果变量被添加,则该变量将不存在于IPDB中,但将存在于经修订IL表示424中。相应地,通过比较IPDB和经修订IL表示424的变量,经改变变量确定器1304可确定任何变量改变。被确定为已改变的变量在图4和13中所示的经改变变量428中指示。
注意,在步骤1502中分析的变量可以是全局变量。全局变量是具有全局作用域的变量,使得它在整个源代码是可见的(因此是可访问的),甚至在源代码包括多个链接文件时。在这样的情形下,全局变量具有贯穿源代码(例如,经标记源代码114或经修改的经标记源代码126)的相同结构(例如,相同属性)和值。
如此,在步骤1406中确定的函数和在步骤1502中被确定已经改变的变量可影响经修改的经标记源代码126中的其它函数,这些其它函数因此也必须被重新编译。相应地,图6中的流程图600可被执行来确定受影响函数集合。图6的流程图600如下关于经修改的经标记的源代码126被描述。
在流程图600的步骤602中,依存关系图可基于针对经标记源代码114(例如如上所述的)存储的增量式程序数据库针对经标记源代码114生成。依存关系图可由依存关系图生成器702(图7)根据流程图900(图9)或以另一方式针对经标记源代码114生成。
在流程图600的步骤604,依存关系图被从如在第一函数集合426和经改变变量428中被指示为改变的任何函数和任何变量开始遍历,以确定受影响函数集合。依存关系图可被图8的依存关系图分析器802根据图11的流程图1100来遍历,包括执行步骤1102来从第一函数集合426的函数的节点开始遍历有向边以确定第一受影响函数,以及执行步骤1104来从经改变的变量428的变量的节点开始遍历有向边以确定第二受影响函数。如图8所示,依存关系图分析器802生成第二函数集合430。第二函数集合430包括由依存关系图分析器802在步骤1102确定的第一受影响函数,并且包括由依存关系图分析器802在步骤1104确定的第二受影响函数。图4示出由受影响函数确定器414输出的第二函数集合430。
在流程图600的步骤606,被确定为已改变的函数和所确定的受影响函数集合中的任何函数被包括在要在禁用优化的情况下被重新编译的函数的集合中。如图4所示,编译模块408接收第一函数集合426和受影响函数430,其包括要被重新编译的函数的集合。第一函数集合426和受影响函数430中的作为被标记函数的函数在禁用优化的情况下被重新编译。第一函数集合426和受影响函数430中的没有作为被标记函数的函数在启用优化的情况下被重新编译。
在步骤1208,所确定的函数集合在禁用优化的情况下被重新编译。如图4所示,编译模块408接收第一函数集合426和受影响函数430,其包括要被重新编译的函数的集合。第一函数集合426和受影响函数430中的作为被标记函数的函数由编译模块408在禁用优化的情况下被重新编译。第一函数集合426和受影响函数430中的没有作为被标记函数的函数由编译模块408在启用优化的情况下被重新编译。编译模块408生成经编译函数432,其包括第一函数集合426和受影响函数430的经重新编译版本。
在步骤1210,经重新编译函数集合被打补丁到源代码的经标记版本的经部分优化编译的表示中以生成经部分优化编译的表示的经修订版本。如图4所示,增量式编译启用器410的代码汇编器416接收经部分编译的机器码116(例如来自存储器438)和经编译函数432。代码汇编器416被配置成将经编译函数432插入到经部分编译的机器码116中以生成经修改的经部分优化机器码128,其是部分编译的机器码116的经修订版本。具体而言,代码汇编器416可被配置成将经编译函数432插入到经部分编译的机器码116中取代在第一函数集合426和受影响函数430中所指示的函数(受被改变的函数和变量影响的函数)。以此方式,经修改的经部分优化的机器码128被生成为经修改的经标记的源代码126的经部分编译表示,而无需整体重新编译经修改的经标记的源代码126。
在步骤1212,在经部分优化编译的表示的经修订版本上执行调试器会话。注意,在一实施例中,经修改的经部分优化的机器码128可被存储在存储器438中(例如,存储器设备的高速缓存存储器或其它短期存储器)并随后用于如本文所述的调试操作。例如,图1的调试器工具106可接收经修改的经部分优化的机器码128以用于调试器会话,如上所述。以此方式,当调试操作完成时,经修改的经部分优化的机器码128不被维持。
流程图1200可随后被重新执行以供调试和对源代码进行修改的进一步迭代。在此情况下,经修改的经标记的源代码以及在流程图1200的先前迭代中生成的经修改的经修改的经标记的源代码的经部分优化编译的表示(以及相关联的IPDB)可被用于下一次迭代的输入。
C.用于LTCG的增量式编译的示例环境
注意,本文描述的编译器的实施例可被实现在任何类型的编译或构建配置中,它们可以或可以不包括链接器。例如,图16示出根据示例实施例的包括编译器1602和链接器1604的构建系统1600的框图。构建系统1600被配置成执行链接时代码生成(LTCG),也被称为整体程序优化。根据LTCG,以多个分开的源代码文件的形式接收源代码。该多个分开的源代码文件一起形成供编译的整个程序。所有源代码文件被构建系统1600一起编译以形成单个可执行文件。构建系统1600执行LTCG的操作的示例在下文描述。
如图16所示,编译器1602包括编译器前端1606和编译器后端1608。编译器前端1606可以与图4的编译器前端404相似地配置,且编译器后端1608可以与图4的编译器后端406相似地配置,或者它们可根据其他实施例来配置。编译器后端1608包括增量式编译启用器108。在一实施例中,增量式编译启用器108可与图4中所示的增量式编译启用器410相似地配置,或者可根据另一实施例来配置。
源代码110由编译器前端1606以多个源代码文件(例如,“.c”文件、“.cpp”文件,等等)的形式来接收。任何数目的源代码文件可被接收作为源代码110,包括数个、数十、数百、数千等数目的文件。编译器前端1606将每一源代码文件的源代码转换成对应IL表示文件,从而生成多个IL表示文件。IL表示文件由编译器前端1606输出在IL表示418中。编译器后端1608接收IL表示418。编译器后端1608通过命令行开关(例如,“/GL”)、通过分析IL表示文件中的一者或多者中的信息、或以另一方式确定LTCG被调用。由于这一点,编译器后端1608将IL表示文件作为经打包的IL表示文件1610传递给链接器1604(例如,打包在.obj文件中或以其他形式)。
链接器1604接收经打包的IL表示文件1610。基于确定IL代码被包含在经打包的IL表示文件1610的文件中,通过经由命令行开关(例如,“/LTCG”)或以另一方式来调用,链接器1604确定编译器后端1608要被调用以跨所有IL表示文件优化IL代码(而非单独地优化每一IL表示文件)。因此,链接器1604生成调用信号1618,这由编译器后端1608接收。
编译器后端1608接收调用信号1618,并继续进行以将IL表示文件一起编译成单个机器码文件,这由编译器后端1608输出为机器码1620。链接器1604接收机器码1620,并且被配置成生成可执行文件1612,可任选地使用一个或多个LIB(库)文件、DLL(动态链接库)文件,等等。
参考图3的流程图300,IL表示418和机器码1620可被存储在图4的存储402中(步骤304)。另外,IPDB 422可由编译器前端404和/或编译器后端1608(例如,由图4的代码分析器436)生成并被存储在存储402中。
随后,开发者可以修改源代码文件中的一者或多者中的代码。开发者可以调用编译器1602来用于增量式编译(例如,使用命令“-incremental(-递增)”开关,或以其他方式)。经修改源代码文件(包括经修改和未经修改源代码文件)可在图16中作为经修改源代码114来被接收。编译器前端1606可以生成经修订IL表示424,这包括经修改源代码114中的每一源代码文件的IL表示文件。编译器后端1608接收经修订IL表示424中的IL表示文件,并按与以上在经修订经打包IL表示文件1614中描述的相似的方式来将它们传递给链接器1604。链接器1604接收经修订经打包IL表示文件1614,并且作为响应确定编译器后端1608要被调用以跨所有IL表示文件优化IL代码(而非优化每一IL文件),链接器1604生成调用信号1618以使编译器后端1608执行经修订IL表示文件的增量式编译。
因此,编译器后端1608接收调用信号1618,接收经修订IL表示文件,并继续进行以根据图3的流程图300执行增量式编译。如上所述,只有机器码1620的单个机器码文件的经修改和受影响函数被编译。注意,根据上述技术,可确定一个或多个IL表示文件中的经修改函数和/或变量。此外,可确定受经修改函数和/或变量影响的一个或多个函数。受影响函数可存在于与影响它们的经修改函数和/或变量相同的IL表示文件中,或可被包括在不同文件中。例如,第一文件中的变量可影响第二文件中的函数,或者第三文件中的函数可影响第四文件中的函数。因为依存关系图生成器702被配置成基于所有IL表示文件来生成依存关系图704,所以可在任何IL表示文件中找出受影响函数。
经编译函数被插入机器码1620中(代替经修改和受影响经编译函数)以生成经重编译机器码1622。链接器1604接收经重编译机器码1622,并被配置成基于此来生成可执行文件1616。
以此方式,增量式编译的各实施例可被合并在LTCG编译实现中,
D.用于使用内联的增量式编译的示例环境
“被调用者”函数是源代码中的被源代码的另一函数(称为“调用者”函数)调用以被执行的函数。被调用者函数可由任何数目的调用者函数调用任何次数。以此方式,被调用者函数的代码是可重用的且可存在于源代码中一次,而不必被复制在调用者函数中的每一者中。
注意,本文描述的编译器的各实施例可被配置成处理相关于函数“内联”的增量式编译。“内联”是编译器优化,其中在源代码的编译期间,被调用者函数的代码被代入调用者函数的主体(代替该调用)。如此,内联具有益处:调用指令的运行时开销可被避免,因为被调用者函数代码可如同它是调用者函数的一部分那样被执行。另一益处是内联允许更激进的优化,因为优化器(例如,编译器后端)在优化内联调用者的主体时具有调用站专用信息。所以内联可以是影响程序性能的重要优化。内联使用试探法来决定何时内联被调用者。过多内联可造成机器码二进制的大小的大量增加,这可具有负面影响。
在一实施例中,可能需要通过增量式构建(例如,根据本文描述的各实施例重编译源代码的受对源代码的修改的影响的那一部分)从经修改源代码生成的机器码并非不同于通过全构建(从头开始整体重编译经修改源代码)从经修改源代码生成的机器码。这样的无差异结果可促进代码测试,确保用户没有看到增量式构建的机器码二进制的程序性能降级。
可能影响这一无差异优选的增量式编译与内联之间的不合需要的交互的示例在以下示例场景中描述。在全构建中,函数“foo”可调用函数“bar”。编译器的内联模块可因为函数“bar”可能是过大的代码部分(例如,高于用于内联的代码大小阈值限制)而决定不将函数“bar”内联到函数“foo”。所以假定在所生成的依存关系图(如上所述)中没有指示其他依存关系,依存关系图将不包括从“bar”到“foo”的依存关系边。现在,如果对函数“bar”的编辑使得函数“bar”在大小上小得多,并且因此是内联候选(例如,具有低于用于内联的代码大小阈值限制的大小),则通过增量式编译为经修改的源代码生成的机器码将仍然在功能上是正确的,如果没有重编译函数“foo”的话。然而,通过增量式编译(没有内联)生成的用于函数“foo”的机器码将不同于通过全编译生成的机器码(其中函数“bar”的代码将被内联到函数“foo”的代码中)。
如此,为解决这一点,在一实施例中,具有要被重编译的任何被调用者的函数将被部分地重编译。这样的函数的部分编译可以在编译的内联阶段之后执行。可接收在内联之后生成的源代码的IL表示,并且可为具有被重编译的任何被调用者的函数生成第二校验和。第二校验和可以与(在修改之前从IL表示生成的)所存储的内联后校验和的值相比较。如果校验和没有差异,则该函数可如同它不受影响那样被处理。如果校验和存在差异,则继续编译该函数。这使得以小成本(部分编译一些函数的成本)来兼容无差异优选。
III.示例移动和静态设备实施例
计算设备118、开发系统100、源代码编辑器102、编译器104、调试器工具106、增量式编译启用器108、编译器400、编译器前端404、编译器后端406、编译模块408、增量式编译启用器410、经标记/编辑代码确定器412、受影响函数确定器414、代码汇编器416、代码分析器436、经改变函数确定器1302、经改变变量确定器1304、依存关系图生成器702、依存关系图分析器802、编译器1602、链接器1604、编译器前端1606、编译器后端1608、流程图200、流程图300、步骤502、流程图600、流程图900、流程图1100、流程图1200、流程图1400以及步骤1502可以用硬件、或硬件组合软件和/或固件来实现。例如,开发系统100、源代码编辑器102、编译器104、调试器工具106、增量式编译启用器108、编译器400、编译器前端404、编译器后端406、编译模块408、增量式编译启用器410、经标记/编辑代码确定器412、受影响函数确定器414、代码汇编器416、代码分析器436、经改变函数确定器1302、经改变变量确定器1304、依存关系图生成器702、依存关系图分析器802、编译器1602、链接器1604、编译器前端1606、编译器后端1608、流程图200、流程图300、步骤502、流程图600、流程图900、流程图1100、流程图1200、流程图1400和/或步骤1502可被实现为配置成在一个或多个处理器中执行并存储在计算机可读存储介质中的计算机程序代码/指令。另选地,计算设备118、开发系统100、源代码编辑器102、编译器104、调试器工具106、增量式编译启用器108、编译器400、编译器前端404、编译器后端406、编译模块408、增量式编译启用器410、经标记/编辑代码确定器412、受影响函数确定器414、代码汇编器416、代码分析器436、经改变函数确定器1302、经改变变量确定器1304、依存关系图生成器702、依存关系图分析器802、编译器1602、链接器1604、编译器前端1606、编译器后端1608、流程图200、流程图300、步骤502、流程图600、流程图900、流程图1100、流程图1200、流程图1400和/或步骤1502可以被实现为硬件逻辑/电路。
例如,在一实施例中,开发系统100、源代码编辑器102、编译器104、调试器工具106、增量式编译启用器108、编译器400、编译器前端404、编译器后端406、编译模块408、增量式编译启用器410、经标记/编辑代码确定器412、受影响函数确定器414、代码汇编器416、代码分析器436、经改变函数确定器1302、经改变变量确定器1304、依存关系图生成器702、依存关系图分析器802、编译器1602、链接器1604、编译器前端1606、编译器后端1608、流程图200、流程图300、步骤502、流程图600、流程图900、流程图1100、流程图1200、流程图1400和/或步骤1502中的一个或多个、其任意组合可以被一起实现在SoC上。SoC可包括集成电路芯片,其包括处理器(例如中央处理单元(CPU))、微控制器、微处理器、数字信号处理器(DSP等))、存储器、一个或多个通信接口、和/或其它电路中的一个或多个,并可任选地执行被接收的程序代码和/或包括嵌入式固件来执行功能。
图17示出示例性移动设备1700的框图,该示例性移动设备1700包括概括地示为组件1702的各种任选硬件和软件组件。例如,移动设备1700的组件1702是可被包括在移动设备实施例中的计算设备118(图1)内的组件的示例。组件1702的特征/要素的任何数量和组合以及附加和/或替代特征/要素可被包括在移动设备实施例中,如相关领域技术人员所知的。注意,组件1702中的任一组件可与组件1702中的任何其他组件通信,尽管为了便于说明并未示出所有连接。移动设备1700可以是本文中其它地方所述或提及的、或者以其它方式已知的各种移动设备(例如,蜂窝电话、智能电话、手持式计算机、个人数字助理(PDA)等)中的任一种,并且可允许经由诸如蜂窝或卫星网络等一个或多个通信网络1704或通过局域网或广域网进行与一个或多个移动设备的无线双向通信。
所示移动设备1700可包括用于执行诸如信号编码、图像处理、数据处理、输入/输出处理、电源控制、和/或其他功能之类的任务的控制器或处理器(称为处理器电路1710)。处理器电路1710是在一个或多个物理硬件电子电路设备元件和/或作为中央处理单元(CPU)、微控制器、微处理器、和/或其它物理硬件处理电路的集成电路设备(半导体材料芯片或管芯)中实现的电子和/或光学电路。处理器电路1710可执行存储在计算机可读介质中的程序代码,诸如一个或多个应用1714、操作系统1712的程序代码、存储器1720中存储的任何程序代码等。操作系统1712可控制对组件1702的分配和使用,并支持一个或多个应用程序1714(也称为“应用”、“app”等)。应用程序1714可包括公共移动计算应用程序(例如,电子邮件应用程序、日历、联系人管理器、web浏览器、消息接发应用程序)、或任何其他计算应用(例如字处理应用、映射应用、介质播放器应用)。
如所示地,移动设备1700可包括存储器1720。存储器1720可以包括不可移动存储器1722和/或可移动存储器1724。不可移动存储器1722可以包括RAM、ROM、闪存、硬盘或者其他公知的存储器存储技术。可移动存储器1724可以包括闪存或订户身份模块(SIM)卡,这在GSM通信系统或者其他公知的存储器存储技术中是公知的,诸如“智能卡”。存储器1720可用于存储运行操作系统1712和应用1714的数据和/或代码。示例数据可以包括要经由一个或多个有线或无线网络被发送至和/或接收自一个或多个网络服务器或其他设备的网页、文本、图像、声音文件、视频数据或者其他数据集。存储器1720可用于存储诸如国际移动订户身份(IMSI)等订户标识符,以及诸如国际移动设备标识符(IMEI)等设备标识符。这种标识符可以被发射至网络服务器以标识用户和设备。
多个程序可被储存在存储器1720中。这些程序包括操作系统1712、一个或多个应用程序1714、以及其他程序模块以及程序数据。这样的应用程序或程序模块的示例可包括例如用于实现开发系统100、源代码编辑器102、编译器104、调试器工具106、增量式编译启用器108、编译器400、编译器前端404、编译器后端406、编译模块408、增量式编译启用器410、经标记/编辑代码确定器412、受影响函数确定器414、代码汇编器416、代码分析器436、经改变函数确定器1302、经改变变量确定器1304、依存关系图生成器702、依存关系图分析器802、编译器1602、链接器1604、编译器前端1606、编译器后端1608、流程图200、流程图300、步骤502、流程图600、流程图900、流程图1100、流程图1200、流程图1400和/或步骤1502(包括流程图200、300、600、900、1100、1200和1400中的任何适当步骤)和/或本文中描述的进一步实施例的计算机程序逻辑(例如,计算机程序代码或指令)。
移动设备1700可支持诸如触摸屏1732、话筒1734、相机1736、物理键盘1738和/或跟踪球1740之类的一个或多个输入设备1730,以及诸如扬声器1752和显示器1754之类的一个或多个输出设备1750。诸如触摸屏1732等触摸屏可以不同方式检测输入。例如,电容式触摸屏在物体(例如,指尖)使流过表面的电流变形或中断时检测到触摸输入。作为另一示例,触摸屏可使用光学传感器,在来自光学传感器的光束被中断时检测到触摸输入。对于通过某些触摸屏被检测到的输入来说,与屏幕表面的物理接触并不是必需的。例如,如本领域公知地,触摸屏1732可被配置成使用电容感测支持手指悬停检测。如一上已经描述的,也可使用其它检测技术,包括基于相机的检测和基于超声波的检测。为了实现手指悬停,用户的手指通常在触摸屏上方预定间隔距离内,诸如在0.1至0.25英寸之间、或0.25至0.5英寸之间、或0.5至0.75英寸之间、或0.75至1英寸之间、或1至1.5英寸之间等等。
为了说明目的,触摸屏1732被示为包括控制接口1792。控制接口1792被配置成控制与显示在触摸屏1732上的虚拟元件相关联的内容。在一示例实施例中,控制接口1792被配置成控制由一个或多个应用1714提供的内容。例如,当移动设备1700的用户利用应用时,控制接口1792可在触摸屏1732上被呈现给用户以使用户能够访问控制这种内容的控件。控制接口 1792的呈现可基于(例如触发于)距触摸屏1732指定距离内的运动的检测、或者没有此类运动。用于基于运动或没有运动使控制接口(例如控制接口1792)呈现在触摸屏(例如触摸屏1732)上的示例实施例在以下更具体地描述。
其他可能的输出设备(未示出)可以包括压电或其他触觉输出设备。一些设备可以用于多于一个输入/输出功能。例如,触摸屏1732和显示器1754可被组合在单个输入/输出设备中。输入设备1730可以包括自然用户界面(NUI)。NUI是使用户能以“自然”方式与设备交互、免受诸如鼠标、键盘、远程控件等输入设备所施加的人工约束的任一界面技术。NUI方法的示例包括依赖于语音识别、触摸和触笔识别、屏上及邻近屏的姿势识别、空中姿势、头部和眼部跟踪、说话和语音、视觉、触摸、姿势以及机器智能的那些方法。NUI的其他示例包括使用加速度计/陀螺仪、面部识别、3D显示器、头部、眼部和凝视跟踪的运动手势检测、沉浸式增强的现实和虚拟现实系统,这些中的全部都提供更自然的界面,还包括使用电场传感电极(EEG及相关方法)来感测脑部活动的技术。由此,在一特定示例中,操作系统1712或应用1714可包括作为允许用户经由语音命令来操作设备1700的语音控制接口的一部分的语音识别软件。此外,设备1700可包括允许经由用户的空间姿势进行用户交互(诸如检测和解释姿势以向游戏应用提供输入)的输入设备和软件。
(诸)无线调制解调器1760可被耦合到(诸)天线(未示出),并可支持处理器电路1710和外部设备之间的双向通信,如本领域中清楚理解的。(诸)调制解调器1760被一般性地示出,并且可以包括用于与移动通信网络1704通信的蜂窝调制解调器1766和/或其它基于无线电的调制解调器(例如蓝牙1764和/或Wi-Fi 1762)。蜂窝调制解调器1766可被配置成根据任何适当的通信标准或技术(诸如GSM、3G、4G、5G等)实现电话呼叫(以及可任选地传送数据)。无线调制解调器1760的至少之一通常被配置用于与一个或多个蜂窝网络(诸如,用于在单个蜂窝网络内、蜂窝网络之间、或移动设备与公共交换电话网络(PSTN)之间的数据和语音通信的GSM网络)进行通信。
移动设备1700还可包括至少一个输入/输出端口1780、电源1782、诸如全球定位系统(GPS)接收机之类的卫星导航系统接收机1784、加速度计1786、和/或物理连接器1790,该物理连接器1790可以是USB端口、IEEE 1394(火线)端口、和/或RS-232端口。所示的组件1702并非是必需或者涵盖全部的,因为如本邻域技术人员所理解地,任何组件可不存在且附加地其它组件可存在。
此外,图18示出其中可实现各实施例的计算设备1800的示例性实现。例如,计算设备118(图1)可在与静态计算机实施例中的计算设备1800相似的一个或多个计算设备中实现,包括计算设备1800的一个或多个特征和/或替代特征。此处所提供的对计算设备1800的描述只是为了说明,并不是限制性的。各实施例也可以在相关领域的技术人员所知的其它类型的计算机系统中实现。
如图18所示,计算设备1800包括一个或多个处理器(被称为处理器电路1802)、系统存储器1804,以及将包括系统存储器1804的各种系统组件耦合到处理器电路1802的总线1806。处理器电路1802是在一个或多个物理硬件电子电路设备元件和/或作为中央处理单元(CPU)、微控制器、微处理器、和/或其它物理硬件处理电路的集成电路设备(半导体材料芯片或管芯)中实现的电子和/或光学电路。处理器电路1802可执行存储在计算机可读介质中的程序代码,诸如操作系统1830、应用程序1832、其它程序1834等的程序代码。总线1806表示若干类型的总线结构中的任何一种总线结构的一个或多个,包括存储器总线或存储器控制器、外围总线、加速图形端口,以及处理器或使用各种总线体系结构中的任何一种的局部总线。系统存储器1804包括只读存储器(ROM)1808和随机存取存储器(RAM)1810。基本输入/输出系统1812(BIOS)储存在ROM 1808中。
计算设备1800还具有一个或多个以下驱动器:用于读写硬盘的硬盘驱动器1814、用于读或写可移动磁盘1818的磁盘驱动器1816、以及用于读或写诸如CD ROM、DVD ROM或其他光介质之类的可移动光盘1822的光盘驱动器1820。硬盘驱动器1814、磁盘驱动器1816,以及光驱动器1820分别通过硬盘驱动器接口1824、磁盘驱动器接口1826,以及光盘驱动器接口1828连接到总线1806。驱动器以及它们相关联的计算机可读介质为计算机提供了对计算机可读指令、数据结构、程序模块,及其他数据的非易失存储器。虽然描述了硬盘、可移动磁盘和可移动光盘,但是,也可以使用诸如闪存卡、数字视频盘、RAM、ROM等等之类的其他类型的基于硬件的计算机可读存储介质来储存数据。
数个程序模块可被储存在硬盘、磁盘、光盘、ROM或RAM上。这些程序包括操作系统1830、一个或多个应用程序1832、其他程序1834以及程序数据1836。应用程序1832或其它程序1834可包括例如用于实现开发系统100、源代码编辑器102、编译器104、调试器工具106、增量式编译启用器108、编译器400、编译器前端404、编译器后端406、编译模块408、增量式编译启用器410、经标记/编辑代码确定器412、受影响函数确定器414、代码汇编器416、代码分析器436、经改变函数确定器1302、经改变变量确定器1304、依存关系图生成器702、依存关系图分析器802、编译器1602、链接器1604、编译器前端1606、编译器后端1608、流程图200、流程图300、步骤502、流程图600、流程图900、流程图1100、流程图1200、流程图1400和/或步骤1502(包括流程图200、300、600、900、1100、1200和1400中的任何适当步骤)和/或本文中描述的进一步实施例的计算机程序逻辑(例如,计算机程序代码或指令)。
用户可以通过诸如键盘1838和定点设备1840之类的输入设备向计算设备1800中输入命令和信息。其它输入设备(未示出)可包括话筒、控制杆、游戏手柄、卫星天线、扫描仪、触摸屏和/或触摸平板、用于接收语音输入的语音识别系统、用于接收手势输入的手势识别系统、诸如此类。这些及其他输入设备常常通过耦合到总线1806的串行端口接口1842连接到处理电路1802,但是,也可以通过其他接口,诸如并行端口、游戏端口、通用串行总线(USB)端口,来进行连接。
显示屏1844也通过诸如视频适配器1846之类的接口连接到总线1806。显示屏1844可在计算设备1800外部或纳入其中。显示屏1844可显示信息,以及作为用于接收用户命令和/或其它信息(例如,通过触摸、手指姿势、虚拟键盘等等)的用户界面。除了显示屏1844之外,计算设备1800还可包括其他外围输出设备(未示出),如扬声器和打印机。
计算设备1800通过适配器或网络接口1850、调制解调器1852、或用于通过网络建立通信的其他手段连接到网络1848(例如,因特网)。可以是内置的或外置的调制解调器1852可以经由串行端口接口1842连接到总线1806,如图18所示,或者可以使用包括并行接口的另一接口类型连接到总线1806。
如此处所用的,术语“计算机程序介质”、“计算机可读介质”以及“计算机可读存储介质”被用于泛指物理硬件介质,诸如与硬盘驱动器1814相关联的硬盘、可移动磁盘1818、可移动光盘1822、其它物理硬件介质,诸如RAM、ROM、闪存卡、数字视频盘、zip磁盘、MEM、基于纳米的存储设备,以及其它类型的物理/有形硬件存储介质(包括图17的存储器1720)。这些计算机可读存储介质与通信介质(不包括通信介质)相区别且不重叠。通信介质通常在诸如载波等已调制数据信号中承载计算机可读指令、数据结构、程序模块或者其它数据。术语“已调制数据信号”是指使得以在信号中编码信息的方式来设定或改变其一个或多个特征的信号。作为示例而非限制,通信介质包括诸如声学、RF、红外线的无线介质和其它无线介质以及有线介质。实施例也针对这些通信介质。
如上文所指示的,计算机程序和模块(包括应用程序1832及其他程序1834)可被储存在硬盘、磁盘、光盘、ROM、RAM或其它硬件存储介质上。这样的计算机程序也可以通过网络接口1850、串行端口接口1842或任何其他接口类型来接收。这些计算机程序在由应用程序执行或加载时使得计算机1800能够实现此处所讨论的实施例的特征。因此,这些计算机程序表示计算机系统1800的控制器。
各实施例还涉及包括存储在任何计算机可读介质上的计算机代码或指令的计算机程序产品。这样的计算机程序产品包括硬盘驱动、光盘驱动、存储器设备包、便携式记忆棒、存储器卡以及其它类型的物理存储硬件。
IV.示例实施例
在一个实施例中,一种方法包括:提供被配置成使得用户能够标记源代码中要针对其禁用经优化编译的部分以生成所述源代码的经标记版本的界面,所述界面被配置成使得所述用户能够在所述源代码中在逐个函数的基础上禁用经优化编译;以及在至少针对被标记的部分禁用优化以及针对所述源代码的其它部分启用优化的情况下构建所述源代码的经部分优化编译的表示。
在一实施例中,所述构建包括:针对整个源代码在启用优化的情况下构建所述源代码的经完全优化编译的表示;至少基于被标记部分确定所述源代码的要在禁用优化的情况下被重新编译的一个或多个函数;在禁用优化的情况下重新编译所确定的一个或多个函数;以及将经重新编译的一个或多个函数打补丁到所述源代码的所述经完全优化编译的表示中以生成经部分优化编译的表示。
在一实施例中,在针对整个源代码启用优化的情况下构建所述源代码的经完全优化编译的表示包括:生成增量式程序数据库,所述增量式程序数据库至少指示所述源代码的经完全优化编译的表示的函数间的依存关系。
在一实施例中,至少基于被标记部分确定所述源代码的要在禁用优化的情况下被重新编译的一个或多个函数包括:基于所述增量式程序数据库生成所述源代码的依存关系图;从被标记部分中包括的任何函数和任何变量开始遍历所述依存关系图来确定受影响函数集合;并且将被标记部分中的任何函数以及所确定的受影响函数集合中的任何函数包括在要在禁用优化的情况下被重新编译的函数的集合中。
在一实施例中,基于所述增量式程序数据库生成所述源代码的依存关系图包括:将节点与所述源代码的每个变量以及与每个函数相关联以指定多个节点;确定第一有向边集合,所述第一有向边集合中的每个有向边从所述依存关系图的第一函数节点延伸到第二函数节点以指示与所述第一函数节点相关联的函数中的改变影响与所述第二函数节点相关联的函数;确定第二有向边集合,所述第二有向边集合中的每个有向边从所述依存关系图的变量节点延伸到第三函数节点以指示与所述变量节点相关联的变量中的改变影响与所述第三函数节点相关联的函数;以及存储包括所述多个节点、所述第一有向边集合以及所述第二有向边集合的依存关系图。
在一实施例中,关于被标记部分中的任何函数和任何变量遍历所述依存关系图以确定所述一个或多个函数包括:从所述被标记部分中的每个函数的节点遍历所述第一有向边集合中的有向边以确定第一受影响函数;以及从所述被标记部分中的每个变量的节点遍历所述第二有向边集合中的有向边以确定第二受影响函数。所确定的一个或多个函数包括所述第一受影响函数、所述第二受影响函数、以及被标记部分中的任何函数。
在一实施例中,所述方法进一步包括:在所述经部分优化编译的表示上执行调试器会话;在所述调试器会话期间接收对所述被标记部分中的函数的至少一个编辑;确定所述源代码的经标记版本中由于所接收的至少一个编辑而要在禁用优化的情况下被重新编译的函数的集合;在禁用优化的情况下重新编译所确定的函数集合;将经重新编译的函数集合打补丁到所述源代码的经标记版本的经部分优化编译的表示中以生成所述经部分优化编译的表示的经修订版本;以及在所述经部分优化编译的表示的经修订版本上执行所述调试器会话。
在一实施例中,所述方法进一步包括:生成增量式程序数据库,所述增量式程序数据库至少指示所述源代码的经标记版本的经部分优化编译的表示的函数间的依存关系。所述确定所述源代码中由于所接收的至少一个编辑而要在禁用优化的情况下被重新编译的函数的集合包括:从所述增量式程序数据库确定第一校验和集合,所述第一校验和集合包括针对所述经部分优化编译的表示的中间语言版本中的每个函数计算的校验和;确定包括针对经编辑的源代码的中间语言版本中的每个函数计算的校验和的第二校验和集合;以及将所述第一校验和集合与所述第二校验和集合进行比较以确定在经编辑的源代码中改变的至少一个函数。
在另一实施例中,一种系统包括代码编辑器和编译器。所述代码编辑器被配置成提供被配置成使得用户能够标记源代码中要针对其禁用经优化编译的部分以生成所述源代码的经标记版本的界面,所述界面被配置成使得所述用户能够在所述源代码中在逐个函数的基础上禁用经优化编译。所述编译器被配置成在至少针对所述源代码的被标记部分禁用优化以及针对其它部分启用优化的情况下构建所述源代码的经部分优化编译的表示。
在一实施例中,所述编译器被配置成:在针对整个源代码启用优化的情况下构建所述源代码的经完全优化编译的表示;至少基于被标记部分确定所述源代码的要在禁用优化的情况下被重新编译的一个或多个函数;在禁用优化的情况下重新编译所确定的一个或多个函数;以及将经重新编译的一个或多个函数打补丁到所述源代码的所述经完全优化编译的表示中以生成经部分优化编译的表示。
在一实施例中,所述编译器包括代码分析器,所述代码分析器被配置成生成增量式程序数据库,所述增量式程序数据库至少指示所述源代码的经完全优化编译的表示的函数间的依存关系。
在一实施例中,所述代码分析器包括:依存关系图生成器,所述依存关系图生成器被配置成基于所述增量式程序数据库生成所述源代码的依存关系图。在一实施例中,所述编译器进一步包括:受影响函数确定器,所述受影响函数确定器被配置成从被标记部分中包括的任何函数和任何变量遍历所述依存关系图来确定受影响函数集合。被标记部分中的任何函数以及所确定的受影响函数集合中的任何函数被包括在要在禁用优化的情况下被重新编译的函数的集合中。
在一实施例中,依存关系图生成器被配置成:将节点与所述源代码的每个变量以及与每个函数相关联以指定多个节点;确定第一有向边集合,所述第一有向边集合中的每个有向边从所述依存关系图的第一函数节点延伸到第二函数节点以指示与所述第一函数节点相关联的函数中的改变影响与所述第二函数节点相关联的函数;确定第二有向边集合,所述第二有向边集合中的每个有向边从所述依存关系图的变量节点延伸到第三函数节点以指示与所述变量节点相关联的变量中的改变影响与所述第三函数节点相关联的函数;以及存储包括所述多个节点、所述第一有向边集合以及所述第二有向边集合的依存关系图。
在一实施例中,所述受影响函数确定器被配置成:从所述被标记部分中的每个函数的节点遍历所述第一有向边集合中的有向边以确定第一受影响函数;以及从所述被标记部分中的每个变量的节点遍历所述第二有向边集合中的有向边以确定第二受影响函数。所确定的一个或多个函数包括所述第一受影响函数、所述第二受影响函数、以及被标记部分中的任何函数。
在一实施例中,所述系统进一步包括调试器工具,所述调试器工具被配置成在经部分优化编译的表示上执行调试器会话。所述代码编辑器被配置成在所述调试器会话期间接收对所述被标记部分中的函数的至少一个编辑。所述编译器被配置成确定所述源代码的经标记版本中由于所接收的至少一个编辑而要在禁用优化的情况下被重新编译的函数集合,在禁用优化的情况下重新编译所确定的函数集合,以及将经重新编译的函数集合打补丁到所述源代码的经标记版本的经部分优化编译的表示中以生成所述经部分优化编译的表示的经修订版本。所述调试器工具被配置成在所述经部分优化编译的表示的经修订版本上执行所述调试器会话。
在一实施例中,所述编译器包括代码分析器,所述代码分析器被配置成生成增量式程序数据库,所述增量式程序数据库至少指示所述源代码的经标记版本的经部分优化编译的表示的函数间的依存关系。所述编译器被配置成从所述增量式程序数据库接收第一校验和集合,所述第一校验和集合包括针对经部分优化编译的表示的中间语言版本中的每个函数计算的校验和;确定包括针对经编辑的源代码的中间语言版本中的每个函数计算的校验和的第二校验和集合;以及将所述第一校验和集合与所述第二校验和集合进行比较以确定在经编辑的源代码中改变的至少一个函数。
在另一实施例中,一种计算机可读存储介质包括计算机可执行指令,所述计算机可执行指令在被处理器执行时执行一种方法,所述方法包括:提供被配置成使得用户能够标记源代码中要针对其禁用经优化编译的部分以生成所述源代码的经标记版本的界面,所述界面被配置成使得所述用户能够在所述源代码中在逐个函数的基础上禁用经优化编译;以及在至少针对所述源代码的被标记的部分禁用优化以及针对其它部分启用优化的情况下构建所述源代码的经部分优化编译的表示。
在一实施例中,所述构建包括:针对整个源代码在启用优化的情况下构建所述源代码的经完全优化编译的表示;至少基于被标记部分确定所述源代码的要在禁用优化的情况下被重新编译的一个或多个函数;在禁用优化的情况下重新编译所确定的一个或多个函数;以及将经重新编译的一个或多个函数打补丁到所述源代码的所述经完全优化编译的表示中以生成经部分优化编译的表示。
在一实施例中,所述在针对整个源代码启用优化的情况下构建所述源代码的经完全优化编译的表示包括生成增量式程序数据库,所述增量式程序数据库至少指示所述源代码的经完全优化编译的表示的函数间的依存关系。在一实施例中,至少基于被标记部分确定所述源代码的要在禁用优化的情况下被重新编译的一个或多个函数包括:基于所述增量式程序数据库生成所述源代码的依存关系图;从被标记部分中包括的任何函数和任何变量遍历所述依存关系图来确定受影响函数集合;并且将被标记部分中的任何函数以及所确定的受影响函数集合中的任何函数包括在要在禁用优化的情况下被重新编译的函数的集合中。
在一实施例中,所述方法进一步包括:在所述经部分优化编译的表示上执行调试器会话;在所述调试器会话期间接收对所述被标记部分中的函数的至少一个编辑;确定所述源代码的经标记版本中由于所接收的至少一个编辑而要在禁用优化的情况下被重新编译的函数的集合;在禁用优化的情况下重新编译所确定的函数集合;将经重新编译的函数集合打补丁到所述源代码的经标记版本的经部分优化编译的表示中以生成所述经部分优化编译的表示的经修订版本;以及在所述经部分优化编译的表示的经修订版本上执行所述调试器会话。
V.结语
尽管上文描述了本发明的各实施例,但是,应该理解,它们只是作为示例来呈现的,而不作为限制。那些精通有关技术的人员将理解,在不偏离如所附权利要求书所定义的本发明的精神和范围的情况下,可以在形式和细节方面进行各种修改。因此,本发明的范围不应该受到上述示例性实施例的任一个的限制,而只应根据下面的权利要求和它们的等效内容进行定义。
Claims (15)
1.一种计算机实现的方法,包括:
提供被配置成使得用户能够标记源代码中要针对其禁用经优化编译的部分以生成所述源代码的经标记版本的界面,所述界面被配置成使得所述用户能够在所述源代码中在逐个函数的基础上禁用经优化编译;以及
使用至少一个处理器电路在至少针对所述源代码的被标记部分禁用优化以及针对其它部分启用优化的情况下构建所述源代码的被标记版本的经部分优化编译的表示。
2.如权利要求1所述的方法,其特征在于,所述构建包括:
在针对整个源代码启用优化的情况下构建所述源代码的经完全优化编译的表示;
至少基于被标记部分确定所述源代码的要在禁用优化的情况下被重新编译的一个或多个函数;
在禁用优化的情况下重新编译所确定的一个或多个函数;以及
将经重新编译的一个或多个函数打补丁到所述源代码的所述经完全优化编译的表示中以生成经部分优化编译的表示。
3.如权利要求2所述的方法,其特征在于,所述在针对整个源代码启用优化的情况下构建所述源代码的经完全优化编译的表示包括:
生成增量式程序数据库,所述增量式程序数据库至少指示所述源代码的经完全优化编译的表示的函数间的依存关系。
4.如权利要求3所述的方法,其特征在于,至少基于被标记部分确定所述源代码的要在禁用优化的情况下被重新编译的一个或多个函数包括:
基于所述增量式程序数据库生成所述源代码的依存关系图;
从被标记部分中包括的任何函数和任何变量遍历所述依存关系图来确定受影响函数集合;以及
将被标记部分中的任何函数以及所确定的受影响函数集合中的任何函数包括在要在禁用优化的情况下被重新编译的函数的集合中。
5.如权利要求4所述的方法,其特征在于,所述基于所述增量式程序数据库生成所述源代码的依存关系图包括:
将节点与所述源代码的每个变量以及与每个函数相关联以指定多个节点;
确定第一有向边集合,所述第一有向边集合的每一有向边从所述依存关系图的第一函数节点延伸到第二函数节点,以指示与所述第一函数节点相关联的函数的变化影响与所述第二函数节点相关联的函数;
确定第二有向边集合,所述第二有向边集合的每一有向边从所述依存关系图的变量节点延伸到第三函数节点,以指示与所述变量节点相关联的变量的变化影响与所述第三函数节点相关联的函数;以及
存储包括所述多个节点、所述第一有向边集合以及所述第二有向边集合的依存关系图。
6.如权利要求5所述的方法,其特征在于,所述关于被标记部分中的任何函数和任何变量遍历所述依存关系图以确定所述一个或多个函数包括:
从所述被标记部分中的每个函数的节点遍历所述第一有向边集合中的有向边以确定第一受影响函数;以及
从所述被标记部分中的每个变量的节点遍历所述第二有向边集合中的有向边以确定第二受影响函数;以及
所确定的一个或多个函数包括所述第一受影响函数、所述第二受影响函数、以及被标记部分中的任何函数。
7.如权利要求1所述的方法,其特征在于,进一步包括:
在所述经部分优化编译的表示上执行调试器会话;
在所述调试器会话期间接收对所述被标记部分中的函数的至少一个编辑;
确定所述源代码的经标记版本中由于所接收的至少一个编辑而要在禁用优化的情况下被重新编译的函数集合;
在禁用优化的情况下重新编译所确定的函数集合;
将经重新编译的函数集合打补丁到所述源代码的经标记版本的经部分优化编译的表示中以生成所述经部分优化编译的表示的经修订版本;以及
在所述经部分优化编译的表示的经修订版本上执行所述调试器会话。
8.如权利要求7所述的方法,其特征在于,进一步包括:
生成增量式程序数据库,所述增量式程序数据库至少指示所述源代码的经标记版本的经部分优化编译的表示的函数间的依存关系;以及
其中所述确定所述源代码中由于所接收的至少一个编辑而要在禁用优化的情况下被重新编译的函数的集合包括:
从所述增量式程序数据库确定第一校验和集合,所述第一校验和集合包括针对所述源代码的经标记版本的中间语言版本中的每个函数计算的校验和;
确定包括针对经编辑的源代码的中间语言版本中的每个函数计算的校验和的第二校验和集合;以及
将所述第一校验和集合与所述第二校验和集合进行比较以确定在经编辑的源代码中改变的至少一个函数。
9.一种系统,包括:
至少一个处理器电路;
代码编辑器,所述代码编辑器被配置成使用所述至少一个处理器电路提供界面,所述界面被配置成使得用户能够标记源代码中要针对其禁用经优化编译的部分以生成所述源代码的经标记版本,所述界面被配置成使得所述用户能够在所述源代码中在逐个函数的基础上禁用经优化编译;以及
编译器,所述编译器被配置成使用至少一个处理器电路在至少针对所述源代码的被标记部分禁用优化以及针对其它部分启用优化的情况下构建所述源代码的被标记版本的经部分优化编译的表示。
10.如权利要求9所述的系统,其特征在于,所述编译器被配置成:
在针对整个源代码启用优化的情况下构建所述源代码的经完全优化编译的表示;
至少基于被标记部分确定所述源代码的要在禁用优化的情况下被重新编译的一个或多个函数;
在禁用优化的情况下重新编译所确定的一个或多个函数;以及
将经重新编译的一个或多个函数打补丁到所述源代码的所述经完全优化编译的表示中以生成经部分优化编译的表示。
11.如权利要求10所述的系统,其特征在于,所述编译器包括:
代码分析器,所述代码分析器被配置成生成增量式程序数据库,所述增量式程序数据库至少指示所述源代码的经完全优化编译的表示的函数间的依存关系。
12.如权利要求11所述的系统,其特征在于,所述代码分析器包括:
依存关系图生成器,所述依存关系图生成器被配置成基于所述增量式程序数据库生成所述源代码的依存关系图;
其中所述编译器进一步包括:
受影响函数确定器,所述受影响函数确定器被配置成从被标记部分中包括的任何函数和任何变量遍历所述依存关系图来确定受影响函数集合;以及
被标记部分中的任何函数以及所确定的受影响函数集合中的任何函数被包括在要在禁用优化的情况下被重新编译的函数的集合中。
13.如权利要求12所述的系统,其特征在于,所述依存关系图生成器被配置成:
将节点与所述源代码的每个变量以及与每个函数相关联以指定多个节点;
确定第一有向边集合,所述第一有向边集合的每一有向边从所述依存关系图的第一函数节点延伸到第二函数节点,以指示与所述第一函数节点相关联的函数的变化影响与所述第二函数节点相关联的函数;
确定第二有向边集合,所述第二有向边集合的每一有向边从所述依存关系图的变量节点延伸到第三函数节点,以指示与所述变量节点相关联的变量的变化影响与所述第三函数节点相关联的函数;以及
存储包括该多个节点、第一有向边集合以及第二有向边集合的依存关系图。
14.如权利要求13所述的系统,其特征在于,所述受影响函数确定器被配置成:
从所述被标记部分中的每个函数的节点遍历所述第一有向边集合中的有向边以确定第一受影响函数;以及
从所述被标记部分中的每个变量的节点遍历所述第二有向边集合中的有向边以确定第二受影响函数;以及
所确定的一个或多个函数包括所述第一受影响函数、所述第二受影响函数、以及被标记部分中的任何函数。
15.一种计算机程序产品,包括其上记录有计算机程序逻辑的计算机可读介质,包括:
使得处理器能够执行权利要求1-8中任一项的计算机程序逻辑。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US14/315,111 | 2014-06-25 | ||
US14/315,111 US10261889B2 (en) | 2014-06-25 | 2014-06-25 | Techniques for edit-and-continue and enhanced optimized debugging on optimized code |
PCT/US2015/037047 WO2015200235A1 (en) | 2014-06-25 | 2015-06-23 | Techniques for edit-and-continue and enhanced optimized debugging on optimized code |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106471476A true CN106471476A (zh) | 2017-03-01 |
CN106471476B CN106471476B (zh) | 2019-08-06 |
Family
ID=53525280
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201580034673.1A Active CN106471476B (zh) | 2014-06-25 | 2015-06-23 | 用于对经优化代码的编辑并继续以及增强的经优化调试的技术 |
Country Status (4)
Country | Link |
---|---|
US (1) | US10261889B2 (zh) |
EP (1) | EP3161642B1 (zh) |
CN (1) | CN106471476B (zh) |
WO (1) | WO2015200235A1 (zh) |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108897545A (zh) * | 2018-06-29 | 2018-11-27 | 南昌华勤电子科技有限公司 | 代码编译方法及装置 |
CN109344051A (zh) * | 2018-08-28 | 2019-02-15 | 北京达佳互联信息技术有限公司 | 数据处理的方法、装置、电子设备及存储介质 |
CN110554861A (zh) * | 2018-06-03 | 2019-12-10 | 苹果公司 | 具有编译和读取-评估-打印-循环操作的软件开发环境 |
CN111819542A (zh) * | 2018-02-28 | 2020-10-23 | 皇家飞利浦有限公司 | 编译设备和方法 |
CN112000584A (zh) * | 2020-10-27 | 2020-11-27 | 北京智芯微电子科技有限公司 | 基于ide调试框架的用于cpu程序的调试方法及调试系统 |
CN112334873A (zh) * | 2018-07-03 | 2021-02-05 | 欧姆龙株式会社 | 编译装置以及编译方法 |
CN113454606A (zh) * | 2019-01-10 | 2021-09-28 | 西门子工业软件有限公司 | 不同编译的可执行文件之间的软件检查点-恢复 |
CN114174983A (zh) * | 2019-07-31 | 2022-03-11 | 国际商业机器公司 | 使用测试向量自动验证高级构造的优化 |
CN115167868A (zh) * | 2022-07-29 | 2022-10-11 | 阿里巴巴(中国)有限公司 | 代码编译方法、装置、设备及计算机存储介质 |
Families Citing this family (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9558106B1 (en) * | 2013-12-19 | 2017-01-31 | Amazon Technologies, Inc. | Testing service with control testing |
US9442707B2 (en) * | 2014-06-25 | 2016-09-13 | Microsoft Technology Licensing, Llc | Incremental whole program compilation of code |
US20160321036A1 (en) * | 2015-04-28 | 2016-11-03 | Box, Inc. | Dynamically monitoring code execution activity to identify and manage inactive code |
US9817643B2 (en) * | 2015-07-17 | 2017-11-14 | Microsoft Technology Licensing, Llc | Incremental interprocedural dataflow analysis during compilation |
US9940218B2 (en) | 2016-02-15 | 2018-04-10 | International Business Machines Corporation | Debugging optimized code using fat binary |
US10509634B2 (en) * | 2016-03-30 | 2019-12-17 | International Business Machines Corporation | Data flow analysis for dynamic application, skipping views |
US10162607B2 (en) * | 2016-05-21 | 2018-12-25 | Apple Inc. | Source code rewriting during recording to provide both direct feedback and optimal code |
US10540262B2 (en) | 2016-10-17 | 2020-01-21 | Microsoft Technology Licensing, Llc | Using edit and continue to dynamically set and unset optimizations in source code while debugging |
US10698668B1 (en) * | 2018-05-29 | 2020-06-30 | Amazon Technologies, Inc. | Custom code transformations during compilation process |
CN111324353B (zh) * | 2018-12-14 | 2022-09-13 | 中移(杭州)信息技术有限公司 | 一种持续集成任务的优化方法及装置 |
US11461078B2 (en) * | 2019-04-03 | 2022-10-04 | Metaspex Llc | Device and method for producing a backend application utilizing metaprogramming and a domain ontology having a syntactic and semantic specification |
US11422917B2 (en) * | 2019-07-26 | 2022-08-23 | Red Hat, Inc. | Deriving software application dependency trees for white-box testing |
US11474816B2 (en) * | 2020-11-24 | 2022-10-18 | International Business Machines Corporation | Code review using quantitative linguistics |
CN112698832B (zh) * | 2020-12-28 | 2024-02-13 | 东软集团股份有限公司 | 一种识别代码变更影响范围的方法、装置及设备 |
US11327721B1 (en) * | 2021-02-08 | 2022-05-10 | Marco Renedo | System for extending functionality of a computer programming language, and related method and software |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050010912A1 (en) * | 2003-07-10 | 2005-01-13 | International Business Machines Corporation | Method and apparatus for generating computer programming code selectively optimized for execution performance and not optimized for serviceability |
US20090313600A1 (en) * | 2008-06-13 | 2009-12-17 | Microsoft Corporation | Concurrent code generation |
CN102236550A (zh) * | 2010-04-30 | 2011-11-09 | 微软公司 | 软件开发工具 |
Family Cites Families (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5758160A (en) | 1993-06-28 | 1998-05-26 | Object Technology Licensing Corporation | Method and apparatus for building a software program using dependencies derived from software component interfaces |
US5675803A (en) * | 1994-01-28 | 1997-10-07 | Sun Microsystems, Inc. | Method and apparatus for a fast debugger fix and continue operation |
US6091896A (en) | 1995-12-22 | 2000-07-18 | Hewlett-Packard Company | Debugging optimized code using data change points |
CA2175711A1 (en) | 1996-05-01 | 1997-11-02 | Lee Richard Nackman | Incremental compilation of c++ programs |
US5978585A (en) * | 1997-03-27 | 1999-11-02 | Inprise Corporation | Development system with improved methods for recompiling dependent code modules |
GB9825102D0 (en) | 1998-11-16 | 1999-01-13 | Insignia Solutions Plc | Computer system |
US6530075B1 (en) * | 1998-12-03 | 2003-03-04 | International Business Machines Corporation | JIT/compiler Java language extensions to enable field performance and serviceability |
US6795963B1 (en) | 1999-11-12 | 2004-09-21 | International Business Machines Corporation | Method and system for optimizing systems with enhanced debugging information |
US6934937B1 (en) | 2000-03-30 | 2005-08-23 | Broadcom Corporation | Multi-channel, multi-service debug on a pipelined CPU architecture |
US7516441B2 (en) * | 2001-06-04 | 2009-04-07 | Microsoft Corporation | Method and system for program editing and debugging in a common language runtime environment |
US8117587B1 (en) | 2008-06-03 | 2012-02-14 | Richard Paul Testardi | Microcontroller-resident software development environment supporting application-level asynchronous event handling, interactive debugging and pin variables for embedded systems |
US8276123B1 (en) * | 2008-07-22 | 2012-09-25 | Juniper Networks, Inc. | Adaptive regression test selection within testing environments |
US8271958B2 (en) | 2008-12-12 | 2012-09-18 | Microsoft Corporation | Remapping debuggable code |
US8806436B2 (en) | 2010-04-30 | 2014-08-12 | Cray Inc. | Systems and methods for debugging applications using dual code generation |
US9111033B2 (en) * | 2012-04-17 | 2015-08-18 | International Business Machines Corporation | Compiling source code for debugging with user preferred snapshot locations |
-
2014
- 2014-06-25 US US14/315,111 patent/US10261889B2/en active Active
-
2015
- 2015-06-23 CN CN201580034673.1A patent/CN106471476B/zh active Active
- 2015-06-23 EP EP15735802.9A patent/EP3161642B1/en active Active
- 2015-06-23 WO PCT/US2015/037047 patent/WO2015200235A1/en active Application Filing
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050010912A1 (en) * | 2003-07-10 | 2005-01-13 | International Business Machines Corporation | Method and apparatus for generating computer programming code selectively optimized for execution performance and not optimized for serviceability |
US20090313600A1 (en) * | 2008-06-13 | 2009-12-17 | Microsoft Corporation | Concurrent code generation |
CN102236550A (zh) * | 2010-04-30 | 2011-11-09 | 微软公司 | 软件开发工具 |
Non-Patent Citations (4)
Title |
---|
URS HOLZLE 等: "debugging optimized code with dynamic deoptimization", 《ACM SIGPLAN NOTICES》 * |
匿名: "Function Specific Option Pragmas一Using the GNU Compiler Collection (GCC)", 《HTTPS://GCC.GNU.ORG/ONLINEDOCS/GCC/FUNCTION-SPECIFIC-OPTION-PRAGMAS.HTML》 * |
周志明: "《深入理解Java虚拟机JVM高级特性与最佳实践》", 30 June 2013, 机械工业出版社 * |
牟海军: "《C语言进阶 重点、难点与疑点解析》", 31 July 2012, 机械工业出版社 * |
Cited By (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111819542A (zh) * | 2018-02-28 | 2020-10-23 | 皇家飞利浦有限公司 | 编译设备和方法 |
CN110554861B (zh) * | 2018-06-03 | 2023-08-04 | 苹果公司 | 具有编译和读取-评估-打印-循环操作的软件开发环境 |
CN110554861A (zh) * | 2018-06-03 | 2019-12-10 | 苹果公司 | 具有编译和读取-评估-打印-循环操作的软件开发环境 |
CN108897545A (zh) * | 2018-06-29 | 2018-11-27 | 南昌华勤电子科技有限公司 | 代码编译方法及装置 |
CN112334873A (zh) * | 2018-07-03 | 2021-02-05 | 欧姆龙株式会社 | 编译装置以及编译方法 |
CN109344051B (zh) * | 2018-08-28 | 2022-03-25 | 北京达佳互联信息技术有限公司 | 数据处理的方法、装置、电子设备及存储介质 |
CN109344051A (zh) * | 2018-08-28 | 2019-02-15 | 北京达佳互联信息技术有限公司 | 数据处理的方法、装置、电子设备及存储介质 |
CN113454606A (zh) * | 2019-01-10 | 2021-09-28 | 西门子工业软件有限公司 | 不同编译的可执行文件之间的软件检查点-恢复 |
US11429379B2 (en) | 2019-01-10 | 2022-08-30 | Siemens Industry Software Inc. | Software checkpoint-restoration between distinctly compiled executables |
CN113454606B (zh) * | 2019-01-10 | 2023-01-17 | 西门子工业软件有限公司 | 不同编译的可执行文件之间的软件检查点-恢复 |
CN114174983A (zh) * | 2019-07-31 | 2022-03-11 | 国际商业机器公司 | 使用测试向量自动验证高级构造的优化 |
CN112000584B (zh) * | 2020-10-27 | 2021-01-29 | 北京智芯微电子科技有限公司 | 基于ide调试框架的用于cpu程序的调试方法及调试系统 |
CN112000584A (zh) * | 2020-10-27 | 2020-11-27 | 北京智芯微电子科技有限公司 | 基于ide调试框架的用于cpu程序的调试方法及调试系统 |
CN115167868A (zh) * | 2022-07-29 | 2022-10-11 | 阿里巴巴(中国)有限公司 | 代码编译方法、装置、设备及计算机存储介质 |
Also Published As
Publication number | Publication date |
---|---|
US10261889B2 (en) | 2019-04-16 |
WO2015200235A1 (en) | 2015-12-30 |
US20150378871A1 (en) | 2015-12-31 |
CN106471476B (zh) | 2019-08-06 |
EP3161642A1 (en) | 2017-05-03 |
EP3161642B1 (en) | 2020-07-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106471476B (zh) | 用于对经优化代码的编辑并继续以及增强的经优化调试的技术 | |
CN106462434B (zh) | 整个程序代码的增量式编译 | |
Moran et al. | Machine learning-based prototyping of graphical user interfaces for mobile apps | |
David et al. | Neural reverse engineering of stripped binaries using augmented control flow graphs | |
US10540262B2 (en) | Using edit and continue to dynamically set and unset optimizations in source code while debugging | |
CN105683924B (zh) | 用于调试本机代码的方法和系统 | |
US10191832B2 (en) | Multi-language playback framework | |
US9524279B2 (en) | Help document animated visualization | |
CN108139891A (zh) | 针对外部文件的缺失包括建议 | |
CN104115120A (zh) | 将程序执行从编译代码变换到解释代码 | |
CN102696012A (zh) | 从代码使用中创建所推断的符号 | |
CN107077346A (zh) | 具有多上下文智能辅助的代码开发工具 | |
CN109313547A (zh) | 用于cpu利用率和代码重构的查询优化器 | |
US11789913B2 (en) | Integration of model execution engine containers with a model development environment | |
CN110442515B (zh) | 应用测试方法、装置、设备及可读存储介质 | |
CN114625844A (zh) | 一种代码搜索方法、装置及设备 | |
CN102289835A (zh) | 微动画效果查看方法及装置 | |
CN114579452A (zh) | 接口影响检测方法及相关设备 | |
US11740875B2 (en) | Type inference in dynamic languages | |
CN109992514B (zh) | 基于可视化内容的移动应用动态分析方法 | |
CN112596737A (zh) | 一种函数调用关系的扫描方法、系统、设备及存储介质 | |
CN113260976A (zh) | 用于在编译源代码中调度指令技术 | |
Benali | An Initial Investigation of Neural Decompilation for WebAssembly | |
Steele et al. | Fast functional simulation with a dynamic language | |
Hoang | Finnish scanner mobile application |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |