CN106462434A - 整个程序代码的增量式编译 - Google Patents

整个程序代码的增量式编译 Download PDF

Info

Publication number
CN106462434A
CN106462434A CN201580033415.1A CN201580033415A CN106462434A CN 106462434 A CN106462434 A CN 106462434A CN 201580033415 A CN201580033415 A CN 201580033415A CN 106462434 A CN106462434 A CN 106462434A
Authority
CN
China
Prior art keywords
function
source code
variable
code
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
Application number
CN201580033415.1A
Other languages
English (en)
Other versions
CN106462434B (zh
Inventor
P·W·塞斯亚纳桑
T·H·曾
W·何
A·阿斯特哈那
A·米利塔鲁
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Microsoft Technology Licensing LLC
Original Assignee
Microsoft Technology Licensing LLC
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Microsoft Technology Licensing LLC filed Critical Microsoft Technology Licensing LLC
Publication of CN106462434A publication Critical patent/CN106462434A/zh
Application granted granted Critical
Publication of CN106462434B publication Critical patent/CN106462434B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/48Incremental compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/447Target code generation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/52Binary to binary

Abstract

提供了启用对源代码的增量式编译的方法、系统和计算机程序产品。存储源代码的中间语言(IL)表示的属性和经编译表示。接收作为第一源代码的经修订版本的经修改源代码。生成经修改源代码的IL表示。将经修订中间IL的属性与所存储的IL表示的属性相比较以确定经修改源代码中已改变的第一函数集合。确定第一源代码中的包括受所确定的第一函数集合影响的函数的第二函数集合。编译第一和第二函数集合以生成经编译函数集合。在第一源代码的经编译表示中用经编译函数集合替换第一和第二集合的经编译版本。

Description

整个程序代码的增量式编译
背景
存在着软件开发人员可使用来开发软件的各种类型的开发应用。集成开发环境(IDE)是一种类型的在一个包中包含若干开发工具的软件开发应用。IDE可包括诸如源代码编辑器、构建自动化工具、以及调试器等工具。IDE的示例包括由加拿大渥太华的EclipseFoundation开发的EclipseTM、加拿大温哥华的ActiveStat开发的ActiveState KomodoTM、捷克共和国的JetBrains开发的IntelliJ IDEA、加利福尼亚雷德伍德市的Oracle公司开发的Oracle JDeveloperTM、Oracle公司开发的NetBeans、加利福尼亚旧金山市的Codenvy开发的CodenvyTM、加利福尼亚库珀蒂诺市的Apple公司开发的以及华盛顿州雷蒙德市的微软公司开发的 Visual
在典型的软件开发中,开发人员可修改大型应用程序的一小部分。开发人员可按发布模式重建(例如,重新编译并链接)经修改的应用,以使得开发人员可以测试该变更。发布模式构建通常使用整个程序优化,其中整个应用被分析并且过程间信息被用来生成高性能的机器码。当前,许多编译器(诸如C/C++编译器)在执行这样的整程序优化时,必须重新编译应用中的所有函数,即使这些函数中只有一个或少许被修改。甚至在对应用作出微小变更时也必须重新构建整个应用导致不利地影响开发人员生产力的长构建时间。
概述
提供本概述以便以简化的形式介绍以下在详细描述中进一步描述的一些概念。本概述并不旨在标识所要求保护主题的关键特征或必要特征,也不旨在用于限制所要求保护主题的范围。
提供了启用对源代码的增量式编译的方法、系统和计算机程序产品。代替将经修改源代码整体重编译,编译经修改源代码的一部分。经修改源代码的被编译的部分是经修改源代码的受作出的对源代码的编辑(直接或间接)影响的那一部分。例如,源代码中的被修改的变量和/或函数可被编译。此外,源代码的受经修改变量和/或函数影响的各部分可被确定并编译。受编辑间接影响的函数是其代码是使用从经编辑函数和变量流出的信息来生成的函数。这是使用过程间信息来优化为这些函数生成的代码的结果。源代码的经重编译部分可被插入源代码的全编译版本中以替换经修改和/或受影响函数。以此方式,生成经修改源代码的经编译版本,而不必整体重编译经修改源代码。
在一个示例方法实现中,存储从第一源代码中的函数和变量的中间语言表示中确定的一个或多个属性和第一源代码的经编译表示。接收作为第一源代码的经修订版本的经修改源代码。生成经修改源代码的中间语言表示(作为“经修订”中间语言表示)。将所存储的中间语言属性与从经修订中间语言表示中确定的属性相比较以确定经修改源代码中相对于第一源代码已改变的第一函数集合。确定第一源代码中的包括受所确定的第一函数集合中的一个或多个函数影响的函数的第二函数集合。编译第一函数集合和第二函数集合以生成经编译函数集合。在第一源代码的经编译表示中,使用该经编译函数集合来替换第一和第二函数集合的经编译版本以生成经修改源代码的经编译表示。
注意,也可将经修订中间语言表示的属性和所存储的中间语言表示的属性相比较以确定经修改源代码中相对于第一源代码已改变的任何变量。第二函数集合可包括第一源代码中的受以下至少一者影响的任何函数:所确定的第一函数集合中的函数或者被确定为已改变的变量。
在一示例系统实现中,编译器包括编译器前端和编译器后端。编译器前端被配置成生成所接收到的源代码文件的中间语言表示,包括被配置成生成第一源代码的中间语言表示和作为第一源代码的经修订版本的经修订源代码的中间语言表示。编译器后端被配置成使用生成所接收到的源代码文件的中间语言表示的经编译表示,包括被配置成生成第一源代码的经编译表示和经修改源代码的中间语言表示的经编译表示。编译器后端包括配置成执行增量式编译的增量式编译启用器。增量式编译启用器包括代码改变确定器、受影响函数确定器以及代码汇编器。代码改变确定器被配置成确定经修改源代码中相对于第一源代码已改变的任何变量和第一函数集合。受影响函数确定器被配置成确定第一源代码中受任何已改变变量和/或已改变的第一函数集合中的任何函数影响的第二函数集合。编译器后端被配置成编译第一函数集合和第二函数集合以生成经编译函数集合。代码汇编器被配置成使用经编译函数集合来替换第一源代码的经编译表示中第一和第二函数集合的经编译版本以生成经修改源代码的经编译表示。
编译器可进一步包括依存关系图生成器。依存关系图生成器被配置成基于第一源代码生成依存关系图。受影响函数确定器可包括依存关系图分析器。依存关系图分析器被配置成分析依存关系图以确定第二函数集合。在一实现中,依存关系图生成器可被配置成:将节点与第一源代码的中间语言表示的每一变量且与每一函数相关联以指定多个节点;确定第一有向边集合,该第一集合的每一有向边从第一函数节点延伸到依存关系图的第二函数节点,以指示与第一函数节点相关联的函数的变化影响与第二函数节点相关联的函数;确定第二有向边集合,该第二集合的每一有向边从变量节点延伸到依存关系图的第三函数节点,以指示与该变量节点相关联的变量的变化影响与第三函数节点相关联的函数;以及存储包括该多个节点、第一有向边集合以及第二有向边集合的依存关系图。
在一实现中,依存关系图分析器可被配置成:从所确定的第一函数集合中的每一函数的节点来遍历第一有向边集合中的有向边以确定第一受影响函数;从被确定为在经修订中间语言表示中已改变的每一变量的节点来遍历第二有向边集合的有向边以确定第二受影响函数;以及生成第二函数集合以包括第一受影响函数和第二受影响函数。
本文还公开了根据本文描述的各实施例的其中存储有启用源代码的增量式编译的计算机程序指令的计算机可读存储介质。
下面将参考各个附图,详细描述本发明的进一步特点和优点,以及本发明的各实施例的结构和操作。值得注意的是,本发明不仅限于此处所描述的特定实施例。本文呈现这些实施例仅用于说明性的用途。基于本文所包含的描述,其它实施例对于相关领域的技术人员将是显而易见的。
附图说明
结合到本说明书并构成本说明书的一部分的附图示出了本发明的各个实施例,且与描述一起,进一步用于说明本发明的原理,并允许相关领域技术人员实施和使用这些实施例。
图1示出根据一示例实施例的包括配置成执行源代码的增量式编译的编译器的计算设备的框图。
图2示出了根据一示例实施例的提供用于执行源代码的增量式编译的过程的流程图。
图3示出根据一实施例的提供图2的流程图的示例实现的流程图。
图4示出了根据一示例实施例的配置成执行源代码的增量式编译的编译器的框图。
图5示出了根据一示例实施例的代码改变确定器的框图。
图6示出了根据一示例实施例的提供用于检测在源代码中被修改的函数的过程的流程图。
图7示出了根据一示例实施例的用于检测在源代码中被修改的变量的过程。
图8示出了根据一示例实施例的被配置成生成依存关系图的代码分析器的框图。
图9示出了根据一示例实施例的被配置成分析依存关系图的受影响函数确定器的框图。
图10示出了根据一示例实施例的提供用于生成依存关系图的过程的流程图。
图11示出根据一实施例的示例性依存关系图的一部分的图形表示。
图12示出了根据一示例实施例的提供用于分析依存关系图的过程的流程图。
图13示出根据示例实施例的包括编译器和链接器的用于增量式编译的构建系统的框图。
图14示出可用于实现各实施例的示例性用户设备的框图。
图15示出可用来实现各个实施例的示例计算设备的框图。
当结合其中相同的附图标记标识对应的元素的附图时,本发明的特征和优点将从以下阐述的详细描述中变得更加显而易见。在附图中,相同的参考标号一般指相同的、功能上相似的和/或结构上相似的元素。其中元素第一次出现的附图由对应的参考标号中最左侧的数字指示。
详细描述
I.介绍
本说明书和附图公开了包括本发明的各特征的一个或多个实施例。本发明的范围不限于所公开的实施例。所公开的实施例仅仅例示本发明,并且所公开的实施例的经修改的版本也被本发明所构思。本发明的各实施例由附加的权利要求所限定。
说明书中对“一个实施例”、“一实施例”、“一示例实施例”等等的引用表示所描述的实施例可包括特定特征、结构或特性,但是,每一个实施例可不必包括该特定特征、结构,或特征。此外,这些短语不一定指相同的实施例。此外,当关于某一实施例描述特定特征、结构或特性时,不管是否被明确描述,关于其他实施例来实现该特征、结构或特性被认为是在本领域技术人员的知识范围内。
以下描述多个示例性实施例。应当注意,在此提供的任何章节/子章节标题不旨在限制。本文档中描述了各实施例,并且任何类型的实施例可被包括在任何章节/子章节下。此外,在任何章节/子章节中公开的各实施例可与在相同章节/子章节和/或不同章节/子章节中描述的任何其它实施例以任何方式组合。
II.用于增量式编译的示例环境
本文描述的各实施例使得编译器(包括独立编译器和集成开发环境(IDE)的编译器)能够执行程序代码的增量式编译。开发人员(设计程序代码的人)被允许对源代码作出修改/修订,并且代替源代码被整体重新编译,只有源代码的受该修改/修订影响的部分被编译。如此,程序代码的增量式编译减少了构建时间。
例如,源代码的受修改影响的函数子集可被检测,这可能是源代码的函数总数中的相对少的数目,并且只有该子集被编译。
在一实施例中,在先前源代码构建(例如,源代码的编译和链接)期间生成的信息的数据库被存储。这一所存储的信息可以结合检测到的代码修改来使用,以确定其代码受该修改影响的函数集,即使这些函数没有被直接修改。未受影响的函数的经编译代码(例如,机器码)可以从先前构建中获得,而不必重新编译未受影响的函数。
例如,在一实施例中,图形数据结构可以在源代码构建期间被构建,捕捉影响为一函数生成的代码的依存关系。这一图形(可被称为代码生成依存关系图(CGDG))或依存关系图(DG)可包括应用程序中每一全局变量和函数的节点。这些节点存储变量和函数的影响代码生成的属性。从第一节点到函数节点的有向边表示第一节点的属性的变化影响为与该函数节点相关联的函数生成的代码。
一种或多种技术(诸如校验和技术)可被用来检测哪些函数自前一构建以来已被编辑。检测到的经编辑的函数与在先前构建期间生成的依存关系图相组合可被用来检测哪些函数需要被编译以及哪些不需要。构建所确定的相关代码信息(包括定义依存关系图的代码信息)可被写入称为增量式程序数据库(IPDB)的数据库,以便在下一增量式构建中使用。
在一个实施例中,增量式编译可如下执行:1)从IPDB中读入为先前构建生成的依存关系图;2)为经修改的输入代码构造依存关系图;3)比较这两个依存关系图之间的变量和函数节点属性以检测已改变的节点的初始集合;4)计算在先前构建的依存关系图中可从初始集合到达的所有函数节点以确定受影响节点集合;5)重新编译与初始节点集合和受影响节点集合相关联的函数以生成经修改的机器码部分。复制来自先前构建的所有其他函数(与初始和受影响节点集合相关联的函数以外的函数)的机器码(例如,来自由先前构建所生成的目标文件),并将它与经修改的机器码部分相组合以生成重建的机器码。
在以下各节中描述了用于执行增量式编译的数个示例性实施例。
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被配置成将源代码112转换成另一计算机语言形式的机器码112,通常具有二进制形式,称为机器码或目标代码。在一些情况下,编译器104可包括多个阶段,并且可首先将第一源代码110转换成中间形式(例如,中间语言),这随后被转换成机器码112。机器码112可被包括在文件(例如,目标(即“.obj”)文件)中,或者可以按另一形式来被创建/存储以形成可执行程序或应用程序。
如在图1中所示,执行引擎106可接收机器码112。执行引擎106被配置成执行机器码112,从而执行由机器码112所表示的程序/应用程序。例如,执行引擎106可包括执行机器码112的一个或多个物理和或虚拟处理器(例如,中央处理单元(CPU))。
注意,开发人员可以通过与用户界面交互和/或以其他方式使执行引擎106执行机器码112。开发人员可以执行机器码112以测试或排查(例如,“调试”)机器码112,或者出于另一原因。开发人员可由于机器码112的执行的结果和/或由于其他原因而决定修改第一源代码110。因此,开发人员可以使源代码编辑器102(例如,从存储中)加载第一源代码110,使得开发人员可以改变第一源代码110中的一个或多个变量和/或一个或多个函数,并且源代码编辑器102可以相应地生成经修改源代码114。由经修改源代码114的经编译版本所表示的对应程序/应用程序可由于这些改变而与机器码112不同地操作。
开发人员可以对第一源代码110中的变量和/或函数作出任何数目的修改以生成经修改源代码114。在任何情况下,与第一源代码110被初始编译以生成机器码112相比,开发人员可能需要编译器104将经修改源代码更快地编译成机器码,因为在经修改源代码114中只改变了第一源代码110的一部分。较快编译增强了开发人员生产力。
相应地,如图1所示,编译器104包括增量式编译启用器108。增量式编译启用器108允许编译器104执行增量式编译,这是受修改影响的源代码部分的编译,而非源代码的全编译(这可花费显著更长时间)。
在各实施例中,增量式编译启用器108可以允许编译器104按各种方式执行增量式编译。例如,在一实施例中,编译器104可根据图2来操作。图2示出了根据一示例实施例的提供用于执行源代码的增量式编译的过程的流程图200。以下参考图1描述流程图200。基于以下描述,其他结构及操作的实施例对于相关邻域的技术人员将是显而易见的。
流程图200开始于步骤202。在步骤202,接收源代码的经修订版本。例如,可按任何方式调用编译器104以执行增量式编译或构建,诸如通过命令行(例如,使用“-incremental(增量)”开关)、通过图形用户界面,等等。如在图1中所示,编译器104可接收经修改源代码114。经修改源代码114可以是第一源代码110的经修改版本(例如,一个或多个变量和/或函数已被改变)。经修改源代码114通常被包括在一个或多个文件中。经修改源代码114包括一个或多个文件中的使得经修改源代码114不同于第一源代码110的一个或多个代码修改。
在步骤204,通过编译经修改源代码的受对源代码作出的改变影响的那一部分并将该经编译部分与源代码的已编译的修订前版本相组合,来生成经修改源代码的经编译表示。在一实施例中,编译器104被配置成生成经修改源代码114的经编译表示,作为经重编译机器码116。此外,增量式编译启用器108允许编译器104以增量式方式生成经重编译机器码116,而非整体编译经修改源代码114。
例如,增量式编译启用器108可被配置成确定经修改源代码114的包含(相对于第一源代码110的)修改的第一部分并确定经修改源代码114的受该修改影响的第二部分。换言之,增量式编译启用器108可以确定经修改源代码114中的由开发人员修改的变量和/或函数(第一部分)。随后,增量式编译启用器108确定经修改源代码114的受被确定为已被修改的变量和/或函数的影响的函数(第二部分)。所确定的第一和第二部分的函数由编译器104编译并被插入机器码112来代替经修改和受影响的函数,以生成经重编译机器码116。
在各实施例中,编译器104和流程图200可以按各种方式进行配置。例如,图3示出了根据一实施例的提供用于执行增量式编译的示例过程的流程图300。图3的流程图300是图2的流程图200的示例。此外,图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的代码编译成经编译表示420。编译模块408可被配置成以任何方式将接收到的IL代码编译成经编译机器码。经编译表示420是图1的机器码112的示例。因而,经编译表示420是通常具有二进制形式的程序代码(称为机器码或目标代码)。经编译表示420可被包括在文件(例如,目标文件)中,或者可以按另一形式来被创建/存储以形成可由一个或多个处理器执行的可执行程序或应用程序。例如,图1的执行引擎106可以接收并执行经编译表示420。
如图4所示,IL表示418和经编译表示420可被存储在存储402中。存储402可包括用于存储数据的任何类型的存储介质/设备中的一个或多个,包括磁盘(例如,在硬盘驱动器中)、光盘(例如,在光盘驱动器中)、磁带(例如,在磁带驱动器中)、诸如RAM设备、ROM设备等的存储器设备、和/或任何其他合适类型的存储介质/设备。
注意,IL表示418可任选地存储在存储402中。在一实施例中,作为将IL表示418整体存储在存储402中的替换或补充,IL表示418的各属性可被确定并存储在存储402中。IL表示418的属性可由编译器前端404或编译器后端406(例如,通过代码分析器436和/或代码改变确定器412)确定并被存储在代码信息422中。IL表示418的可被确定的属性的示例包括被认为所声明的(或“源”)函数属性和计算得到的函数属性的函数属性。所声明的属性是第一源代码110中存在的属性,并且所声明的函数属性的示例包括dllimport、dllexport、数个形式参数,等等。可被计算得到的函数属性的示例包括每一函数的校验和、函数是否可抛出任何异常的指示,等等。另外,可为变量确定所声明的属性和/或计算得到的属性并将其存储在代码信息422中。计算得到的变量属性的示例是在执行函数时变量是否总是具有常数值的指示。编译器前端404和/或编译器后端406确定IL表示418的属性的进一步示例在本文其他部分描述。
回头参考图3,在步骤304,接收作为源代码的经修订版本的经修改源代码。例如,如图4所示,编译器前端404可接收经修改源代码114。经修改源代码114可以是第一源代码110的经修改版本(例如,一个或多个变量和/或函数的属性已被改变)。经修改源代码114通常被包括在一个或多个文件中,且以与第一源代码110相同的编程语言来编程。经修改源代码114包括一个或多个文件中的使得经修改源代码114不同于第一源代码110的一个或多个代码修改。
在步骤306,生成经修改源代码的中间语言表示。例如,如图4所示,编译器前端404被配置成生成经修改源代码114的IL表示,本文称为经修订IL表示424。
在步骤308,将经修订中间语言表示的属性和中间语言表示的所存储的属性相比较以确定经修改源代码中相对于第一源代码已改变的第一函数集合和任何变量。例如,如图4所示,增量式编译启用器410的代码改变确定器412可以接收经修订IL表示424。代码改变确定器412被配置成确定经修订IL表示424中存在的相对于IL表示418的改变,这指示开发人员在经修改源代码114中作出的相对于第一源代码110的改变。具体而言,代码改变确定器412可被配置成确定经修订IL表示424中的经修改变量和/或函数。
例如,图5示出了根据一示例实施例的代码改变确定器412的框图。如图5所示,代码改变确定器412包括经改变函数确定器502和经改变变量确定器504。经改变函数确定器502被配置成将根据经修改源代码生成的IL代码的属性与根据(修改前)源代码生成的IL代码的属性相比较以确定在经修改源代码中改变的任何函数。经改变变量确定器504被配置成将根据经修改源代码生成的IL代码的属性与根据(修改前)源代码生成的IL代码的属性相比较以确定在经修改源代码中改变的任何变量。取决于要搜索对函数、对变量还是对函数和变量两者的改变,经改变函数确定器502和经改变变量确定器504中的一者或两者可存在于各实施例中。
经改变函数确定器502可按任何方式检测经改变的函数。例如,图6示出了根据一示例实施例的提供用于检测在源代码中被修改的功能的过程的流程图600。在一实施例中,经改变函数确定器502可根据流程图600来操作。基于以下有关流程图600的讨论,其他结构及操作的实施例对于相关领域的技术人员将是显而易见的。注意,流程图600的步骤不一定必须以图6中所示的次序发生。
图6的流程图600以步骤602开始。在步骤602,确定包括为所存储的中间语言表示中的每一函数计算得到的校验和的第一校验和集合。例如,如图5所示,经改变函数确定器502接收IL表示418。在一个实施例中,经改变函数确定器502被配置成确定IL表示418中的每一函数的校验和,并将这些校验和包括在第一集合中。另选地,校验和可由编译器前端404或其他来确定。第一校验和集合可被存储在存储402中(例如,在代码信息422中,如下文进一步描述的),或者可按另一方式来被维护。注意,经改变函数确定器502可以在任何时刻确定第一校验和集合,包括在生成IL表示418时、在生成经修订IL表示424之前的时刻、或者在生成经修订IL表示424之后的时刻。
在步骤604,确定包括为经修订中间语言表示中的每一函数计算得到的校验和的第二校验和集合。如图5所示,经改变函数确定器502接收经修订IL表示424。经改变函数确定器502被配置成确定经修订IL表示424中的每一函数的校验和,并将这些校验和包括在第二集合中。另选地,校验和可由编译器前端404或在他处确定。第二校验和集合可以按任何方式来被维护。
注意,经改变函数确定器502可以在步骤602和604以任何方式来确定校验和。例如,在一实施例中,可通过计算函数的每一元组的校验和并按任何方式来组合这些校验和(例如,通过相加,等等)来确定函数的校验和。可基于每一源和目的地元组的校验和以及指令操作码本身来计算指令元组的校验和。在其他实施例中,经改变函数确定器602可以按其他方式来确定函数的校验和。
在步骤606,将第一校验和集合与第二校验和集合相比较以确定在经修订中间语言表示中相对于所存储的中间语言表示已改变的至少一个函数。在一实施例中,经改变函数确定器502被配置成将第一校验和集合与第二校验和集合相比较。如果任何函数被修改或删除,和/或任何新函数被添加(在经修改源代码114中相对于第一源代码110),则这些差异将在第一和第二校验和集合的比较中得到反映。
例如,如果函数被修改(例如,其源已被编辑的函数,等等),则其在第二集合中的校验和相对于第一集合将是不同的。这将指示经修改的函数。如果函数被删除,则该函数的校验和将存在于第一集合中,但不存在于第二集合中。如果函数被添加,则该函数的校验和将不存在于第一集合中,但将存在于第二集合中。因此,通过比较第一和第二集合的校验和,经改变函数确定器502可以确定任何函数变化(修改、删除、添加)。被确定改变的函数在图4和5中所示的第一函数集合426中指示,被包括在(图3)流程图300的步骤308中确定的第一函数集合中。
经改变变量确定器504可按任何方式检测经改变的变量。图7示出了根据一示例实施例的用于检测在源代码中被修改的变量的步骤702。在步骤702,将所存储的中间语言表示的变量和相关联的属性与经修订中间语言表示的变量和相关联的属性相比较以确定任何经改变的变量。例如,如图5所示,经改变变量确定器504接收IL表示418(或代码信息422)以及经修订IL表示424。五百零五被配置成将IL表示418中的或维护在代码信息422中(如从IL表示418确定的)的任何变量与经修订IL表示424中声明的任何变量相比较以确定任何经改变的变量。例如,如果任何变量被修改或删除,和/或任何新函数被添加(在经修改源代码114中相对于第一源代码110),则这些差异将在IL表示418(或代码信息422)和经修订IL表示424的变量的比较中得到反映。
例如,如果变量被修改(例如,变量的所声明的值或计算得到的属性被改变,新属性被添加到变量,属性被从变量移除,等等),当在IL表示418(或422)和经修订IL表示424之间比较变量时,这一差异是明显的。这将指示经修改的变量。如果变量被删除,则该变量将存在于IL表示418(或代码信息422)中,但不存在于经修订IL表示424中。如果变量被添加,则该变量将不存在于IL表示418(或代码信息422)中,但将存在于经修订IL表示424中。因此,通过比较IL表示418(或代码信息422)和经修订IL表示424的变量,经改变变量确定器504可以确定任何变量变化。被确定为已改变的变量在图4和5中所示的经改变变量428中指示。
注意,在步骤702中分析的变量可以是全局变量。全局变量是具有全局作用域的变量,使得它贯穿源代码是可见的(因此是可访问的),甚至在源代码包括多个链接文件时。在这样的情形下,全局变量具有贯穿源代码(例如,第一源代码110或经修改源代码114)的相同结构(例如,相同属性)和值。
回头参考图3,在流程图300的步骤310中,确定第一源代码中的包括受所确定的第一函数集合中的函数或者被确定为已改变的变量中的至少一者影响的函数的第二函数集合。在一实施例中,如在图4中所示,增量式编译启用器410的受影响函数确定器414可以接收第一函数集合426和经改变变量428。第一函数集合426包括由代码改变确定器412确定为已改变的第一函数集合,并可指示任何数目的经改变函数,包括零个或者数十、数百、数千等数目的经改变函数。经改变变量428包括由代码改变确定器412确定为已改变的任何变量,并可指示任何数目的经改变变量,包括零个经改变变量或几个、数十、数百、数千等数目的经改变变量。
此外,受影响函数确定器414接收代码信息422,这包括与从IL表示418获得的第一源代码110有关的信息(例如,属性)。具体而言,代码信息422可被分析以确定IL表示418的(并且因此第一源代码110的)受已改变函数和/或变量影响的函数。如在图4中所示,代码信息422可由代码分析器436生成。代码分析器436可以按本文描述的任何方式基于IL表示418生成代码信息422以包括函数属性和变量属性。如图4所示,代码信息422可被存储在存储402中(例如,一个或多个文件、数据库和/或任何其他数据结构的形式)。代码信息422可由代码分析器436按任何方式生成并具有任何形式。例如,在一实施例中,代码分析器436可以生成代码信息422以包括支持依存关系图的数据。依存关系图指示函数和变量以及它们之间的依存关系。
例如,图8示出了根据一示例实施例的代码分析器436的框图。如图8所示,代码分析器436包括依存关系图生成器802。依存关系图生成器802被配置成生成包括表示IL表示418的函数和变量之间的依存关系的数据的依存关系图804。这些依存关系可被遍历以确定受经修改源代码114中存在的代码改变影响的其他函数。
依存关系图生成器802可按任何方式操作以执行其功能。例如,图10示出了根据一示例实施例的提供用于生成依存关系图的过程的流程图1000。在一实施例中,依存关系图生成器802可根据流程图1000来操作。出于说明的目的,参考流程图1000来描述依存关系图生成器802。基于以下有关流程图1000和依存关系图生成器802的讨论,其他结构及操作的实施例对于相关领域的技术人员将是显而易见的。注意,流程图1000的步骤不一定必须以所示次序发生。
图10的流程图1000以步骤1002开始。在步骤1002,节点与第一源代码的中间语言表示的每一变量且与每一函数相关联以指定多个节点。在一实施例中,依存关系图生成器802解析IL表示418以寻找所有函数。依存关系图生成器802可以按任何方式标识IL表示418中的函数,包括通过标识函数的声明(例如,伴有“()”的函数名)、标识函数的主体(例如,封闭在括号“{”、“}”之间)、和/或通过标识函数的其他部分。依存关系图生成器802可以按任何方式标识IL表示418中的全局变量,包括通过标识全局变量的声明(例如,“extern intglobalvariable=1;”),等等。依存关系图生成器802被配置成使用依存关系图804中的对应节点(例如,带有节点标识符)来标识每一函数和每一变量。
在步骤1004,确定第一有向边集合,第一集合的每一有向边从第一函数节点延伸到依存关系图的第二函数节点,以指示与第一函数节点相关联的函数的变化影响与第二函数节点相关联的函数。在一实施例中,依存关系图生成器802分析IL表示418以确定各函数之间的依存关系。例如,依存关系图生成器802可以确定第一函数(被调用方函数)何时被第二函数(调用方函数)调用,使得第一函数中的变化影响第二函数。因而,依存关系图生成器802可被配置成解析IL表示418中每一函数的结构以确定该函数调用的其他函数(如果有的话)。依存关系图生成器802被配置成将每一函数调用标识成依存关系图804中的“有向边”(例如,带有边标识符)。每一有向边标识第一函数节点和第二函数节点,以指示与第二函数节点相关联的函数依赖于(例如,调用)与第一函数节点相关联的函数。
在步骤1006,确定第二有向边集合,第二集合的每一有向边从变量节点延伸到依存关系图的第三函数节点,以指示与该变量节点相关联的变量的变化影响与第三函数节点相关联的函数。在一实施例中,依存关系图生成器802分析IL表示418以确定各变量和函数之间的依存关系。例如,依存关系图生成器802可以确定函数何时使用一变量,使得该变量中的变化影响该函数。因而,依存关系图生成器802可被配置成解析IL表示418中每一函数的结构以确定该函数使用的各变量(如果有的话)。依存关系图生成器802被配置成将每一变量-函数关系标识成依存关系图804中的“有向边”(例如,带有边标识符)。每一有向边标识变量节点和函数节点,以指示与函数节点相关联的函数依赖于(例如,使用)与变量节点相关联的变量。
在步骤1008,存储包括该多个节点、第一有向边集合以及第二有向边集合的依存关系图。如图8所示,依存关系图生成器802输出依存关系图804。依存关系图804可被存储在存储402中的代码信息422中,如图4所示。
注意,依存关系图生成器802可以在任何时刻生成依存关系图804,包括在IL表示418被编译模块408编译成经编译表示420的时刻、生成经修订IL表示424之前的时刻、或生成经修订IL表示424之后的时刻。
出于解说的目的,图11示出根据一实施例的示例性依存关系图1100的一部分的图形表示。如图11所示,依存关系图1100包括节点和有向边,包括函数节点 1102a-1102c、变量节点 1104a-1104c以及有向边 1106a-1106c和1108a-1108e。函数节点1102-1102c中的每一者与IL表示418中包括的函数F1-F3中的对应一者相关联。变量节点1104-1104c中的每一者与IL表示418中包括的变量V1-V3中的对应一者相关联。函数节点1102-1102c以及变量节点1104-1104c可由依存关系图生成器802在流程图1000的步骤1002中标识。三个函数和三个变量主体11中示出以用于简明的目的,并且可存在更多数目的函数和变量(如虚线有向边1106c和1108e所指示的)。
此外,有向边1106a-1106c中的每一者从第一函数节点延伸到第二函数节点。例如,有向边1106a从函数节点1102a延伸到函数节点1102b,从而指示与函数节点1102a相关联的函数F1中的变化影响与函数节点1102b修改后的函数F2(F2依赖于F1)。有向边1106a-1106c可由依存关系图生成器802在流程图1000的步骤1004中标识。
有向边1108a-1108e中的每一者从变量节点延伸到函数节点。例如,有向边1108a从变量节点1104a延伸到函数节点1102a,从而指示与变量节点1104a相关联的变量V1的变化影响与函数节点1102a相关联的函数F1(F1依赖于V1)。有向边1108a-1108e可由依存关系图生成器802在流程图1000的步骤1006中标识。
继续(图3)流程图300的步骤310的描述,受影响函数确定器414被配置成确定第一源代码110中存在的受第一函数集合426和经改变变量428影响的函数集合,这通过分析代码信息422来确定。受影响函数确定器414可以按任何方式作出这一确定。
例如,图9示出了根据一示例实施例的受影响函数确定器414的框图。如图9所示,受影响函数确定器414包括依存关系图分析器902。依存关系图分析器902被配置成分析依存关系图804以确定受第一函数集合426和经改变变量428影响的函数。
依存关系图分析器902可按任何方式操作以执行其功能。例如,图12示出了根据一示例实施例的提供用于分析依存关系图的过程的流程图1200。在一实施例中,依存关系图分析器902可根据流程图1200来操作。出于说明的目的,参考流程图1200来描述依存关系图分析器902。基于以下有关流程图1200和依存关系图分析器902的讨论,其他结构及操作的实施例对于相关领域的技术人员将是显而易见的。注意,流程图1200的步骤不一定必须以所示次序发生。
图12的流程图1200以步骤1202开始。在步骤1202,从所确定的第一函数集合中的每一函数的节点来遍历第一有向边集合中的有向边以确定第一受影响函数。在一实施例中,对于第一函数集合426中指示的每一函数,依存关系图分析器902被配置成找出依存关系图804中的对应函数节点。依存关系图分析器902从该函数节点遍历依存关系图804中指示的任何有向边以确定任何(从属)函数节点。这些从属函数节点在第一受影响函数集合中指示。
例如,参考图11,如果函数F1被指示在第一函数集合426中,则依存关系图分析器902标识并遍历分别到函数节点1102b和1102c的有向边1106a和1106b,以确定函数F2和F3依赖于函数F1。函数F2和F3因此被包括在第一受影响函数中。
回头参考图12,在步骤1204,从被确定为在经修订中间语言表示中已改变的每一变量的节点来遍历第二有向边集合中的有向边以确定第二受影响函数。在一实施例中,对于经改变变量428中指示的每一遍历,依存关系图分析器902被配置成找出依存关系图804中的对应变量节点。依存关系图分析器902从该变量节点遍历依存关系图804中指示的任何有向边以确定任何(从属)函数节点。这些从属函数节点在第二受影响函数集合中指示。
例如,参考图11,如果变量V1被指示在经改变变量428中,则依存关系图分析器902标识并遍历到函数节点1102a的有向边1108a,以确定函数F1依赖于变量V1。函数F1因此被包括在第二受影响函数中。
在步骤1206,第二函数集合被生成以包括第一受影响函数和第二受影响函数。如图9所示,依存关系图分析器902生成第二函数集合430。第二函数集合430包括由依存关系图分析器902在步骤1202确定的第一受影响函数并且包括由依存关系图分析器902在步骤1204确定的第二受影响函数。图4示出由受影响函数确定器414输出的第二函数集合430。
回头参考图3,在步骤312,第一函数集合和第二函数集合被编译以生成经编译函数集合。如图4所示,编译模块408接收第一函数集合426和第二函数集合430。编译模块408被配置成编译第一函数集合426和第二函数集合430中包括的函数以生成经编译函数432。编译模块408可被配置成以任何方式来编译第一函数集合426和第二函数集合430,包括根据本文其他部分描述的技术或其他已知技术。
在步骤314,在源代码的经编译表示中,使用该经编译函数集合来替换第一和第二函数集合的经编译版本以生成经修改源代码的经编译表示。如图4所示,增量式编译启用器410的代码汇编器416接收(第一源代码110的)经编译表示420和经编译函数432。代码汇编器416被配置成将经编译函数432插入经编译表示420以生成经重编译机器码434。具体而言,代码汇编器416可被配置成将经编译函数432插入经编译表示420来代替第一函数集合426中指示的函数(被开发人员修改的函数)和第二函数集合430中指示的函数(受第一函数集合426的经修改函数影响的函数)。以此方式,经重编译机器码434被生成为经修改源代码114的经编译表示,而无需整体重编译经修改源代码114。
注意,在一实施例中,经修订IL表示424和经重编译机器码434可被存储并随后用于增量式编译。例如,如果经修改源代码被保存(例如,在长期存储中)作为第一源代码110的替换(例如,因为开发人员想要保存该改变),则经修订IL表示424和经重编译机器码434也可被保存(在长期存储则)为经修改源代码110的IL表示和机器码版本。另选地,开发人员可继续作出源代码修改,并且可能不希望用经修改源代码114盖写第一源代码110。在这种情形下,经修改源代码114、经修订IL表示424以及经重编译机器码434可被保存在短期存储(例如,存储器)以供使用,但稍后当不再需要时被丢弃。
在接收到对源代码的进一步修改时,流程图300可随后再执行。在这样的情形下,在流程图300的先前迭代中示出的代码的经修改和重编译版本可被用于增量式编译的后续迭代。例如,可以(在步骤304)接收作为经修改源代码114的经修改版本的接下来经修改的源代码。只在以下情况下,在流程图300的这一接下来的迭代中,经修改源代码114可被认为是第一源代码110,经修订IL表示424可被存储为IL表示418,且经重编译机器码434可被存储为经编译表示420(在步骤302)。此外,代码信息422可已经根据经修订IL表示424(这可任选地存储为IL表示418)被生成,并且因而可被存储和在流程图300的这一接下来的迭代中使用(例如,在步骤310中以确定受影响函数)。因此,在流程图300的这一接下来的迭代全局接收到的经修改源代码可被认为是经修改源代码114,且可在步骤306-314从中生成经重编译机器码。
B.用于LTCG的增量式编译的示例环境
注意,本文描述的编译器的实施例可被实现在任何类型的编译或构建配置中,它们可以或可以不包括链接器。例如,图13示出根据示例实施例的包括编译器1302和链接器1304的构建系统1300的框图。构建系统1300被配置成执行链接时代码生成(LTCG),也被称为整程序优化。根据LTCG,以多个分开的源代码文件的形式接收源代码。该多个分开的源代码文件一起形成供编译的整个程序。所有源代码文件被构建系统1300一起编译以形成单个可执行文件。构建系统1300执行LTCG的操作的示例在下文描述。
如图13所示,编译器1302包括编译器前端1306和编译器后端1308。编译器前端1306可以与图4的编译器前端404相似地配置,且编译器后端1308可以与图4的编译器前端406相似地配置,或者它们可根据其他实施例来配置。编译器后端1308包括增量式编译启用器108。在一实施例中,增量式编译启用器108可与图4中所示的增量式编译启用器410相似地配置,或者可根据另一实施例来配置。
源代码110由编译器前端1306以多个源代码文件(例如,“.c”文件、“.cpp”文件,等等)的形式来接收。任何数目的源代码文件可被接收作为源代码110,包括数个、数十、数百、数千等数目的文件。编译器前端1306将每一源代码文件的源代码转换成对应IL表示文件,从而生成多个IL表示文件。IL表示文件由编译器前端1306输出在IL表示418中。编译器后端1308接收IL表示418。编译器后端1308通过命令行开关(例如,“/GL”)、通过分析IL表示文件中的一者或多者中的信息、或以另一方式确定LTCG被调用。由于这一点,编译器后端1308将IL表示文件作为经打包的IL表示文件1310传递给链接器1304(例如,打包在.obj文件中或以其他形式)。
链接器1304接收经打包的IL表示文件1310。基于确定IL代码被包含在经打包的IL表示文件1310的文件中,通过经由命令行开关(例如,“/LTCG”)或以另一方式来调用,链接器1304确定编译器后端1308要被调用以跨所有IL表示文件优化IL代码(而非单独地优化每一IL表示文件)。因此,链接器1304生成调用信号1318,这由编译器后端1308接收。
编译器后端1308接收调用信号1318,并继续进行以将IL表示文件一起编译成单个机器码文件,这由编译器后端1308输出为机器码1320。链接器1304接收机器码1320,并且被配置成生成可执行文件1312,可任选地使用一个或多个LIB(库)文件、DLL(动态链接库)文件,等等。
参考图3的流程图300,IL表示418和机器码1320可被存储在图4的存储402中(步骤304)。另外,代码信息422可由编译器前端404和/或编译器后端1308(例如,由图4的代码分析器436)生成并被存储在存储402中。
随后,开发人员可以修改源代码文件中的一者或多者中的代码。开发人员可以调用编译器1302来用于增量式编译(例如,使用命令“-incremental”开关,或以其他方式)。经修改源代码文件(包括经修改和非经修改源代码文件)可在图13中作为经修改源代码114来被接收。编译器前端1306可以生成经修订IL表示424,这包括经修改源代码114中的每一源代码文件的IL表示文件。编译器后端1308接收经修订IL表示424中的IL表示文件,并按与以上在经修订经打包IL表示文件1314中描述的相似的方式来将它们传递给链接器1304。链接器1304接收经修订经打包IL表示文件1314,并且作为响应确定编译器后端1308要被调用以跨所有IL表示文件优化IL代码(而非优化每一IL文件),链接器1308生成调用信号1318以使编译器后端1308执行经修订IL表示文件的增量式编译。
因此,编译器后端1308接收调用信号1318,接收经修订IL表示文件,并继续进行以根据图3的流程图300执行增量式编译。如上所述,只有机器码1320的单个机器码文件的经修改和受影响函数被编译。注意,根据上述技术,可确定一个或多个IL表示文件中的经修改函数和/或变量。此外,可确定受经修改函数和/或变量影响的一个或多个函数。受影响函数可存在于与影响它们的经修改函数和/或变量相同的IL表示文件中,或可被包括在不同文件中。例如,第一文件中的变量可影响第二文件中的函数,或者第三文件中的函数可影响第四文件中的函数。因为依存关系图生成器802被配置成基于所有IL表示文件来生成依存关系图804,所以可在任何IL表示文件中找出受影响函数。
经编译函数被插入机器码1320(代替经修改和受影响经编译函数)以生成经重编译机器码1322。链接器1304接收经重编译机器码1322,并被配置成基于此来生成可执行文件1316。
以此方式,增量式编译的各实施例可被合并在LTCG编译实现中,
C.用于使用内联的增量式编译的示例环境
“被调用方”函数是源代码中的被源代码的另一函数(称为“调用方”函数)调用以执行的函数。被调用方函数可由任何数目的调用方函数调用任何次数。以此方式,被调用方函数的代码是可重用的且可存在于源代码中一次,而不必被复制在调用方函数中的每一者中。
注意,本文描述的编译器的各实施例可被配置成处理相关于函数“内联”的增量式编译。“内联”是编译器优化,其中在源代码的编译期间,被调用方函数的代码被代入调用方函数的主体(代替该调用)。如此,内联具有益处:调用指令的运行时开销可被避免,因为被调用方函数代码可如同它是调用方函数的一部分那样被执行。另一益处是内联允许更激进的优化,因为优化器(例如,编译器后端)在优化内联调用方的主体时具有调用点专用信息。所以内联可以是影响程序性能的重要优化。内联使用试探法来决定何时内联被调用方。过多内联可造成机器码二进制文件的大小的大量增加,这可具有负面影响。
在一实施例中,可能需要通过增量式构建(例如,根据本文描述的各实施例重编译源代码的收对源代码的修改的影响的那一部分)从经修改源代码生成的机器码并非不同于通过全构建(从头开始整体重编译经修改源代码)从经修改源代码生成的机器码。这样的无差异结果可促进代码测试,确保优化没有看到增量式构建的机器码二进制文件的程序性能降级。
可能影响这一无差异偏好的增量式编译与内联之间的不合需要的交互的示例在以下示例场景中描述:在全构建中,函数“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、经改变函数确定器502、经改变变量确定器504、依存关系图生成器802、依存关系图分析器902、编译器1302、链接器1304、编译器前端1306、编译器后端1308、流程图200、流程图300、流程图600、步骤702、流程图1000以及流程图1200可以用硬件、或硬件组合软件和/或固件来实现。例如,开发系统100、源代码编辑器102、编译器104、执行引擎106、增量式编译启用器108、编译器400、编译器前端404、编译器后端406、编译模块408、增量式编译启用器410、代码改变确定器412、受影响函数确定器414、代码汇编器416、代码分析器436、经改变函数确定器502、经改变变量确定器504、依存关系图生成器802、依存关系图分析器902、编译器1302、链接器1304、编译器前端1306、编译器后端1308、流程图200、流程图300、流程图600、步骤702、流程图1000以及流程图1200可被实现为配置成在一个或多个处理器中执行并存储在计算机可读存储介质中的计算机程序代码/指令。另选地,计算设备118、开发系统100、源代码编辑器102、编译器104、执行引擎106、增量式编译启用器108、编译器400、编译器前端404、编译器后端406、编译模块408、增量式编译启用器410、代码改变确定器412、受影响函数确定器414、代码汇编器416、代码分析器436、经改变函数确定器502、经改变变量确定器504、依存关系图生成器802、依存关系图分析器902、编译器1302、链接器1304、编译器前端1306、编译器后端1308、流程图200、流程图300、流程图600、步骤702、流程图1000以及流程图1200可被实现为硬件逻辑/电子电路系统。
例如,在一实施例中,开发系统100、源代码编辑器102、编译器104、执行引擎106、增量式编译启用器108、编译器400、编译器前端404、编译器后端406、编译模块408、增量式编译启用器410、代码改变确定器412、受影响函数确定器414、代码汇编器416、代码分析器436、经改变函数确定器502、经改变变量确定器504、依存关系图生成器802、依存关系图分析器902、编译器1302、链接器1304、编译器前端1306、编译器后端1308、流程图200、流程图300、流程图600、步骤702、流程图1000以及流程图1200中的一者或多者(以任何组合)可被一起实现在SoC中。SoC可包括集成电路芯片,其包括处理器(例如中央处理单元(CPU))、微控制器、微处理器、数字信号处理器(DSP等))、存储器、一个或多个通信接口、和/或其它电路中的一个或多个,并可任选地执行被接收的程序代码和/或包括嵌入式固件来执行功能。
图14示出示例性移动设备1400的框图,该示例性移动设备1400包括概括地示为组件1402的各种任选硬件和软件组件。例如,移动设备1400的组件1402是可被包括在移动设备实施例中的计算设备118(图1)内的组件的示例。组件1402的特征/要素的任何数量和组合以及附加和/或替代特征/要素可被包括在移动设备实施例中,如相关领域技术人员所知的。注意,组件1402中的任一组件可与组件1402中的任何其他组件通信,尽管为了便于说明并未示出所有连接。移动设备1400可以是本文中其它地方所述或提及的、或者以其它方式已知的各种移动设备(例如,蜂窝电话、智能电话、手持式计算机、个人数字助理(PDA)等)中的任一种,并且可允许经由诸如蜂窝或卫星网络等一个或多个通信网络1404或通过局域网或广域网进行与一个或多个移动设备的无线双向通信。
所示移动设备1400可包括用于执行诸如信号编码、图像处理、数据处理、输入/输出处理、电源控制、和/或其他功能之类的任务的控制器或处理器(称为处理器电路1410)。处理器电路1410是在一个或多个物理硬件电子电路设备元件和/或作为中央处理单元(CPU)、微控制器、微处理器、和/或其它物理硬件处理电路的集成电路设备(半导体材料芯片或管芯)中实现的电子和/或光学电路。处理器电路1410可执行存储在计算机可读介质中的程序代码,诸如一个或多个应用1414、操作系统1412的程序代码、存储器1420中存储的任何程序代码等。操作系统1412可控制对组件1402的分配和使用,并支持一个或多个应用程序1414(也称为“应用”、“app”等)。应用程序1414可包括公共移动计算应用程序(例如,电子邮件应用程序、日历、联系人管理器、web浏览器、消息接发应用程序)、或任何其他计算应用(例如字处理应用、映射应用、介质播放器应用)。
如所示地,移动设备1400可包括存储器1420。存储器1420可以包括不可移动存储器1422和/或可移动存储器1424。不可移动存储器1422可以包括RAM、ROM、闪存、硬盘或者其他公知的存储器存储技术。可移动存储器1424可以包括闪存或订户身份模块(SIM)卡,这在GSM通信系统或者其他公知的存储器存储技术中是公知的,诸如“智能卡”。存储器1420可用于存储运行操作系统1412和应用1414的数据和/或代码。示例数据可以包括要经由一个或多个有线或无线网络被发送至和/或接收自一个或多个网络服务器或其他设备的网页、文本、图像、声音文件、视频数据或者其他数据集。存储器1420可用于存储诸如国际移动订户身份(IMSI)等订户标识符,以及诸如国际移动设备标识符(IMEI)等设备标识符。这种标识符可以被发射至网络服务器以标识用户和设备。
多个程序可被储存在存储器1420中。这些程序包括操作系统1412、一个或多个应用程序1414、以及其他程序模块以及程序数据。这样的应用程序或程序模块的示例可包括例如用于实现开发系统100、源代码编辑器102、编译器104、执行引擎106、增量式编译启用器108、编译器400、编译器前端404、编译器后端406、编译模块408、增量式编译启用器410、代码改变确定器412、受影响函数确定器414、代码汇编器416、代码分析器436、经改变函数确定器502、经改变变量确定器504、依存关系图生成器802、依存关系图分析器902、编译器1302、链接器1304、编译器前端1306、编译器后端1308、流程图200、流程图300、流程图600、步骤702、流程图1000以及流程图1200以及本文中描述的进一步实施例的计算机程序逻辑(例如,计算机程序代码或指令)。
移动设备1400可支持诸如触摸屏1432、话筒1434、相机1436、物理键盘1438和/或跟踪球1440之类的一个或多个输入设备1430,以及诸如扬声器1452和显示器1454之类的一个或多个输出设备1450。诸如触摸屏1432等触摸屏可以不同方式检测输入。例如,电容式触摸屏在物体(例如,指尖)使流过表面的电流变形或中断时检测到触摸输入。作为另一示例,触摸屏可使用光学传感器,在来自光学传感器的光束被中断时检测到触摸输入。对于通过某些触摸屏被检测到的输入来说,与屏幕表面的物理接触并不是必需的。例如,如本领域公知地,触摸屏1432可被配置成使用电容感测支持手指悬停检测。如一上已经描述的,也可使用其它检测技术,包括基于相机的检测和基于超声波的检测。为了实现手指悬停,用户的手指通常在触摸屏上方预定间隔距离内,诸如在0.1至0.25英寸之间、或0.25至0.5英寸之间、或0.5至0.75英寸之间、或0.75至1英寸之间、或1至1.5英寸之间等等。
为了说明目的,触摸屏1432被示为包括控制界面1492。控制界面1492被配置成控制与显示在触摸屏1432上的虚拟元件相关联的内容。在一示例实施例中,控制界面1492被配置成控制由一个或多个应用1414提供的内容。例如,当移动设备1400的用户利用应用时,控制界面1492可在触摸屏1432上被呈现给用户以使用户能够访问控制这种内容的控件。控制界面1492的呈现可基于(例如触发于)距触摸屏1432指定距离内的运动的检测、或者没有此类运动。用于基于运动或没有运动使控制界面(例如控制界面1492)呈现在触摸屏(例如触摸屏1432)上的示例实施例在以下更具体地描述。
其他可能的输出设备(未示出)可以包括压电或其他触觉输出设备。一些设备可以用于多于一个输入/输出功能。例如,触摸屏1432和显示器1454可被组合在单个输入/输出设备中。输入设备1430可以包括自然用户界面(NUI)。NUI是使用户能以“自然”方式与设备交互、免受诸如鼠标、键盘、远程控件等输入设备所施加的人工约束的任一界面技术。NUI方法的示例包括依赖于语音识别、触摸和触笔识别、屏上及邻近屏的姿势识别、空中姿势、头部和眼部跟踪、说话和语音、视觉、触摸、姿势以及机器智能的那些方法。NUI的其他示例包括使用加速度计/陀螺仪、面部识别、3D显示器、头部、眼部和凝视跟踪的运动手势检测、沉浸式增强的现实和虚拟现实系统,这些中的全部都提供更自然的界面,还包括使用电场传感电极(EEG及相关方法)来感测脑部活动的技术。由此,在一特定示例中,操作系统1412或应用1414可包括作为允许用户经由语音命令来操作设备1400的语音控制界面的一部分的语音识别软件。此外,设备1400可包括允许经由用户的空间姿势进行用户交互(诸如检测和解释姿势以向游戏应用提供输入)的输入设备和软件。
无线调制解调器1460可被耦合至天线(未示出),并且可支持处理器1410与外部设备间的双向通信,如本领域中充分理解的那样。调制解调器1460被一般性地示出,并且可包括用于与移动通信网络1404和/或其它基于无线电的调制解调器(例如,蓝牙1464或/或Wi-Fi 1462)进行通信的蜂窝调制解调器1466。蜂窝调制解调器1466可被配置成根据任何适当的通信标准或技术(诸如GSM、3G、4G、5G等)实现电话呼叫(以及可任选地传送数据)。无线调制解调器1460的至少之一通常被配置用于与一个或多个蜂窝网络(诸如,用于在单个蜂窝网络内、蜂窝网络之间、或移动设备与公共交换电话网络(PSTN)之间的数据和语音通信的GSM网络)进行通信。
移动设备1400还可包括至少一个输入/输出端口1480、电源1482、诸如全球定位系统(GPS)接收机之类的卫星导航系统接收机1484、加速度计1486、和/或物理连接器1490,该物理连接器990可以是USB端口、IEEE 1394(火线)端口、和/或RS-232端口。所示的组件1402并非是必需或者涵盖全部的,因为如本邻域技术人员所理解地,任何组件可不存在且附加地其它组件可存在。
此外,图15示出其中可实现各实施例的计算设备1500的示例性实现。例如,计算设备118(图1)可在与静态计算机实施例中的计算设备1500相似的一个或多个计算设备中实现,包括计算设备1500的一个或多个特征和/或替代特征。此处所提供的对计算设备1500的描述只是为了说明,并不是限制性的。各实施例也可以在相关领域的技术人员所知的其它类型的计算机系统中实现。
如图15所示,计算设备1500包括一个或多个处理器(被称为处理器电路1502)、系统存储器1504,以及将包括系统存储器1504的各种系统组件耦合到处理器电路1502的总线1506。处理器电路1502是在一个或多个物理硬件电子电路设备元件和/或作为中央处理单元(CPU)、微控制器、微处理器、和/或其它物理硬件处理电路的集成电路设备(半导体材料芯片或管芯)中实现的电子和/或光学电路。处理器电路1502可执行存储在计算机可读介质中的程序代码,诸如操作系统1530、应用程序1532、其它程序1534等的程序代码。总线1506表示若干类型的总线结构中的任何一种总线结构的一个或多个,包括存储器总线或存储器控制器、外围总线、加速图形端口,以及处理器或使用各种总线体系结构中的任何一种的局部总线。系统存储器1504包括只读存储器(ROM)1508和随机存取存储器(RAM)1510。基本输入/输出系统1512(BIOS)储存在ROM 1508中。
计算系统1500还具有一个或多个以下驱动器:用于读写硬盘的硬盘驱动器1514、用于读或写可移动磁盘1518的磁盘驱动器1516、以及用于读或写诸如CD ROM、DVD ROM或其他光介质之类的可移动光盘1522的光盘驱动器1520。硬盘驱动器1514、磁盘驱动器1516,以及光驱动器1520分别通过硬盘驱动器接口1524、磁盘驱动器接口1526,以及光盘驱动器接口1528连接到总线1506。驱动器以及它们相关联的计算机可读介质为计算机提供了对计算机可读指令、数据结构、程序模块,及其他数据的非易失存储器。虽然描述了硬盘、可移动磁盘和可移动光盘,但是,也可以使用诸如闪存卡、数字视频盘、RAM、ROM等等之类的其他类型的基于硬件的计算机可读存储介质来储存数据。
数个程序模块可被储存在硬盘、磁盘、光盘、ROM或RAM上。这些程序包括操作系统1530、一个或多个应用程序1532、其他程序1534以及程序数据1536。应用程序1532或其他程序1534可包括例如用于实现开发系统100、源代码编辑器102、编译器104、执行引擎106、增量式编译启用器108、编译器400、编译器前端404、编译器后端406、编译模块408、增量式编译启用器410、代码改变确定器412、受影响函数确定器414、代码汇编器416、代码分析器436、经改变函数确定器502、经改变变量确定器504、依存关系图生成器802、依存关系图分析器902、编译器1302、链接器1304、编译器前端1306、编译器后端1308、流程图200、流程图300、流程图600、步骤702、流程图1000以及流程图1200以及本文中描述的进一步实施例的计算机程序逻辑(例如,计算机程序代码或指令)。
用户可以通过诸如键盘1538和定点设备1540之类的输入设备向计算设备1500中输入命令和信息。其它输入设备(未示出)可包括话筒、控制杆、游戏手柄、卫星天线、扫描仪、触摸屏和/或触摸平板、用于接收语音输入的语音识别系统、用于接收手势输入的手势识别系统、诸如此类。这些及其他输入设备常常通过耦合到总线1506的串行端口接口1542连接到处理电路1502,但是,也可以通过其他接口,诸如并行端口、游戏端口、通用串行总线(USB)端口,来进行连接。
显示屏1544也通过诸如视频适配器1546之类的接口连接到总线1506。显示屏1544可在计算设备1500外部或纳入其中。显示屏1544可显示信息,以及作为用于接收用户命令和/或其它信息(例如,通过触摸、手指姿势、虚拟键盘等等)的用户界面。除了显示屏1544之外,计算设备1500还可包括其他外围输出设备(未示出),如扬声器和打印机。
计算设备1500通过适配器或网络接口1550、调制解调器1552、或用于通过网络建立通信的其他手段连接到网络1548(例如,因特网)。可以是内置的或外置的调制解调器1552可以经由串行端口接口1542连接到总线1506,如图15所示,或者可以使用包括并行接口的另一接口类型连接到总线1506。
如此处所用的,术语“计算机程序介质”、“计算机可读介质”以及“计算机可读存储介质”被用于泛指物理硬件介质,诸如与硬盘驱动器1514相关联的硬盘、可移动磁盘1518、可移动光盘1522、其它物理硬件介质,诸如RAM、ROM、闪存卡、数字视频盘、zip磁盘、MEM、基于纳米的存储设备,以及其它类型的物理/有形硬件存储介质(包括图14的存储器1420)。这些计算机可读存储介质与通信介质(不包括通信介质)相区别且不重叠。通信介质通常在诸如载波等已调制数据信号中承载计算机可读指令、数据结构、程序模块或者其它数据。术语“已调制数据信号”是指使得以在信号中编码信息的方式来设定或改变其一个或多个特征的信号。作为示例而非限制,通信介质包括诸如声学、RF、红外线的无线介质和其它无线介质以及有线介质。实施例也针对这些通信介质。
如上文所指示的,计算机程序和模块(包括应用程序1532及其他程序1534)可被储存在硬盘、磁盘、光盘、ROM、RAM或其它硬件存储介质上。这样的计算机程序也可以通过网络接口1550、串行端口接口1542或任何其他接口类型来接收。这些计算机程序在由应用程序执行或加载时使得计算机1500能够实现此处所讨论的实施例的特征。因此,这些计算机程序表示计算机系统1500的控制器。
各实施例还涉及包括存储在任何计算机可读介质上的计算机代码或指令的计算机程序产品。这样的计算机程序产品包括硬盘驱动、光盘驱动、存储器设备包、便携式记忆棒、存储器卡以及其它类型的物理存储硬件。
IV.结语
尽管上文描述了本发明的各实施例,但是,应该理解,它们只是作为示例来呈现的,而不作为限制。那些精通有关技术的人员将理解,在不偏离如所附权利要求书所定义的本发明的精神和范围的情况下,可以在形式和细节方面进行各种修改。因此,本发明的范围不应该受到上述示例性实施例的任一个的限制,而只应根据下面的权利要求和它们的等效内容进行定义。

Claims (14)

1.一种计算机实现的方法,包括:
在至少一个存储器中存储第一源代码的经编译表示和中间语言表示的属性;
接收作为所述第一源代码的经修订版本的经修改源代码;
使用至少一个处理器电路生成所述经修改源代码的中间语言表示;
将经修订中间语言表示的属性和所存储的中间语言表示的属性相比较以确定所述经修改源代码中相对于所述第一源代码已改变的第一函数集合;
确定所述第一源代码中的受所确定的第一函数集合中的一个或多个函数影响的第二函数集合;
使用所述至少一个处理器电路编译所述第一函数集合和所述第二函数集合以生成经编译函数集合;以及
使用所述经编译函数集合来替换所述第一源代码的经编译表示中的所述第一和第二函数集合的经编译版本以生成所述经修改源代码的经编译表示。
2.如权利要求1所述的方法,其特征在于,所述将经修订中间语言表示的属性和所存储的中间语言表示的属性相比较以确定所述经修改源代码中相对于所述第一源代码已改变的第一函数集合包括:
确定包括为所存储的中间语言表示中的每一函数计算得到的校验和的第一校验和集合;
确定包括为所述经修订中间语言表示中的每一函数计算得到的校验和的第二校验和集合;
将所述第一校验和集合与所述第二校验和集合相比较以确定在所述经修订中间语言表示中相对于所存储的中间语言表示已改变的至少一个函数。
3.如权利要求1所述的方法,其特征在于,进一步包括:
将所述经修订中间语言表示的属性和所存储的中间语言表示的属性相比较以确定所述经修改源代码中相对于所述第一源代码已改变的任何变量;以及
其中所述确定第二函数集合包括:
确定所述第二函数集合以包括所述第一源代码中的受以下至少一者影响的任何函数:所确定的第一函数集合中的函数或者被确定为已改变的变量。
4.如权利要求3所述的方法,其特征在于,所述将经修订中间语言表示的属性和所存储的中间语言表示的属性相比较以确定所述经修改源代码中相对于所述第一源代码已改变的任何变量包括:
将中间语言表示的所存储的属性的变量和相关联属性与所述经修订中间语言表示的变量和相关联属性相比较以确定任何经改变变量。
5.如权利要求3所述的方法,其特征在于,所述确定所述第二函数集合以包括所述第一源代码中的受所确定的第一函数集合中的函数或者被确定为已改变的变量中的至少一者影响的任何函数包括:
基于所述第一源代码生成依存关系图;以及
分析所述依存关系图以确定所述第二函数集合。
6.如权利要求5所述的方法,其特征在于,所述基于所述第一源代码生成依存关系图包括:
将节点与所述第一源代码的中间语言表示的每一变量且与每一函数相关联以指定多个节点;
确定第一有向边集合,所述第一集合的每一有向边从第一函数节点延伸到所述依存关系图的第二函数节点,以指示与所述第一函数节点相关联的函数的变化影响与所述第二函数节点相关联的函数;
确定第二有向边集合,所述第二集合的每一有向边从变量节点延伸到所述依存关系图的第三函数节点,以指示与所述变量节点相关联的变量的变化影响与所述第三函数节点相关联的函数;以及
存储包括所述多个节点、所述第一有向边集合以及所述第二有向边集合的依存关系图。
7.如权利要求6所述的方法,其特征在于,所述分析所述依存关系图以确定所述第二函数集合包括:
从所确定的第一函数集合中的每一函数的节点来遍历所述第一有向边集合中的有向边以确定第一受影响函数;
从被确定为在所述经修订中间语言表示中已改变的每一变量的节点来遍历所述第二有向边集合的有向边以确定第二受影响函数;以及
所述第二函数集合包括所述第一受影响函数和所述第二受影响函数。
8.一种编译器,包括:
至少一个处理器电路;
编译器前端,其被配置成使用至少一个处理器电路生成接收到的源代码文件的中间语言表示,包括被配置成生成第一源代码的中间语言表示和作为所述第一源代码的经修订版本的经修订源代码的中间语言表示;
编译器后端,其被配置成使用所述至少一个处理器电路生成所述接收到的源代码文件的中间语言表示的经编译表示,包括被配置成生成所述第一源代码的经编译表示和所述经修改源代码的中间语言表示的经编译表示,所述编译器后端包括:
配置成执行增量式编译的增量式编译启用器,所述增量式编译启用器包括:
配置成确定所述经修改源代码中相对于所述第一源代码已改变的任何变量和第一函数集合的代码改变确定器,以及
配置成确定所述第一源代码中受任何经改变变量和经改变的第一函数集合中的任何函数影响的第二函数集合的受影响函数确定器;
所述编译器后端被配置成编译所述第一函数集合和所述第二函数集合以生成经编译函数集合;以及
所述增量式编译启用器进一步包括:
代码汇编器,其被配置成使用所述经编译函数集合来替换所述第一源代码的经编译表示中所述第一和第二函数集合的经编译版本以生成所述经修改源代码的经编译表示。
9.如权利要求8所述的编译器,其特征在于,所述代码改变确定器包括:
经改变函数确定器,其被配置成:
确定包括为所述第一源代码的中间语言表示中的每一函数计算得到的校验和的第一校验和集合;
确定包括为所述经修订中间语言表示中的每一函数计算得到的校验和的第二校验和集合;
将所述第一校验和集合与所述第二校验和集合相比较以确定在所述经修订中间语言表示中相对于所存储的中间语言表示已改变的至少一个函数。
10.如权利要求8所述的编译器,其特征在于,所述代码改变确定器包括:
经改变变量确定器,其被配置成:
将所述第一源代码的中间语言表示的变量和相关联属性与所述经修订中间语言表示的变量和相关联属性相比较以确定任何经改变变量。
11.如权利要求8所述的编译器,其特征在于,还包括:
依存关系图生成器,其被配置成基于所述第一源代码生成依存关系图;以及
其中所述受影响函数确定器包括:
配置成分析所述依存关系图以确定所述第二函数集合的依存关系图分析器。
12.如权利要求11所述的编译器,其特征在于,所述依存关系图生成器被配置成:
将节点与所述第一源代码的中间语言表示的每一变量且与每一函数相关联以指定多个节点;
确定第一有向边集合,所述第一集合的每一有向边从第一函数节点延伸到所述依存关系图的第二函数节点,以指示与所述第一函数节点相关联的函数的变化影响与所述第二函数节点相关联的函数;
确定第二有向边集合,所述第二集合的每一有向边从变量节点延伸到所述依存关系图的第三函数节点,以指示与所述变量节点相关联的变量的变化影响与所述第三函数节点相关联的函数;以及
存储包括所述多个节点、所述第一有向边集合以及所述第二有向边集合的依存关系图。
13.如权利要求12所述的编译器,其特征在于,所述依存关系图分析器被配置成:
从所确定的第一函数集合中的每一函数的节点来遍历所述第一有向边集合中的有向边以确定第一受影响函数;
从被确定为在所述经修订中间语言表示中已改变的每一变量的节点来遍历所述第二有向边集合的有向边以确定第二受影响函数;以及
所述第二函数集合包括所述第一受影响函数和所述第二受影响函数。
14.一种计算机程序产品,包括其上记录有计算机程序逻辑的计算机可读介质,包括:
使得处理器能够执行权利要求1-7中任一项的计算机程序逻辑。
CN201580033415.1A 2014-06-25 2015-06-23 整个程序代码的增量式编译 Active CN106462434B (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US14/315,158 2014-06-25
US14/315,158 US9442707B2 (en) 2014-06-25 2014-06-25 Incremental whole program compilation of code
PCT/US2015/037046 WO2015200234A1 (en) 2014-06-25 2015-06-23 Incremental compilation of whole program code

Publications (2)

Publication Number Publication Date
CN106462434A true CN106462434A (zh) 2017-02-22
CN106462434B CN106462434B (zh) 2019-07-26

Family

ID=53674282

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201580033415.1A Active CN106462434B (zh) 2014-06-25 2015-06-23 整个程序代码的增量式编译

Country Status (4)

Country Link
US (2) US9442707B2 (zh)
EP (1) EP3161627B1 (zh)
CN (1) CN106462434B (zh)
WO (1) WO2015200234A1 (zh)

Cited By (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107368292A (zh) * 2017-03-29 2017-11-21 阿里巴巴集团控股有限公司 一种资源编译方法及装置
CN108897545A (zh) * 2018-06-29 2018-11-27 南昌华勤电子科技有限公司 代码编译方法及装置
CN109240698A (zh) * 2017-06-08 2019-01-18 中国移动通信集团浙江有限公司 一种增量编译处理方法及装置
CN109358841A (zh) * 2018-08-15 2019-02-19 中国平安人寿保险股份有限公司 网页应用开发编译方法、装置及存储设备、计算机设备
CN109375921A (zh) * 2018-08-15 2019-02-22 中国平安人寿保险股份有限公司 页面文件快速编译方法、装置及存储设备、计算机设备
CN109460235A (zh) * 2018-10-09 2019-03-12 珠海格力电器股份有限公司 组态软件编译方法
CN111142466A (zh) * 2018-11-02 2020-05-12 横河电机株式会社 工程装置、工程装置的控制方法和存储介质
CN111399844A (zh) * 2020-03-12 2020-07-10 同盾(广州)科技有限公司 安全编译方法、装置、电子设备及计算机可读介质
CN111736849A (zh) * 2020-06-24 2020-10-02 浪潮电子信息产业股份有限公司 一种源代码编译方法及系统
CN111736869A (zh) * 2020-06-19 2020-10-02 浙江大搜车软件技术有限公司 服务端接口的版本更新方法和服务端接口的调用方法
CN112905153A (zh) * 2020-12-07 2021-06-04 中国科学院软件研究所 一种面向软件定义卫星的软件并行构建方法以及装置
CN114174983A (zh) * 2019-07-31 2022-03-11 国际商业机器公司 使用测试向量自动验证高级构造的优化
CN115167868A (zh) * 2022-07-29 2022-10-11 阿里巴巴(中国)有限公司 代码编译方法、装置、设备及计算机存储介质
WO2023123111A1 (zh) * 2021-12-29 2023-07-06 华为技术有限公司 编译方法以及用于编译的装置
JP7450565B2 (ja) 2021-02-02 2024-03-15 三菱電機株式会社 コンパイル方法、開発支援装置および制御システム

Families Citing this family (22)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9916187B2 (en) 2014-10-27 2018-03-13 Oracle International Corporation Graph database system that dynamically compiles and executes custom graph analytic programs written in high-level, imperative programming language
US9378013B2 (en) * 2014-11-14 2016-06-28 Semmle Limited Incremental source code analysis
US9817643B2 (en) * 2015-07-17 2017-11-14 Microsoft Technology Licensing, Llc Incremental interprocedural dataflow analysis during compilation
CN108139898B (zh) * 2015-08-11 2021-03-23 起元技术有限责任公司 数据处理图编译
US10120664B2 (en) * 2015-08-28 2018-11-06 International Business Machines Corporation Incremental build generation
US9910649B2 (en) * 2016-01-19 2018-03-06 International Business Machines Corporation Integrating and sharing software build component targets
US10506016B2 (en) 2016-05-19 2019-12-10 Oracle International Corporation Graph analytic engine that implements efficient transparent remote access over representational state transfer
US10133560B2 (en) * 2016-09-22 2018-11-20 Qualcomm Innovation Center, Inc. Link time program optimization in presence of a linker script
US11431727B2 (en) * 2017-03-03 2022-08-30 Microsoft Technology Licensing, Llc Security of code between code generator and compiler
US10140436B1 (en) * 2017-07-14 2018-11-27 Flexera Software Llc Program obfuscation by reorganizing execution paths
US10990364B2 (en) 2018-06-06 2021-04-27 Ab Initio Technology Llc Updating executable graphs
US11144438B1 (en) * 2018-11-26 2021-10-12 Yourbase Inc. Incremental build system using an inferred dependency graph collected with a system monitor
US11200154B2 (en) * 2019-03-11 2021-12-14 International Business Machines Corporation Function modification for software application testing
US11023212B1 (en) 2019-11-07 2021-06-01 International Business Machines Corporation Executing a part of a compiler generated code as a function
US11301221B2 (en) * 2019-12-13 2022-04-12 Sap Se Rapid code compiling system
US11537372B2 (en) * 2020-03-25 2022-12-27 ManyCore Corporation Generating compilable machine code programs from dynamic language code
CN112214215B (zh) * 2020-12-07 2021-11-02 中国科学院软件研究所 一种面向软件定义卫星的软件快速开发系统与方法
WO2022204410A1 (en) * 2021-03-25 2022-09-29 Wealthcounsel Properties, Llc Systems and methods for facilitating modifications and updates to shared content
US11853753B1 (en) 2021-08-23 2023-12-26 Amazon Technologies, Inc. Detection, presentation, and resolution of bottlenecks in monolith decomposition
US11822910B2 (en) * 2021-10-14 2023-11-21 International Business Machines Corporation Reducing a delivery size of a software update
US20230236812A1 (en) * 2022-01-21 2023-07-27 Dell Products L.P. Using sustainability to recompile and optimize interrupted languages and byte-level execution in meeting sustainability goals
US20230368107A1 (en) * 2022-05-13 2023-11-16 Dell Products L.P. System and method of process placement recommendation based on inferred sustainability advantages for sustainable energy efficiency

Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP0856788A2 (en) * 1992-06-26 1998-08-05 Digital Equipment Corporation Smart recompilation of source program
US6219834B1 (en) * 1998-05-15 2001-04-17 International Business Machines Corporation Extensible compiler and method
CN101034361A (zh) * 2007-01-18 2007-09-12 浙江大学 一种基于指令代价的编译器优化代码生成方法
US20090100410A1 (en) * 2007-10-12 2009-04-16 Novell, Inc. System and method for tracking software changes
US20100325608A1 (en) * 2009-06-19 2010-12-23 Microsoft Corporation Generation of parallel code representations
US20110271261A1 (en) * 2010-04-30 2011-11-03 Microsoft Corporation Modifiable high-level intermediate representation of source code
US20130031536A1 (en) * 2011-07-28 2013-01-31 De Subrato K Apparatus and method for improving the performance of compilers and interpreters of high level programming languages

Family Cites Families (66)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5396627A (en) 1987-11-06 1995-03-07 Hitachi, Ltd. Method of producing object program based on interprocedural dataflow analysis of a source program
US5193191A (en) 1989-06-30 1993-03-09 Digital Equipment Corporation Incremental linking in source-code development system
US5170465A (en) 1989-06-30 1992-12-08 Digital Equipment Corporation Incremental-scanning compiler for source-code development system
US5204960A (en) 1990-01-08 1993-04-20 Microsoft Corporation Incremental compiler
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
US5485616A (en) 1993-10-12 1996-01-16 International Business Machines Corporation Using program call graphs to determine the maximum fixed point solution of interprocedural bidirectional data flow problems in a compiler
US6091896A (en) 1995-12-22 2000-07-18 Hewlett-Packard Company Debugging optimized code using data change points
US5848274A (en) * 1996-02-29 1998-12-08 Supercede, Inc. Incremental byte code compilation system
CA2175711A1 (en) * 1996-05-01 1997-11-02 Lee Richard Nackman Incremental compilation of c++ programs
US5812855A (en) 1996-06-03 1998-09-22 Silicon Graphics, Inc. System and method for constaint propagation cloning for unknown edges in IPA
US6738967B1 (en) * 2000-03-14 2004-05-18 Microsoft Corporation Compiling for multiple virtual machines targeting different processor architectures
US7516441B2 (en) * 2001-06-04 2009-04-07 Microsoft Corporation Method and system for program editing and debugging in a common language runtime environment
US20030005421A1 (en) 2001-06-29 2003-01-02 Raj Prakash Interprocedural optimization framework
US7051322B2 (en) * 2002-12-06 2006-05-23 @Stake, Inc. Software analysis framework
US7454745B2 (en) * 2003-07-31 2008-11-18 International Business Machines Corporation Automated semantic-based updates to modified code base
US20060168565A1 (en) 2005-01-24 2006-07-27 International Business Machines Corporation Method and system for change classification
US7844958B2 (en) * 2005-03-11 2010-11-30 Aptana, Inc. System and method for creating target byte code
US7707547B2 (en) * 2005-03-11 2010-04-27 Aptana, Inc. System and method for creating target byte code
US9129038B2 (en) * 2005-07-05 2015-09-08 Andrew Begel Discovering and exploiting relationships in software repositories
US7721272B2 (en) * 2005-12-12 2010-05-18 Microsoft Corporation Tracking file access patterns during a software build
US7797689B2 (en) * 2005-12-12 2010-09-14 Microsoft Corporation Using file access patterns in providing an incremental software build
US8769511B2 (en) * 2006-02-16 2014-07-01 The Regents Of The University Of California Dynamic incremental compiler and method
US8739137B2 (en) * 2006-10-19 2014-05-27 Purdue Research Foundation Automatic derivative method for a computer programming language
US8856752B2 (en) * 2007-10-26 2014-10-07 Microsoft Corporation Monitoring asset state to enable partial build
CN100576172C (zh) 2008-05-27 2009-12-30 华耀环宇科技(北京)有限公司 一种通过分析代码变化确定功能点变化的方法
US20090313600A1 (en) 2008-06-13 2009-12-17 Microsoft Corporation Concurrent code generation
US20100128866A1 (en) 2008-11-26 2010-05-27 Microsoft Corporation Modification of system call behavior
US8789032B1 (en) 2009-02-27 2014-07-22 Google Inc. Feedback-directed inter-procedural optimization
US8516437B2 (en) * 2010-01-22 2013-08-20 Ebay Inc. System and method for creating, managing, and reusing schema type definitions in services oriented architecture services, grouped in the form of libraries
US8572477B1 (en) * 2010-01-29 2013-10-29 Asana, Inc. Web-based incremental computing
US20110239195A1 (en) * 2010-03-25 2011-09-29 Microsoft Corporation Dependence-based software builds
US8365156B2 (en) * 2010-04-17 2013-01-29 Microsoft Corporation Intermediate language support for change resilience
US8375373B2 (en) * 2010-04-19 2013-02-12 Microsoft Corporation Intermediate language support for change resilience
US8473928B2 (en) 2010-04-19 2013-06-25 Sap Ag Call graph simplification/comparison and automatic initial suspects finding of performance degradations
US8776014B2 (en) * 2010-09-23 2014-07-08 Microsoft Corporation Software build analysis
US8683449B2 (en) 2010-10-28 2014-03-25 Juniper Networks, Inc. Automated parallel software code impact analysis
US8914780B2 (en) * 2011-03-04 2014-12-16 Microsoft Corporation Incremental generation of managed assemblies
US8631395B2 (en) 2011-09-02 2014-01-14 Microsoft Corporation Inter-procedural dead catch handler optimizations
US9098299B2 (en) * 2011-09-16 2015-08-04 Facebook, Inc. Run time incremental compilation of script code
US8671397B2 (en) 2011-09-27 2014-03-11 International Business Machines Corporation Selective data flow analysis of bounded regions of computer software applications
US20150199187A1 (en) * 2011-10-07 2015-07-16 Google Inc. Eager tokenization of programs and distribution of token sequences to client
US8966463B2 (en) 2011-11-29 2015-02-24 Microsoft Technology Licensing, Llc Eliminating redundant function calls
US9110751B2 (en) * 2012-02-13 2015-08-18 Microsoft Technology Licensing, Llc Generating and caching software code
US9002812B2 (en) * 2012-04-01 2015-04-07 Microsoft Technology Licensing, Llc Checksum and hashing operations resilient to malicious input data
US11132251B2 (en) * 2012-05-31 2021-09-28 Samsung Electronics Co., Ltd. Enhanced checksum system
US8959495B2 (en) * 2012-09-14 2015-02-17 Oracle International Corporation Unifying static and dynamic compiler optimizations in source-code bases
US9122490B2 (en) * 2012-10-17 2015-09-01 Microsoft Technology Licensing, Llc Code dependency calculation
US9201649B2 (en) * 2012-10-26 2015-12-01 Inforsys Limited Systems and methods for estimating an impact of changing a source file in a software
US9696974B2 (en) * 2013-03-13 2017-07-04 Microsoft Technology Licensing, Llc. Graph-based model for type systems
US9317265B2 (en) * 2013-03-25 2016-04-19 Facebook, Inc. Optimizing intermediate representation of script code for atomic execution
US20140306964A1 (en) * 2013-04-12 2014-10-16 Microsoft Corporation Incremental compiling of a declarative program
US8990789B2 (en) * 2013-04-18 2015-03-24 Facebook, Inc. Optimizing intermediate representation of script code by eliminating redundant reference count operations
US9152400B2 (en) * 2013-04-18 2015-10-06 Facebook, Inc. Eliminating redundant reference count operations in intermediate representation of script code
US8984485B2 (en) 2013-05-01 2015-03-17 International Business Machines Corporation Analysis of source code changes
US9195441B2 (en) * 2013-07-30 2015-11-24 Facebook, Inc. Systems and methods for incremental compilation at runtime using relaxed guards
US9195458B2 (en) * 2013-07-31 2015-11-24 International Business Machines Corporation System and/or method for computing interprocedural dominators
US9202188B2 (en) * 2013-08-30 2015-12-01 International Business Machines Corporation Impact analysis of change requests of information technology systems
US9244679B1 (en) * 2013-09-12 2016-01-26 Symantec Corporation Systems and methods for automatically identifying changes in deliverable files
US9600256B2 (en) * 2013-10-18 2017-03-21 Microsoft Technology Licensing, Llc Incrementally compiling software artifacts from an interactive development environment
US10152312B2 (en) * 2014-01-21 2018-12-11 Nvidia Corporation Dynamic compiler parallelism techniques
US9740464B2 (en) * 2014-05-30 2017-08-22 Apple Inc. Unified intermediate representation
US9182955B1 (en) * 2014-06-06 2015-11-10 Microsoft Technology Licensing, Llc Data-dependent control flow reduction
US10261889B2 (en) * 2014-06-25 2019-04-16 Microsoft Technology Licensing, Llc Techniques for edit-and-continue and enhanced optimized debugging on optimized code
US20160048376A1 (en) * 2014-08-12 2016-02-18 Advanced Micro Devices, Inc. Portable binary image format (pbif) for pre-compiled kernels
US10241763B2 (en) * 2014-12-10 2019-03-26 Microsoft Technology Licensing, Llc. Inter-procedural type propagation for devirtualization
US20160357530A1 (en) * 2015-06-05 2016-12-08 Apple Inc. Method and apparatus for intermediate representation of applications

Patent Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP0856788A2 (en) * 1992-06-26 1998-08-05 Digital Equipment Corporation Smart recompilation of source program
US6219834B1 (en) * 1998-05-15 2001-04-17 International Business Machines Corporation Extensible compiler and method
CN101034361A (zh) * 2007-01-18 2007-09-12 浙江大学 一种基于指令代价的编译器优化代码生成方法
US20090100410A1 (en) * 2007-10-12 2009-04-16 Novell, Inc. System and method for tracking software changes
US20100325608A1 (en) * 2009-06-19 2010-12-23 Microsoft Corporation Generation of parallel code representations
US20110271261A1 (en) * 2010-04-30 2011-11-03 Microsoft Corporation Modifiable high-level intermediate representation of source code
US20130031536A1 (en) * 2011-07-28 2013-01-31 De Subrato K Apparatus and method for improving the performance of compilers and interpreters of high level programming languages

Cited By (20)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107368292B (zh) * 2017-03-29 2020-06-12 阿里巴巴集团控股有限公司 一种资源编译方法及装置
CN107368292A (zh) * 2017-03-29 2017-11-21 阿里巴巴集团控股有限公司 一种资源编译方法及装置
CN109240698A (zh) * 2017-06-08 2019-01-18 中国移动通信集团浙江有限公司 一种增量编译处理方法及装置
CN109240698B (zh) * 2017-06-08 2021-11-23 中国移动通信集团浙江有限公司 一种增量编译处理方法及装置
CN108897545A (zh) * 2018-06-29 2018-11-27 南昌华勤电子科技有限公司 代码编译方法及装置
CN109358841B (zh) * 2018-08-15 2024-04-30 中国平安人寿保险股份有限公司 网页应用开发编译方法、装置及存储设备、计算机设备
CN109375921A (zh) * 2018-08-15 2019-02-22 中国平安人寿保险股份有限公司 页面文件快速编译方法、装置及存储设备、计算机设备
CN109358841A (zh) * 2018-08-15 2019-02-19 中国平安人寿保险股份有限公司 网页应用开发编译方法、装置及存储设备、计算机设备
CN109460235A (zh) * 2018-10-09 2019-03-12 珠海格力电器股份有限公司 组态软件编译方法
CN111142466A (zh) * 2018-11-02 2020-05-12 横河电机株式会社 工程装置、工程装置的控制方法和存储介质
CN114174983A (zh) * 2019-07-31 2022-03-11 国际商业机器公司 使用测试向量自动验证高级构造的优化
CN114174983B (zh) * 2019-07-31 2022-10-11 国际商业机器公司 用于高级构造的优化的自动验证的方法和系统
CN111399844A (zh) * 2020-03-12 2020-07-10 同盾(广州)科技有限公司 安全编译方法、装置、电子设备及计算机可读介质
CN111736869A (zh) * 2020-06-19 2020-10-02 浙江大搜车软件技术有限公司 服务端接口的版本更新方法和服务端接口的调用方法
CN111736849A (zh) * 2020-06-24 2020-10-02 浪潮电子信息产业股份有限公司 一种源代码编译方法及系统
CN112905153A (zh) * 2020-12-07 2021-06-04 中国科学院软件研究所 一种面向软件定义卫星的软件并行构建方法以及装置
CN112905153B (zh) * 2020-12-07 2023-10-27 中国科学院软件研究所 一种面向软件定义卫星的软件并行构建方法以及装置
JP7450565B2 (ja) 2021-02-02 2024-03-15 三菱電機株式会社 コンパイル方法、開発支援装置および制御システム
WO2023123111A1 (zh) * 2021-12-29 2023-07-06 华为技术有限公司 编译方法以及用于编译的装置
CN115167868A (zh) * 2022-07-29 2022-10-11 阿里巴巴(中国)有限公司 代码编译方法、装置、设备及计算机存储介质

Also Published As

Publication number Publication date
US20170031666A1 (en) 2017-02-02
CN106462434B (zh) 2019-07-26
EP3161627B1 (en) 2018-04-18
US10409574B2 (en) 2019-09-10
EP3161627A1 (en) 2017-05-03
WO2015200234A1 (en) 2015-12-30
US20150378697A1 (en) 2015-12-31
US9442707B2 (en) 2016-09-13

Similar Documents

Publication Publication Date Title
CN106462434B (zh) 整个程序代码的增量式编译
CN106471476B (zh) 用于对经优化代码的编辑并继续以及增强的经优化调试的技术
CN102696012B (zh) 从代码使用中创建所推断的符号
US10540262B2 (en) Using edit and continue to dynamically set and unset optimizations in source code while debugging
US10191832B2 (en) Multi-language playback framework
US9928156B2 (en) Missing include suggestions for external files
US10541042B2 (en) Level-crossing memory trace inspection queries
CN105683924A (zh) 通过从在本机模式中执行转变为在经解释的模式中执行来调试本机代码
US20180189168A1 (en) Test automation using multiple programming languages
EP2706459B1 (en) Apparatus and method for validating a compiler for a reconfigurable processor
CN109313547A (zh) 用于cpu利用率和代码重构的查询优化器
CN103123605A (zh) 一种Android平台自动化集成测试方法和装置
WO2016044109A1 (en) Code development tool with multi-context intelligent assistance
CN110442515A (zh) 应用测试方法、装置、设备及可读存储介质
CN114579452A (zh) 接口影响检测方法及相关设备
CN109634569A (zh) 基于注解的流程实现方法、装置、设备及可读存储介质
Mühlberg et al. Learning assertions to verify linked-list programs
Huang et al. Specialized accelerators and compiler flows: Replacing accelerator APIs with a formal software/hardware interface
US11740875B2 (en) Type inference in dynamic languages
CN113260976A (zh) 用于在编译源代码中调度指令技术
US9256406B1 (en) Graphically scoped C-functions inside stateflow
US11876681B2 (en) Topology recommendation platform for application architecture
JP2015095016A (ja) データ処理システム、入力支援方法、及び入力支援プログラム
Shahbazian Techniques for Methodically Exploring Software Development Alternatives
Palanisamy Extended Metamodelica Based Integrated Copiler Generator

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant