CN1672133A - 优化的代码生成 - Google Patents
优化的代码生成 Download PDFInfo
- Publication number
- CN1672133A CN1672133A CN03818445.1A CN03818445A CN1672133A CN 1672133 A CN1672133 A CN 1672133A CN 03818445 A CN03818445 A CN 03818445A CN 1672133 A CN1672133 A CN 1672133A
- Authority
- CN
- China
- Prior art keywords
- code
- information
- compiler
- intermediate representation
- transform
- 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.)
- Pending
Links
Images
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/52—Binary to binary
-
- 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/447—Target code generation
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种为数据处理系统生成可执行程序代码的方法,它包括用于生成输入代码(IC)的压缩中间表示(E-IR)的编码级和用于从所述中间表示生成可执行代码的解码级。所述编码级包括:对所述输入代码进行变换(301),包括执行代码优化步骤,从而产生变换代码(302)和有关所述变换代码的编译器信息(303);从所述变换代码和所述编译器信息提取(304,306)统计模型的状态信息和统计信息(PDF)(305);以及使用所提取的状态信息和统计信息,将所述变换代码和所述编码器信息编码(307),并产生所述压缩中间表示。所述解码级包括将所述压缩中间表示解码,从而得到所述变换代码和所述编译器信息;并使用所述解码的编译器信息进一步编译所述变换代码,从而产生所述可执行程序代码。
Description
本发明涉及为数据处理系统生成可执行程序代码。
数据处理系统的内存应保持尽可能小以便使系统的成本不高。具体而言,这是对移动终端如移动电话、PDA等移动数据处理系统的一项重要的一般要求。另一方面,需要允许移动终端下载和执行不断增多的各种软件应用,从而增加了移动终端中的内存使用量。
此外,软件应用程序在数据处理系统上执行时应快速、高效地执行。
还希望生成和下载的软件也适用于不同类型的数据处理系统,例如,某个制造商的所有移动电话。
因此,软件应用程序的共同要求包括:
-要存储在数据处理系统中的代码量小。
-机器无关的代码。
-优化的代码。
例如,作为一种生成称为字节码的平台无关代码的编程语言,Java为人所熟知。Java字节码可以压缩形式发布,例如,采用Lempel-Ziv压缩或其它通用压缩技术。
执行Java字节码有几种可能的方式,包括由Java虚拟机器解释、由生成可执行代码的编译器提前编译以及及时(JIT)编译。然而,上述方法的缺点在于它们生成了机器相关的代码或导致代码执行缓慢,因而未满足所有上述要求。具体而言,JIT编译是一种通用方案,在该方案中,字节码部分正好在其执行前编译。在执行期间,编译产生通常可接受的开销。然而,由于及时编译需要很短的时间以便限制此开销,因此,所产生的代码未很好地优化,因而产生慢且效率低的可执行代码。
“统计代码压缩模型的自动推论”(Christopher W.Fraser,,“Automatic Inference of Models for Statistical Code Compression”,(REF))一文公开了一种压缩计算机程序的方法,其中应用了机器学习算法来压缩常规编译器的中间表示。
然而,上述先有技术方法未解决提供高效可执行代码的问题。
本发明的又一目的是解决提供一种编码方案的问题,所述方案提供了改进的压缩率。
上述和其它问题通过为数据处理系统生成可执行程序代码的一种方法得以解决;所述方法包括:
用于生成输入代码的压缩中间表示的编码级,所述编码级包括:
-对所述输入码进行变换,包括执行一组选定的代码优化步骤,从而产生变换代码和有关所述变换代码的编译器信息;
-从所述变换代码和所述编译器信息提取统计模型的状态信息和统计信息;以及
-使用所述提取的状态信息和统计信息,将所述变换代码和所述编码器信息编码,并产生所述压缩中间表示;
用于从所述压缩中间表示生成所述可执行程序代码的解码级;所述解码级包括:
-将所述压缩中间表示解码,从而得到所述变换代码和所述编译器信息;以及
-使用所述解码的编译器信息进一步编译所述变换代码,从而产生所述可执行程序代码。
因此,本发明的优点在于它提供了用于编译程序代码的框架,这产生了程序代码的高效压缩中间表示并在所述编码级的编译期间高度优化代码。
术语优化在本文中使用时的含意是以提高代码性能为目的的变换。
因此,一个优点是可在所述编码级期间执行耗时的优化步骤,从而提供高度优化的中间表示,而所述中间表示在解码器处可变换成优化的可执行代码而无需大的开销。
压缩中间表示由于减小了要传送到和/或存储在数据处理系统中的代码大小,因此它可高效地传送到和/或存储在数据处理系统中。本发明的一个优点是它提供了高压缩率。
本发明的一个优点是除所述传送代码外,第一编译级还提供编译器信息。编译器信息流包含对重建的可执行代码,如所述第一编译级期间执行的优化分析的结果的正确性无直接影响的信息。所述编译器信息有两个用途:
-它可包含语义信息,如高级语言数据类型,从而由于它允许更好的建模而改进了压缩。这可以是在更早的编译遍(pass)中已由初始编译器使用的信息,以及在寄存器值分布中反映的信息等。
-它可以传送编译器信息以供编译器在解码级使用。这可以是初始编译器已从源文件中的输入代码提取的信息,但从压缩的编译数据提取是不容易,甚至是不可能的。
编译器信息项可用于以上的一个或两个用途。
因此,第一编译级的编译器信息可由编码器利用,也可由解码器级利用。因此,在目标设备中进一步编译变换代码的步骤要访问由编码级的编译步骤生成的编译器信息,从而提高了目标设备中生成代码的性能。此外,编码级期间编译器信息的可用性提供了改进的数据建模,从而提高了压缩中间表示的压缩率。
又一个优点是,在根据本发明的框架内,编码器与解码器之间的压缩和文件传送可在任何编译遍应用。
此外,编码器级中的编译可根据特殊实施例的特定需要而进行优化。在一个实施例中,编码器级中的编码可进行优化以得到高压缩率。在另一实施例中,编码可适于在压缩和编译时之间提供一种折衷。
在优选实施例中,在第一数据处理系统上执行编码级,并在第二数据处理系统上执行解码级;所述方法还包括将所述压缩中间表示从所述第一数据处理系统传送到所述第二数据处理系统。因此,初始编译阶段是在不同于目标数据处理系统的数据处理系统上脱机执行的,从而允许代码优化和/或需要多于目标系统上可用资源的压缩技术。因此,在此实施例中,压缩阶段发生在程序传送到例如移动电话等目标系统前,而解压缩和执行阶段发生在移动电话上。相应地,由编码器和解码器上的编译器执行的代码优化将分别称为传送前和传送后优化。
变换代码包括反映在编码级中执行的优化步骤并适用于压缩的计算机程序的表示。变换代码可包括输入代码的任何适当的中间表示,该表示可由解码级进一步编译和链接,以获得优化的可执行代码。传送代码的示例包括优化的机器无关中间表示、适用于目标体系结构有限类的优化的部分机器无关中间表示、仅适用于特定目标体系结构的优化机器特定中间表示等。由于平台无关性程度可能不同,因而可实现平台无关性与优化之间的折衷。
压缩中间表示可通过无线通信(例如UMTS、蓝牙或WLAN)、线路(例如USB、串行端口、以太网)、可移动存储器(例如,多媒体卡、记忆棒)或其它方式传送到目标系统。
在其它实施例中,编码级可在目标设备如移动电话上执行。在此实施例中,移动电话仍可利用高压缩率和脱机优化分析取得的良好优化。
提取的状态信息包括由编译器生成的有关编译期间编译器状态的信息。在本发明的优选实施例中,生成状态信息和统计信息的步骤还包括
-根据变换代码和编译器信息,从状态机获取状态信息;以及
-根据所获取的状态信息,从统计模型获取概率信息。
本发明的优点在于它提供了导致高压缩率的数据建模。
状态机可包括多个模型,这些模型结合起来产生统计模型的状态变量。
在一个实施例中,状态机包括至少所述变换代码和所述编译器信息之一的语法模型。例如,状态可以是编译数据流中在前符号的函数。
在一个实施例中,状态机包括变换代码的执行模型,其中,状态变量可以是例如虚拟机栈的内容,或存储器存取模式的函数。
在又一优选实施例中,状态机包括编译器信息的模型。编译器信息的统计模型取决于编译器信息有类型,并可包括诸如类信息、数据类型、变量的寄存器分配、上下文信息等不容易从编译数据流中获取的元素。因此,改进的压缩率可通过利用编译器信息来实现。
因此,通过组合根据本发明的编译和编码级,并向编码器提供有关变换代码语法和有关其内容的信息,例如,有关类信息、数据类型、上下文信息等的信息,可取得改进的数据建模,从而取得提高的压缩率。
在本发明的优选实施例中,所述方法还包括:
-存储所述压缩中间表示;以及
-结合所生成的可执行程序代码的后续执行来执行所述解码级。
因此,根据经过压缩且至少部分平台无关的表示,可由目标设备生成高效的可执行代码,其中,代码生成只造成与实际代码执行有关的很少开销,并且其中只需少量的存储空间用于在目标设备上存储压缩中间表示。因此,根据此实施例,解码级作为及时(JIT)过程执行,即,在给定软件执行内初次使用压缩中间表示时,将压缩中间表示存储并对其进行解压缩/解码。随后,在整个应用程序执行期间存储器中提供解压缩/解码的代码。
在又一实施例中,压缩代码从网络服务器传送到固定的台式计算机,在台式计算机中进行解码并执行。注意,压缩中间表示可传送到多个不同的接收设备,每个设备实施不同的解码级实现方案。例如,可分别对移动电话、PDA和PC实现不同的解码器。
在其它实施例中,代码在移动设备上压缩并传送到服务器,并在以后下载到具有不同平台的一个或多个移动设备。因此,在放置在目标设备上后,压缩中间表示可在同一设备或不同设备上解压缩/执行。另外,在一些实施例中,它可传送到其它目标设备,或者上载到服务器以进一步分发。
在一个实施例中,压缩中间表示由计算机上执行的编译程序产生,该计算机采用不同于将被压缩的代码(例如,Java字节码)和/或目标系统(例如,基于ARM94的移动电话)的指令格式(例如,基于Pentium-4的台式PC)。然而,在其它实施例中,指令格式可以相同或部分相同。
输入代码可以是不同于主机处理器标准可执行格式的计算机程序的任何适当表示。在本发明的一个实施例中,输入代码包括Java字节码。
此类输入代码的其它示例包括:
-被解释或以某种方式编译用于基础体系结构的平台无关代码格式。
-具有另一体系结构的处理器上的一种体系结构的二进制代码的执行,例如,Intel X86代码在ARM处理器上的执行。
在本发明还有的另一优选实施例中,变换代码包括多个代码元素,并且所述方法还包括确定所述代码元素的概率分布,并将所确定的概率分布提供给生成统计信息的步骤。本发明的优点在于它提供了可适用于许多不同类型代码的压缩方法。或者,概率分布可预先确定并制成表格,从而提供进一步改进的压缩率。
变换代码和编译器信息可以不同的方式耦合。在一个实施例中,它们完全交织,从而在解码器上的编译器需要时为其提供信息。在另一个实施例中,所有编译器信息作为变换代码的前置数据传送和/或存储。也可能存在中间形式。
本发明可以不同的方式实施,包括上述方法和如下系统及其它产品装置,每个均提供了联系最先所述方法描述的一个或多个益处和优点,并且每个均具有与联系最先所述方法描述并在所附权利要求书中公开的优选实施例相对应的一个或多个优选实施例。
注意,前面和下文所述的方法特征可在软件中实施,并可在数据处理系统中或由执行计算机可执行指令驱动的其它处理装置中执行。指令可以是经计算机网络从存储介质或另一计算机装入存储器如RAM中的程序代码组件。或者所述特征可以由硬连线电路而非软件,或者结合软件来实现。
本发明还涉及为数据处理系统生成程序代码的方法;所述方法包括:
-对输入代码进行变换,包括执行一组选定的优化步骤,从而产生变换代码和有关所述变换代码的编译器信息;
-从所述变换代码和所述编译器信息提取统计模型的状态信息和统计信息;以及
-使用所述提取的状态信息和统计信息将所述变换代码和所述编译信息编码,并产生所述输入代码的压缩中间表示;所述压缩中间表示适于在后续的解码级中进行解码并进一步编译以生成可执行程序代码。
本发明还涉及在数据处理系统中生成可执行程序代码的方法;所述方法包括
-接收输入代码的压缩中间表示,所述压缩中间表示包括由编译器生成并至少部分优化的编码变换代码和表示由所述编译器生成的有关所述变换代码的其它信息的编码编译器信息;所述编码变换代码和所述编码编译器信息利用从所述变换代码和所述编译器信息中提取的统计模型的状态信息和统计信息进行编码;
-将所述压缩中间表示解码,从而得到所述变换代码和所述编译器信息;以及
-使用所述解码的编译器信息进一步编译所述变换代码,从而产生所述可执行程序代码。
本发明还涉及用于生成可执行程序代码的数据处理系统,所述系统包括:
适于生成输入代码的压缩中间表示的编码模块;所述编码模块包括:
-适于对所述输入代码进行变换的第一编译器装置,包括执行一组选定的代码优化步骤并产生变换代码和有关所述变换代码的编译器信息;
-处理装置,适于从所述变换代码和所述编译器信息提取统计模型的状态信息和统计信息;以及
-编码装置,适于使用所提取的状态信息和统计信息将所述变换代码和所述编译器信息编码,并产生所述压缩中间表示;
适于从所述压缩中间表示生成所述可执行程序代码的解码模块;所述解码模块包括:
-解码装置,适于将所述压缩中间表示解码,从而得到所述变换代码和所述编译器信息;以及
-第二编译器装置,适于使用所述解码的编译器信息进一步编译所述变换代码,从而产生所述可执行程序代码。
本发明还涉及用于为数据处理系统生成程序代码的编码设备;所述编码设备包括
-用于对输入代码进行变换的编译器装置,包括执行一组选定的代码优化步骤,从而产生变换代码和有关所述变换代码的编译器信息;
-处理装置,适于从所述变换代码和所述编译器信息中提取统计模型的状态信息和统计信息;以及
-编码装置,适于使用所述提取的状态信息和统计信息将所述变换代码和所述编译器信息编码,并产生所述输入代码的所述压缩中间表示;所述压缩中间表示适于在后续的解码级中进行解码并进一步编译以生成可执行程序代码。
本发明还涉及用于生成可执行程序代码的数据处理系统;所述数据处理系统包括:
-适于接收输入代码的压缩中间表示的接收装置,所述压缩中间表示包括由编译器生成并至少部分优化的编码变换代码和由所述编译器生成的表示所述编译器生成的其它信息的编码编译器信息;所述编码变换代码和所述编码编译器信息利用从所述变换代码和所述编译器信息中提取的统计模型的状态信息和统计信息进行编码;
-解码装置,适于将所述压缩中间表示解码,从而得到所述变换代码和所述编译器信息;以及
-编译器装置,适于使用所述解码的编译器信息进一步编译所述变换代码,从而产生所述可执行程序代码。
本发明还涉及包括输入代码的压缩中间表示的数据记录;所述压缩中间表示包括由编译器生成并至少部分优化的编码变换代码和表示所述编译器生成的其它信息的编码编译器信息;所述编码变换代码和所述编码编译器信息利用从所述变换代码和所述编译器信息中提取的统计模型的状态信息和统计信息进行编码;数据处理系统对所述压缩中间表示进行解码并进一步编译,从而产生可执行程序代码。
下面将结合优选实施例,参照附图更详细地描述本发明的上述和其它方面,其中:
图1显示了根据本发明实施例的系统方框图,包括用于生成压缩中间表示的计算机和移动终端;
图2示意性地显示了生成有效本机二进制码的典型优化Java字节码提前编译器不同级的示例;
图3显示了根据本发明实施例的编码器方框图;
图4显示了根据本发明实施例的解码器方框图;
图5显示了Java字节码的一个示例段的流程图;
图6显示了Java字节码的另一个示例段的流程图;以及
图7显示了根据本发明实施例,用于生成可执行代码的数据处理系统的方框图。
图1显示了根据本发明实施例的系统方框图,包括用于生成压缩中间表示的计算机101和用于接收压缩中间表示并生成可执行计算机代码的目标设备102。计算机101包括处理单元(CPU)104、通信单元105、RAM 111及数据存储装置106如硬盘。存储在数据存储装置106的数据包括要编译成用于目标设备102的可执行代码的输入代码107、由处理单元执行的编码进程生成的压缩中间表示108、由编码进程使用的状态机模型109和在由处理单元运行时实现编码进程的程序代码110。因此,在编码程序装入RAM 114中并由CPU执行时,CPU将输入代码107和状态机数据装入RAM,并创建压缩中间表示。压缩中间表示可存储在数据存储装置上以便随后传输到一个或多个目标设备,或者它可直接经通信单元105发送。
在一些实施例中,在一台计算机上创建压缩中间表示,然后将其传送到服务器计算机;压缩中间表示可从服务器计算机发送到一个或多个目标设备。
通信单元105包括适于经通信链路103将数据传送到目标设备102的电路和/或装置。此类电路的示例包括用于无线通信(例如,UMTS、蓝牙或WLAN)的无线电发射机/接收机、适于其它适当电磁信号的接收机/发射机、适于实现有线通信的电路如网络接口、网络卡、电缆调制解调器、电话调制解调器、综合业务数字网(ISDN)适配器、数字用户线(DSL)适配器、USB端口、串行端口、以太网适配器等。
目标设备102包括对应的通信单元111、处理单元112和存储器113。在收到压缩中间表示后,该表示可存储在该设备的存储器113中以便后续编译,例如,在程序代码将要执行时的及时编译。因此,在程序代码要由处理单元112执行时,处理单元112从存储器113装入压缩中间表示,例如装入RAM中(未明示),将压缩中间表示解码并生成可执行代码,该可执行代码随后由处理单元112执行。其优点在于:通过存储压缩表示,降低了在存储器113中存储程序代码所需的存储空间。根据本发明,由于代码编译的耗时优化步骤在计算机101上的编码期间脱机执行,因此,目标设备102上的及时编译只需要很少的额外开销,但生成高效、经过良好优化的程序代码,从而确保目标设备上的高效性能。
在其它实施例中,中间表示可提前解码和编译,例如,在经通信单元111接收压缩中间表示的数据流时,处理单元112可将该表示解码而生成可执行代码,并存储到存储器113中。此实施例具有的优点是与实际执行有关的开销将进一步降到最低。此外,此实施例利用了在代码从计算机101发送到目标设备期间压缩中间表示的小尺寸。
根据本发明,在由处理单元104执行的编码期间执行编译的选择和代码优化步骤,从而产生优化的中间表示,该中间表示在编码期间以及在传送到目标设备之前压缩。因此,在下文中,此中间表示也将称为可压缩的中间表示(CIR)。包括编码CIR的数据记录也将称为目标文件。
编码器执行的具体选择的优化步骤以及中间表示的平台无关程度取决于具体实施例,下面将对此作更详细的描述。
图2示意性地显示了生成有效本机二进制码的典型优化Java字节码提前编译器的不同级的示例。不同的编译和优化步骤201-205将Java字节码206经多个中间表示(IR)207-210转换成给定平台的优化的本机代码211。注意,在不同步骤之间,除暂时存储外,无需将不同的中间表示存储在文件中或甚至在存储器中,但它们可只以概念格式存在,从而可加以存储。还注意,图2所示的大多数优化步骤由于编译步骤的时间限制而在JIT编译器中不可行。
在下述内容中,结合Java字节码的转换描述了本发明的优选实施例。
根据本发明,要执行代码优化的两个主要部分。第一部分是在将目标文件传送到目标设备前完成,而第二个部分是在下载目标文件后在目标设备完成。在下述内容中,这两个部分将分别表示为传送前优化和传送后优化。传送前是提前优化,而传送后可以是提前优化、及时优化,或两者的组合。
最初,Java字节码变换成CIR,CIR馈入执行一组代码优化步骤的优化程序中。为缩短目标设备上的编译时,最好在传送前阶段执行尽可能多的优化。原则上,所有优化可在传送前完成,并且可下载含机器指令的最终二进制文件并使其在终端上执行,而无需任何传送后优化。此方案的优点是可消除终端上的编译时。
然而,传送后执行某些优化步骤的优点在于产生的中间表示是至少部分平台无关的。例如,将来的目标设备可具有在软件编译时未预计到的硬件特征。这些特征可由传送后优化步骤利用,从而提高生成的可执行代码的效率。
生成(部分)机器无关的中间表示并在目标设备上执行某些传送后优化的又一优点在于:提供下载的站点不需要为所有不同的硬件平台保持大量不同的程序版本。
也执行传送后优化的又一优点在于可采用并调整反馈导向的优化,以适应终端用户的实际行为,而非将优化限制为针对“普通用户”。
在下述内容中,将描述最好可以在传送前执行的多个优选优化。
然而,应注意,哪些优化应在传送前执行以及哪些优化应在传送后执行的确切区别可加以调整,以适应特殊的平台。因此,传送前优化和传送后的确切界线不应视为是固定的,而是取决于多个系统特定的设计参数。此类参数的一个示例是指示哪些指令集体系结构是目标指令集体系结构的参数。
通常,本领域中已知多种不同的优化技术。机器无关的优化传统上使用20世纪70年代期间开发的框架,并且基于使用位矢量的迭代数据流分析(参见例如“编译器-原理、技术和工具”[Al Aho,Revi Sethi,Jeffrey Ullman,“Compilers-Principles,Techniques,andTools”,Addison-Wesley,1986])。在20世纪80年代末,开发了称为静态单一赋值格式(即SSA格式)的新的更有效且功能更强大的优化框架(参见例如“现代编译器的Java实现”[Andrew Appel,“Modern compiler Implementation in Java”,Cambridge UniversityPress,1998])。
传送前优化:
控制流程图结构和分析:进行优化前,应完成过程转移指令的分析。此分析的结果是称为控制流程图的有向图。在控制流程图构建期间,从过程中去除不可达的代码。通过使用控制流程图,计算出支配树(dominator tree)(参见例如“现代编译器的Java实现”[Andrew Appel,“Modern compiler Implementation in Java”,CambridgeUniversity Press,1998])和循环嵌套。
调用图构建:调用图描述过程间的控制流,即,哪个过程可调用哪些过程。它用于过程间数据流分析以确定过程调用的副作用。
过程调用优化:此处,目标是减少或消除过程调用的开销。编译时已知的小过程(不包括面向对象编程语言中的大多数虚函数)可以内联。过程内联时消除了调用开销,但指令高速缓存的效率可能降低。除了消除调用开销外,其它优化技术通常由于要处理更大的过程而变得更有效。递归过程一般不是内联的目标(虽然它们可以部分内联),但一些递归过程可使用称为尾递归消除的技术进行优化。如果在递归调用后没有语句,则该调用可变成跳到过程开始处的goto语句。
数组引用的标量替换:数组引用的标量替换是为数组元素进行寄存器分配的技术(参见例如“现代体系结构的优化编译器[RandyAllen,Ken Kennedy,“Optimising Compilers for ModernArchitectures”,Morgan Kaufmann Publishers,2002])。此优化实际上不分配任何处理器寄存器,相反,数组元素保持在编译器生成的临时变量中。随后,正常的寄存器分配将这些临时变量分配给处理器寄存器(如果有利)。数组引用的标量替换本身的执行并不非常耗时,但它依赖于具有可用的数据相关信息。在及时优化器中计算此信息可能在大多数环境下过于昂贵。
带条件转移的常量传播:通过从过程的第一个语句开始解释过程而传播尽可能多的常量,常量传播简化了过程。常量传播在SSA格式上可用,并且应在传送前优化期间执行。
操作符强度降低:操作符强度降低(operator strength reduction)也是以数组引用为目标的优化技术。数组引用形式为a[i]格式时,为找出元素地址需要乘法。操作符强度降低将循环中的数组引用变换成转为使用指针的代码(无需乘法)。操作符强度降低是最重要的机器无关优化方法之一,在SSA格式上可用,且最好应在传送前优化期间执行。
全局值编号:全局值编号属于旨在去除冗余计算的优化技术系列。一个语句如果重复计算已经计算出的值,则该语句称为冗余。在下面的示例中,假定操作符强度降低不能消除数组引用中的乘法(例如,由于代码不在循环中)。在下面的代码段中,i和第二数组引用中元素大小的相乘是多余的:
x=a[i]
if(x<y)
y=a[i]
采用与有限状态机最小化期间查找等效状态时所用相同的原理,全局值编号证明哪些语句是等效的。在某些环境下,可去除一些等效语句。全局编号在SSA格式上可用,并最好应在传送前优化期间执行。
部分冗余消除:部分冗余消除(PRE)是旨在消除冗余计算的另一技术。为尽可能简单地介绍PRE可以执行的操作,可考虑以下示例代码段:
if(a<b) if(a<b){
c=x*y; t=x*y;
else c=t;
d=a+b; } else{
e=x*y; d=a+b;
t=x*y;
}
e=t;
左侧是部分冗余:如果条件为真,则将计算两次x*y。如果条件为假,则不存在冗余。通过在else部分插入额外的x*y,可删除第二次相乘。PRE概括了此操作,而且还可去除循环外的语句。PRE是十分复杂的功能很强大的优化。PRE在SSA格式上可用,并最好应在传送前优化期间执行。
失效代码删除:通过使用控制相关信息,在失效代码删除期间删除了无法影响过程可视行为的所有语句(除其执行时间外)。失效代码删除在SSA格式上可用,并最好应在传送前优化期间执行。
传送后优化:
下面简述最好应在传送后执行的多个优化技术。
循环展开:循环展开重复循环体,从而消除转移语句。由于循环展开一般会增加代码大小,因此,最好应在传送后优化期间执行循环展开。
转移重排序:利用来自先前执行的反馈,可将转移重排序以便执行更少的转移,如下面的示例代码段所示:while((c=getchar())!=EOF){ A:c=getchar();
if(c==′\n′) if(c>″)
X; Z;
else if(c==″) else if(c==″)
Y; Y;
else else if(c==′\n′)
Z; X;
} else if(c==EOF)
goto B;
else
Z;
goto A;
B:
如果“新行”和空格不是从输入中最常读到的字符,则右侧的代码将执行比左侧代码更少的转移。此优化可在传送前或传送后执行。传送后执行此优化的优点在于随后可调整转移以适应特殊用户的行为。
第一遍指令调度:指序调度将指令重新排序以便降低流水线暂停的次数。虽然在超标量处理器上可在传送前执行指令调度,但它可能产生不是次佳的代码(因为必须假定指令延迟的常见模型)。在超标量处理器上,代码在功能上仍然正确(由于硬件在需要时可使执行延迟),但在VLIM处理器上,它将变得更为复杂。直线式代码(straight line code)(所谓基本块)范围内的调度指令并不很耗时,但仅对诸如单发射RISC处理器等相对简单的处理器有用。对于超标量处理器,必需跨基本块调度指令,例如使用跟踪调度(参见例如“构建优化编译器”[Robert Morgan,“Building an OptimisingCompiler”,Digital Press,1998])。跨基本块调度指令需要正在被优化的过程的控制流程图的支配树。为了传送前优化,还计算支配树,并因此可将其存储在目标文件中并传送到终端。然而,在传送后优化期间重新计算支配树可以足够快地完成。跟踪调度可利用有关转移频率的反馈信息而变得更为有效。对于许多内循环,使用称为软件流水化的成本更高的调度技术,可实现更高的性能。软件流水化需要有关数组引用的数据相关信息,这在及时编译器计算起来很耗时。一种替代方案是传送只与传送前优化确定要在传送后优化期间从软件流水化获益的那些内循环有关的数据相关信息。
寄存器分配:寄存器分配确定哪些变量应存储在处理器寄存器中及何时存储。此优化在指令调度后执行,这是因为在指令调度完成后可知道有关同时使用哪些变量的信息。
第二遍指令调度:如果寄存器分配将一些变量溢出到存储器,则执行第二遍指令调度以在代码中将装入指令上移。
平台无关性:
一些优化在了解有关目标平台的更多信息时可产生更好的结果。例如,如果指令调度器知道每条指令的等待时间,则与它针对某个处理器模型只用指令等待时间估计值进行调度相比,通常可以产生更好的调度。尽管如此,人们可能希望在下载到终端前执行一些典型的传送后优化。如上所述,人们当然可以在传送前执行以特定芯片为目标的所有优化。其缺点是具有只为特定指令集体系结构或芯片优化的应用程序版本。然而,人们也可以决定以平台无关的方式,以不过分优化代码为代价,执行例如指令调度或寄存器分配(它们是典型的传送后优化)。
一个益处是可实现更容易的软件分布,这是因为需要更少的版本。另一个益处是传送后优化更快,因为留给终端的工作更少。下面,针对指令调度和寄存器分配阐述了这种折衷。
指令调度:许多指令集体系结构具有大量共同的指令,如存储器存取指令及整数与浮点运算指令。大多数处理器芯片的共同之处还在于:例如乘法和除法指令执行时间比其它指令长。因此,无论代码将在哪个目标芯片上执行,大多数调度器在调度许多指令时将具有类似的目标。在传送前,易于提供调度指令的高级算法,例如,使用数组引用的数据相关信息。对中间表示执行指令调度假定了目标处理器实现该中间表示的指令,并且这些指令具有一定等待时间,如一个周期。一些处理器也许不实现给定中间表示的所有指令,并且必须在终端扩展成几个机器指令。这在一些情况下将产生次佳的代码。
寄存器分配:许多指令集体系结构具有32个整数和32个浮点寄存器。寄存器分配通常根据可用于不同用户的寄存器数量参数化。这涉及有关哪些寄存器用于传递参数和返回值,哪些必须由被叫方在跨函数调用时保留以及哪些必须由主叫方保存并在函数调用后恢复的规则。
寄存器分配可以下述平台无关方式部分地执行。假定N是可用于任一感兴趣平台上寄存器分配器的可用寄存器数量。典型的N值可以为10。寄存器分配有时分成局部阶段和全局阶段。局部寄存器分配将寄存器分配给仅在一个基本块中使用的变量,而全局寄存器分配将寄存器分配给一个函数中使用的变量。全局寄存器分配是耗时的。传送前寄存器分配的方法是使用至多N个寄存器同时执行全局寄存器分配和局部寄存器分配。如果该分配不成功,则只可以使用至多N个寄存器进行全局寄存器分配。在传送后,可以较快地完成局部寄存器分配。
传送前寄存器分配无法分配物理寄存器,这是因为它必须将寄存器使用规则纳入考虑。但是,可分配N个虚拟寄存器(这不同于通常在文献中使用的所谓伪寄存器或符号寄存器)。然而,在对N个寄存器进行分配后,利用将虚拟寄存器映射到物理寄存器的矢量来分配物理寄存器既简单又快。在面向对象语言中,可能10个寄存器就足够了。如果传送前分配未成功(即,一些变量无法分配给寄存器并溢出到存储器),则所述方法可在传送后执行不同的操作。例如,它现在可以使用平台的所有寄存器重新进行分配。另一种替代方案是让溢出的变量保留在存储器中。而另一种替代方案是在全局分配已经完成时仅重新进行局部分配。
中间语言规范:
下面将描述用于根据本发明实施例的可压缩中间表示的语言。
目标文件格式:下面描述了一个目标文件的部分,并且还讨论了压缩的时机。然而,要注意的是备选目标文件格式可使用不同的段:
-文件标题,它描述目标文件类型、目标机器体系结构、文件端序、文件是否是针对32位或64位体系结构而生成的以及其它信息。
-段标题数组,含指令段、数据段等存储在文件中何处的信息。诸如段大小等其它信息也存储在段标题中。
-指令段,可以是机器指令或某一形式的中间表示,如Java字节码或三地址码。可存在多个指令段。这些段是根据本发明的主要压缩目标。
-编译时初始化数据段,例如用于全局变量的编译时初始化数据段。可存在多个数据段。
-重定位条目段,所述条目涉及指令或数据,该段必须在链接编辑期间进行修改以分析地址。存在不同类型的重定位条目,并且通过例如按类型及它们所引用的符号在编译时将它们分类,可将类似的重定位条目组合在一起。这引入了也用于随后可进行压缩的重定位条目的上下文。
-符号的可选段(即,符号表)。对于静态链接的商用应用程序,一般不存在符号表(由于在任何方面均不需要它)。对于一些编程语言,包括Java,它用于解决符号。符号具有属性,如属于哪种数据(例如,为只读符号、为全局符号以及在程序启动时初始化为零、为全局符号并在程序启动时初始化为某个值)。另一个属性是符号的大小。类似的符号可在编译时组合在一起以形成压缩的上下文。
-如果存在符号表,则也存在用于符号名称的单独字符串段。此段只是空结束字符串序列。标识符不存储在符号表中,因为这将浪费存储空间并使得无法允许任意长的标识符名称。要查找符号名称,符号表条目具有到此段的引用(偏移)。相关标识符经常具有相关的名称,如共同的前缀或后缀。通过根据此方面或其它方面将标识符分类,引入用于压缩的上下文。
-可选调试信息。调试信息的现代、简洁的表达格式是DWARF2.1,它支持许多语言,包括Ada 95、C99、C++、Fortran 95和Java。
中间表示-指令:根据本发明的优选实施例,中间表示包括将称为指令的三地址码。根据此实施例,指令是带有一个操作码和不定数量操作数的元组。因此,指令具有可变长度并且不必正好在字节边界上对齐。这使得解释指令更加复杂,但节省了空间。
所有符号无需显式地存储在符号表中。例如,如果存在语句IADDI 1,2,3,它指“将变量2和常量3相加并将结果存储到变量1中”。前缀I表示类型(整数-与浮点数相对),并且后缀I指第二源操作数是立即常量。变量1和2不必存储在符号表中。它们在栈上的位置(与栈指针的偏移)将在解压缩后决定。
表1列出了根据本发明实施例的中间表示的一组操作数。
指令 | 操作数 | 说明 |
ENTER | Context[parameters] | 提示压缩 |
EXIT | Context | 提示压缩 |
BA | Label | 无条件转移到标号 |
BEQ | Label | 相等时条件转移到标号 |
BNE | Label | 不相等时条件转移到标号 |
BGE | Label | 大于或等于时条件转移到标号 |
BLE | Label | 小于或等于时条件转移到标号 |
BLT | Label | 小于时条件转移到标号 |
BGT | Label | 大于时条件转移到标号 |
RET | 函数返回 | |
LABEL | Number | 标号,可能的转移目标 |
BEGIN | Number | 函数开始 |
END | Number | 函数结束 |
IMOV | Src,dest | 拷贝整数src到dest |
BMOV | Src,dest | 拷贝字节src到dest |
HMOV | Src,dest | 拷贝一半src到dest |
FMOV | Src,dest | 拷贝浮点src到dest |
DMOV | Src,dest | 拷贝双精度src到dest |
MEMMOV | Src,size,dest | 从源(src)复制size个字节到目的地(dest) |
ICONST | Const,dest | Dest:=const |
I2F | Src,dest | 从整数转移为浮点数 |
F21 | Src,dest | 从浮点数转换为整数 |
FADD | Src1,src2,dest | Dest:=src1+src2(浮点数) |
DADD | Src1,src2,dest | Dest:=src1+src2(双精度数) |
IADD | Src1,src2,dest | Dest:=src1+src2(整数) |
IADDI | Src1,src2,dest | Dest:=src1+src2(src2是常量) |
ISUB | Src1,src2,dest | Dest:=src1-src2(整数) |
IMULT | Src1,src2,dest | Dest:=src1*src2(整数) |
IDIV | Src1,src2,dest | Dest:=src1/src2(整数) |
AND | Src1,src2,dest | Dest:=src1&src2(整数) |
OR | Src1,src2,dest | Dest:=src1|src2(整数) |
XOR | Src1,src2,dest | Dest:=src1^src2(整数) |
SLL | Src1,src2,dest | 左移位逻辑 |
SRL | Src1,src2,dest | 右移位逻辑 |
SRA | Src1,src2,dest | 右移位算术 |
ICMP | Src1,scr2 | 整数比较 |
IARG | Src | 函数调用的整型参数 |
FARG | Src | 函数调用的浮点型参数 |
DARG | Src | 函数调用的双精度参数 |
ICALL | Callee,dest | Dest:=函数调用的结果 |
FCALL | Callee,dest | Dest:=函数调用的结果 |
DCALL | Callee,dest | Dest:=函数调用的结果 |
PF | Base,offset | 预取数据 |
TS | Base,offset,dest | 测试和设置 |
STB | Base,offset,src | 存储字节 |
STH | Base,offset,src | 存储一半 |
STW | Base,offset,src | 存储字 |
STLL | Base,offset,src | 存储双字 |
STF | Base,offset,src | 存储浮点数 |
STD | Base,offset,src | 存储双精度数 |
LDSB | Base,offset,dest | 装入有符号字节 |
LDUB | Base,offset,dest | 装入无符号字节 |
LDSH | Base,offset,dest | 装入有符号半字节 |
LDUB | Base,offset,dest | 装入无符号半字节 |
LDSW | Base,offset,dest | 装入有符号字 |
LDUW | Base,offset,dest | 装入无符号字 |
LDLL | Base,offset,dest | 装入整数双字 |
LDF | Base,offset,dest | 装入浮点数 |
LDD | Base,offset,dest | 装入双精度数 |
BCHECK | Array,index | 数组是JAVA索引的引用 |
BCHECKI | Array,const | 索引是常量 |
表1
注意,完整的操作码列表可包括其它操作码,例如,额外的转换。在上面的表1中,只有IADDI采用了常量操作数,但完整的操作数列表还可包括采用常量操作数的其它指令。此外,可能需要与特殊源语言(例如,Java)相关的特殊操作码,以及与特殊硬件指令集体系结构相关的特殊操作码,例如在目标处理器支持矢量指令时包括矢量指令。
图3显示了根据本发明实施列的编码器方框图。编码器包括编译器(Comp)模块301、用于压缩编译数据的编码(ENC)模块307、状态机(SM)模块304及实现统计模型(Stat Mod)的统计模块306。
编译器模块301接收输入代码IC,即要压缩的程序代码的初始形式,如JAVA字节码。编译器301将数据编译为中间表示,即所说的CIR-可压缩的中间表示。CIR包括变换代码302和额外的编译器信息303,该信息由压缩级307用于取得更高的压缩率。变换代码302和编译器信息馈入状态机模块304以及编码模块307。状态机包括多个状态变量,这些变量根据从编译器301接收的变换代码302和编译器信息303进行更新。状态机模块将有关状态机当前状态的状态信息305输出到统计模块306。通过统计模块实现的统计模型可视为按状态机304的状态信息305索引的概率密度函数表。概率密度函数PDF传递给编码模块307。编码模块307按顺序压缩变换代码302和编译器信息303,以产生包括编码的中间表示E-IR的输出数据字符串。输出数据字符串的长度等于由统计模型306分配给变换代码302和编译器信息303的概率的负对数。例如,这可以采用已知的算术编码器实现(参见例如“用于长源序列的有效编码系统”[Jones,“An Efficient Coding System for Long Source Sequence”,IEEE-IT,vol.27,1981])。
变换代码302和编译器信息303最好是由编译器301生成为一个符号字符串。在一个实施例中,编译数据量化成分别表示指令和操作数的符号。编译器信息以特殊指令的形式并入编译数据流(例如,ENTER<context>和EXIT<context>)。
在一个实施例中,统计模型306是固定的,状态机的每个状态对应一个符号分布。因此,对于编译器输出的每个符号,对应的状态信息305由状态机304馈送到统计模型306。对于该模型的每个状态,可通过分析“典型”数据训练集确定概率密度函数集并加以存储。
在一个替代实施例中,统计模型是自适应的,并包括对应该模型的每个状态的一组频率计数器。频率计数器在每个符号在给定状态中进行编码后予以更新。在自适应系统中,对于每个状态,馈入编码模块307和解码(DEC)模块401的概率密度函数是在压缩期间从观察的数据估计得到的。这样做的优点在于:由于系统可适应统计特性不符合训练集的变化更广的数据,从而提供了更通用的压缩。固定分布的优点在于它提供了比估计分布更短的压缩数据串。编码效率的差异为每个估计参数约0.5log2N个比特,其中,N是编码符号的数量。具体而言,在数据流的早期部分,固定模型的性能一般比自适应压缩好。
如上所述,状态机304的状态的特征在于多个状态变量。状态机304可包括多个模型,这些模型组合在一起以产生统计模型的状态变量。状态机可包括语法模型,其中,状态是编译数据流中在先符号的函数。状态机还可包括编译数据的执行模型,其中,状态变量可以是例如虚拟机的栈内容,或者是存储器存取模式的函数。状态机还可包括取决于编译器信息的模型,并可包括诸如类信息、数据类型、变量的寄存器分配等不容易从编译数据流中获取的元素。
此外,自适应的概念也可扩展到状态机,即状态机模块可包含几个可选状态机(它们一般以某种方式嵌套在一起,因此更复杂的状态机是更简单状态机的精细化)。随后,调整状态机以适应编码数据。在一个实施例中,系统从包括几个状态的简单状态机开始,并逐渐将经常使用的状态精细化。只有估计了概率密度函数时,使用自适应状态机才有意义,因为为状态机添加状态的准则应该是它可以提供概率密度函数的更好的估计。
下面的表2列出了根据本发明实施例的一组状态变量。
名称 | 注释 |
前一指令(previous instruction) | 最近处理的指令。当在处理的符号是指令时,这是前一指令。当该符号是操作数时,这是该操作数所属的指令。 |
#指定的标号(#assigned labels) | 迄今代码中使用的标号数。标号在代码中按数字顺序指定。因此,此变量将为解码器提供每个新指定的标号而无需任何显式编码。 |
变量栈(整数和浮点数)(Variable Stacks(integerand float)) | 这些是包含代码中使用的所有变量编号的栈。如下所述,它用于状态机的Move-to-front(向前移动)部分。 |
常量栈(Constant Stack) | 用于常量的D:o |
基址栈(Base address stack) | 用于存储器基址的D:o |
偏移栈(Offset Stack) | 用于存储器偏移的D:o |
上下文类型(Context type) | 编译器提供的上下文信息。 |
表2
前一指令:模型的这一部分用于捕捉相邻指令之间的相关性。
前一指令制约后一指令的分布。
#指定的标号:此状态变量用于制约标号的分布。
栈变量:有几个栈状态变量,它们包括变量、常量等。它们用于Move-to-front编码(参见例如“借助书栈的数据压缩”[B Ryabko,“Data Compression by Means of a Book Stack”,Problems ofInformation Transmission,vol.16,no.4,pp.16-21,Oct-Dec 1980]),即不是将变量、常量等编码,而是将其在栈中的位置编码。在编码后,该项移到栈顶。如果同一栈上有不止一个源操作数(大多数算术运算是这种情况),则在二者都已编码后才更新栈。每个栈都有相关联的用于代码字的分布。选择此分布,使概率随栈中位置而减小。因此,此模型可捕捉引用的位置:当经常使用某个变量时,该变量停留在栈顶,并为其分配短代码字。当几个栈具有同一类型的内容时,每个变量一次只在一个栈上,例如,在整数变量栈或浮点变量栈上。变量栈初始化为零在顶部的有序列表。常量栈初始化为按出现顺序包含使用的常量值。值列表被作为编码数据的前置数据包括。
上下文类型:此状态变量由编译器提供,它描述指令的上下文,如算术上下文、函数调用上下文等。上下文类型是固定的编号列表。
如上所述,编译器301输出的数据流由状态机模块304和编码器307解析成不同类型的符号。用于将给定符号编码的分布(PDF)不需要依赖于所有状态变量。要编码的操作数的类型由对应指令格式唯一确定。这是确定性的,不需要将额外的信息编码。表3描述了根据本发明实施例的符号类型和条件结构。
符号类型 | 说明 | 取决于 |
指令 | 每条指令的操作码部分 | 前一指令,上下文类型 |
编号 | 标号的编号。对于一些指令,这是隐含的。 | 前一指令,#指定的标号。 |
上下文 | 帮助符号传递上下文类型的信息。 | 前一指令,上下文类型 |
变量 | 栈指示器,变量栈 | |
常量 | 栈指示器,常量栈 | |
基址 | 基址栈 | |
偏移 | 偏移栈 |
表3
因此,我们公开了根据本发明的用于中间表示压缩的状态机模型示例。该模型包含了马尔可夫(Markov)链组件(对前一符号类型的依赖性)、栈组件(用于变量编码)及语法组件(根据指令确定操作数类型和编号)。它也利用编译器的附加信息(上下文)。
注意,编译器模块301也可执行代码变换以提高可压缩性。
图4显示了根据本发明实施例的解码器方框图。解码器包括解码模块401、编译器模块407、状态机模块404及实现统计模型的统计模块406。
解码模块401接收包括编码中间表示E-IR的输入流,例如,由结合图3所述编码器生成的输入流。解码器提取变换代码402和编译器信息403,并将其作为符号序列馈入与编码器的状态机对应的状态机模块404。因此,如结合图3所述,状态机404更新状态变量,并将对应的状态信息传递给统计模块406,而统计模块406又生成概率分布PDF。用于解码的概率分布406与模型306生成的用于符号编码的概率分布完全相同。解码模块401接收该概率分布以便在对输入流的后续符号解码中使用。因此,状态信息405应完全由变换代码402和编译器信息403确定,以允许解码模块401进行重建。从解码模块401输出的变换代码402和编译器信息403对应于输入图3所示编码器307的那些数据。注意,变换代码402的格式可能不一定是通常在编译期间用于存储的格式。变换代码402和编译器信息还馈入编译器407,此编译器对变换代码进行编译,并执行传送后优化步骤,从而为相关目标设备产生可执行代码。
用于传送后优化的编译器信息
包括在编码中间表示中供解码器使用的编译器信息可包括不同类型的编译器信息,可生成这些信息以便在解压缩后在优化期间使用。有效代码(执行时间和/或空间)与短的编译时间都是解压缩后优化期间所需要的。一些生成的编译器信息可用于实现这两个目标。解压缩后要执行的两个优选优化步骤是指令调度和寄存器分配,上面已描述过它们。下面描述要从编码器传送给解码器的优选类型的编译器信息:
每个流程图的可简化性(reducibility):视所选择的用于指令调度的算法而定,也许可以或者也许不可以对控制流程图进行分析以构建其支配树。控制流程图可以是可简化或不可简化的。可以更简单的方式对可简化的流程图进行分析。然而,如果传送后优化器不知道流程图是否可简化,它必须假定它不可简化,并应用算法构建更一般(且更慢)的支配树。通过在传送前优化期间对每个流程图进行可简化性测试并存储此测试的输出结果,便可在解压缩后应用最快的算法。
别名信息:在指令调度期间,常常发现希望将在“store”指令之后某位置上的“load”指令移到“store”指令前的某个位置上。然而,这种移动只可以在确定两条指令涉及不同的存储单元时才能执行。在至少一个地址保持在指针中时,这变得难以确定,因此要么跳过移动,要么必须(在指令调度前)执行耗时的别名分析。别名分析收集有关哪些指针可指向程序中不同位置上的哪些变量的信息。别名信息一般在传送前优化期间收集,并且如果它存储在传送文件中,则在解压缩后可实现更积极的指令调度。
数据相关性信息:指令调度的一种高级形式是软件流水化,软件流水化创建包括来自多个循环迭代的指令的新循环体。执行此操作可大大减少流水线暂停。要实现软件流水化,需要称为数据相关图的数据结构。此图的构建很耗时,因为它需要分析循环中的每对数组引用以便找出它们是否会涉及同一存储单元,并且如果会,则确定这两个引用之间的迭代次数。数据相关图可存储在传送文件中,从而减少了对传送后分析的需要。
优化优先级信息:并非所有方法需要大量优化。例如,可能很少调用差错处理器,而应集中在重要方法的内循环。传送前优化可使用静态预测(例如根据导致应用程序终止的代码路径)以将此类方法标记为对性能而言不太重要。
注意,图3和图4中的方框图是示意图。在根据本发明的编码器或解码器实施方案中,所示方框可以不同的方式分割和/或组合。例如,状态机方框404包括数据模型的语法结构,并且基本上与编译器407的至少第一遍的状态一致。在图4中,由于对统计模型而言无关的一些信息可由编译器使用,且反之亦然,因此,它们分别显示为单独的方框404和407。在优选实施例中,解码器的状态机404将是编译器407的一部分,并且应与编译器407一起进行设计。
还要注意,在替代实施例中,统计模型不为编码器提供PDF,而是对CIR执行非压缩变换,以将其变换成可由标准压缩工具压缩的形式。在此实施例中,解码侧同样使用标准工具将输入解压缩,然后对符号流进行反向变换。此实施例的优点在于它利用了预计在目标系统上可用的标准工具。
图5显示了Java字节码的一个示例段的流程图。以下代码段是Java方法的说明性示例:
public class exl{ public int h(int a,int b,int c) { int x,y; x=0; y=a+b*c; while(x<y) x=x+a*b*c; return x; } }
上述代码段中,可以通过将a*b*c移出循环而消除部分冗余。
转换成Java字节码后,以上示例如下:
0 iconst_0
1 istore 4
3 iload_1
4 iload_2
5 iload_3
6 imul
7 iadd
8 istore 5
10 goto 23
13 iload 4
15 iload_1
16 iload_2
17 imul
18 iload_3
19 imul
20 iadd
21 istore 4
23 iload 4
25 iload 5
27 icmplt 13
30 iload 4
32 ireturn
图5显示了上述示例的流程。从符号0开始(501),流程继续到符号10,该符号是到符号23的goto语句(503),流程从符号23继续到符号27。如果满足循环的终止条件,则流程继续到符号30(504),否则流程从符号13(501)继续,直至它再次到达符号27。
下面的代码段是上述代码段到上述可压缩中间表示(CIR)的变换。
0 begin ;标记新方法的开始
1 iconst 0,4 ;将常量0移到变量4
2 imul 2,3,6 ;将变量2和变量3相乘,并将结果放
到变量6中
3 iadd 1,6,5 ;将变量1和变量6相加,并将结果放
到变量5中
4 ba 23 ;转到标号23
5 label 13 ;声明标号13
6 imul 1,2,7 ;将变量1和变量2相乘,并将结果放
到变量7中
7 imul 7,3,8 ;将变量7和变量3相乘,并将结果放
到变量8中
8 iadd 4,8,4 ;将变量4和变量8相加,并将结果放
到变量4中
9 label 23 ;声明标号23
10 icmp 4,5 ;比较变量4和变量5
11 blt 13 ;如果变量4小于变量5,则转移到标
号13
12 ireturn 4 ;将变量4作为结果返回
13 end ;标记方法的结束
注意,每行开始处,即每个助记符左侧的数字是指令编号而非地址。此外,上述代码段中的注释用“;”隔开,每行中包括注释是为了提高可读性。
在优化后,上述CIR段如下所示:
0 begin
1 iconst 0,4
2 imul 2,3,6
3 iadd 1,6,5
4 imul 1,6,7
5 ba 1
6 label 0;以前标记为13
7 iadd 4,7,4
8 label 1;以前标记为23
9 icmp 4,5
10 blt 0
11 ireturn 4
12 end
因此,乘法被从循环中移出。最后,在插入其它编译器信息(包括由编码器使用的信息)后,上述示例中由图3的编译器301生成的符号序列如下所示:
0 begin
enter arithmetic_context(算术上下文)
1 iconst 0,4
2 imul 2,3,6
3 iadd 1,6,5
4 imul 1,6,7
exit arithmetic_context(算术上下文)
5 ba 1
6 label 0
7 iadd 4,7,4
8 label 1
enter condition_context(条件上下文)
9 icmp 4,5
10 blt 0
exit condition_context(条件上下文)
11 ireturn 4
12 end
在编码模块307将上述CIR代码编码前,创建了所用常量值的列表。栈已初始化,并且状态机304的上下文类型和最近的指令状态变量已初始化为默认值。
设想这样一个实施例,其中状态机和概率密度函数是静态的,并且事先已为编码器(和解码器)所知,则模型状态可由状态变量提供,所述状态变量由下列元素:最近的指令、上下文类型、整数常量栈和整数变量栈组成。这是以上表2所列状态变量空间的子集,其中,该子集局限于在此示例中使用的那些值。
因此,对于编码器307和状态机模块304从编译器301接收的每个符号,执行下列步骤:
1)使用算术编码器和状态变量提供的PDF将CIR符号编码。
2)更新状态变量。更新状态变量的“最近的指令”或“上下文类型”元素时,将变量设为等于编码CIR符号的值。
在更新栈状态变量时,将CIR符号移到栈顶。
3)对下一符号重复步骤1)和2),直至到达符号流末端。
表4包括根据上述过程的编码符号的列表。表4还包括对应的符号类型和状态机304的对应状态变量,这些状态变量由状态机模块304在从编译模块301收到该符号时进行更新:
CIR符号 | 编码的符号类型 | 更新的状态变量 |
Begin | 指令 | 最近的指令 |
Enter | 指令 | 最近的指令 |
Arithmetic_context | 上下文 | 上下文类型 |
Iconst | 指令 | 最近的指令 |
0 | 整数常数 | 整数常量栈 |
4 | 整数变量 | 整数变量格 |
Imul | 指令 | 最近的指令 |
2 | 整数变量 | --- |
3 | 整数变量 | 整数变量栈 |
6 | 整数变量 | 整数变量栈 |
Iadd | 指令 | 最近的指令 |
1 | 整数变量 | --- |
6 | 整数变量 | 整数变量栈 |
5 | 整数变量 | 整数变量栈 |
Imul | 指令 | 最近的指令 |
1 | 整数变量 | --- |
6 | 整数变量 | 整数变量栈 |
7 | 整数变量 | 整数变量栈 |
Exit | 指令 | 最近的指令 |
Arithmetic_context | 上下文 | 上下文类型 |
BA | 指令 | 最近的指令 |
1 | 编号 | --- |
Label | 指令 | 最近的指令 |
0 | --- | #指定的标号 |
Iadd | 指令 | 最近的指令 |
1 | 整数变量 | --- |
6 | 整数变量 | 整数变量栈 |
5 | 整数变量 | 整数变量栈 |
Label | 指令 | 最近的指令 |
1 | --- | #指定的标号 |
Enter | 指令 | 最近的指令 |
Condition context | 上下文 | 上下文类型 |
Icmp | 指令 | 最近的指令 |
4 | 整数变量 | --- |
5 | 整数变量 | 整数变量栈 |
Blt | 指令 | 最近的指令 |
Exit | 指令 | 最近的指令 |
Condition context | 上下文 | 上下文类型 |
Ireturn | 指令 | 最近的指令 |
4 | 整数变量 | 整数变量栈 |
End | 指令 | 最近的指令 |
表4
图6显示了Java字节码的另一示例段流程图。以下代码段是说明另一优化示例的另一Java方法的示例:
public class ex2{ public int h(int a[]) { int x; int i; x=0; for(i=0;i<100;i++) x=x+a[i]; return x; } }
上述示例中,每次迭代时进行数组界的检查。转换成Java字节码后,以上示例如下所示:
0 iconst_0
1 istore_2
2 iconst_0
3 istore_3
4 goto 16
7 iload_2
8 aload_1
9 iload_3
10 iaload
11 iadd
12 istore_2
13 iinc 3 1
16 iload_3
17 bipush 100
19 icmplt 7
22 iload_2
23 ireturn
图6显示了上述Java字节码段的流程图。从符号0开始(601),流程继续到符号4,该符号是到符号16的goto语句(603),流程从符号16继续到符号19。如果满足循环的终止条件,则流程继续到符号22(604),否则流程从符号7(602)继续,直至它再次到达符号19。注意,除了节点名称外,图6所示的流程图与图5所示的流程图是完全相同的。
在将以上Java字节码段转换成未优化的CIR后,代码段如下所示:
0 begin ;标记新方法的开始
1 iconst 0,2 ;将x初始化为0
2 iconst 0,3 ;将i初始化为0
3 ba 16 ;转到标号16
4 label 7 ;声明标号7
5 bcheck 1,3 ;用变量3对数组1进行边界检查
6 imuli 3,4,4 ;将变量3和变量4相乘,将结果放到
变量4中
7 ldsw 1,4,5 ;从数组装入字,将数据放到变量5中
8 iadd 2,5,2 ;用数组元素使x递增
9 iaddi 3,1,3 ;使i递增
10 label 16 ;声明标号16
11 icmpi 3,100 ;比较变量3和常量100
12 blt 7 ;如果为真,则转到标号7
13 ireturn 2 ;将变量2作为结果返回
14 end ;标记方法的结束
同样地,每个助记符左侧的数字是指令编号而非地址,并且上述代码段中每行包括用“;”分开的注释,以提高可读性。
在下述内容中,假定带有N个元素的数组如下所示存储在连续存储单元中:首先是包含用于边界检查的数组大小N的一个字,接着是数组的数据。此外,假定数组变量(上述CIR代码段中的变量1)指向数组的数据。随后,为便于进行边界检查,应使用概念上在索引-1上的字(假定是大小按字计(word sized)的元素;其中,由于元素具有双字对齐要求,可进行琐碎的调整以确保正确对齐)。
优化后,以上CIR段如下所示:
0 begin ;标记新方法的开始
1 iconst 0,3 ;初始化x
2 bchecki 1,100 ;进入循环湔进行一次边界检查
3 imov 1,5 ;将数组数据指针拷贝到变量5中
4 iaddi 5,400,6 ;将元素101的地址放到变量6中
5 label 0 ;声明标号0
6 ldsw 5,0,7 ;将数组元素装入变量7中
7 iadd 2,7,2 ;使x递增
8 iaddi 5,4,5 ;按数组元素的大小使指针递增
9 icmp 5,6 ;比较变量5和变量6
10 blt 0 ;如果为真,则转到标号0
11 ireturn 2 ;将变量2作为结果返回
12 end ;方法结束
因此,已重写数组访问部分,以便使用遍历数组的指针。删除了最初到标号16的转移,这也使得有可能删除该标号。
最后,在插入其它编译器信息(包括由编码器使用的信息)后,上述示例中由图3的编译器301生成的符号序列如下所示:
0 begin ;标记新方法的开始
1 iconst 0,3 ;初始化x
2 enter array_context
3 bchecki 1,100 ;进入循环湔进行一次边界检查
4 imov 1,5 ;将数组数据指针拷贝到变量5中
5 iaddi 5,400,6 ;将元素101的地址放到变量6中
6 exit array_context
7 enter for_loop_context,5,6,4
;循环变量=5
;终止值=6,步长=4
;忽略循环标号的声明
8 ldsw 5,0,7 ;将数组元素装入变量7中
9 iadd 2,7,2 ;使x递增
;忽略递增的指针(循环变量)
;忽略循环结束测试
10 exit for_loop_cotnext
11 ireturn 2 ;将变量2作为结果返回
12 end ;方法结束
因此,在上述示例中,for_loop_context使得可以删除循环体中一半以上的指令。
实际上,许多循环采用此示例中给出的形式。因此,更简洁的表示是使用循环变量、循环变量的终止值和步长来声明“循环(loop)”指令。循环指令作为上下文提示编码。使用循环指令的益处在于可以忽略循环体的某些部分,即使循环变量递增并测试循环结束。
注意,在上述示例中,未显示指令调度或寄存器分配。所述代码示例显示了压缩前执行的传送前优化。
还要注意,在中间表示的上述实施例中存在很小的平台相关性。该实施例采用了类似于大多数微处理器的指令集体系结构。然而,对于表示的任一实施例,应决定如何处理条件转移。处理器将比较的输出结果存储在条件码寄存器中或通用寄存器中。以上假定使用条件码寄存器。要在传送后为不用条件码的机器生成代码,可使用不同的替代方案。例如,如果寄存器分配在传送后优化期间完成,则临时变量可用于保持比较的输出结果。随后如其它变量一样为这些变量分配寄存器。另一方面,如果寄存器分配在传送前已经完成,则可转为使用专用的通用寄存器。
图7显示了根据本发明实施例,用于生成可执行程序代码的数据处理系统的方框图。数据处理系统701包括处理单元(CPU)704、通信单元705、RAM 711和数据存储装置706,例如硬盘、EPROM、EEPROM等。根据此实施例,数据处理系统701经通信单元705和数据链路703从另一数据处理系统(未显示),例如从软件供应商的服务器接收输入代码。例如,输入代码可从网站下载。接收的输入代码装入RAM 711中。此外,由编码进程使用的编码程序和状态机模型分别从数据存储装置706的对应区域710和709装入RAM中,由CPU执行。编码程序实施根据本发明的编码进程,从而产生优化的压缩中间表示E-IR,此表示E-IR被存储在数据存储装置706的对应区域708中。当在E-IR中编码的程序代码要在以后的某个时刻执行时,从存储区域710和709分别将解码程序和状态机模型装入RAM中。解码程序由CPU执行,使CPU从数据存储装置706的对应区域708将E-IR装入RAM中,以便将编码的表示解码,并生成随后由CPU执行的可执行代码。
因此,根据此实施例,编码级和解码级在目标设备如移动电话上执行,即,上述的传送前优化和传送后优化均在目标设备上执行。在此实施例中,目标设备仍然利用了中间表示的高压缩率,从而减少了所需的存储容量。此外,目标设备利用脱机优化分析取得的良好优化即在编码级期间执行的所说的传送前优化,提供了高效的代码执行,而在可作为及时操作实现的解码级期间并不造成很大开销。
Claims (19)
1.一种为数据处理系统生成可执行程序代码的方法,所述方法包括:
用于生成输入代码(IC)的压缩中间表示(E-IR)的编码级,所述编码级包括:
-对所述输入码进行变换(301),包括执行一组选定的代码优化步骤,从而产生变换代码(302)和有关所述变换代码的编译器信息(303);
-从所述变换代码和所述编译器信息提取(304,306)统计模型的状态信息(305)和统计信息(PDF);以及
-使用所述提取的状态信息和统计信息,将所述变换代码和所述编码器信息编码(307),并产生所述压缩中间表示;
用于从所述压缩中间表示生成所述可执行程序代码的解码级;所述解码级包括:
-将所述压缩中间表示解码(401),从而产生所述变换代码(402)和所述编译器信息(403);以及
-使用所述解码的编译器信息进一步编译(407)所述变换代码,并产生所述可执行程序代码(EXE)。
2.如权利要求1所述的方法,其特征在于:在第一数据处理系统(101)上执行所述编码级,并在第二数据处理系统(102)上执行所述解码级;所述方法还包括将所述压缩中间表示从所述第一数据处理系统传送到所述第二数据处理系统。
3.如权利要求1或2所述的方法,其特征在于:生成所述状态信息和统计信息的步骤还包括
-根据所述变换代码和所述编译器信息从状态机(304)获取状态信息(305);以及
-根据所述获取的状态信息,从统计模型(306)获取概率信息(PDF)。
4.如权利要求3所述的方法,其特征在于:所述状态机包括至少所述变换代码和所述编译器信息之一的语法模型。
5.如权利要求3或4所述的方法,其特征在于:所述状态机包括所述变换代码的执行模型。
6.如权利要求3到5中任意一项所述的方法,其特征在于:所述状态机包括所述编译器信息的模型。
7.如权利要求1到6中任意一项所述的方法,其特征在于:所述方法还包括:
-存储所述压缩中间表示;以及
-结合所述生成的可执行程序代码的后续执行来执行所述解码级。
8.如权利要求1到7中任意一项所述的方法,其特征在于:进一步编译所述变换代码的所述步骤还包括进一步优化所述产生的可执行代码。
9.如权利要求1到8中任意一项所述的方法,其特征在于:所述输入代码包括Java字节码。
10.如权利要求1到9中任意一项所述的方法,其特征在于:所述数据处理系统是移动终端。
11.如权利要求1到10中任意一项所述的方法,其特征在于:所述变换代码包括多个代码元素,并且所述方法还包括确定所述代码元素的概率分布,并将所述确定的概率分布提供给生成统计信息的所述步骤。
12.一种为数据处理系统生成程序代码的方法,所述方法包括:
-对所述输入码进行变换(301),包括执行一组选定的代码优化步骤,从而产生变换代码(302)和有关所述变换代码的编译器信息(303);
-从所述变换代码和所述编译器信息提取(304,306)统计模型的状态信息(305)和统计信息(PDF);以及
-使用所述提取的状态信息和统计信息,将所述变换代码和所述编码器信息编码(307),并产生所述输入代码的压缩中间表示(E-IR);所述压缩中间表示适于在后续的解码级中进行解码并进一步编译以生成可执行程序代码。
13.一种计算机程序,它包括程序代码组件,所述程序代码组件用于在所述程序在计算机上运行时执行如权利要求12所述的所有步骤。
14.一种在数据处理系统中生成可执行程序代码的方法,所述方法包括
-接收输入代码的压缩中间表示(E-IR),所述压缩中间表示包括由编译器生成且至少部分优化的编码变换代码和表示由所述编译器生成的有关所述变换代码的其它信息的编码编译器信息;所述编码变换代码和所述编码编译器信息利用从所述变换代码和所述编译器信息中提取的统计模型的状态信息和统计信息进行编码;
-将所述压缩中间表示解码(401),从而产生所述变换代码(402)和所述编译器信息(403);以及
-使用所述解码的编译器信息进一步编译(407)所述变换代码,并产生所述可执行程序代码(EXE)。
15.一种计算机程序,它包括当所述程序在计算机上运行时,用于执行如权利要求14所述的所有步骤的程序代码组件。
16.一种用于生成可执行程序代码的数据处理系统,所述系统包括:
适于生成输入代码的压缩中间表示的编码模块;所述编码模块包括:
-适于对所述输入代码进行变换的第一编译器装置,包括执行一组选定的代码优化步骤并产生变换代码和有关所述变换代码的编译器信息;
-处理装置,适于从所述变换代码和所述编译器信息提取统计模型的状态信息和统计信息;以及
-编码设备,适于使用所述提取的状态信息和统计信息将所述变换代码和所述编译器信息编码,并产生所述压缩中间表示;
适于从所述压缩中间表示生成所述可执行程序代码的解码模块;所述解码模块包括:
-解码装置,适于将所述压缩中间表示解码,从而得到所述变换代码和所述编译器信息;以及
-第二编译器装置,适于使用所述解码的编译器信息进一步编译所述变换代码,从而产生所述可执行程序代码。
17.一种用于为数据处理系统生成程序代码的编码设备;所述编码设备包括
-用于对输入代码进行变换的编译器装置,包括执行一组选定的代码优化步骤,从而产生变换代码和有关所述变换代码的编译器信息;
-处理装置,适于从所述变换代码和所述编译器信息中提取统计模型的状态信息和统计信息;以及
-编码装置,适于使用所述提取的状态信息和统计信息将所述变换代码和所述编译器信息编码,并产生所述输入代码的压缩中间表示;所述压缩中间表示适于在后续的解码级中进行解码并进一步编译以生成可执行程序代码。
18.一种用于生成可执行程序代码的数据处理系统,所述数据处理系统包括:
-适于接收输入代码的压缩中间表示的接收装置,所述压缩中间表示包括由编译器生成并至少部分优化的编码变换代码和由所述编译器生成的表示所述编译器生成的其它信息的编码编译器信息;所述编码变换代码和所述编码编译器信息利用从所述变换代码和所述编译器信息中提取的统计模型的状态信息和统计信息进行编码;
-解码装置,适于将所述压缩中间表示解码,从而得到所述变换代码和所述编译器信息;以及
-编译器装置,适于使用所述解码的编译器信息进一步编译所述变换代码,从而产生所述可执行程序代码。
19.一种包括输入代码的压缩中间表示的数据记录,所述压缩中间表示包括由编译器生成并至少部分优化的编码变换代码和表示由所述编译器生成的其它信息的编码编译器信息;所述编码变换代码和所述编码编译器信息利用从所述变换代码和所述编译器信息中提取的统计模型的状态信息和统计信息进行编码;所述压缩中间表示适于由数据处理系统解码并进一步编译,从而产生可执行程序代码。
Applications Claiming Priority (4)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
EP02388049.5 | 2002-08-02 | ||
EP02388049A EP1387265A1 (en) | 2002-08-02 | 2002-08-02 | Optimised code generation |
US40321002P | 2002-08-12 | 2002-08-12 | |
US60/403,210 | 2002-08-12 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN1672133A true CN1672133A (zh) | 2005-09-21 |
Family
ID=31716857
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN03818445.1A Pending CN1672133A (zh) | 2002-08-02 | 2003-06-27 | 优化的代码生成 |
Country Status (4)
Country | Link |
---|---|
US (1) | US20060158354A1 (zh) |
CN (1) | CN1672133A (zh) |
AU (1) | AU2003242768A1 (zh) |
WO (1) | WO2004015570A1 (zh) |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101292429B (zh) * | 2005-11-18 | 2012-04-04 | 英特尔公司 | 使用多个马尔可夫链进行压缩的方法和装置 |
CN101542437B (zh) * | 2005-12-07 | 2012-11-28 | 微软公司 | 软件事务性存储器操作的优化 |
CN103493015A (zh) * | 2011-04-20 | 2014-01-01 | 飞思卡尔半导体公司 | 生成资源高效的计算机程序代码的方法和装置 |
CN105359090A (zh) * | 2013-04-26 | 2016-02-24 | 纽约市哥伦比亚大学理事会 | 用于移动应用的系统和方法 |
CN107250982A (zh) * | 2015-11-25 | 2017-10-13 | 华为技术有限公司 | 用于加速器的程序生成方法和系统 |
CN111819542A (zh) * | 2018-02-28 | 2020-10-23 | 皇家飞利浦有限公司 | 编译设备和方法 |
CN112639774A (zh) * | 2018-07-06 | 2021-04-09 | 皇家飞利浦有限公司 | 具有掩蔽功能的编译器设备 |
CN116661804A (zh) * | 2023-07-31 | 2023-08-29 | 珠海市芯动力科技有限公司 | 代码编译方法、代码编译装置、电子设备和存储介质 |
Families Citing this family (40)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP1598739A4 (en) * | 2003-02-18 | 2008-05-14 | Access Co Ltd | NATIVE COMPILATION METHOD, NATIVE COMPILATION PRETREATMENT METHOD, COMPUTER PROGRAM, AND SERVER |
US7434213B1 (en) * | 2004-03-31 | 2008-10-07 | Sun Microsystems, Inc. | Portable executable source code representations |
US7493604B2 (en) * | 2004-10-21 | 2009-02-17 | Microsoft Corporation | Conditional compilation of intermediate language code based on current environment |
KR100597414B1 (ko) * | 2004-10-21 | 2006-07-05 | 삼성전자주식회사 | 데이터 처리 장치 및 이를 이용한 레지스터 할당 방법 |
JP2006260096A (ja) * | 2005-03-16 | 2006-09-28 | Matsushita Electric Ind Co Ltd | プログラム変換方法およびプログラム変換装置 |
US7856618B2 (en) * | 2005-08-04 | 2010-12-21 | International Business Machines Corporation | Adaptively generating code for a computer program |
US20070033592A1 (en) * | 2005-08-04 | 2007-02-08 | International Business Machines Corporation | Method, apparatus, and computer program product for adaptive process dispatch in a computer system having a plurality of processors |
GB0525902D0 (en) * | 2005-12-20 | 2006-02-01 | Nokia Corp | Signal message decompressor |
US20080243518A1 (en) * | 2006-11-16 | 2008-10-02 | Alexey Oraevsky | System And Method For Compressing And Reconstructing Audio Files |
US8079023B2 (en) * | 2007-03-22 | 2011-12-13 | Microsoft Corporation | Typed intermediate language support for existing compilers |
US7996798B2 (en) * | 2007-05-24 | 2011-08-09 | Microsoft Corporation | Representing binary code as a circuit |
US9164783B2 (en) * | 2007-08-20 | 2015-10-20 | International Business Machines Corporation | Load time resolution for dynamic binding languages |
US8473935B2 (en) * | 2008-04-21 | 2013-06-25 | Microsoft Corporation | Just-ahead-of-time compilation |
US8484630B2 (en) * | 2008-12-23 | 2013-07-09 | International Business Machines Corporation | Code motion based on live ranges in an optimizing compiler |
JP4806060B2 (ja) * | 2009-09-15 | 2011-11-02 | インターナショナル・ビジネス・マシーンズ・コーポレーション | コンパイラ・プログラム、コンパイル方法及びコンピュータ・システム |
US8584120B2 (en) * | 2009-11-23 | 2013-11-12 | Julian Michael Urbach | Stream-based software application delivery and launching system |
AU2014203156B2 (en) * | 2009-11-23 | 2016-02-04 | Julian Michael Urbach | Stream-based software application delivery and launching system |
US8656377B2 (en) | 2010-06-10 | 2014-02-18 | Microsoft Corporation | Tracking variable information in optimized code |
US10114660B2 (en) | 2011-02-22 | 2018-10-30 | Julian Michael Urbach | Software application delivery and launching system |
US9183021B2 (en) * | 2011-05-31 | 2015-11-10 | Red Hat, Inc. | Runtime optimization of application bytecode via call transformations |
US8793674B2 (en) * | 2011-09-19 | 2014-07-29 | Nec Laboratories America, Inc. | Computer-guided holistic optimization of MapReduce applications |
US8745607B2 (en) * | 2011-11-11 | 2014-06-03 | International Business Machines Corporation | Reducing branch misprediction impact in nested loop code |
US9052956B2 (en) | 2012-08-30 | 2015-06-09 | Hewlett-Packard Development Company, L.P. | Selecting execution environments |
CA2794154C (en) | 2012-11-01 | 2019-09-10 | Ibm Canada Limited - Ibm Canada Limitee | Code generation using data marking |
US9397902B2 (en) | 2013-01-28 | 2016-07-19 | Rackspace Us, Inc. | Methods and systems of tracking and verifying records of system change events in a distributed network system |
US9813307B2 (en) | 2013-01-28 | 2017-11-07 | Rackspace Us, Inc. | Methods and systems of monitoring failures in a distributed network system |
US9483334B2 (en) | 2013-01-28 | 2016-11-01 | Rackspace Us, Inc. | Methods and systems of predictive monitoring of objects in a distributed network system |
US9135145B2 (en) * | 2013-01-28 | 2015-09-15 | Rackspace Us, Inc. | Methods and systems of distributed tracing |
US9003382B2 (en) * | 2013-02-18 | 2015-04-07 | Red Hat, Inc. | Efficient just-in-time compilation |
US9239712B2 (en) * | 2013-03-29 | 2016-01-19 | Intel Corporation | Software pipelining at runtime |
US10310863B1 (en) * | 2013-07-31 | 2019-06-04 | Red Hat, Inc. | Patching functions in use on a running computer system |
US9563421B2 (en) * | 2014-08-05 | 2017-02-07 | International Business Machines Corporation | Refining data understanding through impact analysis |
US10142353B2 (en) | 2015-06-05 | 2018-11-27 | Cisco Technology, Inc. | System for monitoring and managing datacenters |
US10536357B2 (en) | 2015-06-05 | 2020-01-14 | Cisco Technology, Inc. | Late data detection in data center |
US9817643B2 (en) | 2015-07-17 | 2017-11-14 | Microsoft Technology Licensing, Llc | Incremental interprocedural dataflow analysis during compilation |
KR102414250B1 (ko) * | 2015-07-30 | 2022-06-29 | 삼성전자주식회사 | 전자 장치, 컴파일링 방법 및 컴퓨터 판독가능 기록매체 |
US10558460B2 (en) * | 2016-12-14 | 2020-02-11 | Qualcomm Incorporated | General purpose register allocation in streaming processor |
US10133561B1 (en) | 2017-08-30 | 2018-11-20 | International Business Machines Corporation | Partial redundancy elimination with a fixed number of temporaries |
US11074055B2 (en) * | 2019-06-14 | 2021-07-27 | International Business Machines Corporation | Identification of components used in software binaries through approximate concrete execution |
CN112799655A (zh) * | 2021-01-26 | 2021-05-14 | 浙江香侬慧语科技有限责任公司 | 一种基于预训练的多类型代码自动生成方法、装置及介质 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0943990A3 (en) * | 1998-02-27 | 2004-12-22 | Texas Instruments Incorporated | Method and system of providing dynamic optimization information in a code interpretive runtime environment |
US6691305B1 (en) * | 1999-11-10 | 2004-02-10 | Nec Corporation | Object code compression using different schemes for different instruction types |
US6516305B1 (en) * | 2000-01-14 | 2003-02-04 | Microsoft Corporation | Automatic inference of models for statistical code compression |
-
2003
- 2003-06-27 US US10/522,445 patent/US20060158354A1/en not_active Abandoned
- 2003-06-27 WO PCT/EP2003/006764 patent/WO2004015570A1/en not_active Application Discontinuation
- 2003-06-27 AU AU2003242768A patent/AU2003242768A1/en not_active Abandoned
- 2003-06-27 CN CN03818445.1A patent/CN1672133A/zh active Pending
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101292429B (zh) * | 2005-11-18 | 2012-04-04 | 英特尔公司 | 使用多个马尔可夫链进行压缩的方法和装置 |
CN101542437B (zh) * | 2005-12-07 | 2012-11-28 | 微软公司 | 软件事务性存储器操作的优化 |
CN103493015A (zh) * | 2011-04-20 | 2014-01-01 | 飞思卡尔半导体公司 | 生成资源高效的计算机程序代码的方法和装置 |
CN105359090A (zh) * | 2013-04-26 | 2016-02-24 | 纽约市哥伦比亚大学理事会 | 用于移动应用的系统和方法 |
CN107250982A (zh) * | 2015-11-25 | 2017-10-13 | 华为技术有限公司 | 用于加速器的程序生成方法和系统 |
CN107250982B (zh) * | 2015-11-25 | 2020-11-06 | 华为技术有限公司 | 用于加速器的程序生成方法和系统 |
CN111819542A (zh) * | 2018-02-28 | 2020-10-23 | 皇家飞利浦有限公司 | 编译设备和方法 |
CN112639774A (zh) * | 2018-07-06 | 2021-04-09 | 皇家飞利浦有限公司 | 具有掩蔽功能的编译器设备 |
CN112639774B (zh) * | 2018-07-06 | 2023-11-21 | 皇家飞利浦有限公司 | 具有掩蔽功能的编译器设备 |
CN116661804A (zh) * | 2023-07-31 | 2023-08-29 | 珠海市芯动力科技有限公司 | 代码编译方法、代码编译装置、电子设备和存储介质 |
CN116661804B (zh) * | 2023-07-31 | 2024-01-09 | 珠海市芯动力科技有限公司 | 代码编译方法、代码编译装置、电子设备和存储介质 |
Also Published As
Publication number | Publication date |
---|---|
WO2004015570A1 (en) | 2004-02-19 |
US20060158354A1 (en) | 2006-07-20 |
AU2003242768A1 (en) | 2004-02-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1672133A (zh) | 优化的代码生成 | |
CN1287257C (zh) | 用于算术表达式优化的方法和装置 | |
CN1101019C (zh) | 数据序列产生方法及设备、转换方法及计算机 | |
CN1153129C (zh) | 用于处理器定制操作的设备 | |
CN1244051C (zh) | 对于处理数据的装置和方法 | |
CN1103961C (zh) | 协处理器的数据访问控制装置和方法 | |
CN1672150A (zh) | 用于软件原子化的视图 | |
CN100338568C (zh) | 开发片上系统用的开发环境的生成方法 | |
CN1135468C (zh) | 对存储设备中信号数据字执行数字信号处理的方法和装置 | |
CN1252587C (zh) | 移位分组数据的方法、装置和处理数字音频信号的系统 | |
CN1220938C (zh) | 双调用/返回堆栈分支预测系统 | |
CN1521623A (zh) | 编译设备和编译方法 | |
CN1202470C (zh) | 处理器 | |
CN1482540A (zh) | 编译程序、编译程序装置和编译方法 | |
CN1609856A (zh) | 查询中间语言的方法和系统 | |
CN1609855A (zh) | 查询优化系统和方法 | |
CN1494767A (zh) | 压缩/解压缩结构化文档的方法 | |
CN1809818A (zh) | 在产生差别文件中使用的处理软件 | |
CN1472646A (zh) | 适应性强具备最佳化功能的编译装置 | |
CN1613058A (zh) | 配有jit编译器的虚拟计算机,操作所述计算机的方法以及包括所述虚拟计算机的终端设备 | |
CN1875345A (zh) | 在编译过程中表示和检查程序组件的一致性的可扩展类型系统 | |
CN1783012A (zh) | 程序转换器件及方法、程序转换执行器件及转换执行方法 | |
CN1273893C (zh) | 模块化计算机系统以及相关方法 | |
CN1802632A (zh) | 用于在程序代码转换期间执行解释器优化的方法和装置 | |
CN1841328A (zh) | 脚本语言的自动机方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C02 | Deemed withdrawal of patent application after publication (patent law 2001) | ||
WD01 | Invention patent application deemed withdrawn after publication |