CN107077365B - 有选择地加载预编译的头部和/或其部分 - Google Patents

有选择地加载预编译的头部和/或其部分 Download PDF

Info

Publication number
CN107077365B
CN107077365B CN201580050466.5A CN201580050466A CN107077365B CN 107077365 B CN107077365 B CN 107077365B CN 201580050466 A CN201580050466 A CN 201580050466A CN 107077365 B CN107077365 B CN 107077365B
Authority
CN
China
Prior art keywords
header
precompiled
context
portions
computer program
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.)
Active
Application number
CN201580050466.5A
Other languages
English (en)
Other versions
CN107077365A (zh
Inventor
M·L·哈尔
S·S·玛德胡吉里
J·C·埃米特
L·C·默瑟斯古
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 CN107077365A publication Critical patent/CN107077365A/zh
Application granted granted Critical
Publication of CN107077365B publication Critical patent/CN107077365B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

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
    • G06F8/42Syntactic analysis
    • G06F8/423Preprocessors

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
  • Stored Programmes (AREA)

Abstract

这里描述了能够有选择地加载预编译的头部和/或其部分的技术。预编译的头部是头部文件的编译(例如,预编译)的表示。例如,编译的表示可以是以编译器可以比非编译的头部文件更快地处理的中间形式。在一个示例中,可以基于是否在计算机程序中引用预编译的头部和/或其部分来有选择地加载预编译的头部和/或其部分。在另一示例中,可以推迟加载预编译的头部的部分,直至在计算机程序中引用该部分的内容。

Description

有选择地加载预编译的头部和/或其部分
背景技术
计算机程序构建***通常包括编译器和链接器,该编译器编译计算机程序的翻译单位(例如,已经被预处理的源文件)以提供对象文件,该链接器按照指定的顺序链接对象文件以提供计算机程序的可执行表示。在常规构建***中,编译器经常具有计算机程序的相对地有限的视图。例如,编译器传统地一次处理计算机程序的一个翻译单位,这可能限制编译器编译计算机程序的速度。
可以使用预编译的头部以努力增加编译计算机程序的速度。然而,在利用预编译的头部的常规构建***中,源代码被编译直至一点,并且在存储器中存留所得的编译的代码作为单个代码块。随后执行整个代码块作为来自存储器的单个块。另外,常规构建***经常对如何可以使用预编译的头部施加相对地严格的限制。
发明内容
这里描述了用于有选择地加载预编译的头部和/或其部分等的各种方式。预编译的头部是头部文件的编译(例如,预编译)的表示。例如,编译的表示可以是以编译器可以比非编译的头部文件更快地处理的中间形式。头部文件在这里被定义为在编译的程序中包括的源代码。将认识到,虽然本公开内容全篇使用术语“头部文件”,但是如这里描述的头部文件无需必然地是如在C++编程语言的上下文中普遍地已知的“头部文件”。另外,头部文件无需必然地是文件。在第一示例方式中,头部文件被编译以在数据结构中提供预编译的头部。预编译的头部从数据结构被提取。在计算机程序的编译期间,与预编译的头部关联的引用被加载。加载预编译的头部的部分被推迟,直至该部分的内容在计算机程序中被引用。
在第二示例方式中,头部文件被编译以提供预编译的头部。每个预编译的头部被包括在相应的数据结构中,该数据结构表示预编译的头部从其被编译的头部文件的源代码。每个预编译的头部从相应的数据结构被提取。每个预编译的头部被与其它预编译的头部区分。每个预编译的头部基于相应的预编译的头部是否被引用在计算机程序中来独立于其它预编译的头部独立地、有选择地被加载。
在第三示例方式中,头部文件被编译以在数据结构中提供预编译的头部。预编译的头部从数据结构被提取。预编译的头部的每个部分基于与预编译的头部的相应的部分对应的引用被与预编译的头部的其它部分区分。预编译的头部的每个部分基于相应的部分是否被引用在计算机程序中来与预编译的头部的其它部分独立地、有选择地被加载。
提供这一发明内容以用简化的形式介绍以下在具体实施方式中进一步描述的概念选集。这一发明内容没有旨在于标识要求保护的主题内容的关键特征或者实质特征,它也没有旨在于用来限制要求保护的主题内容的范围。另外,注意,本发明不限于在具体实施方式和/或本文的其它章节中描述的具体实施例。这里呈现这样的实施例仅为了说明目的。附加实施例将基于这里包含的教导而为相关领域技术人员所清楚。
附图说明
在这里被并入并且形成说明书的部分的附图图示了本发明的实施例,并且与描述一起进一步用于说明涉及的原理并且使相关领域技术人员能够实现和使用公开的技术。
图1是根据一个实施例的示例有选择加载***的框图。
图2至图4描绘了根据实施例的用于有选择地加载预编译的头部的至少部分的示例方法的流程图。
图5至图7描绘了根据实施例的用于有选择地加载预编译的头部的示例方法的流程图。
图8至图10描绘了根据实施例的用于有选择地加载预编译的头部的部分的示例方法的流程图。
图11是根据一个实施例的设备的框图,该设备包括图1中所示的有选择地加载构建逻辑的示例实现方式。
图12描绘了其中可以对实施例进行实施的示例计算机。
公开的技术的特征和优点将从以下在与附图结合进行时被阐述的具体实施方式变得更清楚,在附图中,标号全篇标识对应的单元。在附图中,相似标号一般地指示相同、功能上相似和/或结构上相似的单元。单元第一次出现的附图由对应的标号中的最左位指示。
具体实施方式
I.引言
以下具体实施方式参照图示了本发明的示例性实施例的附图。然而,本发明的范围不限于这些实施例,而是代之以由所附权利要求定义。因此,超出附图中所示的实施例之外的实施例(比如所示的实施例的修改的版本)也可以被本发明所涵盖。
在说明书中对“一个实施例”、“实施例”、“示例实施例”等的引用指示描述的实施例可以包括特定特征、结构或者特性,但是每个实施例可以未必包括该特定特征、结构或者特性。另外,这样的短语未必指代相同实施例。另外,在与一个实施例结合描述特定特征、结构或者特性时,主张在相关领域技术人员的知识内与无论是否明确地描述的其它实施例结合地实施这样的特征、结构或者特性。
II.示例实施例
这里描述的示例实施例能够有选择地加载预编译的头部和/或其部分。预编译的头部是头部文件的编译(例如,预编译)的表示。例如,编译的表示可以是以编译器可以比非编译的头部文件更快地处理的中间形式。预编译的头部可以是被优化和预编译的头部文件的非文本版本,尽管示例实施例的范围在这一点上不受限制。在一个示例中,可以基于是否在计算机程序中引用预编译的头部和/或其部分来有选择地加载预编译的头部和/或其部分。在另一示例中,可以推迟加载预编译的头部的部分,直至在计算机程序中引用该部分。
这里描述的示例技术具有如与用于构建计算机程序的常规技术比较的多种益处。例如,示例技术可以能够在使用在常规构建***中盛行的预编译的头部时减少(例如,消除)限制中的至少一些限制。例如,这里描述的技术可以使预编译的头部和/或其部分能够与其它预编译的头部和/或其它部分分离地被加载。根据这一示例,可以在相应的数据结构中存储预编译的头部和/或部分,这些数据结构表示从其编译预编译的头部的头部文件的源代码。示例技术可以能够在预编译的头部的版本之间区分并且确定版本是否适合加载。
示例技术可以能够减少在其中运用它们的构建***的复杂性。可以实施示例技术而没有改变计算机程序中的代码(例如,源代码)、没有标注和/或没有改变构建***。可以用对计算机程序的用户透明的方式实施示例技术。例如,用来编译预编译的头部的编译器可以与关联于构建***的共享的预编译的头部高速缓存透明地交互。例如,编译器可以查询共享的预编译的头部高速缓存以确定适合的预编译的头部是否在遇到include指示(include directive)时可用。如果适合的预编译的头部可用,则编译器可以使用预编译的头部取代解析(例如,重新解析)对应的头部文件。不适合的预编译的头部可以变成用于高速缓存以用于以后重用的候选。示例技术可以比常规技术更可伸缩。
描述了示例方法。根据第一示例方法,编译头部文件以在数据结构中提供预编译的头部。从数据结构提取预编译的头部。在计算机程序的编译期间加载与预编译的头部关联的引用。推迟加载预编译的头部的部分,直至在计算机程序中引用该部分的内容。
根据第二示例方法,编译头部文件以提供预编译的头部。在相应的数据结构中包括每个预编译的头部,该数据结构表示从其编译预编译的头部的头部文件的源代码。从相应的数据结构提取每个预编译的头部。区分每个预编译的头部与预编译的头部中的其它预编译的头部。基于是否在计算机程序中引用相应的预编译的头部来独立于预编译的头部中的其它预编译的头部、有选择地加载每个预编译的头部。
根据第三示例方法,编译头部文件以在数据结构中提供预编译的头部。从数据结构提取预编译的头部。基于与预编译的头部的相应的部分对应的引用来区分预编译的头部的每个部分与预编译的头部的其它部分。基于是否在计算机程序中引用相应的部分来独立于预编译的头部的其它部分、有选择地加载预编译的头部的每个部分。
也描述了示例***。第一示例***包括编译器、提取器和加载器。编译器被配置为编译头部文件以在数据结构中提供预编译的头部。提取器被配置为从数据结构提取预编译的头部。加载器被配置为在计算机程序的编译期间加载与预编译的头部关联的引用。加载器还被配置为推迟加载预编译的头部的部分,直至在计算机程序中引用该部分的内容。
第二示例***包括编译器、提取器和加载器。编译器被配置为编译头部文件以提供预编译的头部。在相应的数据结构中包括每个预编译的头部,该数据结构表示从其编译预编译的头部的头部文件的源代码。提取器被配置为从相应的数据结构提取每个预编译的头部。提取器还被配置为区分每个预编译的头部与预编译的头部中的其它预编译的头部。加载器被配置为基于是否在计算机程序中引用相应的预编译的头部来独立于预编译的头部中的其它预编译的头部、有选择地加载每个预编译的头部。
第三示例***包括编译器、提取器和加载器。编译器被配置为编译头部文件以在数据结构中提取预编译的头部。提取器被配置为从数据结构提取预编译的头部。提取器还被配置为基于与预编译的头部的相应的部分对应的引用来区分预编译的头部的每个部分与预编译的头部的其它部分。加载器被配置为基于是否在计算机程序中引用相应的部分来独立于预编译的头部的其它部分、有选择地加载预编译的头部的每个部分。
也公开示例计算机程序产品。第一示例计算机程序产品包括计算机可读介质,该计算机可读介质具有在其上记录的用于使基于处理器的***能够有选择地加载预编译的头部的至少部分的计算机程序逻辑。计算机程序产品包括第一程序逻辑模块、第二程序逻辑模块和第三程序逻辑模块。第一程序逻辑模块用于使基于处理器的***能够编译头部文件以在数据结构中提供预编译的头部。第二程序逻辑模块用于使基于处理器的***能够从数据结构提取预编译的头部。第三程序逻辑模块用于使基于处理器的***能够在计算机程序的编译期间加载与预编译的头部关联的引用。第三程序逻辑模块也用于使基于处理器的***能够推迟预编译的头部的部分的加载,直至在计算机程序中引用该部分的内容。
第二示例计算机程序产品包括计算机可读介质,该计算机可读介质具有在其上记录的用于使基于处理器的***能够有选择地加载预编译的头部的计算机程序逻辑。计算机程序产品包括第一程序逻辑模块、第二程序逻辑模块、第三程序逻辑模块和第四程序逻辑模块。第一程序逻辑模块用于使基于处理器的***能够编译头部文件以提供预编译的头部。在相应的数据结构中包括每个预编译的头部,该数据结构表示从其编译预编译的头部的头部文件的源代码。第二程序逻辑模块用于使基于处理器的***能够从相应的数据结构提取每个预编译的头部。第三程序逻辑模块用于使基于处理器的***能够区分每个预编译的头部与预编译的头部中的其它预编译的头部。第四程序逻辑模块用于使基于处理器的***能够基于是否在计算机程序中引用相应的预编译的头部来独立于预编译的头部中的其它预编译的头部、有选择地加载每个预编译的头部。
第三示例计算机程序产品包括计算机可读介质,该计算机可读介质具有在其上记录的用于使基于处理器的***能够有选择地加载预编译的头部的部分的计算机程序逻辑。计算机程序产品包括第一程序逻辑模块、第二程序逻辑模块、第三程序逻辑模块和第四程序逻辑模块。第一程序逻辑模块用于使基于处理器的***能够编译头部文件以在数据结构中提供预编译的头部。第二程序逻辑模块用于使基于处理器的***能够从数据结构提取预编译的头部。第三程序逻辑模块用于使基于处理器的***能够基于与预编译的头部的相应的部分对应的引用来区分预编译的头部的每个部分与预编译的头部的其它部分。第四程序逻辑模块用于使基于处理器的***能够基于是否在计算机程序中引用相应的部分来独立于预编译的头部的其它部分、有选择地加载预编译的头部的每个部分。
图1是根据一个实施例的示例有选择加载***100的框图。一般而言,有选择加载***100操作以响应于从用户(例如,软件工程师、应用开发员等)接收的请求(例如,超文本传送协议(HTTP)请求)来向用户提供信息。信息可以包括文档(例如,Web页面、图像、音频文件、视频文件等)、可执行文件的输出和/或任何其它适当类型的信息。根据这里公开的示例实施例,有选择加载***100有选择地加载预编译的头部和/或其部分。在以下讨论中提供关于用于有选择地加载预编译的头部和/或其部分的技术的细节。
如图1中所示,有选择加载***100包括多个用户***102A-102M、网络104和多个服务器106A-106N。使用熟知的网络通信协议通过网络104执行在用户***102A-102M和服务器106A-106N之中的通信。网络104可以是广域网(例如,因特网)、局域网(LAN)、另一类型的网络或者其组合。
用户***102A-102M是能够与服务器106A-106N通信的处理***。处理***的示例是包括能够根据指令集合来操控数据的至少一个处理器的***。例如,处理***可以是计算机、个人数字助理等。用户***102A-102M被配置为向服务器106A-106N提供用于请求在服务器106A-106N上存储(或者以别的方式经由服务器106A-106N可访问)的信息的请求。例如,用户可以发起用于使用在由用户拥有或者以别的方式可由用户访问的用户***102上部署的客户端(例如,Web浏览器、Web爬行器(crawler)或者其它类型的客户端)来执行计算机程序(例如,应用)的请求。根据一些示例实施例,用户***102A-102M能够访问由服务器106A-106N主控的域(例如,网站),从而使得用户***102A-102M可以访问经由域可用的信息。这样的域可以例如包括可以作为超文本标记语言(HTML)文档和在其中链接的对象(例如,文件)而被提供的网页。
将认识到,任何一个或者多个用户***102A-102M可以与任何一个或者多个服务器106A-106N通信。虽然在图1中将用户***102A-102M描绘为台式计算机,但是相关领域技术人员将认识到,用户***102A-102M可以包括任何具有客户端功能的***或者设备,包括但不限于台式计算机、膝上型计算机、平板计算机、个人数字助理、蜂窝电话等。
服务器106A-106N是能够与用户***102A-102M通信的处理***。服务器106A-106N被配置为执行响应于从用户接收请求来向用户提供信息的程序。例如,信息可以包括文档(例如,网页、图像、音频文件、视频文件等)、可执行文件的输出或者任何其它适当类型的信息。根据一些示例实施例,服务器106A-106N被配置为主控相应网站,从而使得网站可由有选择加载***100的用户访问。
可以由服务器106A-106N中的一个或者多个服务器执行的一个示例类型的计算机程序是开发员工具。开发员工具是相对于程序代码执行诊断操作(例如,标识问题源、调试、建档、控制等)的计算机程序。开发员工具的示例包括但不限于web开发平台(例如,WindowsAzure
Figure BDA0001248701810000081
Amazon Web
Figure BDA0001248701810000082
Google App
Figure BDA0001248701810000083
等)和集成开发环境(例如,MicrosoftVisual
Figure BDA0001248701810000084
Eclipse PlatformTM等)。将认识到,可以使用开发员工具来实施这里描述的示例技术。
出于示例目的而将第一服务器106A示出为包括有选择加载构建逻辑108。有选择加载构建逻辑108被配置为有选择地加载预编译的头部和/或其部分。有选择加载构建逻辑108可以包括用于构建计算机程序的多种功能中的任何功能,包括但不限于源控制、静态代码分析、编译、链接、提取、加载等。
源控制涉及管理对计算机程序的改变。例如,每当对计算机程序做出改变时,可以递增与计算机程序关联的修订编号;可以存储指示做出改变的时间的时间戳;可以记录指定做出了改变的人的指示符;等等。
静态代码分析包括在没有执行计算机程序的情况下分析计算机程序以寻找评论、单位测试、重复、复杂性、潜在故障、遵守编码规则等。
编译包括将计算机程序的源代码变换成另一语言的代码(例如,可执行代码或者中间代码)。例如,可以将计算机程序从相对更高级的编程语言(例如,C或者C++)编译成相对更低级的语言(例如,汇编语言或者机器代码)。可以将源代码编译成对象文件,这些对象文件是可重新定位格式机器代码。可以将编译的计算机程序存留到盘以用于后续处理。
链接涉及将从编译产生的代码(例如,对象文件)组合成单个可执行计算机程序。
提取包括从存储库接收(例如,取回)信息(例如,数据、计算机程序代码等)以用于处理。例如,可以在计算机程序的编译期间从存储库提取预编译的头部。
加载包括在一个或者多个处理***(例如,用户***102A-102M和/或服务器106A-106N中的任何一个或者多个处理***)的主存储器中存储信息(例如,计算机程序的可执行代码)。例如,可以从盘向主存储器复制这样的信息。加载还可以包括执行预备操作以预备计算机程序的可执行代码以用于运行。预备操作的示例包括但不限于使与计算机程序关联的权限、存储器要求等生效;复制栈上的命令行变元;将寄存器(比如栈指针)初始化;跳转到计算机程序的入口点;等等。根据这里描述的示例实施例,加载可以包括有选择地将预编译的头部和/或其部分加载到处理***的主存储器。
将认识到,有选择加载构建逻辑108可以是(或者可以被包括在)开发工具(中),尽管示例实施例的范围在这一点上不受限制。以下参照图2至图11更具体地讨论用于有选择地加载预编译的头部和/或其部分的示例技术。
可以用各种方式实施有选择加载构建逻辑108以有选择地加载预编译的头部和/或其部分,包括在硬件、软件、固件或者其任何组合中实施。例如,可以将有选择加载构建逻辑108实施为被配置为在一个或者多个处理器中被执行的计算机程序代码。在另一示例中,可以将有选择加载构建逻辑108实施为硬件逻辑/电子电路。例如,可以在现场可编程门阵列(FPGA)、专用集成电路(ASIC)、专用标准产品(ASSP)、片上***(SoC)、复杂可编程逻辑器件(CPLD)等中实施有选择加载构建逻辑108。每个SoC可以包括集成电路芯片,该集成电路芯片包括处理器(例如,微控制器、微处理器、数字信号处理(DSP)等)、存储器、一个或者多个通信接口和/或用于执行它的功能的另外的电路和/或嵌入式固件中的一个或者多个部件。
出于示例目的而没有旨在于限制地将有选择加载构建逻辑108示出为被并入第一服务器106A中。将认识到,可以在用户***102A-102M中的一个或者多个用户***中并入有选择加载构建逻辑108(或者其任何部分)。例如,可以在用户***102A-102M中的一个或者多个用户***中并入有选择加载构建逻辑108的客户端侧方面,并且可以在第一服务器106A中并入有选择加载构建逻辑108的服务器侧方面。在另一示例中,可以在用户***102A-102M之中分布有选择加载构建逻辑108。在又另一示例中,可以在用户***102A-102M中的单个用户***中并入有选择加载构建逻辑108。在另一示例中,可以在服务器106A-106N之中分布有选择加载构建逻辑108。在再另一示例中,可以在服务器106A-106N中的单个服务器中并入有选择加载构建逻辑108。
图2至图4描绘了根据实施例的用于有选择地加载预编译的头部的至少部分的示例方法的流程图。图5至图7描绘了根据实施例的用于有选择地加载预编译的头部的示例方法的流程图。图8至图10描绘了根据实施例的用于有选择地加载预编译的头部的部分的示例方法的流程图。流程图200、300、400、500、600、700、800、900和1000可以例如由图1中所示的有选择加载构建逻辑108执行。出于示例目的,相对于图11中所示的设备1100来描述流程图200、300、400、500、600、700、800、900和1000。设备1100可以包括用户***102A-102M中的一个或者多个用户***、服务器106A-106N中的一个或者多个服务器或者其任何组合,尽管示例实施例的范围就这一点而言不受限制。设备1100包括根据一个实施例的有选择加载构建逻辑1102,该有选择加载构建逻辑1102是有选择加载构建逻辑108的示例。如图11中所示,设备1100还包括存储库1104。出于示例目的而将存储库示出为包括共享的预编译的头部的高速缓存1116。有选择加载构建逻辑1102被示出为包括编译器1106、提取器1108、加载器1110、存储逻辑1112和确定逻辑1114。另外的结构和操作实施例将基于关于流程图200、300、400、500、600、700、800、900和1000的讨论而为相关领域技术人员所清楚。
如图2中所示,流程图200的方法始于步骤202。在步骤202中,编译头部文件以在数据结构中提供预编译的头部。例如,头部文件可以是个体头部文件。个体头部文件不包括任何其它头部文件。在另一示例中,预编译的头部可以是个体预编译的头部。个体预编译的头部不包括任何其它预编译的头部。预编译的头部可以是二进制头部,但是示例实施例的范围在这一点上不受限制。数据结构中的每个数据结构可以包括任何适当结构,包括但不限于类型、符号、树、权标(例如,在C++中)等。
在一个示例实现方式中,编译器1102编译头部文件以提供预编译的头部。例如,可以在头部文件1118中包括头部文件,并且可以在预编译的头部1120中包括预编译的头部。编译器1106可以向在共享的预编译的头部高速缓存1116中存储的数据结构提供预编译的头部,尽管示例实施例的范围在这一点上不受限制。共享的预编译的头部高速缓存1116是集中式存储位置,其中可以存储可用来被并入到计算机程序(例如,其中存储预编译的头部的数据结构)中的预编译的头部中的一个或者多个(例如,所有)预编译的头部。例如,通过使用共享的预编译的头部高速缓存1116来将存储位置集中化可以增加构建计算机程序的速度(例如,减少处理时间)。根据这一示例,使用共享的预编译的头部高速缓存1116可以增加编译计算机程序的速度和/或加载预编译的头部的速度。预编译的头部可以是编译器1106的运行状态的快照。将认识到,数据结构中的每个数据结构可以是由编译器1106在内部用来捕获计算机程序的编译的状态的任何结构。
在一个示例上下文实施例中,在计算机程序的指明的上下文中编译头部文件以在数据结构中提供预编译的头部。根据这一实施例,指明的上下文包括头部文件相对于计算机程序的其它部分而言的指明的位置和/或头部文件相对于计算机程序的其它部分而言的指明的顺序。例如,指明的位置可以指示头部文件是在计算机程序中的第十头部文件,并且指明的顺序可以指示头部文件在计算机程序中跟随头部文件A、B和C而在头部文件D之前。示例指明的位置和顺序是出于示例目的而提供的并且没有旨在于限制。将认识到,头部文件可以具有任何适当的指明的位置和/或指明的顺序。
在步骤204,从数据结构提取预编译的头部。在一个示例实现方式中,提取器1108从可以在共享的预编译的头部高速缓存1116中存储的数据结构提取预编译的头部。在这一实现方式的一个方面中,提取器1108暂时地暂停编译计算机程序以提取预编译的头部。根据这一方面,提取器1108响应于预编译的头部的提取的完成来使得计算机程序的编译恢复。
在以上关于步骤202而提到的示例上下文实施例中,基于指明的上下文从数据结构提取预编译的头部。以下参照图3和图4来提供对指明的上下文的进一步讨论,包括对指明的上下文可以用于有选择地加载预编译的头部的至少部分的一些示例方式的说明。
在步骤206,在计算机程序的编译期间加载(例如,自动地加载)与预编译的头部关联的引用。例如,引用可以唯一地标识头部文件和/或预编译的头部。引用可以包括头部文件的名称和/或预编译的头部的名称。引用可以是任何适当形式,包括但不限于函数、类、变量等。可以用任何适当语言编写计算机程序,包括但不限于C、C++、PythonTM、JavaTM、Ruby等。在一个示例实现方式中,加载器1110加载引用。
在一个示例多引用实施例中,步骤206包括加载与预编译的头部关联的多个引用。多个引用对应于预编译的头部的多个相应的部分。例如,可以基于是否在计算机程序中引用与每个部分对应的引用来递增地加载该部分。可以在相应的数据结构中包括每个部分,尽管示例实施例的范围在这一点上不受限制。
在步骤208,推迟(例如,自动地推迟)加载预编译的头部的部分,直至在计算机程序中引用该部分的内容。例如,可以响应于在步骤206加载引用来执行在步骤208推迟预编译的头部的部分的加载。可以在无需对计算机程序的任何改变的情况下自动地执行在步骤208推迟预编译的头部的部分的加载。在一个示例实现方式中,加载器1110推迟预编译的头部的部分的加载,直至在计算机程序中引用该部分的内容。
在以上参照步骤206而提到的示例多引用实施例中,步骤208包括推迟多个部分中的每个部分的加载,直至在计算机程序中引用相应的部分的内容。
在一些示例实施例中,可以不执行流程图200的一个或者多个步骤202、204、206和/或208。另外,可以执行除了步骤202、204、206和/或208之外或者取代步骤202、204、206和/或208的步骤。例如,在以上关于步骤202和204而提到的示例上下文实施例中,流程图200的方法可以包括存储上下文指示符,该上下文指示符基于在指明的上下文中编译头部文件来指定指明的位置和指明的顺序。例如,存储逻辑1112可以存储指定指明的位置和指明的顺序的上下文指示符1122。根据这一实施例,流程图200的方法还可以包括回顾上下文指示符以确定指明的位置和指明的顺序。例如,提取器1108可以回顾上下文指示符1122以确定指明的位置和指明的顺序。进一步根据这一实施例,可以在步骤204响应于回顾上下文指示符来提取预编译的头部。例如,提取器1108可以响应于回顾上下文指示符1122来提取预编译的头部。
在另一示例实施例中,流程图200的方法包括向计算机程序的相应的头部文件分配存储器地址范围。例如,存储逻辑1112可以向相应的头部文件(例如,头部文件1118)分配存储器地址范围1124。根据这一实施例,步骤202包括编译头部文件以提供相应的预编译的头部。在相应的存储器地址范围中、在一个或者多个数据结构中提供预编译的头部中的每个预编译的头部。例如,在其中提供预编译的头部的一个或者多个数据结构可以表示从其编译预编译的头部的头部文件的源代码。每个预编译的头部不可由其它预编译的头部修改。因而,每个预编译的头部不能重写另一预编译的头部。每个预编译的头部不能改变另一预编译的头部的指针。例如,可以将每个预编译的头部配置为只读预编译的头部。任何一个或者多个预编译的头部可以被分层在任何一个或者多个其它预编译的头部上,只要预编译的头部都没有修改另一预编译的头部的数据结构。
在又一示例实施例中,流程图200的方法包括标识在头部文件中定义的符号。符号包括指针。根据这一实施例,流程图200的方法还包括基于指向一个或者多个依赖性的指针来确定符号的一个或者多个依赖性。进一步根据这一实施例,步骤204包括提取符号和一个或者多个依赖性。将认识到,在其中提供预编译的头部的数据结构可以包括符号。数据结构也可以包括一个或者多个依赖性中的至少一个(例如,所有)依赖性。
在另一示例实施例中,可以用图3的流程图300中所示的步骤中的一个或者多个步骤替换流程图200的步骤206和208。如图3中所示,流程图300的方法始于步骤302。在步骤302中,在计算机程序中标识与头部文件关联的include指示。在一个示例实现方式中,编译器1106和/或确定逻辑1114标识计算机程序中的与头部文件关联的include指示1126。例如,编译器1106可以在编译计算机程序之时通过遇到include指示1126来标识include指示。确定逻辑1114可以在编译器1106编译计算机程序时或者在编译器1106编译计算机程序之前回顾计算机程序。确定逻辑1114可以在回顾计算机程序之时标识include指示1126。
在步骤304,做出为了提供预编译的头部而在其中编译头部文件的、计算机程序的指明的上下文和引用上下文是否相同的确定。例如,可以响应于在步骤302标识include指示来在步骤304确定指明的上下文和引用上下文是否相同。在一个示例中,指明的上下文可以包括头部文件相对于计算机程序的其它部分的指明的位置和/或头部文件相对于计算机程序的其它部分的指明的顺序。根据这一示例,引用上下文可以包括头部文件相对于计算机程序的其它部分的引用位置和/或头部文件相对于计算机程序的其它部分的引用顺序。进一步根据这一示例,如果指明的位置和指明的顺序分别与引用位置和引用顺序相同,则指明的上下文和引用上下文相同;否则,指明的上下文和引用上下文不相同。如果指明的上下文和引用的上下文相同,则流程继续到步骤306。否则,流程继续到步骤310。在一个示例实现方式中,确定逻辑1114确定指明的上下文和引用上下文是否相同。
在步骤306,在计算机程序的编译期间加载与预编译的头部关联的引用。在一个示例实现方式中,加载器1110加载引用。
在步骤308,推迟加载预编译的头部的部分,直至在计算机程序中引用该部分的内容。在完成步骤308时,流程图300的方法结束。在一个示例实现方式中,加载器1110推迟预编译的头部的部分的加载,直至在计算机程序中引用该部分的内容。
在步骤310,在计算机程序的引用上下文中编译头部文件以在第二数据结构中提供第二预编译的头部。在一个示例实现方式中,编译器1106在引用上下文中编译头部文件以在第二数据结构中提供第二预编译的头部。
在步骤312,从第二数据结构提取第二预编译的头部。在一个示例实现方式中,提取器1108从第二数据结构提取第二预编译的头部。
在步骤314,加载与第二预编译的头部关联的第二引用。在一个示例实现方式中,加载器1110加载与第二预编译的头部关联的第二引用。
在步骤316,推迟加载第二预编译的头部的第二部分,直至在计算机中引用第二部分的内容。在完成步骤316时,流程图300的方法结束。在一个示例实现方式中,加载器111推迟第二预编译的头部的第二部分的加载,直至在计算机程序中引用第二部分的内容。
在又另一示例实施例中,可以用图4的流程图400中所示的步骤中的一个或者多个步骤替换流程图200的步骤206和208。如图4中所示,流程图400的方法始于步骤402。在步骤402中,在计算机程序中标识与头部文件关联的include指示。在一个示例实现方式中,确定逻辑1114标识计算机程序中的与头部文件关联的指示1126。
在步骤404,做出在为了提供预编译的头部而在其中编译头部文件的、计算机程序的指明的上下文中的头部文件含义和引用上下文中的头部文件的含义是否相同的确定。例如,可以响应于在步骤402标识include指示来执行在步骤404确定指明的上下文中的头部文件的含义和引用上下文中的头部文件的含义是否相同。如果指明的上下文中的头部文件的含义和引用上下文中的头部文件的含义相同,则流程继续到步骤406。否则,流程继续到步骤410。在一个示例实现方式中,确定逻辑1114确定指明的上下文中的头部文件的含义和引用上下文中的头部文件的含义是否相同。
头部文件的含义是执行头部文件的编译的表示的结果(例如,执行通过编译头部文件而被提供的预编译的头部的结果)。例如,在指明的上下文中编译头部文件可以提供第一结果,并且在引用上下文中编译头部文件可以提供与第一结果不同的第二结果。根据这一示例,如果第一结果与第二结果相同,则指明的上下文中的头部文件的含义和引用上下文中的头部文件的含义相同。进一步根据这一示例,如果第一结果与第二结果不同,则指明的上下文中的头部文件的含义和引用上下文中的头部文件的含义不同。应当指出,指明的上下文中的头部文件中的include指示和引用上下文中的头部文件中的include指示无需必然地相同并且无需必然地按照相同顺序以便指明的上下文中的头部文件的含义和引用上下文中的头部文件的含义相同。
如果指明的上下文中的头部文件的include指示和引用上下文中的头部文件中的include指示相同并且按照相同顺序,则指明的上下文中的头部文件的含义和引用上下文中的头部文件的含义被视为“确切地相同”。根据这一实施例,如果指明的上下文中的头部文件中的include指示和引用上下文中的头部文件中的include指示不相同和/或没有按照相同顺序,则指明的上下文中的头部文件的含义和引用上下文中的头部文件中的含义没有“确切地相同”。
在步骤406,在计算机程序的编译期间加载与预编译的头部关联的引用。在一个示例实现方式中,加载器1110加载与预编译的头部关联的引用。
在一个示例实施例中,多个引用与预编译的头部的相应的版本关联。预编译的头部的版本与相应的上下文关联。根据这一实施例,步骤406包括基于引用与指明的上下文关联的、预编译的头部的指明的版本关联来从多个引用选择引用。
在步骤408,推迟加载预编译的头部的部分,直至在计算机程序中引用该部分的内容。在完成步骤408时,流程图400的方法结束。在一个示例实现方式中,加载器1110推迟预编译的头部的部分的加载,直至在计算机程序中引用该部分的内容。
在步骤410,在计算机程序的第二上下文中编译头部文件,在该第二上下文中,头部文件具有与引用上下文中的头部文件的含义相同的含义,以在第二数据结构中提供第二预编译的头部。在一个示例实现方式中,编译器1106在计算机程序的第二上下文中编译头部文件以在第二数据结构中提供第二预编译的头部。
在步骤412,从第二数据结构提取第二预编译的头部。在一个示例实现方式中,提取器1108从第二数据结构提取第二预编译的头部。
在步骤414,加载与第二预编译的头部关联的第二引用。在一个示例实现方式中,加载器1110加载第二引用。
在步骤416,推迟加载第二预编译的头部的第二部分,直至在计算机程序中引用第二部分的内容。在完成步骤416时,流程图400的方法结束。在一个示例实现方式中,加载器1110推迟第二预编译的头部的第二部分的加载,直至在计算机程序中引用第二部分的内容。
如以上提到的那样,图5至图7描绘了根据实施例的用于有选择地加载预编译的头部的示例方法的流程图。如图5中所示,流程图500的方法始于步骤502。在步骤502中,编译头部文件以提供预编译的头部。在相应的数据结构中包括每个预编译的头部,该数据结构表示从其编译预编译的头部的头部文件的源代码。例如,在相应的数据结构中包括每个预编译的头部可以使预编译的头部独立于其它预编译的头部而被加载。每个预编译的头部可以是个体预编译的头部。因而,每个预编译的头部可以不包括任何其它预编译的头部。在一个示例实现方式中,编译器1106编译头部文件1118以提供预编译的头部1120。
在一个示例上下文实施例中,在计算机程序的相应的上下文中编译每个头部文件以提供相应的预编译的头部。根据这一实施例,计算机程序的每个上下文包括计算机程序中的相应的头部文件的位置和/或相应的头部文件相对于计算机程序的其它部分的顺序。
在步骤504,从相应的数据结构提取每个预编译的头部。在一个示例实现方式中,提取器1108从相应的数据结构提取预编译的头部120中的每个预编译的头部。
在以上关于步骤502提到的示例上下文实施例中,基于在其中编译相应的头部文件的上下文从相应的数据结构提取每个预编译的头部。以下参照图6和图7提供对上下文的进一步讨论,包括说明这样的上下文可以用于有选择地加载预编译的头部的一些示例方式。
在步骤506,区分(例如,自动地区分)每个预编译的头部与预编译的头部中的其它预编译的头部。在一个示例实现方式中,存储逻辑1108和/或确定逻辑1110区分预编译的头部1120中的每个预编译的头部与预编译的头部1120中的其它预编译的头部。例如,存储逻辑1108和/或确定逻辑1110可以向相应的预编译的头部1120指派标识符。每个标识符可以与其它标识符不同。存储逻辑1108可以在设备1100的存储器中的相应的位置(例如,在存储库1104和/或共享的预编译的头部高速缓存1116中的相应的位置)存储预编译的头部1120。存储逻辑1108可以在存储库1104和/或共享的预编译的头部高速缓存1116中与预编译的头部1120一起存储标识符。存储逻辑1108和/或确定逻辑1110可以维护查找表,该查找表交叉引用相应的存储器位置的标识符和地址。
在步骤508,基于是否在计算机程序中引用相应的预编译的头部来独立于其它预编译的头部、有选择地(例如,自动地、有选择地加载)每个预编译的头部。可以在无需对计算机程序的任何改变的情况下自动地执行在步骤508有选择地加载每个预编译的头部。可以用任何适当语言(包括但不限于C、C++、PhthonTM、JavaTM、Ruby等)来编写计算机程序。在一个示例实现方式中,加载器1110基于是否在计算机程序中引用相应的预编译的头部来独立于预编译的头部1120中的其它预编译的头部、有选择地加载预编译的头部1120中的每个预编译的头部。
在一个示例实施例中,在多个数据结构的相应的子集中包括每个预编译的头部。每个子集包括其中包括相应的预编译的头部的相应的数据结构。根据这一实施例,在步骤506区分每个预编译的头部包括在存储器中组织多个子集中的每个子集以免与存储器中的多个子集中的其它子集重叠。例如,可以在存储器中的多个相应的存储器地址范围中组织多个子集以免与多个范围中的其它范围重叠。在一个示例实现方式中,存储逻辑1108在存储器中组织多个子集中的每个子集。
在一些示例实施例中,可以不执行流程图500的一个或者多个步骤502、504、506和/或508。另外,可以执行除了步骤502、504、506和/或508之外或者取代步骤502、504、506和/或508的步骤。例如,在一个示例实施例中,流程图500的方法包括区分多个预编译的头部中的至少一个预编译的头部的多个部分中的每个部分与多个部分中的其它部分。例如,存储逻辑1108和/或确定逻辑1110可以区分至少一个预编译的头部的每个部分与多个部分中的其它部分。根据这一实施例,流程图500的方法还包括基于是否在计算机程序中引用相应的部分来独立于多个部分中的其它部分、有选择地加载多个部分中的每个部分。例如,加载器1110基于是否在计算机程序中引用相应的部分来独立于多个部分中的其它部分、有选择地加载至少一个预编译的头部的每个部分。
在另一示例实施例中,流程图500的方法包括确定至少一个头部文件包括指针。例如,确定逻辑1114可以确定至少一个头部文件包括指针。根据这一实施例,流程图500的方法还包括基于指针指向至少一个头部文件的至少一个依赖性来确定至少一个依赖性。例如,确定逻辑1114可以基于指针指向至少一个头部文件的至少一个依赖性来确定至少一个依赖性。
在又另一示例实施例中,可以用图6的流程图600中所示的步骤中的一个或者多个步骤替换流程图500的步骤508。如图6中所示,流程图600的方法始于步骤602。在步骤602中,在计算机程序中标识与头部文件关联的include指示。include指示与之关联的头部文件可以包括在步骤502被编译的所有头部文件或者少于所有头部文件。在一个示例实现方式中,确定逻辑1114标识计算机程序中的与头部文件1118关联的include指示1126。
在步骤604,做出为了提供对应的预编译的头部而在其中编译头部文件的、计算机程序的指定的上下文和引用上下文是否相同的确定。例如,可以响应于在步骤602标识include指示来执行在步骤604确定指定的上下文和引用上下文是否相同。如果指定的上下文和引用上下文相同,则流程继续到步骤606。否则,流程继续到步骤612。在一个示例实现方式中,确定逻辑1114确定指定的上下文和引用上下文是否相同。
在步骤606,做出对于对应的预编译的头部中的每个预编译的头部是否在计算机程序中引用相应的对应的预编译的头部的确定。如果在计算机程序中引用了相应的对应的预编译的头部,则流程继续到步骤608。否则,流程继续到步骤610。在一个示例实现方式中,确定逻辑对于对应的预编译的头部中的每个预编译的头部确定是否在计算机程序中引用了相应的对应的预编译的头部。
在步骤608,加载相应的对应的预编译的头部。在一个示例实现方式中,加载器1110加载相应的对应的预编译的头部。
在步骤610,不加载相应的对应的预编译的头部。在一个示例实现方式中,加载器1110不加载相应的对应的预编译的头部。
在对于对应的预编译的头部中的每个预编译的头部完成步骤608或者步骤610时,流程图600的方法结束。
在步骤612,在计算机程序的引用上下文中编译头部文件以在相应的第二数据结构中提供第二预编译的头部。在一个示例实现方式中,编译器1106在计算机程序的引用上下文中编译头部文件以在相应的第二数据结构中提供第二预编译的头部。
在步骤614,从第二数据结构提取第二预编译的头部。在一个示例实现方式中,提取器1108从第二数据结构提取第二预编译的头部。
在步骤616,区分每个第二预编译的头部与其它第二预编译的头部。在一个示例实现方式中,存储逻辑1108和/或确定逻辑1110区分每个第二预编译的头部与第二预编译的头部中的其它第二预编译的头部。例如,存储逻辑1108和/或确定逻辑1110可以向相应的第二预编译的头部指派标识符。每个标识符可以不同于其它标识符。存储逻辑1108可以在设备1100的存储器中的相应的位置(例如,在存储库1104和/或共享的预编译的头部高速缓存1116中的相应的位置)存储第二预编译的头部。存储逻辑1108可以在存储库1104和/或共享的预编译的头部高速缓存1116中与第二预编译的头部一起存储标识符。存储逻辑1108和/或确定逻辑1110可以维护查找表,该查找表交叉引用相应的存储器位置的标识符和地址。
在步骤618,基于是否在计算机程序中引用了相应的第二预编译的头部来独立于其它第二预编译的头部、有选择地加载每个第二预编译的头部。在完成步骤618时,流程图600的方法结束。在一个示例实现方式中,加载器1110基于是否在计算机程序中引用了相应的第二预编译的头部来独立于其它第二、有选择地加载每个第二预编译的头部。
在又一示例实施例中,可以用图7的流程图700中所示的步骤中的一个或者多个步骤替换流程图500的步骤508。如图7中所示,流程图700的方法始于步骤702。在步骤702中,在计算机程序中标识与指明的头部文件关联的include指示。在一个示例实现方式中,确定逻辑1114标识计算机程序中的与指明的头部文件关联的include指示1126。
在步骤704,做出为了提供对应的预编译的头部而在其中编译指明的头部文件的指定的上下文中的指明的头部文件的含义和引用上下文中的指明的头部文件的含义是否相同的确定。例如,可以响应于在步骤702标识include指示来执行在步骤704确定指定的上下文中的指明的头部文件的含义和引用上下文中的指明的头部文件的含义是否相同。引用上下文与指定的上下文不同。如果指定的上下文中的指明的头部文件的含义和引用上下文中的指明的头部文件的含义相同,则流程继续到步骤706。否则,流程继续到步骤712。在一个示例实现方式中,确定逻辑1114确定指定的上下文中的指明的头部文件的含义和引用的上下文中的指明的头部文件的含义是否相同。
在步骤706,做出是否在计算机程序中引用了对应的预编译的头部的确定。如果在计算机程序中引用了对应的预编译的头部,则流程继续到步骤708。否则,流程继续到步骤710。在一个示例实现方式中,确定逻辑1114确定是否在计算机程序中引用了对应的预编译的头部。
在步骤708,加载对应的预编译的头部。在一个示例实现方式中,加载器1110加载对应的预编译的头部。
在一个示例实施例中,对应的预编译的头部的多个版本与相应的上下文关联。根据这一实施例,步骤708包括基于对应的预编译的头部的指明的版本与指定的上下文关联来加载指明的版本。
在步骤710,不加载对应的预编译的头部。在一个示例实现方式中,加载器1110不加载对应的预编译的头部。
在完成步骤708或者步骤710时,流程图700的方法结束。
在步骤712,在计算机程序的第二上下文中编译指明的头部,在该第二上下文中,指明的头部文件具有与引用上下文中的指明的头部文件的含义相同的含义,以在第二数据结构中提供第二预编译的头部。在一个示例实现方式中,编译器1106在计算机程序的第二上下文中编译指明的头部文件以在第二数据结构中提供第二预编译的头部。
在步骤714,从第二数据结构提取第二预编译的头部。在一个示例实现方式中,提取器1108从第二数据结构提取第二预编译的头部。
在步骤716,区分第二预编译的头部与其它预编译的头部。在一个示例实现方式中,存储逻辑1108和/或确定逻辑1110区分第二预编译的头部与其它预编译的头部。例如,存储逻辑1108和/或确定逻辑1110可以向包括第二预编译的头部的相应的预编译的头部指派标识符。每个标识符可以与其它标识符不同。存储逻辑1108可以在设备1100的存储器中的相应的位置(例如,在储存库1104和/或共享的预编译的头部高速缓存1116中的相应的位置)存储预编译的头部。存储逻辑1108可以在存储库1104和/或共享的预编译的头部高速缓存1116中与预编译的头部一起存储标识符。存储逻辑1108和/或确定逻辑1110可以维护查找表,该查找表交叉引用相应的存储器位置的标识符和地址。
在步骤718,基于是否在计算机程序中引用了第二预编译的头部来独立于其它预编译的头部、有选择地加载第二预编译的头部。在完成步骤718时,流程图700的方法结束。在一个示例实现方式中,加载器1110基于是否在计算机程序中引用了第二预编译的头部来独立于其它预编译的头部、有选择地加载第二预编译的头部。
如以上提到的那样,图8至图10描绘了根据实施例的用于有选择地加载预编译的头部的部分的示例方法的流程图。如图8中所示,流程图800的方法始于步骤802。在步骤802中,编译头部文件以在数据结构中提供预编译的头部。预编译的头部可以是个体预编译的头部。因而,预编译的头部可以不包括任何其它预编译的头部。在一个示例实现方式中,编译器1106编译头部文件以在数据结构中提供预编译的头部。
在一个示例上下文实施例中,在计算机程序的指明的上下文中编译头部文件以在数据结构中提供预编译的头部。根据这一实施例,指明的上下文包括计算机程序中的头部文件的位置和/或头部文件相对于计算机程序的其它部分的顺序。
在步骤804,从数据结构提取预编译的头部。在一个示例实现方式中,提取器1108从数据结构提取预编译的头部。
在以上关于步骤802提到的示例上下文实施例中,基于指明的上下文从数据结构提取预编译的头部。以下参照图9和图10提供对指明的上下文的进一步讨论,包括说明指明的上下文可以用于有选择地加载预编译的头部的部分的一些示例。
在步骤806,基于与相应的部分对应的引用来区分(例如,自动地区分)预编译的头部的每个部分与预编译的头部的其它部分。在一个示例实现方式中,存储逻辑1108和/或确定逻辑1110基于与相应的部分对应的引用来区分预编译的头部的每个部分与预编译的头部的其它部分。例如,存储逻辑1108和/或确定逻辑1110可以向相应的部分指派引用。每个引用可以与其它引用不同。存储逻辑1108可以在设备1100的存储器中的相应的位置(例如,在存储库1104和/或共享的预编译的头部高速缓存1116中的相应的位置)存储部分。存储逻辑1108可以在存储库1104和/或共享的预编译的头部高速缓存1116中与部分一起存储引用。存储逻辑1108和/或确定逻辑1110可以维护查找表,该查找表交叉引用相应的存储器位置的引用和地址。
在步骤808,基于是否在计算机程序中引用了相应的部分来独立于预编译的头部的其它部分、有选择地加载(例如,自动地、有选择地加载)预编译的头部的每个部分。在一个示例中,可以在无需对计算机程序的任何改变的情况下自动地执行在步骤808有选择地加载预编译的头部的每个部分。在另一示例中,可以基于是否在计算机程序中个别地引用了至少一个(例如,每个)相应的部分来执行在步骤808有选择地加载预编译的头部的每个部分。例如,这样的引用可以不引用预编译的头部的任何其它部分。可以用任何适当语言(包括但不限于C、C++、PythonTM、JavaTM、Ruby等)来编写计算机程序。在一个示例实现方式中,加载器1110基于是否在计算机程序中引用了相应的部分来独立于预编译的头部的其它部分、有选择地加载预编译的头部的每个部分。
在一些示例实施例中,可以不执行流程图800的一个或者多个步骤802、804、806和/或808。另外,可以执行除了步骤802、804、806和/或808之外或者取代步骤802、804、806和/或808的步骤。例如,在一个示例实施例中,可以用图9的流程图900中所示的步骤中的一个或者多个步骤替换流程图800的步骤808。如图9中所示,流程图900的方法始于步骤902。在步骤902中,在计算机程序中标识与头部文件关联的include指示。在一个示例实现方式中,确定逻辑1114标识计算机程序中的与头部文件关联的include指示1126。
在步骤904,做出为了提供预编译的头部而在其中编译头部文件的、计算机程序的指明的上下文和引用上下文是否相同的确定。例如,可以响应于在步骤902标识include指引来执行在步骤904确定指明的上下文和引用上下文是否相同。如果指明的上下文和引用上下文相同,则流程继续到步骤906。否则,流程继续到步骤912。在一个示例实现方式中,确定逻辑1114确定指明的上下文和引用上下文是否相同。
在步骤906,做出对于预编译的头部的每个部分是否在计算机程序中引用相应的部分的确定。如果在计算机程序中引用了相应的部分,则流程继续到步骤908。否则,流程继续到步骤910。在一个示例实现方式中,确定逻辑1114确定对于重新编译的头部的每个部分是否在计算机程序中引用了相应的部分。
在步骤908,加载预编译的头部的相应的部分。在一个示例实现方式中,加载器1110加载预编译的头部的相应的部分。
在步骤910,不加载预编译的头部的相应的部分。在一个示例实现方式中,加载器1110不加载预编译的头部的相应的部分。
在对于预编译的头部的每个部分完成步骤908或者910时,流程图900的方法结束。
在步骤912,在计算机程序的引用上下文中编译头部文件以在第二数据结构中提供第二预编译的头部。在一个示例实现方式中,编译器1106在计算机程序的引用上下文中编译头部文件以在第二数据结构中提供第二预编译的头部。
在步骤914,从第二数据结构提取第二预编译的头部。在一个示例实现方式中,提取器1108从第二数据结构提取第二预编译的头部。
在步骤916,基于与相应的部分对应的引用来区分第二预编译的头部的每个部分与第二预编译的头部的其它部分。在一个示例实现方式中,存储逻辑1108和/或确定逻辑1110基于与相应的部分对应的引用来区分第二预编译的头部的每个部分与第二预编译的头部的其它部分。例如,存储逻辑1108和/或确定逻辑1110可以向第二预编译的头部的相应的部分指派引用。每个引用可以与其它引用不同。存储逻辑1108可以在设备1100的存储器中的相应的位置(例如,在存储库1104和/或共享的预编译的头部高速缓存1116中的相应的位置)存储部分。存储逻辑1108可以在存储库1104和/或共享的预编译的头部高速缓存1116中与部分一起存储引用。存储逻辑1108和/或确定逻辑1110可以维护查找表,该查找表交叉引用相应存储器位置的引用和地址。
在步骤918,基于是否在计算机程序中引用了相应的部分来独立于第二预编译的头部的其它部分、有选择地加载第二预编译的头部的每个部分。在完成步骤918时,流程图900的方法结束。在一个示例实现方式中,加载器1110基于是否在计算机程序中引用了相应的部分来独立于第二预编译的头部的其它部分、有选择地加载第二预编译的头部的每个部分。
在另一示例实施例中,可以用图10的流程图1000中所示的步骤中的一个或者多个步骤替换流程图800的步骤808。如图10中所示,流程图1000的方法始于步骤1002。在步骤1002中,在计算机程序中标识与头部文件关联的include指引。在一个示例实现方式中,逻辑1114标识计算机程序中的与头部文件关联的include指引1126。
在步骤1004,做出为了提供预编译的头部而在其中编译头部文件的、计算机程序的指明的上下文中的头部文件的含义和引用上下文中的头部文件的含义是否相同的确定。例如,可以响应于在步骤1002标识include指示来执行在步骤1004确定指明的上下文中的头部文件的含义和引用上下文中的头部文件的含义是否相同。引用上下文与指明的上下文不同。如果指明的上下文中的头部文件的含义和引用上下文中的头部文件的含义相同,则流程继续到步骤1008。否则,流程继续到步骤1012。在一个示例实现方式中,确定逻辑1114确定指明的上下文中的头部文件的含义和引用上下文中的头部文件的含义是否相同。
在步骤1006,做出对于预编译的头部的每个部分是否在计算机程序中引用了相应的部分确定。如果在计算机程序中引用了相应的部分,则流程继续到步骤1008。否则,流程继续到步骤1010。在一个示例实现方式中,确定逻辑1114对于预编译的头部的每个部分确定是否在计算机程序中引用了相应的部分。
在步骤1008,加载预编译的头部的相应的部分。在一个示例实现方式中,加载器1110加载预编译的头部的相应的部分。
在一个示例实施例中,预编译的头部的多个版本与相应的上下文关联。根据这一实施例,在步骤1008基于预编译的头部的指明的版本与指明的上下文关联来加载指明的版本。
在步骤1010,不加载预编译的头部的相应的部分。在一个示例实现方式中,加载器1110不加载预编译的头部的相应的部分。
在对于预编译的头部的每个部分完成步骤1008或者步骤1010时,流程图1000的方法结束。
在步骤1012,在计算机程序的第二上下文中编译头部文件,在该第二上下文中,头部文件具有与引用上下文中的头部文件的含义相同的含义,以在第二数据结构中提供第二预编译的头部。在一个示例实现方式中,编译器1106在计算机程序的第二上下文中编译头部文件以在第二数据结构中提供第二预编译的头部。
在步骤1014,从第二数据结构提取第二预编译的头部。在一个示例实现方式中,提取器1108从第二数据结构提取第二预编译的头部。
在步骤1016,基于与相应的部分对应的引用来区分第二预编译的头部的每个部分与第二预编译的头部的其它部分。在一个示例实现方式中,存储逻辑1108和/或确定逻辑1110基于与相应的部分对应的引用来区分第二预编译的头部的每个部分与第二预编译的头部的其它部分。例如,存储逻辑1108和/或确定逻辑1110可以向第二预编译的头部的相应的部分指派引用。每个引用可以与其它引用不同。存储逻辑1108可以在设备1100的存储器中的相应的位置(例如,在存储卡1104和/或共享的预编译的头部高速缓存1116中的相应的位置)存储部分。存储逻辑1108可以在存储库1104和/或共享的预编译的头部1116中与部分一起存储引用。存储逻辑1108和/或确定逻辑1110可以维护查找表,该查找表交叉引用相应存储器位置的引用和地址。
在步骤1018,基于是否在计算机程序中引用了相应的部分来独立于第二预编译的头部的其它部分、有选择地加载第二预编译的头部的每个部分。在完成步骤1018时,流程图1000的方法结束。在一个示例实现方式中,加载器1110基于是否在计算机程序中引用了相应的部分来独立于第二预编译的头部的其它部分、有选择地加载第二预编译的头部的每个部分。
将认识到,设备1100可以不包括存储库1104、编译器1106、提取器1108、加载器1110、存储逻辑1112、确定逻辑1114和/或共享的预编译的头部高速缓存1116中的一个或者多个部件。另外,设备1100可以包括除了存储库1104、编译器1106、提取器1108、加载器1110、存储逻辑1112、确定逻辑1114和/或共享的预编译的头部高速缓存1116之外或者取代它们的部件。
可以在硬件、软件、固件或者其任何组合中实施用户***102A-102M中的任何一个或者多个用户***、服务器106A-106N中的任何一个或者多个服务器、有选择加载构建逻辑108、有选择加载构建逻辑1102、编译器1106、提取器1108、加载器1110、存储逻辑1112、确定逻辑1114、流程图200、流程图300、流程图400、流程图500、流程图600、流程图700、流程图800、流程图900和流程图1000。
例如,可以将用户***102A-102M中的任何一个或者多个用户***、服务器106A-106N中的任何一个或者多个服务器、有选择加载构建逻辑108、有选择加载构建逻辑1102、编译器1106、提取器1108、加载器1110、存储逻辑1112、确定逻辑1114、流程图200、流程图300、流程图400、流程图500、流程图600、流程图700、流程图800、流程图900和流程图1000至少部分地实施为被配置为在一个或者多个处理器中被执行的计算机程序代码。
在另一示例中,可以将用户***102A-102M中的任何一个或者多个用户***、服务器106A-106N中的任何一个或者多个服务器、有选择加载构建逻辑108、有选择加载构建逻辑1102、编译器1106、提取器1108、加载器1110、存储逻辑1112、确定逻辑1114、流程图200、流程图300、流程图400、流程图500、流程图600、流程图700、流程图800、流程图900和流程图1000至少部分地实施为硬件逻辑/电子电路。这样的硬件逻辑/电子电路可以包括一个或者多个硬件逻辑部件。硬件逻辑部件的示例包括但不限于现场可编程门阵列(FPGA)、专用集成电路(ASIC)、专用标准产品(ASSP)、片上***(SoC)、复杂可编程逻辑器件(CPLD)等。例如,SoC可以包括集成电路芯片,该集成电路芯片包括处理器(例如,微控制器、微处理器、数字信号处理(DSP)等)、存储器、一个或者多个通信接口和/或用于执行它的功能的另外的电路和/或嵌入式固件中的一个或者多个部件。
III.示例计算机***
图12描绘了其中可以对实施例进行实施的示例计算机1200。可以使用计算机1200、包括计算机1200的一个或者多个特征和/或备选特征来实施图1中所示的用户***102A-102M中的一个或者多个用户***和/或图1中所示的文件服务器106A-106N中的任何一个或者多个文件服务器和/或图11中所示的设备1100。计算机1200可以例如是以常规个人计算机、移动计算机或者工作站的形式的通用计算设备,或者计算机1200可以是专用计算设备。这里提供的对计算机1200的描述仅出于说明的目的而被提供,并且没有旨在于限制。如相关领域技术人员将知道的那样,可以在更多类型的计算机***中对实施例进行实施。
如图12中所示,计算机1200包括处理单元1202、***存储器1204和将包括***存储器1204的各种***部件耦合到处理单元1202的总线1206。总线1206表示若干类型的总线结构中的一个或者多个任何类型的总线结构,包括存储器总线或者存储器控制器、***总线、加速图形端口和使用多种总线架构中的任何总线架构的处理器或者本地总线。***存储器1204包括只读存储器(ROM)1208和随机存取存储器(RAM)1210。在ROM 1208中存储基本输入/输出***1212(BIOS)。
计算机1200也具有以下驱动中的一个或者多个驱动:用于从硬盘读取和向硬盘写入的硬盘驱动1214、用于从可移除磁盘1218读取或者向可移除磁盘1218写入的磁盘驱动1216和用于从可移除光盘1222(比如CD ROM、DVD ROM或者其它光学介质)读取或者向可移除光盘1222写入的光盘驱动1220。硬盘驱动1214、磁盘驱动1216和光盘驱动1220由分别由硬盘驱动接口1224、磁盘驱动接口1226和光驱动接口1228连接到总线1206。驱动及其关联的计算机可读存储介质提供对用于计算机的计算机可读指令、数据结构、程序模块和其它数据的非易失性存储器。虽然描述了硬盘、可移除磁盘和可移除光盘,但是其它类型的计算机可读存储介质可以用来存储数据,比如闪存卡、数字视频盘、随机存取存储器(RAM)、只读存储器(ROM)等。
可以在硬盘、磁盘、光盘、ROM或者RAM上存储多个程序模块。这些程序包括操作***1230、一个或者多个应用程序1232、其它程序模块1234和程序数据1236。应用程序1232或者程序模块1234可以例如包括用于实施如这里描述的有选择加载构建逻辑108、有选择加载构建逻辑1102、编译器1106、提取器1108、加载器1110、存储逻辑1112、确定逻辑1114、流程图200(包括流程图200的任何步骤)、流程图300(包括流程图300的任何步骤)、流程图400(包括流程图400的任何步骤)、流程图500(包括流程图500的任何步骤)、流程图600(包括流程图600的任何步骤)、流程图700(包括流程图700的任何步骤)、流程图800(包括流程图800的任何步骤)、流程图900(包括流程图900的任何步骤)和/或流程图1000(包括流程图1000的任何步骤)中的一项或者多项的计算机程序逻辑。
用户可以通过输入设备(比如键盘1238和指点设备1240)来向计算机1200中录入命令和信息。其它输入设备(未示出)可以包括麦克风、操纵杆、游戏板、卫星盘、扫描仪、触屏、相机、加速度计、陀螺仪等。这些和其它输入设备经常通过被耦合到总线1206的串行端口接口1242而被连接到处理单元1202,但是也可以由其它接口(比如并行端口、游戏端口或者通用串行总线(USB))连接。
显示设备1244(例如,监视器)也经由接口(比如视频适配器1246)而被连接到总线1206。除了显示设备1244之外,计算机1200可以包括其它***输出设备(未示出),比如扬声器和打印机。
计算机1200通过网络接口或者适配器1250、调制解调器1252或者用于通过网络建立通信的其它装置而被连接到网络1248(例如,因特网)。可以在内部或者外部的调制解调器1252经由串行端口接口1242而被连接到总线1206。
如这里所用,术语“计算机程序介质”和“计算机可读存储介质”用来一般地指代介质,比如与硬盘驱动1214关联的硬盘、可移除磁盘1218、可移除光盘1222以及其它介质,比如闪存卡、数字视频盘、随机存取存储器(RAM)、只读存储器(ROM)等。这样的计算机可读存储介质区别于通信介质并且与通信介质不重叠(不包括通信介质)。通信介质在调制的数据信号(比如载波)中体现计算机可读指令、数据结构、程序模块或者其它数据。术语“调制的数据信号”意味着如下信号,该信号让它的特性中的一个或者多个特性以对信号中的信息进行编码这样的方式而被设置或者改变。举例而言并且没有限制,通信介质包括无线介质(比如声学、RF、红外线和其它无线介质)以及有线介质。示例实施例也涉及这样的通信介质。
如以上指出的那样,可以在硬盘、磁盘、光盘、ROM或者RAM上存储计算机程序和模块(包括应用程序1232和其它程序模块1234)。也可以经由网络接口1250或者串行端口接口1242接收这样的计算机程序。这样的计算机程序在由应用执行或者加载时使计算机1200能够实施这里描述的实施例的特征。因而,这样的计算机程序表示计算机1200的控制器。
示例实施例也涉及包括在任何计算机可用介质上存储的软件(例如,计算机可读指令)的计算机程序产品。这样的软件当在一个或者多个数据处理设备中被执行时使得数据处理设备如这里描述的那样操作。实施例可以使用现在或者将来已知的任何计算机可用或者计算机可读介质。计算机可读介质的示例包括但不限于存储设备,比如RAM、硬驱动、软盘、CD ROM、DVD ROM、zip盘、磁带、磁存储设备、光存储设备、基于MEMS的存储设备、基于纳米技术的存储设备等。
将认识到,公开的技术不限于任何特定计算机或者类型的硬件。适合的计算机和硬件的某些细节是熟知的而无需在本公开内容中加以具体阐述。
IV.结论
虽然已经用结构特征和/或动作特有的言语描述了主题内容,但是将理解,在所附权利要求中定义的主题内容未必限于以上描述的具体特征或者动作。实际上,以上描述的具体特征和动作被公开作为实施权利要求的示例,并且其它等效特征和动作旨在于在权利要求的范围内。

Claims (20)

1.一种用于推迟预编译的头部的部分的加载的方法,包括:
使用一个或者多个处理器来在计算机程序的指明的上下文中编译头部文件以在一个或者多个数据结构中提供预编译的头部,所述指明的上下文包括所述头部文件相对于所述计算机程序的其它部分的指明的位置和所述头部文件相对于所述计算机程序的所述其它部分的指明的顺序;
基于所述上下文来从所述一个或者多个数据结构提取所述预编译的头部;
标识与所述头部文件关联的include指示;
在所述计算机程序的编译期间加载与所述预编译的头部关联的引用;以及
响应于加载所述引用,推迟所述预编译的头部的部分的加载,直至所述部分的上下文在所述计算机程序中被引用。
2.根据权利要求1所述的方法,其中加载所述引用包括:
加载所述头部文件的名称;并且
其中推迟所述预编译的头部的所述部分的所述加载包括:
推迟所述预编译的头部的所述部分的所述加载,直至所述头部文件的所述名称在所述计算机程序中被引用。
3.根据权利要求1所述的方法,其中加载所述引用包括:
加载与所述预编译的头部关联的多个引用,所述多个引用对应于所述预编译的头部的多个相应的部分;并且
其中推迟所述预编译的头部的所述部分的所述加载包括:
推迟所述多个部分中的每个部分的加载,直至所述相应的部分的内容在所述计算机程序中被引用。
4.根据权利要求1所述的方法,还包括:
基于所述头部文件在所述指明的上下文中被编译来存储指定所述指明的位置和所述指明的顺序的上下文指示符;以及
回顾所述上下文指示符以确定所述指明的位置和所述指明的顺序;
其中提取所述预编译的头部包括:
响应于回顾所述上下文指示符来提取所述预编译的头部。
5.根据权利要求1所述的方法,还包括:
向所述计算机程序的多个相应的头部文件分配多个存储器地址范围;
其中编译所述头部文件包括:
编译所述多个头部文件以提供多个相应的预编译的头部,所述多个预编译的头部中的每个预编译的头部在所述多个存储器地址范围中的相应的存储器地址范围中、在一个或者多个数据结构中被提供;并且
其中每个预编译的头部不可由所述多个预编译的头部中的其它预编译的头部修改。
6.根据权利要求1所述的方法,还包括:
标识在所述头部文件中被定义的一个或者多个符号,所述一个或者多个符号包括一个或者多个指针;以及
基于所述一个或者多个指针指向所述一个或者多个符号的一个或者多个依赖性来确定所述一个或者多个依赖性;
其中提取所述预编译的头部包括:
提取所述一个或者多个符号和所述一个或者多个依赖性。
7.根据权利要求1所述的方法,还包括:
响应于标识所述include指示,确定所述指明的上下文和引用上下文是否相同;
其中加载所述引用包括:
响应于所述指明的上下文和所述引用上下文相同的确定来加载所述引用。
8.根据权利要求1所述的方法,还包括:
响应于标识所述include指示,确定所述指明的上下文中的所述头部文件的含义和不同于所述指明的上下文的引用上下文中的所述头部文件的含义是否相同;
其中加载所述引用包括:
响应于所述指明的上下文中的所述头部文件的所述含义和所述引用上下文中的所述头部文件的所述含义相同的确定来加载所述引用。
9.根据权利要求8所述的方法,其中多个引用与关联于多个相应的上下文的所述预编译的头部的多个相应的版本关联;并且
其中加载所述引用包括:
基于所述引用与关联于所述指明的上下文的所述预编译的头部的指明的版本相关联来从所述多个引用选择所述引用。
10.一种用于有选择地加载预编译的头部的***,包括:
一个或者多个处理器;
编译器,其使用所述一个或者多个处理器中的至少一个处理器而被实施,其被配置为编译多个头部文件以提供多个预编译的头部,每个预编译的头部被包括在一个或者多个相应的数据结构中,所述一个或者多个相应的数据结构表示所述多个头部文件中的一个或者多个头部文件的源代码,从所述源代码编译所述预编译的头部;
提取器,其被配置为从所述相应的一个或者多个数据结构提取所述多个预编译的头部中的每个预编译的头部,所述提取器还被配置为区分所述多个预编译的头部中的每个预编译的头部与所述多个预编译的头部中的其它预编译的头部;
所述编译器或者确定逻辑中的至少一种,其被配置为标识与至少一个头部文件关联的include指示;以及
加载器,其被配置为基于所述相应的预编译的头部是否在计算机程序中被引用来独立于所述多个预编译的头部中的其它预编译的头部、有选择地加载每个预编译的头部。
11.根据权利要求10所述的***,其中所述提取器还被配置为区分所述多个预编译的头部中的至少一个预编译的头部的多个部分中的每个部分与所述多个部分中的其它部分;并且
其中所述加载器被配置为基于所述相应的部分是否在所述计算机程序中被引用来独立于所述多个部分中的其它部分、有选择地加载所述多个部分中的每个部分。
12.根据权利要求10所述的***,其中每个预编译的头部被包括在多个数据结构中的相应的子集中,每个子集包括所述相应的预编译的头部被包括在其中的所述一个或者多个相应的数据结构;并且
其中所述提取器被配置为在存储器中组织所述多个子集中的每个子集以免与所述存储器中的所述多个子集中的其它子集重叠。
13.根据权利要求10所述的***,包括:
所述确定逻辑,其被配置为确定所述多个头部文件中的至少一个头部文件包括至少一个指针,所述确定逻辑还被配置为基于所述一个或者多个指针指向所述至少一个头部文件的至少一个依赖性来确定所述至少一个依赖性;
其中所述提取器被配置为提取每个预编译的头部和所述至少一个依赖性。
14.根据权利要求10所述的***,包括:
所述确定逻辑,其被配置为响应于对所述include指示的标识,确定为了提供所述多个预编译的头部中的至少一个对应的预编译的头部而将所述至少一个头部文件编译在其中的指定的上下文和引用上下文是否相同;
其中所述加载器被配置为响应于对所述指定的上下文和所述引用上下文相同的确定,基于所述至少一个对应的预编译的头部被引用在所述计算机程序中,来加载所述至少一个对应的预编译的头部。
15.根据权利要求10所述的***,其中所述至少一个头部文件包括指明的头部文件;
其中所述***包括:
所述确定逻辑,其被配置为响应于对所述include指示的标识,确定为了提供所述多个预编译的头部中的对应的预编译的头部而将所述指明的头部文件编译在其中的指定的上下文中的所述指明的头部文件的含义和不同于所述指定的上下文的引用上下文中的所述指明的头部文件的含义是否相同;并且
其中所述加载器被配置为响应于对所述指定的上下文中的所述指明的头部文件的所述含义和所述引用上下文中的所述指明的头部文件的所述含义相同的确定,基于所述对应的预编译的头部被引用在所述计算机程序中,来加载所述对应的预编译的头部。
16.根据权利要求15所述的***,其中所述对应的预编译的头部的多个版本与多个相应的上下文关联;并且
其中所述加载器被配置为基于所述对应的预编译的头部的指明的版本与所述指定的上下文关联来加载所述指明的版本。
17.一种计算机可读存储介质,所述计算机可读存储介质具有在其上记录的用于使基于处理器的***能够有选择地加载预编译的头部的部分的计算机程序逻辑,所述计算机程序逻辑包括:
第一程序逻辑模块,其用于使所述基于处理器的***能够编译头部文件以在一个或者多个数据结构中提供所述预编译的头部;
第二程序逻辑模块,其用于使所述基于处理器的***能够从所述一个或者多个数据结构提取所述预编译的头部;
第三程序逻辑模块,其用于使所述基于处理器的***能够标识与所述头部文件关联的include指示;
第四程序逻辑模块,其用于使所述基于处理器的***能够基于与所述预编译的头部的多个部分中的多个相应的部分对应的多个引用来区分所述多个部分中的每个部分与所述多个部分中的其它部分;以及
第五程序逻辑模块,其用于使所述基于处理器的***能够基于所述相应部分是否被引用在计算机程序中来独立于所述多个部分中的其它部分、有选择地加载所述多个部分中的每个部分。
18.根据权利要求17所述的计算机可读存储介质,还包括:
第六程序逻辑模块,其用于使所述基于处理器的***能够响应于对所述include指示的标识来确定指明的上下文和引用上下文是否相同;
其中所述第五程序逻辑模块包括:
用于使所述基于处理器的***能够响应于对所述指明的上下文和所述引用上下文相同的确定,基于所述多个部分中的一个或者多个部分中的所述相应的部分被引用在所述计算机程序中,来独立于所述多个部分中的其它部分、有选择地加载所述一个或者多个部分中的每个部分的逻辑。
19.根据权利要求17所述的计算机可读存储介质,还包括:
第六程序逻辑模块,其用于使所述基于处理器的***能够响应于对所述include指示的标识来确定指明的上下文中的所述头部文件的含义和不同于所述指明的上下文的引用上下文中的所述头部文件的含义是否相同;
其中所述第五程序逻辑模块包括:
用于使所述基于处理器的***能够响应于对所述指明的上下文中的所述头部文件的所述含义和所述引用上下文中的所述头部文件的所述含义相同的确定,基于所述多个部分中的一个或者多个部分中的所述相应的部分被引用在所述计算机程序中,来独立于所述多个部分中的其它部分、加载所述一个或者多个部分中的每个部分的逻辑。
20.根据权利要求19所述的计算机可读存储介质,其中所述预编译的头部的多个版本与多个相应的上下文关联;并且
其中所述第五程序逻辑模块包括:
用于使所述基于处理器的***能够响应于对所述指明的上下文中的所述头部文件的所述含义和所述引用上下文中的所述头部文件的所述含义相同的确定,基于所述一个或者多个部分中的所述相应的部分被引用在所述计算机程序中并且还基于所述预编译的头部的指明的版本与所述指明的上下文关联,来独立于所述多个部分中的其它部分、加载所述指明的版本的所述多个部分中的所述一个或者多个部分中的每个部分的逻辑。
CN201580050466.5A 2014-09-19 2015-09-17 有选择地加载预编译的头部和/或其部分 Active CN107077365B (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US14/491,642 US9672020B2 (en) 2014-09-19 2014-09-19 Selectively loading precompiled header(s) and/or portion(s) thereof
US14/491,642 2014-09-19
PCT/US2015/050541 WO2016044501A1 (en) 2014-09-19 2015-09-17 Selectively loading precompiled header(s) and/or portion(s) thereof

Publications (2)

Publication Number Publication Date
CN107077365A CN107077365A (zh) 2017-08-18
CN107077365B true CN107077365B (zh) 2021-06-25

Family

ID=54251736

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201580050466.5A Active CN107077365B (zh) 2014-09-19 2015-09-17 有选择地加载预编译的头部和/或其部分

Country Status (4)

Country Link
US (1) US9672020B2 (zh)
EP (1) EP3195120A1 (zh)
CN (1) CN107077365B (zh)
WO (1) WO2016044501A1 (zh)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109845236A (zh) * 2016-08-18 2019-06-04 瑞典爱立信有限公司 用于通过选择性地审查主叫方的地理位置来增强voip安全性的方法和装置
US20200004522A1 (en) * 2018-06-27 2020-01-02 Hewlett Packard Enterprise Development Lp Selective download of a portion of a firmware bundle
US11720340B2 (en) * 2019-07-30 2023-08-08 Hewlett-Packard Development Company, L.P. Hash map of executable control blocks

Family Cites Families (18)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5680622A (en) * 1994-06-30 1997-10-21 Borland International, Inc. System and methods for quickly detecting shareability of symbol and type information in header files
US5692196A (en) * 1994-08-26 1997-11-25 Silicon Graphics, Inc. System and method for conditionally compiling a software compilation unit
US5822588A (en) * 1995-06-09 1998-10-13 Sun Microsystem, Inc. System and method for checking the use of synchronization locks in a multi-threaded target program
CA2194020C (en) * 1996-12-24 2002-02-05 Kevin Paul Hickman Minimizing debug information for global types in compiled languages
US5905990A (en) 1997-06-23 1999-05-18 International Business Machines Corporation File system viewpath mechanism
US6654954B1 (en) * 1998-02-17 2003-11-25 International Business Machines Corporation Computer system, program product and method utilizing executable file with alternate program code attached as a file attribute
US6658492B1 (en) * 1998-03-20 2003-12-02 Sun Microsystems, Inc. System and method for reducing the footprint of preloaded classes
ATE451625T1 (de) 2004-05-22 2009-12-15 Advantest Corp Verfahren und struktur zur entwicklung eines testprogramms für integrierte halbleiterschaltungen
US7814242B1 (en) * 2005-03-25 2010-10-12 Tilera Corporation Managing data flows in a parallel processing environment
US8104016B2 (en) * 2005-12-22 2012-01-24 Synopsys, Inc. Scalable language infrastructure for electronic system level tools
US7904892B2 (en) * 2006-01-06 2011-03-08 Northrop Grumman Corporation Systems and methods for identifying and displaying dependencies
US7958497B1 (en) * 2006-06-07 2011-06-07 Replay Solutions, Inc. State synchronization in recording and replaying computer programs
US20070294319A1 (en) * 2006-06-08 2007-12-20 Emc Corporation Method and apparatus for processing a database replica
US8214810B2 (en) 2006-08-29 2012-07-03 International Business Machines Corporation Method of compiling source code, compiler, computer system, and computer program product
US9250973B2 (en) * 2009-03-12 2016-02-02 Polycore Software, Inc. Apparatus and associated methodology of generating a multi-core communications topology
CN101702130B (zh) * 2009-11-12 2012-12-26 深圳市五巨科技有限公司 一种移动终端加载共享函数库的方法和装置
US8464234B2 (en) * 2011-10-24 2013-06-11 Google Inc. Pre-parsed headers for compilation
CN103019686B (zh) * 2012-11-20 2016-11-23 北京思特奇信息技术股份有限公司 一种跨两个中间件的***及其编译方法

Also Published As

Publication number Publication date
EP3195120A1 (en) 2017-07-26
WO2016044501A1 (en) 2016-03-24
US20160085523A1 (en) 2016-03-24
US9672020B2 (en) 2017-06-06
CN107077365A (zh) 2017-08-18

Similar Documents

Publication Publication Date Title
CN109976761B (zh) 软件开发工具包的生成方法、装置及终端设备
EP3876116B1 (en) Method and apparatus for running mini program, electronic device, and storage medium
CN112513820B (zh) 开发工具扩展程序的透明远程执行
KR101944570B1 (ko) 변형 컨텍스트-인식 데이터 소스 관리
Deitel Java how to program
US10942734B2 (en) Software dependency shading
US10353702B2 (en) Source code element signatures
US10162605B2 (en) Code snippet content recommendation to define an object literal
US9558214B1 (en) Secondary mappings to enable code changes without schema updates
US10698571B2 (en) Behavior feature use in programming by example
US20190108218A1 (en) Automated term extraction
US9311077B2 (en) Identification of code changes using language syntax and changeset data
JP6529501B2 (ja) 動的にカスタマイズされた文脈依存型ヘルプを生成する方法
CN103999036A (zh) 在支持事务的计算机体系结构中使用异常进行代码专业化的方法和***
US20170315830A1 (en) On-demand loading of dynamic scripting language code for reduced memory usage
US8146006B2 (en) Method and apparatus for obtaining user interface information from executable program code
US9141344B2 (en) Hover help support for application source code
US20160171104A1 (en) Detecting multistep operations when interacting with web applications
US20170054790A1 (en) System and Method for Object Compression and State Synchronization
KR20170057264A (ko) 멀티 컨텍스트 지능형 지원 기능을 갖는 코드 개발 툴
CN107077365B (zh) 有选择地加载预编译的头部和/或其部分
KR20220113372A (ko) 통합된 참조물 및 2차 객체 표시
WO2016205628A1 (en) A method and system for evaluating computational algorithms described in printed publications
CN114398673A (zh) 应用程序的合规检测方法、装置、存储介质与电子设备
US9703578B2 (en) Providing class loading for JAVA™ applications

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