程序处理装置的制作方法

文档序号:6649410阅读:149来源:国知局
专利名称:程序处理装置的制作方法
技术领域
本发明涉及对用C语言等高级语言描述的源程序的逻辑矛盾进行检验的程序处理装置,特别是涉及检验向将源程序变换成机器语言程序的编译器提供的启发信息之逻辑矛盾的程序处理装置。
背景技术
近年,随着媒体处理应用程序的增大化、多样化,开发工数增大,在媒体技术领域也越来越需要利用高级语言的应用程序开发。因此,进行了利用高级语言实现媒体处理应用程序开发的尝试。此时,用户期待即使利用高级语言的开发也能够进行更精确的调谐。因此,需要具体控制编译器进行的最佳化策略。
该最佳化策略的控制方法大致分为2个。
作为其中一控制方法,可以举出对编译器直接进行有关某一最佳化的指示的控制方法。作为另一控制方法,可以举出通过对编译器示出整个程序的静态信息,支持编译器的最佳化的控制方法。
另外,作为用于具体实现上述2个控制方法的方法之一,可以举出利用编译指示(pragma)对编译器进行指示。“编译指示”是指依赖于语言处理系统的描述,对编译器提供某些信息。
下面示出编译指示的例子。图1是表示包含直接进行与最佳化有关的指示的编译指示的源程序一个例子的图。[#pragma_software_pipelining]是指示利用软件流水线技术对之后马上描述的循环处理进行最佳化的编译指示,是用户描述的。编译器是基于该编译指示的指示,利用软件流水线技术对该循环处理实施最佳化。软件流水线技术是同时执行几个不同的重复(iteration,重复处理)的技术。
图2是表示包含对编译器示出整个程序的静态信息的源程序一个例子的图。[#pragma_min_iteration=5]是用户保证对之后马上描述的循环处理至少执行5次循环的编译指示。编译器基于该编译指示例如判断是否可以基于该软件流水线技术进行最佳化,如果可以,则进行那样的最佳化。
对于这样的编译指示,在日本特开2004-38597号公报中也有具体说明。
但是,上述2个控制方法中,用户描述编译指示时必须与实际程序在逻辑上不产生矛盾。因此,必须自己分析程序中的多个模块,并在程序中描述编译指示,但由于模块的调用关系复杂性,用户有可能将矛盾的编译指示附加到程序中。在这样的情况下,编译器基于错误编译指示的指示,进行中间代码的最佳化等。因此,存在编译器生成错误的机器语言程序的问题。
另外,为了避免生成错误的机器语言程序,用户只能附加自己可以解析的范围内的消极的编译指示,不能进行良好的最佳化。

发明内容
本发明是为了解决上述问题而提出的,第一目的在于提供一种程序处理装置,其可以对编译指示代表的提示信息进行检验,以便使编译器不会生成错误的机器语言程序。
另外,第二目的在于提供一种程序处理装置,其可以对提示信息进行检验,以便即使用户对编译器积极提供编译指示代表的提示信息,也能进行良好的最佳化。
为了达成上述目的,本发明的程序处理装置是作为输入接受包含用户提供给编译器的提示信息的程序,检验包含上述提示信息的程序中的上述提示信息的逻辑匹配性。最好是,上述程序处理装置具有语法解析单元,解析包含用户对编译器提供的提示信息的程序的语法,生成解析信息;和检验单元,基于上述解析信息,检验包含上述提示信息的程序中的上述提示信息的逻辑匹配性。
通过基于解析信息来检验提示信息的逻辑匹配性,可以检验编译指示所代表的提示信息,以便编译器不会生成错误的机器语言程序。另外,为了即使用户积极向编译器提供编译指示所代表的提示信息也能进行良好的最佳化,可以对提示信息进行检验。另外,这样的提示信息包含2个,即一个是编译器直接进行有关某个最佳化的指示的提示信息,另一个是通过对编译器示出整个程序的静态信息而支持利用编译器的最佳化的提示信息。
最好是,上述提示信息是可通过程序的静态解析得到的静态信息,上述语法解析单元对包含上述提示信息的程序语法进行静态解析,生成上述解析信息。也可以是上述提示信息是有关循环处理的重复次数的信息,上述语法解析单元解析包含上述提示信息的程序中所包含的循环处理的重复次数,生成包含该重复次数的上述解析信息。例如,上述提示信息是指定循环处理的循环进行规定次数以上的信息,上述检验单元基于上述解析信息检验与上述提示信息对应的循环处理的循环是否进行上述规定次数以上。
可以检验与循环处理的重复次数有关的提示信息在逻辑上是否矛盾。
更好是,上述提示信息是与数据的设置位置有关的信息,上述语法解析单元解析含有上述提示信息的程序中所包含的数据的设置位置,生成包含该数据的设置位置的上述解析信息。例如,上述提示信息是指定数据和、该数据以规定值调整的信息,上述语法解析单元解析含有上述提示信息的程序中所包含的数据的调整值,生成含有解析结果的上述解析信息,上述检验单元基于上述解析信息,检验上述提示信息指定的数据的调整值是否与上述提示信息指定的上述规定值一致。
可以检验与数据设置有关的提示信息在逻辑上是否矛盾。
更好是,上述提示信息是与指针变量访问的区域有关的信息,上述语法解析单元解析含有上述提示信息的程序中所包含的指针变量访问的区域,生成包含解析结果的上述解析信息。上述提示信息是指定指针变量和、该指针变量访问的区域没有与其他指针变量访问的区域重复的区域的信息,上述语法解析单元解析含有上述提示信息的程序中所包含的指针变量访问的区域与其他指针变量访问的区域之间是否存在重复区域,生成含有解析结果的上述解析信息,上述检验单元基于上述解析信息,检验上述提示信息指定的指针变量与其他指针变量访问的区域之间是否存在重复区域。例如,上述程序是用遵循ISO/IEC98991999-Programming Language C的语言描述的,上述提示信息是上述指针变量和restrict描述的组合。
可以检验有关指针变量的提示信息在逻辑上是否矛盾。
更好是,上述提示信息是与从变量读出数据和向变量写入数据有关的信息,上述语法解析单元解析从含有上述提示信息的程序中所包含的变量读出数据或者向该变量写入数据,生成包含解析结果的上述解析信息。例如,上述提示信息指定变量和、在描述该提示信息的位置之后对该变量的访问是从数据写入开始的信息,上述检验单元基于上述解析信息,检验上述提示信息指定的变量在描述该提示信息的位置之后对该变量的访问是否从写入数据开始。
可以检验与从变量读出数据或者对变量写入数据有关的提示信息在逻辑上是否矛盾。
更好是,上述提示信息是与分支条件的成立频度有关的信息,上述语法解析单元解析含有上述提示信息的程序中所包含的分支条件的静态成立频度,生成包含解析结果的上述解析信息。例如,上述提示信息是表示分支条件成立的可能性大的信息,上述检验单元基于上述语法解析单元,检验与上述提示信息对应的分支条件成立的可能性是否大。
可以检验与分支条件的成立频度有关的提示信息在逻辑上是否矛盾。
更好是,上述提示信息是指示利用编译器的程序的最佳化处理方法的信息,上述检验单元基于上述解析信息,检验上述提示信息指示的上述最佳化处理方法能否实现。另外,上述提示信息是指示循环展开的循环处理最佳化的信息,上述语法解析单元解析含有上述提示信息的程序中所包含的循环处理的重复次数,生成包含该重复次数的解析信息,上述检验单元基于上述解析信息,对与上述提示信息对应的循环处理检验能否进行利用循环展开的最佳化。
可以检验将循环展开的最佳化直接指示给编译器的提示信息在逻辑上是否矛盾。
更好是,上述提示信息是指示软件流水线技术的循环处理最佳化的信息,上述语法解析单元解析含有上述提示信息的程序中所包含的循环处理的重复次数,生成包含该重复次数的解析信息,上述检验单元基于上述解析信息,判断对与上述提示信息对应的循环处理可否进行利用软件流水线技术的最佳化。
可以检验将软件流水线技术的最佳化直接指示给编译器的提示信息在逻辑上是否矛盾。
更好是,上述提示信息是指示多个数据和、对该多个数据生成配对命令的数据访问最佳化的信息,上述语法解析单元解析含有上述提示信息的程序中所包含的数据的调整值,生成包含解析结果的上述解析信息,上述检验单元具有条件判断部和配对命令生成可否判断部,条件判断部是基于上述解析单元,判断上述提示信息指定的上述多个数据的调整值是否满足上述多个数据类型大小的2倍以上的条件,上述配对命令生成可否判断部是在满足上述条件时,对上述提示信息指定的上述多个数据判断可以进行利用生成配对命令的数据访问的最佳化。
可以检验将配对命令的输出直接指示给编译器的提示信息在逻辑上是否矛盾。
更好是,上述提示信息是指示变量和、缓冲存储器的控制处理的最佳化的信息。
可以检验指示缓冲存储器等的控制处理的内部函数的提示信息在逻辑上是否矛盾。
本发明的另一方面的程序处理装置是检验程序中的、对编译器提供的提示信息的逻辑匹配性的程序处理装置,具有检验单元,将包含用户提供给编译器的提示信息的程序和、作为包含上述提示信息的程序的语法解析结果的解析信息作为输入,基于上述解析信息,检验含有上述提示信息的程序中的上述提示信息的逻辑匹配性。
通过基于从外部输入的解析信息而检验提示信息的逻辑匹配性,可以检验编译指示代表的提示信息,以便编译器不会生成错误的机器语言程序。另外,为了即使用户积极向编译器提供编译指示代表的提示信息也能进行最佳化,可以对提示信息进行检验。另外,在这样的提示信息包含对编译器直接进行与某个最佳化有关的指示的提示信息、和通过对编译器示出整个程序的静态信息而支持利用编译器的最佳化的提示信息。
另外,本发明不仅仅可以作为具有这样的特征单元的程序处理装置实现,还可以作为将程序处理装置具有的特征单元作为步骤的程序处理方法实现。另外,作为程序处理装置具有的特征单元还可以作为使计算机工作的程序实现。另外,这样的程序当然可以经Compact Disc-ReadOnly Memory(CD-ROM)等记录媒体和因特网等通信网络流通。
根据本发明,可以提供一种为了使编译器不会生成错误的机器语言程序而能检验编译指示代表的提示信息的程序处理装置。
另外,可以提供一种为了即使用户向编译器积极提供编译指示代表的提示信息也能进行良好的最佳化而检验提示信息的程序处理装置。


通过根据附图对实施例的说明,可以更清楚本发明的其他优点和特征。
图1是表示包含直接进行与最佳化有关的指示的编译指示的源程序一个例子的图。
图2是表示包含对编译器示出整个程序的静态信息的编译指示的源程序一个例子的图。
图3是表示程序处理装置的结构的功能框图。
图4A是表示包含有关重复次数的提示信息,并且包含函数func1的程序一个例子的图。
图4B是表示包含main函数、函数func2以及函数func3的程序的一例的图。
图5是语法解析部执行的处理的流程图。
图6是表示调用流程图表的一例的图。
图7是表示解析信息的一例的图。
图8是错误检验部执行的处理的流程图。
图9是表示检验结果的一例的图。
图10A是包含有关指针变量的提示信息,并且包含函数func1、函数func2以及函数func3的程序的一例的图。
图10B是表示包含main函数的程序的一例的图。
图11是表示基于图10A和图10B所示的程序、由语法解析部生成的调用流程图表的一例的图。
图12是表示语法解析部生成的解析信息的一例的图。
图13是错误检验部执行的处理的流程图。
图14是表示检验结果的一例的图。
图15是表示包含与变量的读写有关的提示信息的程序的一例的图。
图16是表示基于图15所示的程序,由语法解析部生成的调用流程图表的一例的图。
图17是表示语法解析部生成的解析信息的一例的图。
图18是错误检验部执行的处理的流程图。
图19是表示检验结果的一例的图。
图20是表示包含与静态频度有关的提示信息的程序的一例的图。
图21是表示基于图20所示的程序,由语法解析部生成的调用流程图表的一例的图。
图22是表示语法解析部生成的解析信息的一例的图。
图23是错误检验部执行的处理的流程图。
图24是表示检验结果的一例的图。
图25是表示包含与循环展开有关的提示信息的程序的一例的图。
图26是表示图5的S202的处理结果生成的调用流程图表的图。
图27是表示图5的S203和S204的处理结果生成的解析信息的图。
图28是错误检验部执行的处理的流程图。
图29是表示包含关于软件流水线技术的提示信息的程序的一例的图。
图30是表示图5的S202的处理结果生成的调用流程图表的图。
图31是表示图5的S203和S204的处理结果生成的解析信息的图。
图32是错误检验部执行的处理的流程图。
图33是表示包含有关配对命令的提示信息的程序的一例的图。
图34是表示图5的S202的处理结果生成的调用流程图表的图。
图35是表示图5的S203和S204的处理结果生成的解析信息的图。
图36是错误检验部执行的处理的流程图。
图37是表示包含由指示缓冲存储器等的控制处理的内部函数生成的提示信息的程序的一例的图。
图38是表示图5的S202的处理结果生成的调用流程图表的图。
图39是表示图5的S203和S204的处理结果生成的解析信息的图。
图40是错误检验部执行的处理的流程图。
图41是表示检验结果的一例的图。
图42是表示程序的一例的图。
图43是表示示出提示信息的错误信息的检验结果一个例子的图。
图44是表示包含纠正信息的检验结果的一例的图。
图45是表示程序的一例的图。
图46是表示包含纠正信息的检验结果一个例子的图。
图47是表示包含取决于编译选项的纠正信息的检验结果一个例子的图。
图48是表示程序的一例的图。
图49是表示包含不能判断编译指示是否有错的不确定信息的检验结果一个例子的图。
图50是表示包含示出编译指示有可能错误的警告信息的检验结果一个例子的图。
图51是表示程序处理装置的另一结构的功能框图。
图52是表示程序的一例的图。
图53是表示解析信息的一例的图。
具体实施例方式
下面参考

本发明的实施例涉及的程序处理装置。
图3是表示程序处理装置结构的功能框图。程序处理装置102是接受用高级语言描述且包含编译指示所代表的提示信息的程序101,并判断程序101中的提示信息的逻辑匹配性的装置,具有语法解析部104和错误检验部105。
语法解析部104接受程序101(程序101由多个文件构成时,适当称为程序101a和程序101b),对程序101进行编译器等所用的通常的语法解析处理,作为解析信息106输出解析结果。
错误检验部105基于程序101和解析信息106,检验提示信息的逻辑匹配性,输出检验结果103。
另外,语法解析部104和错误检验部105执行的处理,在后述的每个实施例中都不同。因此,在说明各实施例时具体进行说明。
本实施例说明检验与循环处理的重复次数有关的提示信息的逻辑性矛盾的程序处理装置。有关循环处理的重复次数的提示信息例如有下面信息。
(1)指定循环处理的最大重复次数的提示信息;
(2)指定循环处理的最小重复次数的提示信息;(3)指定循环处理的重复次数一定是偶数次的提示信息;(4)指定循环处理的重复次数一定是奇数次的提示信息。
说明程序处理装置102执行包含这些提示信息的程序101的处理。
图4A是表示包含有关重复次数的提示信息并且包含函数func1的程序一个例子的图。图4B是表示包含main函数、函数func2以及函数func3的程序一个例子的图。
图4A所示的程序101a以及图4B所示的程序101b的关系是分别被编译之后被链接。
作为上述第2个提示信息的一种的编译指示[#pragma_min_iteration]表示提示信息之后马上进行的循环处理(for,while,do)的重复次数为至少几次。在图4A所示的程序101a中,第3行描述有编译指示[#pragma_min_iteration=5]。因此,通过用户示出循环处理A(第5行至第12行)的重复次数最少是5次。
作为上述第3个提示信息的一种的编译指示[#pragma_iteration_even]表示提示信息之后马上进行的循环处理(for,while,do)的重复次数一定为偶数次。在程序101a中,第4行描述有该编译指示。因此,通过用户示出循环处理A的重复次数一定是偶数次。
作为上述第4个提示信息的一种的编译指示[#pragma_iteration_odd]表示提示信息之后马上进行的循环处理(for,while,do)的重复次数一定为奇数次。在程序101a中,第14行描述有该编译指示。因此,通过用户示出循环处理B(第15行至第21行)的重复次数一定是奇数次。
另外,在程序101a的第13行描述有编译指示[#pragma_min_iteration=3]。因此,通过用户示出循环处理B的重复次数最少是3次。
在利用编译器编译时,利用由编译指示[#pragma_min_iteration]指定的循环处理的最小重复次数,对该循环处理进行可否适用软件流水线技术的判断,在可以时,进行对该循环处理进行利用软件流水线技术的最佳化。
另外,编译指示[#pragma_min_iteration]指定的循环处理的最小重复次数大于等于2次,并且,在对该循环处理只指定编译指示[#pragma_iteration_even]或编译指示[#pragma_iteration_odd]时,编译器对该循环处理进行如执行循环展开的最佳化。循环展开是循环处理高速化方法的一种,是通过同时执行多个重复(重复处理)来提高循环处理内的执行速度的方法。循环展开在展开的重复次数为2次时,循环处理的重复次数为偶数的场合下与奇数的场合下的最佳化处理的方法不同。在偶数的场合下,原样展开即可,但在奇数的场合下,需要在循环处理的外侧执行多出的1次。
说明将包含这些提示信息的程序101a和101b作为输入时的语法解析部104以及错误检验部105执行的处理。
图5是语法解析部104执行的处理的流程图。语法解析部104解析程序101(程序101a以及程序101b)整体,生成各函数的调用程序图表(S202)。这与由通常的编译器等生成的调用流程图表相同。
图6是表示调用流程图表的一例的图。图6所示的调用流程图表107是图4A以及图4B分别所示的程序101a以及程序101b生成的调用流程图表107。从该调用流程图表107可以知道main函数调用函数func2以及func3。另外,还可以知道函数func2调用func1,函数func3也调用func1。像这样,调用流程图表107利用箭头方向示出函数间的调用关系。
下面,如图5所示,语法解析部104基于生成的调用流程图表107,解析全局变量或各函数调出时虚变量取什么样的值(S203)。本实施例中,语法解析部104解析全局变量或虚变量可取值的最大值以及最小值,同时解析是否可取得偶数值以及是否可取得奇数值。另外,也可以解析函数内的局部变量。
语法解析部104作为解析信息106输出解析的结果(S204)。图7是表示解析信息的一例的图。图7所示的解析信息106表示解析结果的一部分。例如示出,关于函数func3的虚变量s,最大值和最小值都是[5],不能取偶数值,可以取奇数值。这是通过进行以下解析而求出的。即,从图6所示的调用流程图表107可知函数func3被main函数调用。从程序101b知道main函数中的函数func3的实变量为[5],函数func3只被调用1次。因此,可以得到上述解析结果。
另外,关于函数func1内的全局变量y,在解析信息106中示出最大值为[6],最小值为[5],可以取偶数值和奇数值的任一个。这可以通过进行以下解析来求得。即,从调用流程图表107知道函数func1被函数func2和函数func3调用。在函数func2内,对全局变量y代入[6]。另外,在函数func3内对全局变量y代入虚变量s的值。在此,从调用流程图表107可知函数func1被main函数调用。因此,检查main函数内的函数func3的实变量,就可知是[5]。因此,函数func3的虚变量s的值成为[5]。即,函数func3内的全局变量y的值也成为[5]。通过上述,函数func3内的全局变量可取的值是[5]或[6]。因此,可以得到上述的解析结果。通过进行同样的解析,可以得到图7所示的解析信息106。
下面说明错误检验部105执行的处理。
图8是错误检验部105执行的处理的流程图。错误检验部105对程序101a和程序101b中包含的各循环处理重复以下处理。在图4A所示的程序101a中包含循环处理A和循环处理B的2个循环处理。从而,对这2个循环处理执行以下处理。
错误检验部105判断对关注的循环处理附加的提示信息是什么(S302)。例如,在程序101a中包含的循环处理A附加有编译指示[#pragma_min_iteration=5]和编译指示[#pragma_iteration_even]。
在该提示信息是编译指示[#pragma_min_iteration]时(在S302中#pragma_min_iteration),错误检验部105还利用解析信息106,求出该循环处理的最小重复次数(S303)。例如,从解析信息106可知,在循环处理A的情况下,规定循环处理的重复次数的虚变量x值的最小值为[2]。因此,可求出循环处理A的最小重复次数为[2]。
对循环处理附加的提示信息是编译指示[#pragma_iteration_even]时(在S302中#pragma_iteration_odd/even),错误检验部105一边利用解析信息106,一边检查该循环处理的重复次数是否仅仅是偶数(S305)。例如在循环处理A的情况下,示出规定循环处理的重复次数的虚变量x值仅仅取偶数,不取奇数。同样,对循环处理附加的提示信息是编译指示[#pragma_iteration_odd]时(在S302中#pragma_iteration_odd/even),错误检验部105一边利用解析信息106,一边检查该循环处理的重复次数是否仅仅是奇数(S305)。
另外,不是执行S303和S305的处理的某一方,而是在对同一循环处理附加的提示信息为多个的情况下,还有执行S303和S305双方的处理的情况。
S303和S305的处理之后,错误检验部105检查提供给循环处理的提示信息与实际循环处理的重复次数是否矛盾(S304)。在矛盾时(在S304中的“否”),错误检验部105将检验结果103作为错误信息显示在未图示的显示部(S306)。
例如,在程序101a的第3行指定的编译指示[#pragma_min_iteration=5]指示循环处理A的最小重复次数是最小5次,但如上所述,在S303的处理中求出循环处理A的最小重复次数为2次。因此,错误检验部105作为错误信息显示检验结果103。同样,在程序101a的第14行指定的编译指示[#pragma_iteration_odd]指示循环处理B的重复次数仅仅是奇数次,但在S305的处理中检查出规定循环处理B的重复次数的全局变量y值可以取得偶数和奇数的双方。因此,错误检验部105作为错误信息显示检验结果103。
图9是示出检验结果的一例的图。如上所述,示出程序101a的第3行的[#pragma_min_iteration=5]和第14行的[#pragma_iteration_odd]在逻辑上矛盾。
在进行了检验结果103的错误显示(S306)之后,或者提供给循环处理的提示信息与实际循环处理的重复次数不矛盾时(在S304中的“是”)时,对下一循环处理进行与上述相同的处理(S302~S306)。另外,在不存在附加给关注的循环处理的提示信息时(在S302中“无”),错误检验部105对该循环处理不进行任何处理,对下一循环处理进行与上述同样的处理(S302~S306)。
在对程序101中包含的所有循环处理执行了上述处理(S302~S306)的时刻,错误检验部105应执行的处理结束。
如上所述,根据本实施例,可以检验与循环处理的重复次数有关的提示信息在逻辑上是否矛盾。
另外,上述实施例中,采用作为第2个到第4个提示信息的一种的编译指示进行了说明,但作为第1个提示信息的一种,也可以采用编译指示[#pragma_max_iteration]。该编译指示表示提示信息之后马上进行的循环处理(for,while,do)的重复次数最多是几次。例如,在程序中有编译指示[#pragma_max_iteration=10]的描述时,通过用户表示该编译指示之后马上进行的循环处理的重复次数是最大10次。也可以是由错误检验部105对该编译指示进行检验。
另外,错误检验部105不利用解析信息106就可以判断提示信息的逻辑矛盾性时,也可以不利用解析信息106而判断提示信息的逻辑矛盾性。例如,在循环处理的重复次数不是变量而是定义为常数时,错误检验部105可以不参考解析信息106就能求出循环处理的最小重复次数等。
本实施例中,说明检验有关指针变量的提示信息的逻辑性矛盾的程序处理装置。有关指针变量的指针信息例如有以下信息。
(1)指定指针变量所示的数据的调整值的提示信息;(2)表示指针变量所示的区域没有交迭(overlap)的提示信息。
说明程序处理装置102执行包含这些提示信息的程序101的处理。
图10A是表示包含有关指针变量的提示信息并且包含函数func1、函数func2以及函数func3的程序一个例子的图。图10B是表示包含main函数的程序的一例的图。
图10A所示的程序101a和图10B所示的程序101b的关系是被分别编译后被链接。
作为上述第1个提示信息的一种的编译指示[pragma_align_pointer],表示在主存储器中有几个由编译指示指定的指针变量所指的数据的调整值。例如,图10A所示的程序101a中的函数func3之前有编译指示[pragma_align_pointer=8q1]的描述。这表示用户示出以8字节单位调整函数func3的指针变量q1所指的数据。同样,编译指示[pragma_align_pointer=4q2,q3]的描述,表示用户示出以4字节单位调整指针变量q2所指的数据和指针变量q3所指的数据。
另外,程序101a所含的编译指示[#pragma_align_object]是对之后示出的数据以指定的字节数进行调整的用户指示。例如,函数func1内的编译指示[#pragma_align_object=4a,b]的描述是,在主存储器上以4字节单位调整变量a和b的指示。变量a和b是短(short)型变量,通常短型变量是2字节的变量。从而,本实施例中,在没有编译指示[#pragma_align_object]的指定时,以2字节单位调整短型变量。
像这样,通过调整数据并利用配对命令,可以从存储器中一次装载多个数据、或者写数据,编译器可以进行那样的最佳化。这样,可以减少访问存储器的次数,可以使处理高速化。
作为上述第2个提示信息的一种的restrict描述,是用C99语言(IS0/IEC 98991999-Programming Language C)导入的,表示在其范围内指定的所有指针变量所指的主存储器上的区域相互不交迭。即,通过用户示出函数func3的指针变量q1、q2以及q3所指的区域相互不交迭。例如,若指针q1所指的区域和指针q2所指的区域相互不交迭,则编译器可以进行交换在前面区域写入数据的命令和在后面区域写入数据的命令的执行顺序的最佳化。
说明将包含这些提示信息的程序101a和101b作为输入时的语法解析部104和错误检验部105执行的处理。
语法解析部104执行与图5所示的流程图相同的处理。但是,在S203的处理中解析的对象不同。即,语法解析部104解析函数的指针变量所指的数据的调整值,同时对指针变量所指的区域进行解析,解析是否有可能与其他指针指相同的区域。
图11是表示基于图10A和图10B所示的程序101a和101b,由语法解析部104生成的调用流程图表的一例的图。根据该调用流程图表107,main函数调用函数func1和函数func2。另外,func1和func2分别调用函数func3。
图12是表示语法解析部104生成的解析信息106的一例的图。在图5的S203的处理中,语法解析部104基于程序101a和101b,解析调用各函数时的指针变量和全局指针变量的调整以及指示同一区域的可能性。
例如,考虑函数func3的虚变量q1。基于调用流程图表107,可知函数func3被函数func1和函数func2调用。利用编译指示[#pragma_align_object=4a,b],以4字节单位调整与函数func3的虚变量q1对应的函数func1内的函数func3的实变量[&a]所指的数据。另外,利用编译指示[#pragma_align_object=8x],以8字节单位调整与函数func3的虚变量q1对应的函数func2内的函数func3的实变量[&x]所指的数据。因此,函数func3的虚变量q1所指的数据的调整值是4和8。
另外,函数func3的虚变量q1和q2分别对应函数func1内的函数func3的实变量[&a]和p1。在函数func1内调用函数func3之前,在p1中代入[&a]的值。因此,p1和[&a]表示相同值。从而,作为有可能指定与虚变量q1所指的区域同一区域的指针,求出虚变量q2。
以下同样,若对虚变量q2和q3进行同样解析,则可以得到如图12所示的解析信息106。
下面说明错误检验部105执行的处理。
图13是错误检验部105执行的处理的流程图。错误检验部105对在程序101a和程序101b中所含的各指针变量重复以下处理。如图10A所示,在程序101a中包含指针变量q1、q2和q3等。
错误检验部105判断附加到指针变量上的提示信息是什么(S402)。对指针变量附加的提示信息是编译指示[#pragma_align_pointer]时(在S402中#pragma_align_pointer),利用解析信息106,求出该指针变量的调整值(S403)。例如,在函数func3的虚变量q1的情况下,作为调整值求出4和8。
对指针变量附加的信息是restrict描述时(在S402中restrict),错误检验部105利用解析信息106检验该指针变量所指示的区域是否与其他指针变量所指示的区域相互交迭(S405)。例如,表示函数func3的虚变量q1指示的区域与函数func3的虚变量q2指示的区域相互交迭。
另外,不是执行S403和S405的处理的某一方,在附加给同一指针变量的提示信息是多个的情况下,也有执行S403和S405双方的处理的情况。
在S403和S405的处理之后,错误检验部105检查提供给指针变量的提示信息与实际指针变量的信息是否矛盾(S404)。在矛盾时(在S404中的“否”),错误检验部105将检验结果103作为错误信息显示在未图示的显示部(S406)。
例如,对函数func3的虚变量q1附加2个提示信息,即编译指示[#pragma_align_pointer=8q1]和restrict描述。错误检验部105对编译指示[#pragma_align_pointer=8q1]首先进行是否有矛盾的检验。从解析信息106可知虚变量q1的调整值可以取4或8。这与作为提示信息的编译指示[#pragma_align_pointer=8q1]不一致。因此,错误检验部105作为错误信息显示检验结果103。接着,错误检验部105进行restrict描述是否有矛盾的检验。从解析信息106可知存在虚变量q1和q2指向同一区域的情况,与restrict描述矛盾。因此,错误检验部105作为错误信息显示检验结果103(S406)。
在进行了检验结果103的错误显示(S406)之后,或者提供给指针变量的提示信息与实际的指针变量信息不矛盾时(在S404中的“是”),错误检验部105对下一指针变量(例如虚变量q2或q3)进行与上述同样的处理(S402~S406)。另外,在不存在附加给指针变量的提示信息时(在S402中的“无”),错误检验部105对该指针变量不进行任何处理,对下一指针变量进行与上述相同的处理(S402~S406)。
图14是表示检验结果103的一例的图。如上所述,示出编译指示[#pragma_align_pointer=8q1]和restrict描述[short *restrict q1]同实际的指针变量信息矛盾。此外,还示出对虚变量q2的restrict描述矛盾、和对虚变量q3的编译指示矛盾。
在对程序101中包含的所有指针变量执行上述处理(S402~S406)的时刻,错误检验部105结束所有应执行的处理。
如上所述,根据本实施例,可以检验有关数据设置的提示信息在逻辑上是否矛盾。
另外,可以检验有关指针变量的提示信息在逻辑上是否矛盾。
本实施例说明检验有关变量读写的提示信息的逻辑矛盾的程序处理装置。有关变量读写的提示信息例如有以下信息。
(1)表示在提示信息的设置位置之后对指定变量的访问是从数据写入开始的提示信息。
说明程序处理装置102执行包含该提示信息的程序101的处理。
图15是表示包含有关变量读写的提示信息的程序的一例的图。在程序101中包含函数func1、函数func2以及函数func3。
作为上述提示信息的一种的编译指示[#pragma_start_from_write],表示对于由该编译指示指定的变量,在该编译指示的设置位置之后,对该变量的访问是从数据的写入处理开始。例如,在程序101的函数func1()中有编译指示[#pragma_start_from_write x]的描述。这表示用户示出在该编译指示的设置位置之后,对变量x的访问是从数据的写入处理开始。
编译器将该编译指示作为契机,在具有缓冲存储器的计算机中产生了存储器访问时,只确保该区域,可以进行不从主存储器向缓冲存储器传送数据(预取处理)的最佳化。由此,可以减少存储器访问时间。
说明将包含该提示信息的程序101作为输入时的语法解析部104和错误校验部105执行的处理。
语法解析部104执行与图5所示的流程相同的处理。但是,在S203的处理中,解析的对象不同。即,语法解析部104对各函数进行是否存在全局变量的读取及写入的解析。
图16是表示基于图15所示的程序101,由语法解析部104生成的调用流程图表的一例的图。根据该调用流程图表107,函数func1调用函数func2和函数func3。
图17是表示语法解析部104生成的解析信息106的一例的图。在图5的S203的处理中,语法解析部104对各函数的每个全局变量检验有无读写。
例如,在函数func2执行对全局变量y的数据写入和、从全局变量x读取数据,在函数func3执行对全局变量z的数据写入和、从全局变量y读取数据,所以解析信息106成为图17那样。另外,语法解析部104对函数func1也进行相同处理,生成解析信息106。
下面说明错误检验部105执行的处理。
图18是错误检验部105执行的处理的流程图。错误检验部105对程序101中包含的各全局变量重复以下处理。如图15所示,程序101包含3个全局变量x、y以及z。
错误检验部105判断附加到关注的全局变量中的提示信息是什么(S501)。在对该全局变量附加的提示信息是编译指示[#pragma_start_from_write]时(在S501中#pragma_start_from_write),错误检验部105利用解析信息106,检查在该编译指示的设置位置以后是否有对该全局变量的数据写入(S502)。检查结果,若提供给该全局变量的编译指示[#pragma_start_from_write]与实际对该全局变量的数据写入的信息矛盾(S503中的“否”),则错误检验部105作为错误信息在未图示的显示部显示检验结果103(S504)。
例如,对于全局变量x,在func1内附加有由编译指示[#pragma_start_from_write]决定的提示信息。因此,在S502的处理中,错误检验部105检验对该编译指示位置之后的全局变量x的数据写入。在程序101中,在该编译指示之后存在函数func2的调用,但根据解析信息106,在函数func2内部存在从全局变量x读取数据。因此,该编译指示与对实际全局变量x的写入的信息之间存在矛盾(在S503中的“否”)。因此,错误检验部105作为错误信息显示图19所示的检验结果103(S504)。即,错误检验部105显示编译指示[#pragma_start_from_write x]的描述有误。
同样,错误检验部105对全局变量z检验在函数func1内附加的编译指示[#pragma_start_from_write]。这样,从解析信息106可知在该编译指示之后马上调用的函数func3只进行从全局变量z读取数据。因此,编译指示与实际的对全局变量的写入信息之间没有矛盾。因此,错误检验部105不进行错误输出等。
如上所述,根据本实施例,可以检验与从变量读取数据或对变量的数据写入有关的提示信息在逻辑上是否矛盾。
本实施例说明检验有关静态频度的提示信息的逻辑性矛盾的程序处理装置。有关静态频度的提示信息例如有下面的信息。
(1)表示分支条件的成立频度大的提示信息;(2)表示分支条件的不成立频度大的提示信息。
说明程序处理装置102执行包含这些提示信息的程序101的处理。
图20是表示包含有关静态频度的提示信息的程序的一例的图。在程序101包含函数func1和函数func2。
作为上述的第1个提示信息的一种的编译指示[#pragma_likely_true],表示紧接在此之后的if文的条件式成立的(条件式成为true)频度大。通过用户表示,在程序101中,作为if文的条件式的[i%5==0]成立的频度大。
编译器按照该编译指示,进行在if文的条件式成立时执行的命令串、比if文不成立时执行的命令串即由eles文指定的命令串优先执行那样的机器语言命令设置的最佳化。这样,可以提高执行机器语言程序时的处理时间。
作为上述的第2个提示信息的一种的编译指示[#pragma_likely_false],表示紧接在此之后的if文的条件式不成立的(条件式成为false)频度大。
编译器按照该编译指示,进行在if文的条件式不成立时执行的命令串即由else文指定的命令串比if文成立时执行的命令串优先执行那样的机器语言命令设置的最佳化。这样,可以提高执行机器语言程序时的处理时间。
说明将包含这些提示信息的程序101作为输入时的语法解析部104和错误检验部105执行的处理。
语法解析部104执行与图5所示的流程图相同的处理。但是,在S203的处理中解析的对象不同。即,语法解析部104对各函数的虚变量和全局变量进行值的频度解析。
图21是表示基于图20所示的程序101,由语法解析部104生成的调用流程图表的一例的图。根据该调用流程图表107可知,函数func1调用函数func2。
图22是表示语法解析部104生成的解析信息106的一例的图。如上所述,在图5的S203的处理中,语法解析部104对各函数的虚变量和全局变量分别进行值的频度解析。
例如,若解析函数func2的虚变量i的频度,则函数func2有被函数func1总计调用17次的可能性,作为解析信息106示出此时的虚变量i值的频度。例如,虚变量i成为0的次数为2次。因此,表示虚变量i成为0的概率是2/17。
下面说明错误检验部105执行的处理。
图23是错误检验部105执行的处理的流程图。错误检验部105对各if文重复以下处理。如图20所示,在程序101中包含[if(i%5==0)]这样的if文。
错误检验部105判断对关注的if文附加的提示信息是什么(S601)。在附加的提示信息是编译指示[#pragma_likely_true]或编译指示[#pragma_likely_false]时(在S601中#pragma_likely_true/false),错误检验部105利用解析信息106分别检查该if文的条件式的成立或不成立的频度(S602)。其结果,若提示信息与实际频度矛盾(在S603中的“否”),则错误检验部105作为错误信息在未图示的显示部显示检验结果103(S604)。
例如,在if文[if(i%5==0)]附加有编译指示[#pragma_likely_true]。因此,错误检验部105基于解析信息106检查该if文的条件式[i%5==0]的成立频度(S602)。即,条件式[i%5==0]成立是虚变量i是5的倍数的时候,虚变量i成为5的倍数的概率是4/17(虚变量i成为0的概率2/17和虚变量i成为5的概率2/17之和)。因此,该条件式成立的频度小于一半,判断出该条件式不成立的频度更大。因此,错误检验部105判断出编译指示[#pragma_likely_true]和if文的条件式[i%5==0]成立的频度之间产生矛盾(在S603中“否”),显示图24所示的检验结果103。
如上所述,根据本实施例,可以检验有关静态频度(分支条件成立的频度)的提示信息在逻辑上是否矛盾。
本实施例说明检验对编译器直接指定最佳化方法的提示信息的逻辑矛盾的程序处理装置。作为对编译器直接指定最佳化方法的提示信息,例如有指定循环展开的提示信息。
说明程序处理装置102执行包含该提示信息的程序101的处理。
图25是表示包含有关循环展开的提示信息的程序一个例子的图。程序101中包含函数func1和函数func2。
作为指定循环展开的提示信息的一种的编译指示[#pragma_loop_unrolling],是对之后马上进行的循环处理(for,while,do)进行利用循环展开的最佳化的、用户对编译器的指示。例如,在程序101的函数func1内描述有编译指示[#pragma_loop_unrolling],通过用户作出对紧接在此之后的for循环处理进行循环展开的指示。在此,展开的重复次数是2次。
编译器以该编译指示为契机,利用循环展开对该for循环处理进行最佳化。这样,可以提速for循环处理的执行速度。
说明将包含该提示信息的程序101作为输入时的语法解析部104和错误检验部105执行的处理。
语法解析部104执行与图5所示的流程图相同的处理。图26是表示图5的S202的处理结果所生成的调用流程图表的图。从调用流程图表107可知函数func2调用func1。
图27是表示图5的S203和S204的处理结果生成的解析信息的图。根据解析信息106,函数func1的虚变量x的最大值和最小值都是[3],不能取偶数值,只能取奇数值。由于解析信息106的生成处理与实施例1相同,所以在此不再作具体说明。
图28是错误检验部105执行的处理的流程图。错误检验部105对程序101中包含的各循环处理重复以下处理。
错误检验部105判断对循环处理附加的提示信息是什么(S701)。例如,在图25的程序101中包含的for循环处理附加有编译指示[#pragma_loop_unrolling]。
该提示信息是编译指示[#pragma_loop_unrolling]时(在S701中#pragma_loop_unrolling),错误检验部105还利用解析信息106,检验该循环处理的重复次数的可能性(S702)。例如,程序101的for循环处理的重复次数由虚变量x的值规定。从而,从解析信息106可知for循环处理的重复次数仅为3次,只能取奇数次。
错误检验部105判断关注的循环处理的重复次数大于2次并且该重复次数是否只能取奇数次或偶数次(S703)。在不满足该条件时(在S703中的“否”),不能进行展开的重复次数为2次的、利用循环展开的循环处理的最佳化。因此,在这样的情况下,错误检验部105作为错误信息在未图示的显示部显示检验结果103(S704)。
在满足该条件时(在S703中的“是”),或者进行了错误显示(S704)之后,错误检验部105对下一循环处理进行与上述处理相同的处理(S701~S704)。另外,在上述的for循环处理的情况下,满足该条件。
如上所述,根据本实施例,可以检验直接对编译器指示利用循环展开的最佳化的提示信息在逻辑上是否矛盾。
本实施例说明检验对编译器直接指定最佳化方法的提示信息的逻辑性矛盾的另一程序处理装置。作为对编译器直接指定最佳化方法的提示信息,例如有指定软件流水线技术的提示信息。
图29是表示包含有关软件流水线技术的提示信息的程序一个例子的图。程序101中包含有函数func1和函数func2。
作为指定软件流水线技术的提示信息的一种的编译指示[#pragma_software_pipelining],是对紧接在此之后的循环处理(for,while,do)利用软件流水线技术进行最佳化的、用户对编译器的指示。例如,在程序101的函数func1内描述有编译指示[#pragma_software_pipelining],用户进行了对紧接在此之后的for循环处理利用软件流水线技术实施最佳化的指示。另外,软件流水线技术是同时执行几个不同的循环处理的技术,所以循环处理的重复次数需要大于同时执行的最小循环处理次数,在此是2次。
编译器将该编译指示作为契机,对该for循环处理利用软件流水线技术进行最佳化。这样,可以提高for循环处理的执行速度。
说明将包含该提示信息的程序101作为输入时的语法解析部104和错误检验部105所执行的处理。
语法解析部104执行与图5所示的流程图相同的处理。但是,在S203的处理中,不同点是调用全局变量或各函数时仅解析虚变量的最小值。
图30是表示图5的S202的处理结果生成的调用流程图表的图。从调用流程图表可知函数func1调用函数func2。
图31是表示图5的S203和S204处理的结果生成的解析信息的图。根据解析信息106,示出函数func1的虚变量x的最小值为[2]。由于解析信息106的生成处理与实施例1相同,所以在此不再作具体说明。
图32是错误检验部105执行的处理的流程图。错误检验部105对程序101中包含的各循环处理重复以下处理。
错误检验部105判断对循环处理附加的提示信息是什么(S801)。例如,对图29的程序101中包含的for循环处理附加有编译指示[#pragma_software_pipelining]。
在该提示信息是编译指示[#pragma_software_pipelining]时(在S801中#pragma_software_pipelining),错误检验部105还利用解析信息106,检验该循环处理的重复次数的可能性(S802)。例如,程序101的for循环处理的重复次数由虚变量x规定。从而,从解析信息106可知for循环处理的重复次数为最小2次。
错误检验部105判断关注的循环处理的重复次数是否大于2次(S803)。在不满足该条件时(在S803中的“否”),不能进行利用软件流水线技术的循环处理的最佳化。因此,在这种情况下,错误检验部105作为错误信息在未图示的显示部显示检验结果103(S804)。
在满足该条件时(在S803中的“是”),或进行了错误显示(S804)之后,对下一循环处理进行与上述相同的处理(S801~804)。另外,在上述for循环处理的情况下,满足该条件。
如上所述,根据本实施例,可以检验对编译器直接指示利用软件流水线技术的最佳化的提示信息在逻辑上是否矛盾。
本实施例说明检验对编译器直接指定最佳化方法的提示信息的逻辑性矛盾的再另一程序处理装置。作为对编译器直接指定最佳化方法的提示信息,例如有指定配对命令的输出的提示信息。
图33是表示包含有关配对命令的提示信息的程序一个例子的图。在程序101中包含函数func1和函数func2。
作为有关配对命令的提示信息的一种的编译指示[#pragma_pair_ins p],是发行从存储器一次性加载指定排列p的多个要素、或向存储器一次性写入指定排列p的多个要素的配对命令,并进行最佳化的、用户对编译器的指示。例如,在程序101的函数func2内描述有编译指示[#pragma_pair_inst a],通过用户作出对排列a发行配对命令的指示。另外,为了发行配对命令,排列p的要素的调整值,必须是排列p的要素的通常类型的2倍以上。
编译器实施将该编译指示作为契机、对排列p发行配对命令的最佳化。这样,可以减少访问存储器的次数,可以使处理高速化。
说明将包含该提示信息的程序101作为输入时的语法解析部104和错误检验部105执行的处理。
语法解析部104执行与图5所示的流程图相同的处理。但是,在S203处理中,不同点是解析函数的虚变量所指的排列要素的调整值。另外,调整值的解析方法与实施例2所示相同。因此,在此不再作具体说明。
图34是表示图5的S202处理的结果生成的调用流程图表的图。从调用流程图表107可知函数func1调用函数func2。
图35是表示图5的S203和S204处理的结果生成的解析信息的图。根据解析信息106可知,函数func2的虚变量a指示的区域的数据,即排列a的各要素以4字节单位被调整。
图36是错误检验部105执行的处理的流程图。错误检验部105对程序101中包含的各排列重复以下处理。
错误检验部105判断对关注的排列附加的提示信息是什么(S901)。例如,对图33的程序101中包含的排列a的起始要素的指针,附加有编译指示[#pragma_pair_inst](在程序中描述成编译指示[#pragma_pair_inst a])。
在该提示信息是编译指示[#pragma_pair_inst]时(在S901中#pragma_pair_inst),错误检验部105还利用解析信息106,检验该排列要素的调整值(S902)。在此,从解析信息106可知排列a的要素的调整值为4。
错误检验部105判断检验的排列要素的调整值是否是大于该排列要素的通常类型的2倍(S903)。在不满足该条件时(在S903中的“否”),编译器不能对排列实施发行配对命令的最佳化。因此,在这样的情况下,错误检验部105作为错误信息在未图示的显示部显示检验结果103(S904)。
在满足该条件时(在步骤S903中的“是”),或者进行了错误显示(S904)之后,对下一排列进行与上述相同的处理(S901~S904)。另外,程序101中包含的排列a的要素按4字节调整,并且排列a的要素是短型。由于短型的数据是2字节,该排列a满足上述条件。
如上所述,根据本实施例,可以检验对编译器直接指示配对命令的输出的提示信息在逻辑上是否矛盾。
本实施例说明检验对编译器直接指定最佳化方法的提示信息的逻辑性矛盾的再另一程序处理装置。作为对编译器直接指定最佳化方法的提示信息,例如有由指示缓冲存储器等的控制处理的内部函数决定的提示信息。
图37是表示包含由指示缓冲存储器等的控制处理的内部函数决定的提示信息的程序一个例子的图。在程序101包含函数func1和函数func2。
作为指示缓冲存储器等的控制处理的提示信息的一种的内部函数reserve_region,是仅仅在缓冲存储器上确保用于存储由该内部函数的实变量指定的变量值的区域、并且执行从主存储器向缓冲存储器不传送(预取)该变量值的处理的内部函数。这样,可以减少访问存储器的时间。可以进行这样的处理是因为,用户保证在描述了内部函数reserve_region的位置之后的、对由该内部函数reserve_region的实变量指定的变量访问是从数据写入开始。
说明将包含该提示信息的程序101作为输入时的语法解析部104和错误检验部105执行的处理。
语法解析部104执行与图5所示的流程图相同的处理。但是,在S203的处理中与实施例3同样,对各函数进行是否存在从全局变量读取数据、以及对全局变量写入数据的解析。
图38是表示图5的S202处理结果生成的调用流程图表的图。从调用流程图表107可知,函数func1调用函数func2。
图39是表示图5的S203和S204的处理结果生成的解析信息的图。根据解析信息106可知,例如在函数func2内进行从全局变量x的读取和对全局变量y的写入。
图40是错误检验部105执行的处理的流程图。错误检验部105对程序101中包含的各全局变量重复以下处理。
错误检验部105判断对关注的全局变量附加的提示信息是什么(S1001)。在对该全局变量附加的提示信息是内部函数reserve_region时(在S1001中reserve_region()),错误检验部105还利用解析信息106,检查在该内部函数的设置位置之后是否存在对该全局变量的数据写入(S1002)。
错误检验部105对关注的全局变量,检查该内部函数的设置位置之后的、对该全局变量的访问是否是从数据写入开始(S1003)。在不满足该条件时(在S1003中的“否”),错误检验部105作为错误信息在未图示的显示部显示检验结果103(S1004)。
例如,对全局变量x,在程序101的函数func1内附加有由内部函数reserve_region(x)决定的提示信息。因此,在S1002的处理中,错误检验部105检查该内部函数的设置位置之后的对全局变量x的数据写入。在程序101中,在该内部函数之后马上存在函数func2的调用,但根据解析信息106,在函数func2内部存在从全局变量x的数据读取,不存在对全局变量x的数据写入。因此,对全局变量x的访问,是在内部函数reserve_region(x)的设置位置之后,从该全局变量x的数据读取开始,不满足上述条件(在S1003中的“否”)。从而,错误检验部105作为错误信息显示图41所示的检验结果103(S1004)。
在满足上述条件时(在S1003中的“是”),或者进行了错误显示(S1004)之后,错误检验部105对下一全局变量进行与上述处理相同的处理(S1001~S1004)。
如上所述,根据本实施例,可以检验由指示缓冲存储器等的控制处理的内部函数决定的提示信息在逻辑上是否矛盾。
根据上述实施例1~8,可以进行编译指示所代表的提示信息的检验,以便编译器不会生成错误的机器语言程序。因此,可以进行提示信息的检验,以便即使用户对编译器积极提供编译指示所代表的提示信息,也可以进行良好的最佳化。另外,在这样的提示信息中包含对编译器直接进行有关某个最佳化的指示的提示信息、和通过对编译器示出整个程序的静态信息而支持利用编译器的最佳化的提示信息。
以上,基于实施例说明了本发明的程序处理装置,但本发明不限于该实施例。
例如,在提供了图42所示的程序101时,错误检验部105与上述实施例同样,也可以是取代显示表示图43所示的提示信息的错误信息的检验结果,而在知道怎样纠正提示信息好的情况下,显示图44所示的包含纠正信息的检验结果103。在图44的检验结果103示出的是表示纠正信息的检验结果103的一例的图,是应当将程序101的第2行的编译指示[#pragma_min_iteration=5]纠正为[#pragma_min_iteration=2]的纠正信息。
另外,在提供了图45所示的程序101时,为了编译指示[#pragma_align_pointer=8a]在逻辑上不矛盾,以8字节单位调整排列a的要素即可。因此,例如若在程序101的第2行插入编译指示[#pragma_align_pointer=8a],则编译指示[#pragma_align_pointer=8a]在逻辑上不矛盾。图46是表示包含这样的纠正信息的检验结果103的一例的图。另外,也可以是这样的纠正信息不需要以编译指示形式提供,而是以编译选项的形式提供。例如,图47是表示包含由编译选项决定的纠正信息的检验结果103的一例的图。另外,[编译选项]是在启动编译器时指定成为编译对象的程序101、同时用户可以任意指定的对编译器的指示。例如,用户编译程序101[foo.c]时,采用命令[cc],在计算机的命令行上可以输入cc-falign-all-array=8foo.c。
另外,在提供了图48所示的程序101的情况下,规定for循环处理的重复次数的main函数的虚变量x是在执行机器语言程序时确定。因此,for循环处理的重复次数在编译时不确定。从而,不能判断程序101中包含的编译指示[#pragma_min_iteration=5]在逻辑上是否矛盾。因此,也可以显示图49所示的、包含表示不能判断该编译指示是否有误的不确定信息的检验结果103。另外,也可以显示如图50所示的、包含表示该编译指示有可能有误的警告信息的检验结果103。
另外,代替图3所示的程序处理装置102,也可以采用图51所示的程序处理装置202。程序处理装置202是接受包含提示信息的程序101和对该程序101的解析信息106,判断程序101中的提示信息的逻辑匹配性的装置,具有语法解析部104和错误检验部105。语法解析部204是接受程序101(101a、101b),对程序101(101a、101b)进行在编译器等中使用的通常的语法解析处理的处理部。另外,解析信息106是对与在语法解析部204语法解析的程序101(101a、101b)不同的程序101(101a、101b)的解析结果。例如,在程序101由程序101a和程序101b构成的情况下,解析信息106是对程序101a的解析信息106,输入到语法解析部204的程序是如程序101b。
错误检验部105的结构由于与上述实施例相同,所以在此不再作具体说明。图52表示输入到程序处理装置202的程序101的一例,图53表示输入到程序处理装置202的解析信息106的一例。其结果,从程序处理装置202可以得到与图9所示相同的检验结果103。
另外,以C语言描述的源程序说明了程序101,但也可以是用此外的C++语言等高级语言描述的源程序,也可以是目标程序、用中间语言描述的程序、用汇编语言描述的程序。
另外,上述实施例中作为提示信息主要以编译指示为例进行了说明,但提示信息不限于编译指示,也可以是内部函数、编译选项和编程语言的约定语等。
另外,在循环展开中展开的重复次数不限于2次,即使比该次数多的次数,也通过进行基于同样意旨的处理,可以进行提示信息的检验。
另外,在软件流水线技术中同时执行的循环处理次数不限于2次,即使比该2次多的次数,也可以通过进行基于同样意旨的处理,可以进行提示信息的检验。
产业上的可用性本发明可以用于检验用户对编译器提供的提示信息的逻辑矛盾的程序处理装置等,特别是可以用作从程序中预先排除提示信息的逻辑矛盾的预处理器等。
权利要求
1.一种程序处理装置,其特征在于接受包含用户提供给编译器的提示信息的程序,检验包含上述提示信息的程序中的上述提示信息的逻辑匹配性。
2.如权利要求1所述的程序处理装置,其特征在于,具有语法解析单元,解析包含上述提示信息的程序的语法,生成解析信息;和检验单元,基于上述解析信息,检验包含上述提示信息的程序中的上述提示信息的逻辑匹配性。
3.如权利要求2所述的程序处理装置,其特征在于上述提示信息是可通过程序的静态解析得到的静态信息,上述语法解析单元对包含上述提示信息的程序的语法进行静态解析,生成上述解析信息。
4.如权利要求3所述的程序处理装置,其特征在于上述语法解析单元对包含上述提示信息的程序中的函数间信息进行静态解析,生成上述解析信息。
5.如权利要求3所述的程序处理装置,其特征在于上述提示信息是有关循环处理的重复次数的信息,上述语法解析单元解析包含上述提示信息的程序中所包含的循环处理的重复次数,生成包含该重复次数的上述解析信息。
6.如权利要求5所述的程序处理装置,其特征在于上述提示信息是指定循环处理的重复进行规定次数以上的信息,上述检验单元基于上述解析信息,检验与上述提示信息对应的循环处理的重复是否进行了上述规定次数以上。
7.如权利要求5所述的程序处理装置,其特征在于上述提示信息是指定循环处理的重复仅进行规定次数以下的信息,上述检验单元基于上述解析信息,检验与上述提示信息对应的循环处理的重复是否仅进行上述规定次数以下。
8.如权利要求5所述的程序处理装置,其特征在于上述提示信息是指定循环处理的重复次数一定为偶数的信息,上述检验单元基于上述解析信息,检验与上述提示信息对应的循环处理的重复次数是否一定为偶数。
9.如权利要求5所述的程序处理装置,其特征在于上述提示信息是指定循环处理的重复次数一定为奇数的信息,上述检验单元基于上述解析信息,检验与上述提示信息对应的循环处理的重复次数是否一定为奇数。
10.如权利要求3所述的程序处理装置,其特征在于上述提示信息是与数据的设置位置有关的信息,上述语法解析单元解析含有上述提示信息的程序中所包含的数据的设置位置,生成包含该数据的设置位置的上述解析信息。
11.如权利要求10所述的程序处理装置,其特征在于上述提示信息是指定数据和、该数据以规定值被调整的信息,上述语法解析单元解析含有上述提示信息的程序中所包含的数据的调整值,生成含有解析结果的上述解析信息,上述检验单元基于上述解析信息,检验由上述提示信息指定的数据的调整值是否与由上述提示信息指定的上述规定值一致。
12.如权利要求3所述的程序处理装置,其特征在于上述提示信息是与指针变量访问的区域有关的信息,上述语法解析单元解析含有上述提示信息的程序中所包含的指针变量访问的区域,生成包含解析结果的上述解析信息。
13.如权利要求12所述的程序处理装置,其特征在于上述提示信息是指定指针变量和、该指针变量访问的区域与其他指针变量访问的区域之间不具有重复区域的信息,上述语法解析单元解析含有上述提示信息的程序中所包含的指针变量访问的区域与其他指针变量访问的区域之间是否具有重复区域,并生成含有解析结果的上述解析信息,上述检验单元基于上述解析信息,检验由上述提示信息指定的指针变量与其他指针变量访问的区域之间是否具有重复区域。
14.如权利要求3所述的程序处理装置,其特征在于上述提示信息是与从变量的数据读取和对变量的数据写入有关的信息,上述语法解析单元解析从含有上述提示信息的程序中所包含的变量的数据读取或者对该变量的数据写入,生成包含解析结果的上述解析信息。
15.如权利要求14所述的程序处理装置,其特征在于上述提示信息是指定变量和、在描述该提示信息的位置之后对该变量的访问是从数据写入开始的信息,上述检验单元基于上述解析信息,检验由上述提示信息指定的变量,在描述该提示信息的位置之后对该变量的访问是否从数据写入开始。
16.如权利要求3所述的程序处理装置,其特征在于上述提示信息是与分支条件的成立频度有关的信息,上述语法解析单元解析含有上述提示信息的程序中所包含的分支条件的静态成立频度,生成包含解析结果的上述解析信息。
17.如权利要求16所述的程序处理装置,其特征在于上述提示信息是表示分支条件成立的可能性大的信息,上述检验单元基于上述语法解析单元,检验与上述提示信息对应的分支条件成立的可能性是否大。
18.如权利要求2所述的程序处理装置,其特征在于上述提示信息是指示利用编译器的程序的最佳化处理方法的信息,上述检验单元基于上述解析信息,检验由上述提示信息指示的上述最佳化处理方法能否实现。
19.如权利要求18所述的程序处理装置,其特征在于上述提示信息是指示利用循环展开的循环处理最佳化的信息,上述语法解析单元解析含有上述提示信息的程序中所包含的循环处理的重复次数,生成包含该重复次数的解析信息,上述检验单元基于上述解析信息,对与上述提示信息对应的循环处理检验能否进行利用循环展开的最佳化。
20.如权利要求19所述的程序处理装置,其特征在于,上述检验单元具有条件判断部,在循环展开时展开的重复次数为2时,基于上述解析信息,判断是否满足与上述提示信息对应的循环处理的重复次数大于等于2次、且只是奇数次或偶数次的条件;循环展开可否判断部,在满足上述条件时,判断为对与上述提示信息对应的循环处理是否可以进行利用循环展开的最佳化。
21.如权利要求18所述的程序处理装置,其特征在于上述提示信息是指示利用软件流水线技术的循环处理最佳化的信息,上述语法解析单元解析含有上述提示信息的程序中所包含的循环处理的重复次数,生成包含该重复次数的解析信息,上述检验单元基于上述解析信息,判断对与上述提示信息对应的循环处理可否进行利用软件流水线技术的最佳化。
22.如权利要求21所述的程序处理装置,其特征在于,上述检验单元具有重复次数判断部,在同时执行的重复次数为n次时,基于上述解析信息,判断与上述提示信息对应的循环处理的重复次数是否大于等于n;软件流水线技术可否判断部,若与上述提示信息对应的上述循环处理的上述重复次数大于等于n次,则判断为对该循环处理可以进行利用软件流水线技术的最佳化;其中,n为大于等于2的整数。
23.如权利要求18所述的程序处理装置,其特征在于,上述提示信息是指示多个数据和、利用对该多个数据的配对命令的生成而进行的数据访问最佳化的信息;上述语法解析单元解析含有上述提示信息的程序中所包含的数据的调整值,生成包含解析结果的上述解析信息;上述检验单元具有条件判断部,基于上述解析单元,判断由上述提示信息指定的上述多个数据的调整值是否满足上述多个数据类型大小的2倍以上的条件;配对命令生成可否判断部,在满足上述条件时,对由上述提示信息指定的上述多个数据判断为可以进行利用生成配对命令而进行的数据访问的最佳化。
24.如权利要求18所述的程序处理装置,其特征在于上述提示信息是指示变量和、缓冲存储器的控制处理的最佳化的信息。
25.如权利要求24所述的程序处理装置,其特征在于上述提示信息是指示变量和、在上述缓冲存储器上确保用于存储该变量值的区域的信息;上述语法解析单元解析从包含上述提示信息的程序中所含的变量的数据读取或对该变量的数据写入,生成包含解析结果的上述解析信息;上述检验单元具有条件判断部,基于上述解析单元,判断由上述提示信息指定的上述变量是否满足在描述该提示信息的位置之后对该变量的访问是从数据写入开始的条件;缓冲存储器最佳化可否判断部,在满足上述条件时,判断是否可以通过在缓冲存储器上确保用于存储由上述提示信息指定的上述变量值的区域来进行上述缓冲存储器的最佳化。
26.如权利要求2所述的程序处理装置,其特征在于,还具有错误信息输出单元,在上述检验单元判断为上述提示信息没有逻辑匹配性时,输出错误信息。
27.如权利要求26所述的程序处理装置,其特征在于在上述检验单元判断为上述提示信息没有逻辑匹配性时,上述错误信息输出单元输出该提示信息的纠正方法。
28.如权利要求26所述的程序处理装置,其特征在于在上述检验单元判断为上述提示信息没有逻辑匹配性时,上述错误信息输出单元输出不足的提示信息。
29.如权利要求26所述的程序处理装置,其特征在于在上述检验单元判断为上述提示信息没有逻辑匹配性时,启动编译器时,上述错误信息输出单元输出用户对包含成为编译对象的上述提示信息的程序指定的编译选项。
30.如权利要求2所述的程序处理装置,其特征在于,还具有错误信息输出单元,在上述检验单元不能判断上述提示信息是否有逻辑匹配性时,输出表示不能判断上述提示信息是否有逻辑匹配性的错误信息。
31.如权利要求1所述的程序处理装置,其特征在于,上述程序是用C语言或C++语言描述,上述提示信息是用户可在上述程序中描述的对编译器的指示,即编译指示描述。
全文摘要
提供一种程序处理装置,为了使编译器不会生成错误的机器语言程序,可以对编译指示所代表的提示信息进行检验。该程序处理装置具有语法解析单元(104),解析包含用户对编译器提供的提示信息的程序(101)的语法,生成解析信息(106);和错误检验部(105),基于上述解析信息(106),检验包含上述提示信息的程序(101)中的上述提示信息的逻辑匹配性。
文档编号G06F9/45GK1758222SQ200510108608
公开日2006年4月12日 申请日期2005年10月8日 优先权日2004年10月8日
发明者小川一, 坂田俊幸, 瓶子岳人 申请人:松下电器产业株式会社
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1