CN104375875A - 用于应用程序的编译优化的方法以及编译器 - Google Patents
用于应用程序的编译优化的方法以及编译器 Download PDFInfo
- Publication number
- CN104375875A CN104375875A CN201310356194.4A CN201310356194A CN104375875A CN 104375875 A CN104375875 A CN 104375875A CN 201310356194 A CN201310356194 A CN 201310356194A CN 104375875 A CN104375875 A CN 104375875A
- Authority
- CN
- China
- Prior art keywords
- variable
- constant
- constant variable
- potential
- source code
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
- G06F8/4434—Reducing the memory space required by the program code
- G06F8/4435—Detection or removal of dead or redundant code
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种用于应用程序的编译优化的方法及相应的编译器。该方法包括:确定所述应用程序的源代码中的可常量化变量;利用所述可常量化变量,获取最终的常量变量以及所述常量变量的值;以及利用所述常量变量以及所述常量变量的值,对所述应用程序进行编译。
Description
技术领域
本发明涉及应用程序的编译技术,更具体地,涉及用于应用程序的编译优化的方法以及编译器。
背景技术
当前,应用程序需具备处理来自外部的信息的能力。这些外部信息包括但不限于:执行环境变量(例如,表示操作系统级别的变量等)、来自用户的命令行输入、应用程序的外部配置文件等。
通常,应用程序的开发者通过在源代码中使用例如IF/ELSE或SWITCH语句的分支选择语句来实现有关外部信息的处理。
然而,在某些情况下,应用程序可能被要求总是在一个稳定的环境中运行,或者仅应用于特定的场景。这样,应用程序在运行时,相关的变量的分支选择语句实际上只运行一个分支语句,而其它分支语句将变得多余。但这些多余的分支语句仍然包含在应用程序的可执行文件中,从而增加可执行文件的大小,并可能降低应用程序的整体性能。
为了避免上述的情形,目前常用的方法是在对应用程序的源代码进行编译前使用例如#ifdef的预处理命令对源代码进行预处理。通过该预处理命令,可以帮助在编译时删除无用的分支。
这种预处理适用于结构良好的应用程序,但对于具有大量遗留代码(legacycode)的非结构良好的应用程序,则并不适用。此外,采用这种预处理,可能导致代码庞大,可读性差,并且不能灵活地适用于所有的场景。
发明内容
根据本发明的一个方面,提供了一种用于应用程序的编译优化的方法,其包括:确定所述应用程序的源代码中的可常量化变量;利用所述可常量化变量,获取最终的常量变量以及所述常量变量的值;以及利用所述常量变量以及所述常量变量的值,对所述应用程序进行编译。
根据本发明的另一个方面,提供了一种用于应用程序的编译优化的编译器,其包括:可常量化变量确定装置,其被配置为确定所述应用程序的源代码中的可常量化变量;常量变量获取装置,其被配置为利用所述可常量化变量,获取最终的常量变量以及所述常量变量的值;以及编译装置,其被配置为利用所述常量变量以及所述常量变量的值,对所述应用程序进行编译。
附图说明
通过结合附图对本公开示例性实施方式进行更详细的描述,本公开的上述以及其它目的、特征和优势将变得更加明显,其中,在本公开示例性实施方式中,相同的参考标号通常代表相同部件。
图1示出了适于用来实现本发明实施方式的示例性计算机系统/服务器12的框图。
图2是根据本发明的实施例的用于应用程序的编译优化的方法的示意性流程图;
图3是图2的实施例中确定可常量化变量的步骤的示意性流程图;
图4是根据本发明的实施例的用于应用程序的编译优化的编译器的示意性方框图。
具体实施方式
在附图中显示了本公开的一些优选实施方式,下面将参照附图更详细地描述这些优选实施方式。然而,可以以各种形式实现本公开,其不应被这里阐述的实施方式所限制。相反,提供这些实施方式是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。
所属技术领域的技术人员知道,本发明的各个方面可以实现为系统、方法或计算机程序产品。因此,本发明的各个方面可以具体实现为以下形式,即:完全的硬件实施方式、完全的软件实施方式(包括固件、驻留软件、微代码等),或硬件和软件方面结合的实施方式,这里可以统称为“电路”、“模块”或“系统”。此外,在一些实施例中,本发明的各个方面还可以实现为在一个或多个计算机可读介质中的计算机程序产品的形式,该计算机可读介质中包含计算机可读的程序代码。
可以采用一个或多个计算机可读介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本文件中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括——但不限于——电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括——但不限于——无线、有线、光缆、RF等等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言的任意组合来编写用于执行本发明操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言—诸如Java、Smalltalk、C++等,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络——包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
下面将参照根据本发明实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述本发明。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机程序指令实现。这些计算机程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,使得这些计算机程序指令在通过计算机或其它可编程数据处理装置的处理器执行时,产生了实现流程图和/或框图中的一个或多个方框中规定的功能/动作的装置。
也可以把这些计算机程序指令存储在计算机可读介质中,这些指令使得计算机、其它可编程数据处理装置、或其他设备以特定方式工作,从而,存储在计算机可读介质中的指令就产生出包括实现流程图和/或框图中的一个或多个方框中规定的功能/动作的指令的制造品(article of manufacture)。
也可以把计算机程序指令加载到计算机、其它可编程数据处理装置、或其它设备上,使得在计算机、其它可编程数据处理装置或其它设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机或其它可编程装置上执行的指令提供实现流程图和/或框图中的一个或多个方框中规定的功能/动作的过程。
图1示出了适于用来实现本发明实施方式的示例性计算机系统/服务器12的框图。图1显示的计算机系统/服务器12仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
如图1所示,计算机系统/服务器12以通用计算设备的形式表现。计算机系统/服务器12的组件可以包括但不限于:一个或者多个处理器或者处理单元16,系统存储器28,连接不同系统组件(包括系统存储器28和处理单元16)的总线18。
总线18表示几类总线结构中的一种或多种,包括存储器总线或者存储器控制器,外围总线,图形加速端口,处理器或者使用多种总线结构中的任意总线结构的局域总线。举例来说,这些体系结构包括但不限于工业标准体系结构(ISA)总线,微通道体系结构(MAC)总线,增强型ISA总线、视频电子标准协会(VESA)局域总线以及外围组件互连(PCI)总线。
计算机系统/服务器12典型地包括多种计算机系统可读介质。这些介质可以是任何能够被计算机系统/服务器12访问的可用介质,包括易失性和非易失性介质,可移动的和不可移动的介质。
系统存储器28可以包括易失性存储器形式的计算机系统可读介质,例如随机存取存储器(RAM)30和/或高速缓存存储器32。计算机系统/服务器12可以进一步包括其它可移动/不可移动的、易失性/非易失性计算机系统存储介质。仅作为举例,存储系统34可以用于读写不可移动的、非易失性磁介质(图1未显示,通常称为“硬盘驱动器”)。尽管图1中未示出,可以提供用于对可移动非易失性磁盘(例如“软盘”)读写的磁盘驱动器,以及对可移动非易失性光盘(例如CD-ROM,DVD-ROM或者其它光介质)读写的光盘驱动器。在这些情况下,每个驱动器可以通过一个或者多个数据介质接口与总线18相连。存储器28可以包括至少一个程序产品,该程序产品具有一组(例如至少一个)程序模块,这些程序模块被配置以执行本发明各实施例的功能。
具有一组(至少一个)程序模块42的程序/实用工具40,可以存储在例如存储器28中,这样的程序模块42包括——但不限于——操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。程序模块42通常执行本发明所描述的实施例中的功能和/或方法。
计算机系统/服务器12也可以与一个或多个外部设备14(例如键盘、指向设备、显示器24等)通信,还可与一个或者多个使得用户能与该计算机系统/服务器12交互的设备通信,和/或与使得该计算机系统/服务器12能与一个或多个其它计算设备进行通信的任何设备(例如网卡,调制解调器等等)通信。这种通信可以通过输入/输出(I/O)接口22进行。并且,计算机系统/服务器12还可以通过网络适配器20与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。如图所示,网络适配器20通过总线18与计算机系统/服务器12的其它模块通信。应当明白,尽管图中未示出,可以结合计算机系统/服务器12使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、RAID系统、磁带驱动器以及数据备份存储系统等。
图2是根据本发明的实施例的用于应用程序的编译优化的方法的示意性流程图。下面结合附图,对本实施例进行详细描述。
本发明的实施例的主要思想是将应用程序的源代码中在运行时能够成为常量的变量在对应用程序进行编译时提前常量化,从而无需改变源代码就能够删除源代码中的无效语句,并能够灵活地生成各种特定于环境、场景的执行文件。
参见图2,在步骤S210,确定应用程序的源代码中的可常量化变量。在本实施例中,所谓可常量化变量是指在运行时能够安全地成为常量的变量,也就是说,在运行时具有唯一确定的常量值的变量。
图3示出了确定可常量化变量的步骤S210的示意性流程图。如图3所示,在步骤S301,分析应用程序的源代码,以获得潜在可常量化变量。在本实施例中,所谓潜在可常量化变量是指可能成为可常量化变量的变量。
在一个实施例中,首先,在源代码中查找分支选择语句。分支选择语句可以是例如C语言中的IF/ELSE语句或者SWITCH语句。接着,提取所查找的分支选择语句中的变量,作为潜在可常量化变量。在对源代码查找了所有的分支选择语句并获得了潜在可常量化变量后,可生成潜在可常量化变量列表以包含所有的潜在可常量化变量。
在另一个实施例中,首先,在源代码中查找分支选择语句。如上所述,分支选择语句例如是IF/ELSE语句或SWITCH语句。接着,确定在所查找的分支选择语句中是否存在函数调用。然后,如果确定在分支选择语句中没有函数调用,则提取该分支选择语句中的变量,作为潜在可常量化变量。相反,如果确定在分支选择语句中存在函数调用,则可进一步确定所调用的函数是否是语义确定的函数,即调用时可生成确定值的函数。如果确定所调用的函数是语义确定的函数,则提取该分支选择语句中的变量,作为潜在可常量化变量。相反,如果确定所调用的函数不是语义确定的函数,则该分支选择语句中的变量不是潜在可常量化变量。对源代码中的所有分支选择语句进行上述的处理,并生成潜在可常量化变量列表以包含所获得的潜在可常量化变量。
在获得了潜在可常量化变量后,可进一步对这些潜在可常量化变量进行“提纯”处理,以去除不能安全地成为常量的潜在可常量化变量。具体地,在步骤S305,从在步骤S301中获得的潜在可常量化变量中除去被多次赋值的潜在可常量化变量。在一个实施例中,可对所获得的潜在可常量化变量的每一个的赋值操作进行计数。在分析源代码期间,每当处理一个赋值语句时,赋值语句中的变量的赋值计数值就增加1。通过上述操作,可以得到每一个潜在可常量化变量的赋值计数值。如果某个潜在可常量化变量的赋值计数值超过1,则表明该潜在可常量化变量在运行时不能安全地成为常量。因此,从所获得的潜在可常量化变量中除去赋值操作的计数值超过1的潜在可常量化变量。
然后,在步骤S310,确定应用程序的源代码中受外部信息变量影响的受影响变量。在本实施例中,外部信息变量是指表示来自外部的信息的变量,例如命令行参数、描述应用程序的运行环境的环境变量、应用程序的外部配置文件中的参数变量等。
在一个实施例中,首先,在应用程序的源代码中,查找命令行参数或者环境变量或者应用程序的外部配置文件中的参数变量,作为外部信息变量。接着,在源代码中,查找被这些外部信息变量直接赋值的变量,作为直接受影响变量。然后,查找在直接受影响变量被视为常量时通过常量传播被赋值为常量的变量,作为间接受影响变量。直接受影响变量和间接受影响变量构成受影响变量。在实现中,可生成受外部信息影响变量列表以包含上述的受影响变量。可选地,在上述受外部影响变量列表中也可包含外部信息变量。
虽然以上按照步骤S301、S305和S310的顺序进行了描述,但本领域的普通技术人员容易知道,上述的步骤S301、S305与步骤S310之间的执行顺序并不受限于此。
接着,在步骤S315,从剩余的潜在可常量化变量和受影响变量中选择相同的变量,作为可常量化变量。通过上述的步骤S301、S305和S310,可获得经过“提纯”处理的潜在可常量化变量列表和受外部信息影响变量列表。因此,可常量化变量是在潜在可常量化变量列表和受外部信息影响变量列表中同时出现的变量。
下面通过两个具体的例子说明确定可常量化变量的过程。
例子1:假定应用程序的部分源代码如下所示:
首先,在源代码中查找分支选择语句,可获得1个IF/ELSE语句,其具有4个分支。在每个分支语句中存在函数strcmp()的调用,而函数strcmp()是字符串比较函数,其语义是确定的,因此,潜在可常量化变量是所查找的IF/ELSE语句中的变量langlvl。由于变量langlvl的赋值操作只有一次,因此,经过“提纯”处理的潜在可常量化变量仍然是变量langlvl。然后,在源代码中查找外部信息变量和受影响变量。argv[1]表示命令行输入的第一个参数,因此属于外部信息变量。受变量argv[1]影响的变量是langlvl。因此,可获得外部信息变量argv[1]和受影响变量langlvl。最后,可确定可常量化变量是langlvl。
例子2:假定应用程序的部分源代码如下所示:
首先,在源代码中查找分支选择语句,可获得5个IF/ELSE语句。其中,3个IF/ELSE语句存在函数调用,包括函数strcmp()、函数checkPrev()、函数isSupportLd()和函数isSupportAssert()。如前所述,函数strcmp()是语义确定的函数,因此,相应的变量langlvl是潜在可常量化变量。另外两个IF/ELSE语句没有函数调用,因此,其中的变量flag、outFormat是潜在可常量化变量。这样,潜在可常量化变量是变量langlvl、flag、outFormat。接着,对上述变量的赋值操作进行计数,变量langlvl的赋值计数值为1,变量flag的赋值计数值为4,变量outFormat的赋值计数值为1,因此,从当前的潜在可常量化变量中除去变量flag。这样,经过“提纯”处理的潜在可常量化变量是变量langlvl、outFormat。然后,查找外部信息变量和受影响变量。由于argv[]表示命令行参数,因此,外部信息变量是变量argv[1]、argv[2]。相应地,受影响变量是变量langlvl、outFormat。根据所获得的潜在可常量化变量和受影响变量,可以确定可常量化变量是变量langlvl、outFormat。
返回到图2,在获得了可常量化变量后,在步骤S220,利用所获得的可常量化变量,获取最终的常量变量以及常量变量的值。
在一个实施例中,可将所获得的可常量化变量呈现给例如应用程序的开发者。具体地,将所获得的可常量化变量,包括可常量化变量的变量名、所在的位置、依赖性等,形成模板以提供给开发者。然后,应用程序的开发者可通过修改模板来指定哪些可常量化变量是常量变量,并确定对应的值。修改后的模板记录了常量变量及其值,可作为随后的编译用的外部配置文件。在该实施例中,通过接受来自开发者的对常量变量及其值的指定,确定最终的常量变量及其值。
在另一个实施例中,首先,读取用于编译的外部配置文件。该外部配置文件描述了应用程序中将成为常量变量的变量及其相应的值。然后,可在可常量化变量中确定与该外部配置文件中的变量相同的可常量化变量为最终的常量变量。相应地,常量变量的值也被获得。
然后,在步骤S230,考虑在步骤S220中获取的常量变量及其值,对应用程序进行编译。由于已经知道应用程序的源代码中哪些变量是常量,因此,在编译时可使用例如常量折叠、无效代码删除等现有的优化方法以移除分支选择语句中多余的分支。
通过以上描述可以看出,本实施例的用于应用程序的编译优化的方法通过在对应用程序进行编译之前确定在运行时能够成为常量的变量并随后进行编译,能够无需修改应用程序的源代码而实现对应用程序对特定运行环境、场景的定制,并且无需编译多余的代码,具有成本低且安全的优点。另外,本实施例的方法也能够适用于存在大量遗留代码的应用程序。
在相同的发明构思下,图4示出了根据本发明的实施例的用于应用程序的编译优化的编译器400的示意性方框图。
如图4所示,本实施例的编译器400包括:可常量化变量确定装置401,其被配置为确定应用程序的源代码中的可常量化变量;常量变量获取装置402,其被配置为利用在可常量化变量确定装置401中确定的可常量化变量,获取最终的常量变量以及常量变量的值;以及编译装置403,其被配置为利用常量变量以及常量变量的值,对应用程序进行编译。
在本实施例中,在可常量化变量确定装置401中,分析模块4011分析应用程序的源代码,以获得潜在可常量化变量。
在一个实施例中,在分析模块4011中,查找单元在源代码中查找分支选择语句,然后,提取单元提取分支选择语句中的变量,作为潜在可常量化变量。
在另一个实施例中,在分析模块4011中,查找单元在源代码中查找分支选择语句。如果在分支选择语句中存在函数调用且所调用的函数是语义确定的函数,则提取单元提取分支选择语句中的变量,作为潜在可常量化变量。如果在分支选择语句中没有函数调用,则提取单元提取分支选择语句中的变量,作为潜在可常量化变量。
接着,移除模块4012从通过分析模块4011获得的潜在可常量化变量中除去被多次赋值的潜在可常量化变量。在一个实施例中,在移除模块4012中,计数单元对所获得的潜在可常量化变量的赋值操作进行计数。然后,移除单元除去赋值操作的计数值超过1的潜在可常量化变量。
另外,在可常量化变量确定装置401中,确定模块4013根据应用程序的源代码,确定受外部信息变量影响的受影响变量。在一个实施例中,在确定模块4013中,第一查找单元在源代码中查找命令行参数或者环境变量或者应用程序的外部配置文件中的参数变量,作为外部信息变量,并且第二查找单元在源代码中查找被第一查找单元所查找的外部信息变量直接赋值的变量,作为直接受影响变量,以及查找在直接受影响变量被视为常量时通过常量传播被赋值为常量的变量,作为间接受影响变量。直接受影响变量和间接受影响变量构成整个受影响变量。
然后,选择模块4014从通过移除模块4012后剩余的潜在可常量化变量、通过确定模块4013所确定的受影响变量中,选择相同的变量以作为可常量化变量。
通过可常量化变量确定装置401确定的可常量化变量被提供给常量变量获取装置402。
在一个实施例中,在常量变量获取装置402中,呈现模块4021呈现所确定的可常量化变量给例如应用程序的开发者,并且接受模块4022接受在可常量化变量中指定常量变量和常量变量的值。
在另一个实施例中,在常量变量获取装置402中,读取模块读取用于编译的外部配置文件,该外部配置文件描述了将成为常量变量的变量及其相应的值。然后,常量变量确定模块将可常量化变量中与所读取的外部配置文件中的变量相同的可常量化变量确定为常量变量,并相应地可确定常量变量的值。
在常量变量获取装置402获得了常量变量及其值后,编译装置403利用所获取的常量变量及其值,对应用程序进行编译。由于编译装置403已经知道哪些变量成为常量以及这些常量的值,因此,编译装置403可以使用如常量折叠、无效代码删除等优化方法进行编译优化。
应当注意,本实施例的编译器400能够在操作上实现图2和图3所示的用于应用程序的编译优化的方法。
附图中的流程图和框图显示了根据本发明的多个实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
以上已经描述了本发明的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术的技术改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。
Claims (16)
1.一种用于应用程序的编译优化的方法,包括:
确定所述应用程序的源代码中的可常量化变量;
利用所述可常量化变量,获取最终的常量变量以及所述常量变量的值;以及
利用所述常量变量以及所述常量变量的值,对所述应用程序进行编译。
2.根据权利要求1所述的方法,其中,确定所述应用程序的源代码中的可常量化变量包括:
分析所述源代码,以获得潜在可常量化变量;
从所述潜在可常量化变量中除去被多次赋值的潜在可常量化变量;
确定所述源代码中受外部信息变量影响的受影响变量;以及
从剩余的所述潜在可常量化变量和所述受影响变量中选择相同的变量,作为所述可常量化变量。
3.根据权利要求2所述的方法,其中,分析所述源代码以获得潜在可常量化变量包括:
在所述源代码中查找分支选择语句;以及
提取所述分支选择语句中的变量,作为所述潜在可常量化变量。
4.根据权利要求2所述的方法,其中,分析所述源代码以获得潜在可常量化变量包括:
在所述源代码中查找分支选择语句;
如果在所述分支选择语句中没有函数调用,则提取所述分支选择语句中的变量,作为所述潜在可常量化变量;
如果在所述分支选择语句中存在函数调用且所调用的函数是语义确定的函数,则提取所述分支选择语句中的变量,作为所述潜在可常量化变量。
5.根据权利要求2所述的方法,其中,从所述潜在可常量化变量中除去被多次赋值的潜在可常量化变量包括:
对所述潜在可常量化变量的赋值操作进行计数;以及
除去赋值操作的计数值超过1的潜在可常量化变量。
6.根据权利要求2所述的方法,其中,确定所述源代码中受外部信息变量影响的受影响变量包括:
在所述源代码中,查找命令行参数或者描述所述应用程序的运行环境的环境变量或者所述应用程序的外部配置文件中的参数变量,作为所述外部信息变量;
查找被所述外部信息变量直接赋值的变量,作为直接受影响变量;以及
查找在所述直接受影响变量被视为常量时通过常量传播被赋值为常量的变量,作为间接受影响变量;
其中,所述受影响变量包括所述直接受影响变量和所述间接受影响变量。
7.根据权利要求1所述的方法,其中,利用所述可常量化变量,获取最终的常量变量以及所述常量变量的值包括:
呈现所述可常量化变量;以及
接受在所述可常量化变量中指定常量变量和所述常量变量的值。
8.根据权利要求1所述的方法,其中,利用所述可常量化变量,获取最终的常量变量以及所述常量变量的值包括:
读取描述将成为常量变量的变量及其相应的值的外部配置文件;以及
将所述可常量化变量中与所述外部配置文件中的变量相同的可常量化变量确定为常量变量。
9.一种用于应用程序的编译优化的编译器,包括:
可常量化变量确定装置,其被配置为确定所述应用程序的源代码中的可常量化变量;
常量变量获取装置,其被配置为利用所述可常量化变量,获取最终的常量变量以及所述常量变量的值;以及
编译装置,其被配置为利用所述常量变量以及所述常量变量的值,对所述应用程序进行编译。
10.根据权利要求9所述的编译器,其中,所述可常量化变量确定装置包括:
分析模块,其被配置为分析所述源代码,以获得潜在可常量化变量;
移除模块,其被配置为从所述潜在可常量化变量中除去被多次赋值的潜在可常量化变量;
确定模块,其被配置为确定所述源代码中受外部信息变量影响的受影响变量;以及
选择模块,其被配置为从剩余的所述潜在可常量化变量所述受影响变量中选择相同的变量,作为所述可常量化变量。
11.根据权利要求10所述的编译器,其中,所述分析模块包括:
查找单元,其被配置为在所述源代码中查找分支选择语句;以及
提取单元,其被配置为提取所述分支选择语句中的变量,作为所述潜在可常量化变量。
12.根据权利要求10所述的编译器,其中,所述分析模块包括:
查找单元,其被配置为在所述源代码中查找分支选择语句;以及
提取单元,其被配置为如果在所述分支选择语句中没有函数调用,则提取所述分支选择语句中的变量,作为所述潜在可常量化变量,以及如果在所述分支选择语句中存在函数调用且所调用的函数是语义确定的函数,则提取所述分支选择语句中的变量,作为所述潜在可常量化变量。
13.根据权利要求10所述的编译器,其中,所述移除模块包括:
计数单元,其被配置为对所述潜在可常量化变量的赋值操作进行计数;以及
移除单元,其被配置为除去赋值操作的计数值超过1的潜在可常量化变量。
14.根据权利要求10所述的编译器,其中,所述确定模块包括:
第一查找单元,其被配置为在所述源代码中,查找命令行参数或者描述所述应用程序的运行环境的环境变量或者所述应用程序的外部配置文件中的参数变量,作为所述外部信息变量;
第二查找单元,其被配置为查找被所述外部信息变量直接赋值的变量,作为直接受影响变量,以及查找在所述直接受影响变量被视为常量时通过常量传播被赋值为常量的变量,作为间接受影响变量;
其中,所述受影响变量包括所述直接受影响变量和所述间接受影响变量。
15.根据权利要求9所述的编译器,其中,所述常量变量获取装置包括:
呈现模块,其被配置为呈现所述可常量化变量;以及
接受模块,其被配置为接受在所述可常量化变量中指定常量变量和所述常量变量的值。
16.根据权利要求9所述的编译器,其中,所述常量变量获取装置包括:
读取模块,其被配置为读取描述将成为常量变量的变量及其相应的值的外部配置文件;以及
常量变量确定模块,其被配置为将所述可常量化变量中与所述外部配置文件中的变量相同的可常量化变量确定为常量变量。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310356194.4A CN104375875B (zh) | 2013-08-15 | 2013-08-15 | 用于应用程序的编译优化的方法以及编译器 |
US14/259,599 US9223552B2 (en) | 2013-08-15 | 2014-04-23 | Compiling optimization of an application and compiler thereof |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310356194.4A CN104375875B (zh) | 2013-08-15 | 2013-08-15 | 用于应用程序的编译优化的方法以及编译器 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104375875A true CN104375875A (zh) | 2015-02-25 |
CN104375875B CN104375875B (zh) | 2017-08-25 |
Family
ID=52467775
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310356194.4A Expired - Fee Related CN104375875B (zh) | 2013-08-15 | 2013-08-15 | 用于应用程序的编译优化的方法以及编译器 |
Country Status (2)
Country | Link |
---|---|
US (1) | US9223552B2 (zh) |
CN (1) | CN104375875B (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107038058A (zh) * | 2017-02-08 | 2017-08-11 | 阿里巴巴集团控股有限公司 | 一种代码处理方法及装置 |
CN110506256A (zh) * | 2017-07-31 | 2019-11-26 | 帝斯贝思数字信号处理和控制工程有限公司 | 用于生成源代码的方法 |
CN112799649A (zh) * | 2020-06-15 | 2021-05-14 | 中兴通讯股份有限公司 | 代码构建方法、装置、设备和存储介质 |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10175964B2 (en) * | 2014-09-26 | 2019-01-08 | Microsoft Technology Licensing, Llc | Compiler caching for runtime routine redundancy tracking |
US9419991B2 (en) * | 2014-09-30 | 2016-08-16 | Juniper Networks, Inc. | De-obfuscating scripted language for network intrusion detection using a regular expression signature |
US20180225110A1 (en) * | 2017-02-08 | 2018-08-09 | International Business Machines Corporation | Legacy program code analysis and optimization |
US10936290B2 (en) | 2018-11-29 | 2021-03-02 | International Business Machines Corporation | Compile-time folding of assumed constant values |
CN115292203B (zh) * | 2022-09-30 | 2022-12-16 | 平安银行股份有限公司 | 一种源代码分析方法及装置 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20020174418A1 (en) * | 2001-03-30 | 2002-11-21 | Microsoft Corporation | Constant return optimization transforming indirect calls to data fetches |
US20060200809A1 (en) * | 2005-03-03 | 2006-09-07 | Nikola Grcevski | Transforming code to expose glacial constants to a compiler |
US20090119654A1 (en) * | 2007-10-30 | 2009-05-07 | International Business Machines Corporation | Compiler for optimizing program |
US20120233601A1 (en) * | 2012-05-01 | 2012-09-13 | Concurix Corporation | Recompiling with Generic to Specific Replacement |
CN102741812A (zh) * | 2010-01-12 | 2012-10-17 | 高通股份有限公司 | 通过元数据抽取执行动态语言 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7840950B2 (en) * | 2006-03-09 | 2010-11-23 | International Business Machines Corporation | Programmatic compiler optimization of glacial constants |
US7921418B2 (en) * | 2006-08-15 | 2011-04-05 | International Business Machines Corporation | Compile time evaluation of library functions |
-
2013
- 2013-08-15 CN CN201310356194.4A patent/CN104375875B/zh not_active Expired - Fee Related
-
2014
- 2014-04-23 US US14/259,599 patent/US9223552B2/en not_active Expired - Fee Related
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20020174418A1 (en) * | 2001-03-30 | 2002-11-21 | Microsoft Corporation | Constant return optimization transforming indirect calls to data fetches |
US20060200809A1 (en) * | 2005-03-03 | 2006-09-07 | Nikola Grcevski | Transforming code to expose glacial constants to a compiler |
US20090119654A1 (en) * | 2007-10-30 | 2009-05-07 | International Business Machines Corporation | Compiler for optimizing program |
CN102741812A (zh) * | 2010-01-12 | 2012-10-17 | 高通股份有限公司 | 通过元数据抽取执行动态语言 |
US20120233601A1 (en) * | 2012-05-01 | 2012-09-13 | Concurix Corporation | Recompiling with Generic to Specific Replacement |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107038058A (zh) * | 2017-02-08 | 2017-08-11 | 阿里巴巴集团控股有限公司 | 一种代码处理方法及装置 |
CN110506256A (zh) * | 2017-07-31 | 2019-11-26 | 帝斯贝思数字信号处理和控制工程有限公司 | 用于生成源代码的方法 |
CN110506256B (zh) * | 2017-07-31 | 2023-09-01 | 德斯拜思有限公司 | 用于生成源代码的方法 |
CN112799649A (zh) * | 2020-06-15 | 2021-05-14 | 中兴通讯股份有限公司 | 代码构建方法、装置、设备和存储介质 |
CN112799649B (zh) * | 2020-06-15 | 2023-09-12 | 中兴通讯股份有限公司 | 代码构建方法、装置、设备和存储介质 |
Also Published As
Publication number | Publication date |
---|---|
US9223552B2 (en) | 2015-12-29 |
US20150052507A1 (en) | 2015-02-19 |
CN104375875B (zh) | 2017-08-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104375875A (zh) | 用于应用程序的编译优化的方法以及编译器 | |
EP3588285B1 (en) | Sequence optimizations in a high-performance computing environment | |
CN109863473B (zh) | 用于样本驱动简档引导优化的方法、电子设备及电子系统 | |
US20110078424A1 (en) | Optimizing program code using branch elimination | |
US11579856B2 (en) | Multi-chip compatible compiling method and device | |
US7353503B2 (en) | Efficient dead code elimination | |
US20060200796A1 (en) | Program development apparatus, method for developing a program, and a computer program product for executing an application for a program development apparatus | |
US20130125098A1 (en) | Transformation of Computer Programs | |
CN110058861B (zh) | 源码处理方法及装置、存储介质、电子设备 | |
JP6911059B2 (ja) | Cpu利用およびコードリファクタリングのためのクエリオプティマイザー | |
CN103077062B (zh) | 一种代码改动的检测方法和装置 | |
CN105446725A (zh) | 用于模型驱动开发的方法和系统 | |
CN105701006A (zh) | 用于程序调试中的变量跟踪的方法和系统 | |
US8458679B2 (en) | May-constant propagation | |
CN106598828A (zh) | 一种源代码中的无效类确定方法及装置 | |
CN110780879A (zh) | 一种基于智能编译技术的决策执行方法、装置、设备及介质 | |
CN113568605B (zh) | 约定式路由配置方法、装置、和系统 | |
US20130031537A1 (en) | Specialized Function Implementation Using Code Frequency Profiling | |
CN111949328A (zh) | 一种启动加速方法、装置、计算机设备及存储介质 | |
CN105786465A (zh) | 一种脚本语言执行方法及装置 | |
CN104951290A (zh) | 优化软件的方法和设备 | |
CN107817972B (zh) | 缓存代码处理方法、装置、存储介质及电子设备 | |
CN111796832B (zh) | 热补丁文件生成方法、装置、设备及存储介质 | |
CN114090514A (zh) | 分布式系统的日志检索方法及装置 | |
US8495033B2 (en) | Data processing |
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 | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20170825 |