C程序编译方法及编译器的制造方法

文档序号:8430571阅读:220来源:国知局
C程序编译方法及编译器的制造方法
【技术领域】
[0001]本发明涉及通信技术领域,尤其涉及一种C程序编译方法及编译器。
【背景技术】
[0002]C语言被广泛应用于开发各种系统软件,如操作系统、编译器、嵌入式系统、并行计算等,因此,针对各种目标机器的C程序编译器也层出不穷。C程序编译器的功能就是将用户的C程序转换成语义等价的目标机程序。在经典编译架构中,编译过程通常被划分为5个串行的模块,即:词法分析、语法分析、语义分析及中间代码生成、中间代码优化、目标代码生成。通常将词法分析、语法分析、语义分析及中间代码生成阶段合称为前端,将中间代码优化、目标代码生成阶段合称为后端。前端主要完成与源语言相关的各类分析工作,而后端主要涉及与目标机相关的各类转换、生成工作。随着用户C程序规模及复杂程度不断增大,编译过程将耗费更多的时间。
[0003]现有技术中,中间代码优化和目标代码生成均是以C程序的文件为单位执行的,需要逐一的处理文件中的各个函数,速度很慢,导致编译过程中后端的阶段非常耗时。因此,降低后端阶段的耗时,减少C程序编译时间,从而提高C程序编译效率成为亟待解决的问题。

【发明内容】

[0004]本发明提供一种C程序编译方法及编译器,能够降低后端阶段的耗时,从而提高C程序编译效率。
[0005]一方面,本发明提供一种C程序编译方法,包括:依次对C程序进行词法分析、语法分析、语义分析及中间代码生成,
[0006]将经过所述语义分析及中间代码生成的C程序以函数为单位分配在至少两个线程上,以分别进行中间代码优化;
[0007]对经过所述中间代码优化的C程序进行目标代码生成。
[0008]另一方面,本发明提供一种C程序编译器,包括:用于对C程序进行词法分析的词法分析器、用于对词法分析后的C程序进行语法分析的语法分析器、用于对语法分析后的C程序进行语义分析及中间代码生成的语义分析及中间代码生成器、中间代码优化器和目标代码生成器,
[0009]所述中间代码优化器,用于将经过所述语义分析及中间代码生成的C程序以函数为单位分配在至少两个线程上,以分别进行中间代码优化;
[0010]所述目标代码生成器,用于对经过所述中间代码优化的C程序进行目标代码生成。
[0011]本发明提供的C程序编译方法及编译器,依次对C程序进行词法分析、语法分析、语义分析及中间代码生成,将经过语义分析及中间代码生成的C程序以函数为单位分配在至少两个线程上,以分别进行中间代码优化;对经过中间代码优化的C程序进行目标代码生成。这样一来,编译器在进行中间代码优化时,可以以函数为单位,在提供的至少两个线程上并行的处理各函数,加快了优化的速度,进而减少了 C程序编译时间,提高了 C程序编译效率。
【附图说明】
[0012]为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
[0013]图1为本发明提供的C程序编译方法的流程示意图;
[0014]图2为本发明提供的另一 C程序编译方法的流程示意图;
[0015]图3为本发明提供的符号系统的结构示意图;
[0016]图4为本发明提供的编译并行方法的流程示意图;
[0017]图5为本发明C程序编译器的结构示意图;
[0018]图6为本发明另一 C程序编译器的结构示意图;
[0019]图7为本发明再一 C程序编译器的结构示意图。
【具体实施方式】
[0020]为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0021]图1为本发明提供的C程序编译方法的流程示意图,如图1所示,该方法包括:
[0022]SlOUC程序编译器依次对C程序进行词法分析、语法分析、语义分析及中间代码生成。
[0023]需要说明的是,词法分析、语法分析、语义分析及中间代码生成,主要完成与源语言相关的各类分析工作,如对组成C程序文件的各个函数进行分析以得到各个函数的信息如函数长度等等。
[0024]S102、C程序编译器将经过语义分析及中间代码生成的C程序以函数为单位分配在至少两个线程上,以分别进行中间代码优化。
[0025]进一步地,编译器可以将中间代码以函数为单位独立组织,即为每个函数分配一个优化线程,并将所有线程加入线程池,由操作系统统一调度,如,中央处理器(CenterProcess Unit, CPU)可支持的线程为4个,该的包括的函数为6个,其函数长度经过前端分析确定为:一个较长的函数,三个很短的函数和两个中等长度的函数,这时,可以将较长的函数分配到一个线程上,其他两个中等长度的函数各分配一个线程,最后将三个很短的函数分配到同一个线程上;或者,将较长的函数分配到一个线程上,其他两个中等长度的函数各分配一个线程,并在其各自的线程上也分别分配一个很短的函数,将最后一个很短的线程分配到另一个空置的线程上等等,此处仅仅举例说明可以根据函数的长度分配到不同的线程上,但不以上述分配方式做任何限定。且保护范围不限于上述举例,以前端分析得出的其他函数信息的分配方法均在保护范围之内。
[0026]进一步地,在线程上的函数可以以各函数为单位分别优化,优化可以使得C程序编译出的执行程序执行加快或者C程序编译出的文件较小,分别优化可以加快优化的速度。
[0027]S103、C程序编译器对经过中间代码优化的C程序进行目标代码生成。
[0028]进一步地,编译器可以对上述优化后的C程序进行目标代码生成,C程序可以是分别利用上述线程以函数为单位并行进行代码生成,还可以是以其他方式分配在不同线程上以函数为单位并行进行代码生成。
[0029]本发明提供的C程序编译方法,依次对C程序进行词法分析、语法分析、语义分析及中间代码生成,将经过语义分析及中间代码生成的C程序以函数为单位分配在至少两个线程上,以分别进行中间代码优化;对经过中间代码优化的C程序进行目标代码生成。这样一来,编译器在进行中间代码优化时,可以以函数为单位,在提供的至少两个线程上并行的处理各函数,加快了优化的速度,进而减少了 C程序编译时间,提高了 C程序编译效率。
[0030]下面采用具体的实施例,对图1所示方法实施例的技术方案进行详细说明。
[0031]图2为本发明提供的另一 C程序编译方法的流程示意图,如图2所示,该方法包括:
[0032]S201、C程序编译器依次对C程序进行词法分析、语法分析、语义分析及中间代码生成获取C程序中各函数的信息。
[0033]S202、C程序编译器根据获取的C程序中各函数的信息将各函数分配在CPU可支持的至少两个线程上。
[0034]举例来说,各函数的信息可以是函数长度,或者该函数执行优化的历史参照时间长短等。
[0035]S203、C程序编译器为各函数对应分配一个符号访问接口,符号访问接口与全局符号数据相连,且与函数对应的局部符号数据相连。
[0036]举例来说,图3为本发明提供的符号系统的结构示意图,符号系统是编译器的数据中心,主要定义了编译过程中各种数据结构及其访问接口,如符号信息、类型系统、抽象语法树等。如图3所示,本发明考虑到后端多线程对符号系统的并发访问,因此对于符号系统设计也是以函数为并发控制粒度设计的:为C程序中的每个函数提供一个符号访问接口,该符号访问接口与全局符号数据相连,使得函数可以改写全局符号,且该符号访问接口与该函数对应的局部符号数据相连,使得该函数可以改写自己的局部符号。
[0037]S204、C程序编译器在分配到的线程上对各函数进行优化,优化至少包括各函数分别通过对应的符号访问接口对全局符号中函数需改写的符号进行标记,并通过符号访问接口在函数对应的局部符号中改写需改写的符号。
[0038]进一步地,本实施例只是描绘了在编译优化过程中针对并行编译模式设计的一个数据访问控制机制,并不是以此概括所有的编译优化方法,优化并不以此举例为限定。
[0039]举例来说,符号可以是变量、变量类型、变量结构信息,字段,访问权限等等,改写可以是函数对符号的使用或对符号的定义,如函数XXl通过XXl函数的符号访问接口使用了一次其函数自身的局部变量,该局部变量会记录下这次使用,或者,也可以是对全局变量的改写或定义。
[0040]进一步地,在函数在各线程上并发优化时,符号系统会为全局符号建立一份完整的映射,再针对每个函数的形成属于该函数的局部符号,这部分的数据是可以改写的。即为每个函数提供一个独立的符号访问接口,该符号访问接口数据相连的符号系统提供的全局符号可读取且可标记需改写的内容,局部符号可改写,使得在线程上并行优化的各函数可以分别通过相应的符号访问接口同时与符号系统交互,读取全局符号并分别改写其对应的局部符号。除了函数符号访问接口之外,符号系统还提供了一个全局符号更新接口,该接口主要用于编译过程中对全局符号进行更新。
[0041]S205、C程序编译器对各线程上完成优化的函数进行数据维护,数据维护为根据全局符号中各符号上的标记更新全局符号。
[0042]进一步地,为保证符号信息及中间代码的一致性、完整性,所有优化线程执行完毕后,可以对各线程的优化结果合并、整理,并通知符号系统进行数据维护。
[0043]举例来说,编译器可以将所有函数对某个全局符号的改写整合在一起,如对于一个全局变量a,标记有函数XXl对它进行了一次定义,函数XX2使用了它一次,那么整合的时候可以将函数XXl对它进行了一次定义,函数XX2使用了它一次对应记录在这个全局符号a里,并保留这个全局符号a ;如对某一个全局变量b,没有任何标记,即函数XXl没有对它进行改写,函数XX2也没有对它进行改写,统计发现也没有任何该C程序中的其他函数对b进行过改写,那么整合的时候可以全局符号里的b删除。这样可以根据符号的信息将优化等编译过程中对符号的改写记录下来,一方面可以删除不需要的符号节省资源,另一方面可以提高后续调试的准确度。
[0044]S206、C程序
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1