CN200680056637.6
2006.12.14
CN101563673A
2009.10.21
撤回
无权
发明专利申请公布后的视为撤回IPC(主分类):G06F 9/45申请公布日:20091021|||实质审查的生效|||公开
G06F9/45
富士通株式会社
山下浩一郎
日本神奈川县
北京东方亿思知识产权代理有限责任公司
赵淑萍;南 霆
通过计算机对被时序地处理并以事先规定的定时输出中间结果的软件进行编译的编译方法包括:提取步骤,从包含在所述软件的源代码中的处理序列提取与并列处理和条件分支相关的处理模块;以及生成步骤,对所提取的处理模块进行重构并生成执行代码。
1. 一种编译方法,所述编译方法通过计算机进行软件的编译,所述软件被时序地处理并以事先规定的定时输出中间结果,所述编译方法的特征在于,包括:提取步骤,由所述计算机从包含在所述软件的源代码中的处理序列提取与并列处理和条件分支相关的处理模块;以及生成步骤,由所述计算机对所提取的处理模块进行重构,生成执行代码。2. 如权利要求1所述的编译方法,其特征在于,所述提取步骤包括第一阶段和第二阶段,所述第一阶段对于进行计算并将计算结果代入所述计算机的存储器和寄存器中的运算代入处理的处理模块,基于语句间的依赖性方程式进行重新排列,求出在中间语言级别上被整理的语句序列,所述第二阶段对所述整理的语句序列进行语句组的结合以及重新定义。3. 如权利要求2所述的编译方法,其特征在于,所述生成步骤包括第三阶段,所述第三阶段对于在所述第二阶段进行了分组的调度化处理模块以及线程化处理模块附加语句,并生成最终的中间语言以作为线程和调度器,所述调度化处理模块是在后续的处理模块为条件分支处理时与后续的处理模块结合并被重新定义的调度化处理模块,所述线程化处理模块是在调用源的处理模块为条件分支处理时将条件分支的从属子句重新定义而得的所述线程化处理模块。4. 如权利要求2或3所述的编译方法,其特征在于,所述第一阶段对所有的通过控制语句划分的运算代入语句的组进行,并且所述第一阶段包括:提取被定义和参照的变量、定义表现各语句的依赖关系的依赖图、删除不需要的语句、以及基于所述依赖图对语句进行排序。5. 如权利要求2至4中任一项所述的编译方法,其特征在于,所述第二阶段从处于嵌套结构中的最内层级的处理模块起依次进行所述语句组的结合以及重新定义。6. 如权利要求5所述的编译方法,其特征在于,所述第二阶段是对所述第一阶段的排序结果进行的,并且对于将处理模块化为对象的程序的代码,当调用源的处理模块为条件分支处理时,将条件分支的从属子句重新定义为线程化处理模块,当不是条件分支并且后续的处理模块是接在条件分支处理之后的处理模块时,结合所述处理模块和后续的处理模块并重新定义为调度化处理模块。7. 如权利要求3至6中任一项所述的编译方法,其特征在于,所述第三阶段是对所述第二阶段进行分组后的调度化处理模块和线程化处理模块进行的,当作为处理对象的处理模块为线程化处理模块时,进行向线程化处理模块追加语句的处理,当作为处理对象的处理模块为调度化处理模块时,进行向调度化处理模块追加语句的处理。8. 如权利要求3所述的编译方法,其特征在于,所述调度化处理模块具有线程的上下文切换功能,所述线程化处理模块具有只在调度器请求时动作的结构。9. 如权利要求3所述的编译方法,其特征在于,所述第三阶段对被最外围的循环包围的调度化处理模块嵌入定时器处理器的机制,所述定时器处理器的机制利用所述计算机的OS定时器功能周期地发送信号并自动启动所述被最外围的循环包围的调度化处理模块。10. 如权利要求3所述的编译方法,其特征在于,所述第三阶段附加控制语句,所述控制语句具有在不需要运算处理的期间释放所述计算机的机构。11. 一种编译器,所述编译器通过计算机进行软件的编译,所述软件被时序地处理并以事先规定的定时输出中间结果,所述编译器的特征在于,包括:前端,所述前端通过所述计算机将所述软件的源代码翻译成第一中间语言并将所述第一中间语言保存在存储部中;中间路径,所述中间路径通过所述计算机基于保存在所述存储部中的所述第一中间语言,从包含在所述软件的源代码中的处理序列提取与并列处理和条件分支相关的处理模块,对所提取的处理模块进行重构,生成第二中间语言并将所述第二中间语言保存在存储部中;以及后端,所述后端通过所述计算机基于保存在所述存储部中的所述第二中间语言自动生成执行代码。12. 如权利要求11所述的编译器,其特征在于,所述中间路径包括第一阶段和第二阶段,所述第一阶段对于进行计算并将计算结果代入所述存储部中的运算代入处理的处理模块,基于语句间的依赖性方程式进行重新排列,求出在中间语言级别上被整理的语句序列,所述第二阶段对所述整理的语句序列进行语句组的结合以及重新定义。13. 如权利要求12所述的编译器,其特征在于,所述中间路径包括第三阶段,所述第三阶段对于在所述第二阶段进行了分组的调度化处理模块以及线程化处理模块附加语句,并并生成最终的中间语言以作为线程和调度器,所述调度化处理模块是在后续的处理模块为条件分支处理时与后续的处理模块结合并被重新定义的调度化处理模块,所述线程化处理模块是在调用源的处理模块为条件分支处理时将条件分支的从属子句重新定义而得的线程化处理模块。14. 如权利要求12或13所述的编译器,其特征在于,所述第一阶段是对所有的通过控制语句划分的运算代入语句的组进行的,并且所述第一阶段包括:提取被定义和参照的变量、定义表现各语句的依赖关系的依赖图、删除不需要的语句、以及基于所述依赖图对语句进行排序。15. 如权利要求12至14中任一项所述的编译器,其特征在于,所述第二阶段从处于嵌套结构中的最内层级的处理模块起依次进行所述语句的组的结合以及重新定义。16. 如权利要求15所述的编译器,其特征在于,所述第二阶段是对所述第一阶段的排序结果进行的,并且对于将处理模块化为对象的程序的代码,当调用源的处理模块为条件分支处理时,将条件分支的从属子句重新定义为线程化处理模块,当不是条件分支并且后续的处理模块是接在条件分支处理之后的处理模块时,结合所述处理模块和后续的处理模块并重新定义为调度化处理模块。17. 如权利要求13至16中任一项所述的编译器,其特征在于,所述第三阶段是对所述第二阶段进行分组后的调度化处理模块和线程化处理模块进行的,当作为处理对象的处理模块为线程化处理模块时,进行向线程化处理模块追加语句的处理,当作为处理对象的处理模块为调度化处理模块时,进行向调度化处理模块追加语句的处理。18. 如权利要求13所述的编译器,其特征在于,所述调度化处理模块具有线程的上下文切换功能,所述线程化处理模块具有只在调度器请求时动作的结构。19. 如权利要求13所述的编译器,其特征在于,所述第三阶段对被最外围的循环包围的调度化处理模块嵌入定时器处理器的机制,所述定时器处理器的机制利用所述计算机的OS定时器功能周期地发送信号并自动启动所述被最外围的循环包围的调度化处理模块。20. 如权利要求13所述的编译器,其特征在于,所述第三阶段附加控制语句,所述控制语句具有在不需要运算处理的期间释放所述计算机的机构。
编译方法以及编译器 技术领域 本发明涉及编译方法以及编译器,特别是涉及在嵌入式设备中自动生成软件的执行代码的编译方法以及编译器。 背景技术 图1是示出在嵌入式设备中生成软件的执行代码的现有编译器的结构的图。图1所示的编译器为了将嵌入式设备的软件作为单一的应用程序有效地执行而进行代码的优化。图1所示的编译器包括:翻译装置(frontend,前端)2、优化装置(middle path,中间路径)4、以及代码生成装置(back end,后端)5。前端2从源代码1生成中间语言3-1,中间路径4从中间语言3-1生成中间语言3-2。后端5从中间语言3-2生成优化后的执行代码6。在由编译器进行翻译作业的过程中,中间路径4执行简单的重构,例如删除不需要的变量、封装命令、或者对调用函数进行内联展开(inline expansion)。 在上述用于优化执行代码的重构中,只进行命令代码的删除或简单的替换,而不进行诸如改变源代码1中所描述的处理序列的结构本身的重构。 已有在开始执行运动图像处理或通信处理等处理之后与CPU的处理能力无关地在预定的时刻周期地输出中间计算结果的时序列处理的软件。在使用图1所示的编译器对上述的按时间序列描述的软件进行编译来生成执行代码的情况下,即使在从处理的开始到结束为止的总计算量与CPU的处理能力匹配的情况下,有时也会如图2的例子所示,根据开始进行处理P3、P4的顺序的不同而出现处理跟不上而延迟的情况。图2是用于说明时序处理的延迟的图。在图2中,P1~P4表示处理,t1表示开始条件判断时刻,t2表示处理P3的实际结束时刻,t3表示处理P4的期待的结束时刻,t4表示处理P4的实际结束时刻、t5表示处理P3的期待的结束时刻。此时,处理P4的实际结束时刻t4落后于处理P4的期待结束时刻t3,发生了延迟D1。 通常,即使如上所述CPU的平均处理能力足够,从局部处理的观点来说也可以想到会发生CPU的处理能力不足的状态,此时软件如图3所示那样通过在设计阶段定义缓冲器8来避免处理延迟的问题。图3是用于说明避免时序处理的延迟的图。在图3中,对于与2相同的部分标注相同的符号,并省略对其的说明。在图3中,P3y、P4y表示第y个执行的处理P3、P4,P4z表示第z个执行的处理P4,t2y表示处理P3y的实际结束时刻,t3y表示处理P4y的期待的结束时刻,t5y表示处理P3y的期待的结束时刻。 图4是示出现有动态调度器的映象(image)的图。在该图中,11是任务或者线程,12是从任务或者线程11报告的执行信息表,13是基于信息表来执行调度的动态调度器,14表示操作系统(OS)16内的上下文切换和处理管理功能,15表示根据动态调度器13的指示的切换。当现有的嵌入式设备中高效地并行(同时)执行多个任务或线程11时,图4所示的动态调度器13使应用程序具有动态收集概括(dynamic profiling)功能,从而随时向OS报告存储器和CPU的使用量。动态调度器13参照实时收集的信息的信息表12来动态定义任务或线程11的优先级,并通过OS 16的上下文切换处理管理功能14进行任务或线程11的切换15。 如上所述,用于高效地执行多个任务或线程11的动态调度器13是与和OS 16联动的应用程序分开动作的软件,即为外部(或者外设)调度器。因此,从作为对象的软件所需要的CPU计算量的观点来看,这种动态调度器13被看作是纯粹的开销。 因此,为了避免由参照信息表12定义优先级的动态调度器13产生开销,通常采用使用开销小的调度器的方法,这种调度器基于轮询或者按照事先设定好的固定的优先级非主动地动作,但这种方法无法高效地执行所有的软件。 为了生成使处理时间最短的执行代码、并且避免由动态调度器13产生的开销,有时采用在执行代码中嵌入用于定义执行开始的静态调度器机构。 静态调度器作为对存储器和CPU使用量不进行动态报告的替代手段,编译时关注分支命令,基于期望的信息表来决定编译时的调度,其中,所述信息表是对从分支命令跳入的从属处理的存储器或CPU的使用量乘以分支预测的系数而获得的。 相对于动态执行最优处理的动态调度器,静态调度器虽然执行时调度时的开销小,但特别是对于具有每次执行时运算量或处理数据量发生变化的结构的软件来说,调度精度下降,处理时间不一定最短。因此,静态调度器通常被用于预先知道要在CPU上处理的运算量的软件。 现有的编译器在进行代码级的优化或进行按时间序列描述的源代码的编译时,分析数据的依赖性或控制的依赖性,分割可并行执行的处理,生成对于并行配置的CPU的执行代码。由此,从按时间序列描述的源代码提取更多的可并行执行的处理,生成从执行开始到结束的处理时间最短的执行代码。 例如,在专利文件1或专利文件2中提出了动态调度器。另外,例如,在专利文件2中提出了多级调度器。 专利文件1:日本特开平6-110688号公报; 专利文件2:日本特开2003-84989号公报; 专利文件3:日本特开平8-212070号公报。 发明内容 嵌入式设备的软件运行环境随着高级化的OS和编译环境而变化,并且曾在个人计算机(PC)、工作站等动作的通用软件也已能够在嵌入式设备中动作。另一方面,在嵌入式设备中,希望利用CPU和存储器等有限的资源高效地运行作为对象的软件。 在现有的嵌入式设备中,启动不伴有重构的代码优化级别的编译器,或者在启动多个任务或线程的软件结构的情况下启动调度器。 另一方面,为了更加有效地运行软件,需要由软件的安装者进行适合于作为对象的嵌入式设备手动的移植操作。 如上所述,在嵌入式设备有限的软件运行环境中,当运行软件时,特别是当运行以按时间序列描述的源代码在预定的时刻周期地输出中间计算结果的时序处理的应用程序时,被要求通过编译器自动生成低开销、高调度精度、且可高效利用CPU和存储器等资源的执行代码。 因此,本发明的目的在于,实现一种即使在有限的软件运行环境中也能够高效地生成执行代码的编译方法以及编译器。 上述的问题能够通过以下的编译方法解决,该编译方法是一种通过计算机编译软件的编译方法,所述软件被时序地处理并以事先规定的定时输出中间结果,所述编译方法的特征在于,包括:提取步骤,由所述计算机从包含在所述软件的源代码中的处理序列提取与并列处理和条件分支相关的处理模块;以及生成步骤,由所述计算机对所提取的处理模块进行重构,生成执行代码。 上述的问题能够通过以下的编译器解决,所述编译器通过计算机进行软件的编译,所述软件被时序地处理并以事先规定的定时输出中间结果,所述编译器的特征在于,包括:前端,所述前端通过所述计算机将所述软件的源代码翻译成第一中间语言并将所述第一中间语言保存在存储部中;中间路径,所述中间路径通过所述计算机基于保存在所述存储部中的所述第一中间语言,从包含在所述软件的源代码中的处理序列提取与并列处理和条件分支相关的处理模块,对所提取的处理模块进行重构,生成第二中间语言并将所述第二中间语言保存在存储部中;以及后端,所述后端通过所述计算机基于保存在所述存储部中的所述第二中间语言自动生成执行代码。 发明效果 根据本发明,能够实现即使在有限的软件运行环境中也能够高效地生成执行代码的编译方法以及编译器。 附图说明 图1是示出现有编译器的结构的图; 图2是用于说明时序处理的延迟的图; 图3是用于说明避免时序处理的延迟的图; 图4是示出现有动态调度器的映象的图; 图5是示出本发明编译器的一个实施例的结构的图; 图6是用于说明构成软件的源代码的分类的图; 图7是示出表现了语句的依赖关系的依赖图的一个示例的图; 图8是示出以图7的依赖图为基础进行处理顺序的互换的示例的图; 图9是示出软件的流程结构例的图; 图10是示出实施例的第一阶段的处理的流程图; 图11是用于说明将无条件跳转以及环处理的模块作为运算代入处理模块进行重新定义的图; 图12是用于说明各运算代入处理模块之间的重新定义的图; 图13是用于说明线程化处理模块以及调度化处理模块的重新定义的图; 图14是用于说明线程化处理模块以及调度化处理模块的图; 图15是示出实施例的第二阶段的处理的流程图; 图16是用于说明向线程化处理模块中追加语句的方法的图; 图17是用于说明向调度化处理模块中追加语句的方法的图; 图18是用于说明最外围调度化处理模块的定时器处理的图; 图19是用于说明实施例的第三阶段的处理的流程图; 图20是示出实施例的动作时的时序图的映象的图; 图21是将图2的现有方法和本实施例的时序图的映象进行比较图; 图22是示出实施例的调度化处理模块的映象的图; 图23是示出对实际的程序进行编译时对于现有方法和本实施例的资源利用效率的测定结果的图。 标号说明 31源代码 32前端 33-1、33-2中间语言 34中间路径 35后端 36执行代码 81任务或线程 83动态调度器 84上下文切换和处理管理功能 86OS 88定时器功能 具体实施方式 本发明的编译方法以及编译器通过进行重构来生成能够实现小开销并可提高CPU等资源的利用效率的执行代码,在该重构当中,通过编译时的中间语言的预处理将在嵌入式设备上动作的软件中按时间序列描述的软件的源代码转换成任务或线程,并生成调度代码。 即,在嵌入式设备上动作的应用程序中,对于进行运动图像处理或通信处理等时序处理的环结构的应用程序进行重构,由此通过在执行时必要的定时进行必要的运算,在不必要时释放CPU的方法来提高包括CPU在内的资源的利用效率,在所述重构中,从在于编译的初始阶段已完成结构分析的中间语言(中间代码)之上按语句级别分类的处理模块,构建由条件分支的处理模块构成的调度器,生成定时器处理器(timer handler),提取在条件分支后被执行的代入运算处理的处理模块,转换成线程,根据等待来释放CPU,插入对信号进行应答的苏醒(wake-up)机构, 如上所述,在本发明中,将作为执行对象软件的基础的源代码在编译过程的中间语言级别上进行分析、分类,提取处理模块,并从这些处理模块中重新定义可并行(同时)处理的处理模块以及与调度相关的处理模块,插入必要最低限度的语句。由此,删除不需要的外部语句(代码),能够通过重构来实现作为对象的软件的专用调度器。 实施例 图5是示出本发明的编译器的一个实施例的结构的图。本编译器的实施例采用了本发明的编译方法的一个实施例。在本实施例中,本发明适用在了生成嵌入式设备上的软件的执行代码的情况。嵌入式设备是包括CPU等处理器和存储器等存储部、并由处理器执行存储在存储部内的程序的、具有公知的硬件结构的计算机(或者计算机系统)。 图5所示的编译器对代码进行优化,以将嵌入式设备的软件作为单一的应用程序来高效运行。图5所示的编译器包括:翻译装置(front edge,前端)32、优化装置(middle path,中间路径)34以及代码生成装置(back edge,后端)35。前端32从源代码31生成中间语言33-1并将其保存在存储部中,中间路径34从保存在存储部的中间语言33-1生成中间语言33-2并将其保存在存储部中。后端35从保存在存储部中的中间语言33-2生成优化后的执行代码36,并根据需要将该执行代码36保存在存储部中。在由编译器进行翻译操作的过程中,中间路径34进行不需要的变量的删除、命令的封装、调用函数的内联展开等的单纯的重构。前端32和后端35是单纯的翻译装置,不能主动地优化执行代码。当优化代码时,由于由后端35直接译解前端32所生成的中间语言33-1,并生成执行代码,因此不使用中间路径34。 通常,编译处理将以源代码表示的处理序列转换成能够被作为对象的CPU等计算装置(处理器)译解的执行代码。另外,在中间路径中,通过删除不传播的变量以及数学式语句、或进行子程序的内联展开、将环以迭代单位展开的展开处理等通用的优化方法,来生成更高效的执行代码。 与此相对,本实施例的特点在于,生成将嵌入中间路径34中的有效的执行代码的方法。图5所示的中间路径34将中间语言33-1作为输入并通过以下所述的步骤进行重构,生成中间语言33-2。在中间语言33-1级别上进行重构。因此,前端32和后端35可以使用已有的,而不需要进行变更,中间路径34可以通用地嵌入已有的编译器中。 图6是用于说明构成软件的源代码31的分类的图。图6示出了将构成软件的源代码31在语句级别进行分类的情况,所有的源代码31在被翻译成中间语言33-1之后,能够分为下述任一个处理类别pS1~ps4。处理类别pS1表示进行运算并将运算结果代入存储器或寄存器等存储部中的运算代入处理。处理分类ps2表示以包含后沿的跳转命令表示的循环处理,即表示是后沿跳转(back edge jump)。处理类别ps3表示以条件分支或附带条件的跳转命令表示的分支处理。处理类别ps4表示子程序以及函数调用等,表示无条件跳转命令。 在本实施例中,关注任意结构的中间语言33进行重构,因此可以在任何位置进行通用的优化处理,但为了原样使用环结构,在进行重构之前不应用展开(unrolling)方法等循环优化方法。 编译器在生成中间语言33-2时肯定在其内部具有变量表,中间语言33-2的各语句采用升序编号,并且包括参考的变量(式的右边)和定义的变量(式的左边)。当以Sx表示第x个语句时,以(式1)表示Sx的参考变量的集合,用(式2)表示Sx的定义变量的集合。 Use(Sx) (式1) Def(Sx) (式2) (式1)和(式2)还适用于集合化的语句组SG,对第y个语句组SGy同样地定义(式3)和(式4)。 Use(SGy) (式3) Def(SGy) (式4) 另外,当没有定义以及参考的变量时,使用空集Φ来表示。 当语句Sx是条件分支语句时,由于只存在用于判断条件的参考变量,因此(式5)成立。 Def(Sx)=Φ、Use(Sx)≠Φ(式5) 当语句Sx为由于调用子程序而引起的无条件跳转语句时,(式6)成立。 Def(Sx)=Use(Sx)=Φ(式6) 语句间的依赖关系以相互定义和参考的变量集合是否包含同一个要素来定义。就第m个和第n个语句来说,在从(式1)和(式2)导出的变量的集合中,当以m<n的关系有(式7)成立时,存在正向依赖性。 Def(Sm)∩Use(Sn)≠Φ(式7) 其中,作为表现Sm和Sn具有正向依赖性δ的式子,定义(式8)。 SmδSn(式8) 当以m>n的关系有(式7)成立时,存在负向依赖性。作为表现Sm和Sn具有负向依赖性δi的式子,定义(式9)。 Smδi Sn(式9) 另外,当(式10)成立时,存在输出依赖性。 Def(Sm)=Def(Sn)(式10) 作为表现Sm和Sn具有输出依赖性δo的式子,定义(式11)。 Smδo Sn(式11) 就满足(式11)的Sm和Sn来说,当对于满足m<k<n关系的任意的k有(式12)成立时,用Sm定义的变量在任何位置都不被参考,能够通过用Sn覆盖来削除Sm。 (Def(Sm)=Def(Sn))∩Use(Sk)=Φ(式12) 将(式8)、(式9)、(式11)通常称作依赖性方程式,通过对所有的语句导出(式1)和(式2),能够制作表现各语句间的依赖关系的依赖图。 图7是示出用于表现语句的依赖关系的依赖图的一个示例的图。在该图中,Sa~Sf表示语句。在图7所示的例子中示出了语句Sd参考语句Sa的定义结果,在语句Sf中定义语句Sd所参考的变量。另外,语句Sb定义的变量在任何位置都不被使用而在语句Sf中被重新定义,因此认为(式12)成立,从而语句Sb将从代码中删除。 原则上,满足(式8)、(式9)以及(式11)的关系的语句是满足某些依赖关系的语句,不能互换处理顺序。换句话说,(式8)、(式9)以及(式11)中任何关系都不成立的语句之间,能够互换处理顺序。 从上述的观点出发,在图7中,当如(式13)所示将由语句Sa和语句Sd构成的组设为SGx、并将由语句Sc和语句Se构成的组设为SGy时,从(式14)可以看出,这些组SGx和Sgy之间不存在依赖关系,因此能够相互替换处理顺序。在(式14)中,表示不存在依赖关系。另外,如上所述由于可以删除语句Sb,因此图7所示的依赖图与图8所示的图等效。图8是示出在图7的依赖图的基础上互换了语句的处理顺序即排序后的例子的图。 SGx=(Sa,Sd)SGy=(Sc,Se)(式13) 即, Def(SGx)=Def(Sa)∪Def(Sd),Use(SGx)=Use(Sa)∪Use(Sd) Def(SGy)=Def(Sc)∪Def(Se),Use(SGy)=Use(Sc)∪Use(Se) 并且, (Def(Sa)或Def(Sd))∩(Use(Sc)或Use(Se))=Φ (Def(Sa)或Def(Sd))∩(Use(Sc)或Use(Se))=Φ (Def(Sa)或Def(Sd))∩(Use(Sc)或Use(Se))=Φ 成立,因此能够得到(式14)。 (式14) 图9是示出软件的流程结构例的图。图9中的pS1~ps4分别示出与图6所示的处理类别pS1~ps4的处理对应的处理模块。如图9所示,被展开为中间语言的语句序列采用了在多个代入处理的处理模块pS1之间插有条件分支的处理模块ps3或无条件跳转的处理模块ps4的方式。条件分支的处理模块ps3或无条件跳转的处理模块ps4不是示出数据的依赖性而是示出控制结构的模块,并且处理流程被看作暂时被中断,因此将在图5所示的中间路径34的处理单位考虑为:用条件分支的处理模块ps3或无条件跳转的处理模块ps4的语句划分的运算代入处理的处理模块pS1,即,代入语句的集合。 在本实施例中,作为第一阶段的处理,假定基于上述语句间的依赖方程式对图9所示的运算代入处理的处理模块pS1进行重排。在图10中,输入为中间语言33-1,输出也为中间语言33-1。 图10示出的第一阶段对所有被控制语句划分的运算代入语句的组进行。首先,在步骤St1中提取要定义和参考的变量,在步骤St2中定义依赖图。另外,在步骤St3中删除不需要的语句,在步骤St4中基于依赖图进行语句的排序。 在第一阶段的依赖性分析中,以前有时无法在编译阶段中明确地提取指针变量等的依赖关系。本实施例的第一阶段由于是用于更加简便地进行第二阶段以后的操作的预处理,因此并非一定要提取全部的依赖关系。 在本实施例的第二阶段中,对于在上述的中间语言级别进行整理的语句序列,按照后述的方式进行语句的组的结合以及重新定义。另外,在第二阶段虽进行结合以上述的处理类别分类的处理模块的操作,但通常的软件包括:嵌套结构的循环,具有嵌套结构的条件分支、子程序之内的循环、条件分支等的层级结构。因此,在本实施例的第二阶段进行的操作是从处于嵌套结构的最内层级的处理模块起依次进行的。 处于嵌套结构的最内层级的处理模块一定是运算代入处理的处理模块。当在第一阶段中存在于最内层级处理模块中的语句通过依赖方程式的求解而被删除时,对应的嵌套结构也被删除。 在嵌套结构的最内层级的处理模块的处理中,当调用源的处理模块为无条件跳转、即被调用的子程序的主体时,将其与前级处理类别的无条件跳转的处理模块结合,重新分组,并重新定义为运算代入处理模块。 在通常的代码优化中,如果语句已被内联展开,那么该代码优化操作将在第一阶段的处理中与通常的运算代入处理模块的整理一起被执行,但在本实施例中,语句没有必要内联展开,只进行语句的分组即可。 在嵌套结构的最内层级的处理模块的处理中,当调用源的处理模块为循环处理(后沿跳转)的处理模块、即在循环内部不包括条件分支等控制结构的单纯循环的主体时,将其重新分组并重新定义为运算代入处理模块。 图11用于说明将无条件跳转和循环处理(后沿跳转)的处理模块作为运算代入处理模块重新定义的图。如图11所示,当调用源的处理模块为无条件跳转时,将其与前级处理类别的无条件跳转的处理模块结合,重新分组并重新定义为运算代入处理模块。另外,如图11所示,当调用源的处理模块为循环处理(后沿跳转)的处理模块时,将其重新分组并重新定义为运算代入处理模块。 如上述进行运算代入处理模块的重新定义的结果,有时会在嵌套的同一层级中有运算代入处理模块纵向排列。此时,纵向排列的运算代入处理模块被结合,再一次被重新定义为运算代入处理模块。 图12是用于说明各运算代入处理模块之间的重新定义的图。在图12中的“代入运算”表示代入运算处理模块,用虚线围起来的处理模块表示结合后的处理模块。 接下来,当调用源的处理模块为条件分支处理的处理模块时,即相当于条件分支的真(true)和假(false)中任一个的从属子句时,不需要特别进行处理模块间的结合处理,将其定义为线程化处理模块。 图13是用于说明线程化处理模块和调度化处理模块的新定义的图。根据嵌套结构的层级分析,线程化处理模块的构成要素不一定局限于一个处理模块,另外,线程化处理模块的构成要素也不局限于运算代入处理模块。 另外,当某个处理模块的后续的处理模块为条件分支处理时,结合这些处理模块,重新定义为调度化处理模块。 线程化处理模块和调度化处理模块之间具有密切的联系,由于线程化处理模块是条件分支的从属子句,因此必须与包含条件分支的调度化处理模块结合。 对于以上述的处理模块化为对象的代码,还考虑嵌套结构来重新定义线程化处理模块和调度化处理模块。图14是用于说明线程化处理模块和调度化处理模块的图。在图14所示的程序中,41表示在图14中位于最上层级的调度化处理模块,42是从属于调度化处理模块41的线程化处理模块,43是包含在比调度化处理模块41低一层级的层级中的调度化处理模块,44是从属于调度化处理模块43的线程化处理模块,45是包含在比线程化处理模块42低一层级的层级中的调度化处理模块,46是从属于调度化处理模块45的线程化处理模块。 图15是示出本实施例的第二阶段的流程图。在图15中,输入为中间语言33-1,输出也为中间语言33-1。 图15所示的第二阶段是对在上述第一阶段基于依赖图对语句进行排序的结果进行的。首先,在步骤St11,对于将处理模块化作为对象的程序的代码,从嵌套结构的最内层级的处理模块开始依次进行处理。在步骤St12,判断调用源的处理模块是否为条件分支处理。当步骤St12的判断结果为“是”时,在步骤St13将条件分支的从属子句重新定义为线程化处理模块,处理返回St11,开始进行嵌套结构中的最内层级的下一层级的处理模块的处理。另一方面,当步骤St12的判断结果为“否”时,在步骤St14判断后续的处理模块是否是接在条件分支处理之后的处理模块,当判断结果为“否”时,处理返回St11,开始进行嵌套结构中的最内层级的下一层级的处理模块的处理。另外,当后续的处理模块为条件分支处理从而步骤St14的判断结果为“是”时,步骤St15将这些处理模块和后续的处理模块进行结合,作为调度化处理模块重新定义。在步骤St15之后,处理返回St11,开始进行嵌套结构中的最内层级的下一层级的处理模块的处理。 在本实施例的第二阶段,对于在上述的中间语言级被整理的语句序列,按照后述的方式进行语句的组的结合以及重新定义。另外,在第二阶段虽进行结合以上述的处理类别分类的处理模块的操作,但通常的软件包括:嵌套结构的循环,具有嵌套结构的条件分支、子程序之内的循环、条件分支等的阶次结构。因此,在本实施例的第二阶段进行的操作是从处于嵌套结构最内层级的处理模块起依次进行的。 在本实施例的第三阶段,向在第二阶段分组后的调度化处理模块和线程化处理模块附加控制语句,生成最终的中间语言(中间代码)以作为线程和调度器。 条件分支以及算出条件的运算和从属于他们的处理模块的调用的关系等价于动态调度器和被调度的线程的关系。在本实施例中,为了构成不使用外部(或外设)调度器的结构,在调度化处理模块的结构中设置与线程的上下文切换功能起相同作用的机制。另外,在线程化处理模块中设置只在调度器请求时才动作的机制。 因此,在本实施例的第三阶段,对调度化处理模块以及从属于该调度化处理模块的线程化处理模块进行如下的操作。 图16是用于说明对线程化处理模块追加语句的方法的图。首先,如在图16中用51所示的那样,用循环包围线程化处理模块55,如52所示,在循环的入口部分(前头部分)插入像等待(wait)机构这样的OS服务调用,其中所述等待机构等待接收信号并直到接收到信号为止释放CPU。另外,如53、54所示,还考虑被线程化的处理模块彼此并行动作的情况,基于用(式8)、(式9)以及(式11)导出的依赖方程式来分析并行执行(同时执行)的处理模块,当存在依赖关系时,插入根据信号量(semaphore)或互斥(Mutex)的排他控制代码。即,如53所示的那样加上排他锁,并且如54所示的那样解除排他锁。根据上述的操作,能够在程序主体中追加把改变了结构的线程化处理模块55定义为事件处理线程59来启动的代码。 根据上述的操作,在也可以不进行处理动作的定时,事件处理线程59释放CPU,因此不占用不需要的CPU资源。 图17用于说明向调度化处理模块中追加语句的图。调度化处理模块内包含有条件分支处理,可以认为发生该条件分支的定时即为启动上述事件处理线程59的定时(进行调度)。因此,在条件分支后的从属子句,插入如图17中的61所示那样的发行从属的事件处理线程59所期待的信号(即,针对条件A或B成立时进行动作的事件的信号)的语句(代码),并将追加语句后的模块定义为调度化处理模块69。 当在作为基础的源代码31中调度化处理模块位于嵌套结构的内部时,启动该调度化处理模块65的是处于其父层级的调度化处理模块。在图14所示的例子中,通过插入对信号进行应答的苏醒(wake-up)机构那样的重构,用45表示的嵌套的内侧的调度化处理模块以用41表示的上层级调度化处理模块的信号发送为契机而动态启动。 在本实施例中,主要假设了时序处理、即以事先规定的定时输出中间计算结果这样的以通用的编程语言描述的程序,这样的程序通常在程序的最上层级采用循环结构。如果执行本实施例的第二阶段的处理,就必然会存在被最外围循环包围的调度化处理模块,即最外围调度化处理模块。 由于不存在启动上述最外围调度化处理模块的动态信号发生装置,因此对于最外围调度化处理模块,如图18所示那样利用OS的定时器功能,以嵌入诸如从OS周期地发送信号(定时器信号)以便自动启动最外围调度化处理模块的定时器处理器这样的机制。图18是用于说明最外围调度化处理模块的定时器处理的图。在图18中,对于与图17相同的部分标注相同的标号,并省略说明。在图18中,64是从OS周期地发送的信号(定时器信号),65A是最外围调度化处理模块,69A表示通过插入如61所示那样发行从属的事件处理线程59所期待的信号(即,针对条件A或B成立时动作的事件的信号)的语句(代码)来定义的调度化处理模块。 图19是用于说明本实施例的第三阶段的处理的流程图。在图19中,输入的是中间语言33-1,输出的也是中间语言33-2。 图19所示的第三阶段是对在上述第二阶段进行了分组的调度化处理模块和线程化处理模块来进行的。首先,在步骤St21,判断作为处理对象的处理模块是线程化处理模块还是调度化处理模块。当作为处理对象的模块是线程化处理模块时,进行步骤St22~St25的向线程化处理模块中追加语句的处理。另一方面,当作为处理对象的处理模块为调度化处理模块时,进行步骤St26~St28的向调度化处理模块中追加语句的处理。 在步骤St22,如图16中的51所示,用循环包围线程处理模块55。在步骤St23,如图16中的52所示,在循环的入口部分插入像等待机构这样的OS服务调用,其中所述等待机构等待接收信号并直到接收到信号为止释放CPU。在步骤St24,还考虑被线程化的处理模块彼此并行动作的情况,如图16中的53、54所示的那样,基于从(式8)、(式9)以及(式11)导出的依赖性方程式,对并行执行(同时执行)的处理模块进行分析,判断是否存在依赖关系。当步骤St24的判断结果为“是”时,在步骤25中,插入根据信号量(semaphore)或互斥(Mutex)的排他控制代码,并且结束处理。另一方面,当步骤St24的判断结果为“否”时,结束处理。 在步骤St26,在条件分支后的从属子句上插入如图17的61所示那样发行从属的事件处理线程59所期待的信号(即,针对条件A或B成立时动作的事件的信号)的发送机构(语句),并将插入发送机构后的模块定义为调度化处理模块69。在步骤St27,判断调度化处理模块是否为最外围调度化理模块。当步骤St27的判断结果为“是”时,在步骤St28嵌入定时器处理器,并且结束处理。另一方面,当在步骤St27的判断结果为“否”时,结束处理。 通过进行上述第三阶段的操作,能够从包含在源代码31中的处理序列导出动态调度器功能,不会产生如使用外部调度器时那样的开销。另外,由于不需要进行不必要的缓冲,提高了存储器的利用效率。并且,各处理模块具有在必要时才使用CPU的机制,即同时具有在不需要进行处理动作时释放CPU的机制,因此也能够有效地使用CPU资源。 图20是示出本实施例动作时的时序表的映象的图。图20示出了利用OS的定时器功能获得的周期信号(定时器信号)、通过调度器处理模块实现的动态调度器、以及事件处理线程ET1、ET2的时序。 如果具有嵌套结构的部分代码具有处于同一层级的调度器、并且从上述(式14)导出的语句(或处理模块)的顺序能够互换,那么调度化处理模块中的处理顺序也能互换,以便在动态调度中引入优先级分配控制概念。通常,动态调度器的优先级分配是按照启发式(heuristic)算法确定的,并且CPU的使用量(处理模块的关键路径)、存储器的使用量(数据使用量)等作为在算法的判断中使用的参数(或系数)。每当确定在优先级排序时成为关键的参数时,获得最优方案很大程度上依赖于作为对象的软件的属性。 在本实施例中,为了将上述第一阶段~第三阶段的处理内置于编译器的中间路径34内,作为利用通常的编译器的优化方法,能够导入2路径编译的方法。在通常的2路径编译中器中,基于第一次编译生成的执行代码,实际运行嵌入式设备等,收集概况,并基于概况的收集结果进行第二次的编译。 当在使用概况收集的2路径编译被允许的编译器中应用本实施例时,能够基于该概况的收集结果,根据优先级对调度表处理模块进行排序。因此,通过利用本方法,能够得到精度更高的调度结果。 如此,中间路径34生成图5的后端35可译解的中间语言33-2,编译器生成执行代码36。 图21是对图2的现有方法和本实施例的时序表的映象进行比较的图。在图21中,对于与图2和图20相同的部分标注相同的标号,并省略说明。图21的上部示出本实施例的动作时序,下部示出图2的现有方法的动作时序。在图21中,OH1是在本实施例中使用多个线程而产生的开销,R1示出本实施例中的CPU释放时间。根据本实施例,处理P3的实际结束时间比现有方法中的结束时间t2晚一些,但能够在期待结束时间t3之前结束处理P4。因此,在本实施例中,在通过进行时序处理来定期地输出中间计算结果的软件中,能够避免在现有方法中由于所发生的分支定时的偏离而导致的处理结束时间的延迟。另外,在本实施例中,不需要进行如图3所示的现有方法那样的缓冲,因此提高了存储器的利用效率。 图22是示出本实施例的调度化处理模块、即动态调度器的影像的图。在该图中,81表示任务或线程,82表示CPU的空闲状态(idlestate),83表示具有上下文切换功能并进行调度的动态调度器、84表示OS 86内的处理管理功能、85表示根据动态调度器83的指示进行的切换、88表示OS 86内的定时器功能。当在嵌入式设备中高效地并行(同时)执行多个任务或线程81时,图22所示的动态调度器83基于来自OS 86的定时器功能88的信号来动态地定义任务或线程81的优先级,并且根据其上下文切换功能和OS 86的处理管理功能84进行任务或线程81的切换85。根据本实施例,被分解成线程和定时器处理器的源代码31能主动地释放CPU并将其置为空闲状态82,因此不会占用不需要的CPU资源。另外,构成动态调度器83的调度化处理模块由于是原本就存在于源代码31中的代码,因此多个线程化所产生的开销也极小。 图23是示出对实际的程序进行编译时对于上述现有方法和实施例的资源利用效率的测定结果的图。如图23所示,程序PA是运动图像播放器软件、程序PB是通信处理软件。程序PA、PB都是以时序处理为基础、以事先规定的定时输出中间结果的软件。程序PC是静止图像处理软件、程序PD是算术运算软件。程序PC是进行XGA压缩图像的扩展的软件。程序PD是已由程序设计者在源代码级进行了优化的流体计算软件。 从图23也可知:根据本实施例,对于全部程序PA~PD,可以确认与上述现有方法相比CPU的负荷减少。另外,根据本实施例,对于程序PA、PB、PC,可以确认存储器使用量比上述现有方法相比减少。并且,另外,根据本实施例,对于程序PA、PB、PC,可以确认CPU的功耗也比高峰时的功耗减少。根据本实施例,对于程序PC,虽然线程化的效果很少,但可以看到在第一阶段进行语句调整的效果。 如上所述,虽然主要还是依赖时序处理型程序的完成程度,但根据本实施例,可以确认减少CPU和存储器的使用、即资源的使用量比使用现有方法的情况相比减少了30%左右。另外,作为辅助效果可获得CPU的空闲状态,因此还具有减少CPU功耗的效果。 产业上的实用性 本发明可以适用于具有CPU和存储器等资源的各种电子设备,特别是适用于资源有限的嵌入式设备。 以上,虽然根据实施例说明了本发明,但本发明不限于上述实施例,不用说也可以在本发明范围内进行各种变形以及改进。
《编译方法以及编译器.pdf》由会员分享,可在线阅读,更多相关《编译方法以及编译器.pdf(44页珍藏版)》请在专利查询网上搜索。
通过计算机对被时序地处理并以事先规定的定时输出中间结果的软件进行编译的编译方法包括:提取步骤,从包含在所述软件的源代码中的处理序列提取与并列处理和条件分支相关的处理模块;以及生成步骤,对所提取的处理模块进行重构并生成执行代码。 。
copyright@ 2017-2020 zhuanlichaxun.net网站版权所有经营许可证编号:粤ICP备2021068784号-1