(57)【要約】【課題】ビットフィールドを含むソースコードから生成するオブジェクトコードのサイズを削減する【解決手段】出現頻度カウント部１２２は、ソースコードのビットフィールドに含まれる各メンバの使用頻度をカウントする。ビットフィールド情報再設定部１２３は、出現頻度カウント部１２２がカウントした出現頻度に応じて、ビットフィールド内での各メンバのビット位置を再設定する。コード出力部１３は、ビットフィールド情報再設定部１２３のビット位置の設定を反映してコンパイルしたオブジェクトコード、またはビットフィールド情報再設定部１２３のビット位置の設定を反映してソースコードを修正した修正ソースコード、の少なくとも一方を出力する。【選択図】図２
2013246602.tif 000002
【特許請求の範囲】
【請求項１】
ソースコード内のビットフィールドに含まれる各メンバの使用頻度をカウントする出現頻度カウント部と、
前記出現頻度カウント部がカウントした出現頻度に応じて、前記ビットフィールド内での各メンバのビット位置を再設定する再設定部と、
前記再設定部のビット位置の再設定に応じて前記ソースコードをコンパイルしたオブジェクトコード、または前記再設定部のビット位置の再設定に応じて前記ソースコードを修正した修正ソースコード、の少なくとも一方を出力するコード出力部と、
を備えるプログラム処理装置。
【請求項２】
前記再設定部は、前記ビットフィールド内のメンバを、出現頻度が高い順に最上位ビットを含むビット位置または最下位ビットを含むビット位置に配置する、請求項１に記載のプログラム処理装置。
【請求項３】
前記再設定部は、前記ビットフィールド内の最も出現頻度が高いメンバを、最下位ビットを含むビット位置に配置する、請求項１に記載のプログラム処理装置。
【請求項４】
前記再設定部は、前記ビットフィールド内のビット幅が１ビットのメンバを、最上位ビットを含むビット位置または最下位ビットを含むビット位置に配置しないように設定を行う、請求項１に記載のプログラム処理装置。
【請求項５】
前記ソースコードと共に入力されるオプション情報を解析するオプション解析部を更に備え、
前記オプション解析部は、前記再設定部による再設定処理を行うか否かを示すオプション情報が指定されたか否かを判定し、
前記再設定部は、前記オプション解析部による判定に応じて、前記ビットフィールド内での各メンバのビット位置の再設定を行う、請求項１に記載のプログラム処理装置。
【請求項６】
前記再設定部は、前記出現頻度カウント部がカウントした出現頻度と、前記オプション情報内のビットフィールドの再設定を行うか否かの指標を示す判定指標と、に基づいて前記ビットフィールド内での各メンバのビット位置の再設定を行うか否かを決定する、請求項５に記載のプログラム処理装置。
【請求項７】
前記再設定部によるビット位置の設定後の前記ビットフィールドの情報であるビットフィールド情報を出力するビットフィールド情報出力部を更に備える、請求項１に記載のプログラム処理装置。
【請求項８】
前記ビットフィールド情報出力部は、前記オプション解析部が読み込み可能な形式で前記ビットフィールド情報を出力する、請求項７に記載のプログラム処理装置。
【請求項９】
前記出現頻度カウント部は、前記ビットフィールドに含まれる各メンバの使用頻度を、読み込みまたは書き込みに関する処理についてのみカウントする、請求項１に記載のプログラム処理装置。
【請求項１０】
コンピュータに、
ソースコード内のビットフィールドに含まれる各メンバの使用頻度をカウントするカウント処理と、
前記カウント処理により算出した出現頻度に応じて、前記ビットフィールド内での各メンバのビット位置を再設定する再設定処理と、
前記再設定処理に応じて前記ソースコードをコンパイルしたオブジェクトコード、または前記再設定処理に応じて前記ソースコードを修正した修正ソースコード、の少なくとも一方を出力する出力処理と、
を実行させるプログラム。
【請求項１１】
前記再設定処理では、前記ビットフィールド内のメンバを、出現頻度が高い順に最上位ビットを含むビット位置または最下位ビットを含むビット位置に配置する、請求項１０に記載のプログラム。
【請求項１２】
前記再設定処理では、前記ビットフィールド内の最も出現頻度が高いメンバを、最下位ビットを含むビット位置に配置する、請求項１０に記載のプログラム。
【請求項１３】
前記再設定処理では、前記ビットフィールド内のビット幅が１ビットのメンバを、最上位ビットを含むビット位置または最下位ビットを含むビット位置に配置しないように設定を行う、請求項１０に記載のプログラム。
【請求項１４】
前記ソースコードと共に入力されるオプション情報を解析するオプション解析処理を更に実行し、
前記オプション解析処理では、前記再設定処理を行うか否かを示すオプション情報が指定されたか否かを判定し、
前記再設定処理では、前記オプション解析処理による判定に応じて、前記ビットフィールド内での各メンバのビット位置の再設定を行う、請求項１０に記載のプログラム。
【請求項１５】
前記再設定処理では、前記出現頻度カウント処理においてカウントした出現頻度と、前記オプション情報内のビットフィールドの再設定を行うか否かの指標を示す判定指標と、に基づいて前記ビットフィールド内での各メンバのビット位置の再設定を行うか否かを決定する、請求項１４に記載のプログラム。
【請求項１６】
前記再設定処理によるビット位置の設定後の前記ビットフィールドの情報であるビットフィールド情報を出力するビットフィールド情報出力処理を更に実行する、請求項１０に記載のプログラム。
【請求項１７】
前記ビットフィールド情報出力処理では、前記オプション解析処理において読み込み可能な形式で前記ビットフィールド情報を出力する、請求項１６に記載のプログラム。
【請求項１８】
前記出現頻度カウント処理では、前記ビットフィールドに含まれる各メンバの使用頻度を、読み込みまたは書き込みに関する処理についてのみカウントする、請求項１０に記載のプログラム。
【請求項１９】
ソースコード内のビットフィールドに含まれる各メンバの使用頻度をカウントするカウント処理と、
前記カウント処理により算出した出現頻度に応じて、前記ビットフィールド内での各メンバのビット位置を再設定する再設定処理と、
前記再設定処理に応じて前記ソースコードをコンパイルしたオブジェクトコード、または前記再設定処理に応じて前記ソースコードを修正した修正ソースコード、の少なくとも一方を出力する出力処理と、
を実行するプログラム処理方法。
【請求項２０】
前記再設定処理では、前記ビットフィールド内のメンバを、出現頻度が高い順に最上位ビットを含むビット位置または最下位ビットを含むビット位置に配置する、請求項１９に記載のプログラム処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム処理装置、プログラム処理方法、及びプログラムに関し、例えばソースコードをコンパイルまたは加工するプログラム処理装置、プログラム処理方法、及びプログラムに関する。
【背景技術】
【０００２】
コンパイラは、プログラミング言語（たとえばＣ言語）で記載されたソースコードを実行可能なオブジェクトコードに変換する。この変換処理は、コンパイルと呼称される。そして、コンパイルにより生成された各オブジェクトコードを関連付けるリンク処理が行われる。最終的な（リンク処理後の）オブジェクトコードのサイズ削減や実行速度の向上のために、コンパイル及びリンク処理に関する様々な提案がなされている。特にデータの記憶容量が限られるマイコン（マイクロコントローラ、マイクロコンピュータ）においては、オブジェクトコードのサイズ削減が重要となる。
【０００３】
例えば、特許文献１には、分割コンパイルされたプログラム（オブジェクトコード）中に含まれる外部変数や副プログラムのメモリ配置を最適化する、すなわちリンク処理を最適化するプログラム処理装置が開示されている。当該プログラム処理装置は、当該メモリ再配置を行うことにより、オブジェクトコードのコードサイズを削減している。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平１１−２９６３７９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
ところで、Ｃ言語を始めとするプログラミング言語では、構造体内においてビットフィールドと呼ばれる方式を用いることができる。図１９（Ａ）は、ビットフィールドを用いたＣ言語のソースコードを示す一例である。図示するように、構造体内の各メンバのビットサイズ（例えば、"unsigned char c:2;"）が定義される。
【０００６】
ビットフィールドを含むソースコードから生成したオブジェクトコードにおいて、ビットフィールドのメンバのデータ転送に関するコードは、コードサイズを増大させる一因となっている。一般的に、マイコンに備わっているビット操作命令は、１ビットのみを操作する命令である。換言すると、マイコンは、特定のビット位置から特定のビット幅のデータのみを同時に転送する命令や演算する命令を備えていない。そのため、複数ビットのビットフィールドのメンバとバイトレジスタとの間において転送を行う場合、マイコンは、バイト単位で転送処理を行い、シフト演算やＡＮＤ演算等を用いて対象メンバの値を取り出す必要がある。以下、具体例を説明する。
【０００７】
図１９（Ａ）は、前述のようにＣ言語のソースコードの一例である。このソースコードをコンパイルした場合、ビットフィールド内のメンバからレジスタに値を読み出す命令（例："c0 = x.c; , c0 = x.a; , c0 = x.d;"）がどのようにオブジェクトコード内で記述されるかについて説明する。なお、以下の説明では、ビットフィールドのメンバを下位ビットから順番に割り当てることを前提に説明を行う。すなわち、図１９（Ａ）をコンパイルした場合、変数ｄがメモリ上の最上位ビットを含むビット位置に配置され、変数ａが最下位ビットを含むビット位置に配置される。
【０００８】
図１９（Ｂ）は、ビットフィールド内の最上位ビットまたは最下位ビットに位置していないメンバ（"ｃ"）の値をレジスタに読み込む場合のオブジェクトコードを示している。図示するように、「左シフト演算命令、右シフト演算命令」または「右シフト演算命令、ＡＮＤ演算命令」のいずれかの処理を行うことにより、対象メンバ以外のデータを取り除き、所望のメンバの値を取り出し、当該所望のメンバの値をレジスタに書き込む。なお、後述の図１９（Ｃ）及び（Ｄ）と異なるコードには図中に下線を付している。
【０００９】
一方、図１９（Ｃ）は、ビットフィールド内の最下位ビットに位置しているメンバ（"ａ"）の値をレジスタに読み込む場合のオブジェクトコードを示している。図示するように、当該オブジェクトコードでは、ＡＮＤ演算を行うことのみにより、対象メンバ以外の不要なデータを取り除き、所望のメンバの値を取り出すことができる。
【００１０】
図１９（Ｄ）は、ビットフィールド内の最上位ビットに位置しているメンバ（"ｄ"）の値をレジスタに読み込む場合のオブジェクトコードを示している。図示するように、当該オブジェクトコードでは、右シフト演算を行うことのみにより、対象メンバ以外の不要なデータを取り除き、所望のメンバの値を取り出すことができる。
【００１１】
続いて、レジスタ内のデータをビットフィールド内の対象メンバに書き込む命令をコンパイルした場合のオブジェクトコードについて説明する。図２０（Ａ）は、ソースコードを表し、図２０（Ｂ）〜（Ｄ）は、各ビット位置におけるオブジェクトコードを表す。レジスタ内のデータをビットフィールド内の対象メンバに書き込む場合、書き込むデータを対象メンバのビット幅に応じてマスクする必要があり、更にビット単位で転送を行うためにビット位置合わせを行う必要がある。さらに、対象となるメンバ以外は、値を変更しないように制御を行う必要がある。これらの要求を実現するために、左シフト演算及びＡＮＤ演算によるマスクを行い、対象となるメンバのビット位置とビット幅を合わせる。そして、書き込み対象となるビットフィールドについては、バイト単位のＡＮＤ演算を行って対象となるメンバだけを０クリアし、ＯＲ演算を用いて書き込むデータを対象のメンバに代入する。
【００１２】
図２０（Ｂ）は、レジスタ内のデータをビットフィールド内の対象メンバ（"ｃ"、最上位ビットでも最下位ビットにも含まれないビット位置にあるメンバ）に書き込む場合のオブジェクトコードを示している。この場合、オブジェクトコードには、「左シフト演算及びアンド演算によるマスク」（対象となるメンバのビット位置及びビット幅を合わせる）、「ＡＮＤ演算」（対象メンバの０クリア）、「ＯＲ演算」（書き込み処理）が含まれる。なお、図中において図２０（Ｃ）及び（Ｄ）と異なるコードには下線を付している。
【００１３】
図２０（Ｃ）は、レジスタ内のデータをビットフィールド内の対象メンバ（"ａ"、最下位ビットを含むビット位置にあるメンバ）に書き込む場合のオブジェクトコードを示している。図示するように、最下位ビットを含む位置の対象メンバを扱う場合、ビット位置とビット幅を合わせる処理については、ＡＮＤ演算を行うのみで良い。換言すると、ビット位置を調整する必要が無い。
【００１４】
図２０（Ｄ）は、レジスタ内のデータをビットフィールド内の対象メンバ（"ｄ"、最上位ビットを含むビット位置にあるメンバ）に書き込む場合のオブジェクトコードを示している。図示するように、最上位を含む配置のメンバは、左シフト演算を行うことにより、マスク処理（ＡＮＤ演算により行っていた処理）を実現することができる。
【００１５】
以上、図１９及び図２０を参照して説明したように、最上位ビットまたは最下位ビットを含んで配置したメンバは、オブジェクトコードにおいてその他のメンバと比較して短い命令列とすることができる。しかしながら、これまでの技術では、ＡＮＳＩ  Ｃの仕様等の影響もあり、ビットフィールド内のメンバの配置については何らの考慮もなされていない。
【００１６】
なお、特許文献１は、リンカを用いたメモリ領域の配置について言及しているが、ビット位置について何らの言及もしていない。換言すると、上述の技術（図１９及び図２０）は、構文解析に関する技術であるが、特許文献１はリンカに関する最適化についてのみ言及している。
【００１７】
すなわち、上述した技術では、ビットフィールドを含むソースコードから生成するオブジェクトコードのサイズを削減できないという問題があった。
【００１８】
その他の課題と新規な特徴は、本明細書の記述および添付図面から明らかになるであろう。
【課題を解決するための手段】
【００１９】
一実施の態様によれば、プログラム処理装置は、ビットフィールドに含まれる各メンバの出現頻度に応じて各メンバのビット位置を調整する。
【発明の効果】
【００２０】
前記一実施の形態によれば、プログラム処理装置は、ビットフィールドを含むソースコードから生成するオブジェクトコードのサイズを削減することができる。
【図面の簡単な説明】
【００２１】
【図１】実施の形態１にかかるプログラム処理装置１０の構成を示すブロック図である。
【図２】実施の形態１にかかる構文解析部１２の構成を示すブロック図である。
【図３】実施の形態１にかかるソースコード２０の一例を示す図である。
【図４】実施の形態１にかかるビットフィールドメンバ情報１２４を示す模式図である。
【図５】ビット配置を示す概念図である。
【図６】実施の形態１にかかるビットフィールドメンバ情報１２４を示す模式図である。
【図７】ビット配置を示す概念図である。
【図８】ビット配置とオブジェクトコードのサイズとの関係を示す概念図である。
【図９】各ビット位置に応じた処理概要を説明する概念図である。
【図１０】整数型（unsigned short int）に関するビットフィールドのビット配置を示す模式図である。
【図１１】実施の形態１にかかる出現頻度カウント部１２２の処理を示す概念図である。
【図１２】実施の形態２にかかるプログラム処理装置１０の構成を示すブロック図である。
【図１３】実施の形態３にかかるプログラム処理装置１０の構成を示すブロック図である。
【図１４】実施の形態３にかかる構文解析部１２の構成を示すブロック図である。
【図１５】実施の形態３にかかるビットフィールド情報５０の一例を示す図である。
【図１６】実施の形態３にかかる修正ソースコード４０の一例を示す図である。
【図１７】実施の形態３にかかるビットフィールド情報５０の一例を示す図である。
【図１８】実施の形態１〜３にかかるプログラム処理装置１０のハードウェア構成を示す図である。
【図１９】一般的なソースコードとオブジェクトコードとの関係を示す概念図である。
【図２０】一般的なソースコードとオブジェクトコードとの関係を示す概念図である。
【発明を実施するための形態】
【００２２】
＜実施の形態１＞
以下、図面を参照して本発明の実施の形態について説明する。図１は、本実施の形態にかかるプログラム処理装置の構成を示すブロック図である。プログラム処理装置１０は、入力部１１と、構文解析部１２と、コード出力部１３と、を備える。プログラム処理装置１０には、ソースコード２０が入力される。また、本実施の形態にかかるプログラム処理装置１０は、ソースコード２０をコンパイルしたオブジェクトコード３０を出力する。
【００２３】
ソースコード２０は、例えばＣ言語等のプログラム言語で記載されたソースプログラムである。なお、プログラム言語は、Ｃ言語に限らずビットフィールドを使用可能な言語であればよく、例えばＣ＋＋であってもよい。
【００２４】
入力部１１には、ソースプログラム２０が入力される。実際には、入力部１１は、コマンドライン上からソースプログラム２０の指定を受け付け、当該指定されたソースプログラム２０をディレクトリ等から読み出す。入力部１１は、入力されたソースプログラム２０を構文解析部１２に供給する。
【００２５】
構文解析部１２は、いわゆる一般的なコンパイラにおける構文解析を行う。これに加えて、構文解析部１２は、ソースプログラム２０内にビットフィールドが定義されている場合には、ビット位置の再設定を行う。ビット位置の再設定は、後述するビットフィールドメンバ情報１２４を編集することにより行う。構文解析部１２は、ビットフィールドメンバ情報を含む構文解析結果をコード出力部１３に供給する。構文解析部１２の詳細構成は、図２を参照して後述する。
【００２６】
本実施の形態におけるコード出力部１３は、構文解析結果を用いてオブジェクトコード３０を生成する。すなわち、コード出力部１３は、意味解析、コード最適化処理等を行い、オブジェクトコードを生成する。
【００２７】
続いて、図２を参照して、構文解析部１２の詳細構成について説明する。図２に示すように、構文解析部１２は、ビットフィールド情報設定部１２１と、出現頻度カウント部１２２と、ビットフィールド情報再設定部１２３と、を備える。さらに、構文解析部１２は、ビットフィールドメンバ情報１２４を保持する。
【００２８】
なお、構文解析部１２は、図示しないものの、ソースコード２０の一般的な構文解析を行う各処理部を有する。さらに、構文解析部１２は、構文解析に先立ち、字句解析を適宜行った際の解析結果を受け付ける。
【００２９】
ビットフィールド情報設定部１２１は、ソースコード２０を解析し、ビットフィールドが定義されているか否かを判定する。そして、ビットフィールドがソースコード２０内に定義されている場合、ビットフィールドメンバ情報１２４を更新する。以下、図３〜７を参照して、ビットフィールド情報設定部１２１における更新処理について説明する。
【００３０】
図３は、ビットフィールドが定義されているソースコード２０の一例である。図３には、タグとして"ｓｔ１"及び"ｓｔ２"が定義され、"ｓｔ１"の変数として"ｘ"及び"ｙ"が定義され、"ｓｔ２"の変数として"ｚ"が定義されている。ビットフィールド情報設定部１２１は、ビットフィールドに関するタグの情報を検出し、検出した情報をビットフィールドメンバ情報１２４に反映する。タグ"ｓｔ１"には、４つのメンバ（ａ，ｂ，ｃ，ｄ）が定義され、タグ"ｓｔ２"には、４つメンバ（ｅ，ｆ，ｇ，ｈ）が定義されている。各メンバの定義には、ビット幅も併せて定義される。例えば、タグ"ｓｔ１"のメンバ"ｂ"のビット幅は、２である。
【００３１】
図４は、ビットフィールド情報設定部１２１が生成したビットフィールドメンバ情報１２４を示す模式図である。ビットフィールドメンバ情報１２４は、各タグ内の各メンバについてのメンバ名、ビット位置、ビット幅、及び出現頻度が含まれる。ビットフィールド情報設定部１２１は、ソースコード２０（図３）を解析し、各タグについてのメンバ名、ビット位置、ビット幅を更新する。なお、この段階では、出現頻度にはデータが設定されない。図４（Ａ）は、タグ"ｓｔ１"についての情報を示すビットフィールドメンバ情報１２４である。図４（Ｂ）は、タグ"ｓｔ２"についての情報を示すビットフィールドメンバ情報１２４である。
【００３２】
図５は、図４に対応するビット配置を示す概念図である。図５（Ａ）は、図４（Ａ）に対応するタグ"ｓｔ１"のビット配置を示す。図示するように、１バイトの中に、４つのメンバが配置されている。ここで、各メンバの配置は、ＡＮＳＩ  Ｃに規定されているように、ソースコード２０における配置順序と対応している。同様に、図５（Ｂ）は、図４（Ｂ）に対応するタグ"ｓｔ２"のビット配置を示す。
【００３３】
ＡＮＳＩ  Ｃの規定とは、ＡＮＳＩ  Ｃ９８９９に規定されたものであり、詳細には「処理系は、ビットフィールドを保持するに十分な大きさの任意のアドレス付け可能な記憶域単位を割り付けてよい。十分な領域が残っている場合、構造体のビットフィールドの直後に続く別のビットフィールドは、同じ単位の隣接したビットに詰め込まなければならない。（６．５．２．１  構造体指定子および共用体指定子）」と定義されている。すなわち、ビットフィールド内で隣り合って定義されたメンバは、隣接した領域（ビット位置）に配置しなければならないことが定義されている。
【００３４】
再び、図２を参照する。出現頻度カウント部１２２は、ビットフィールド内の各メンバの出現頻度をカウントする。図３のソースコードに、出現頻度カウント部１２２によるカウント処理をコメント形式で記載している。例えば、出現頻度カウント部１２２は、ソースコード行（"y.d = x.b;"）を解析し、タグ"ｓｔ１"のメンバ"ｂ"及び"ｄ"が使用されたことを確認し、メンバ"ｂ"及び"ｄ"の使用回数をインクリメントする。出現頻度カウント部１２２は、タグ単位で使用回数をカウントする。そのため、図３の例では、出現頻度カウント部１２２は、ソースコード行（"x.a = 1;"）とソースコード行（"y.a = 1;"）を同様に扱う、すなわちタグ"ｓｔ１"のメンバ"ａ"が使用されたものとしてカウントする。出現頻度カウント部１２２は、ビットフィールド内の各メンバのカウント数をビットフィールドメンバ情報１２４に反映する。例えば、出現頻度カウント部１２２は、タグ"ｓｔ１"の各メンバの出現回数をカウントし、メンバ"ａ"のカウント数"６"、メンバ"ｂ"のカウント数"２"、メンバ"ｃ"のカウント数"３"、メンバ"ｄ"のカウント数"１"をビットフィールドメンバ情報１２４に反映する。出現頻度カウント部１２２は、タグ"ｓｔ２"についても同様に処理する。
【００３５】
ビットフィールド情報再設定部１２３は、ビットフィールドメンバ情報１２４内のカウント数を参照して、各メンバのビット位置を再設定する。ビットフィールド情報再設定部１２３は、使用頻度が高い（カウント数が多い）メンバのビット位置を、最上位ビットを含むビット位置、または最下位ビットを含むビット位置に変更する。ここで、ビットフィールド情報再設定部１２３は、最も使用頻度が高いメンバのビット位置を、最下位ビットを含むビット位置に変更することが好ましい。また、各マイコンは、１ビットを扱う命令（オブジェクトコード内の命令）を持つことが一般的である。そのため、１ビット幅のメンバについては、最上位ビットまたは最下位ビットを含むビット位置には配置しないようにする。
【００３６】
図６は、図３のソースコード２０についてビットフィールド情報再設定部１２３が再設定した後のビットフィールドメンバ情報１２４を示す図である。図６（Ａ）は、タグ"ｓｔ１"についての再設定後の情報である。図４（Ａ）と比較すると分かるように、複数ビット幅のメンバのうち最も使用頻度が高い（カウント数が多い）メンバである"ｃ"が最下位ビットを含むビット位置（"０"）に配置されている。また、複数ビット幅のメンバのうち２番目に使用頻度が高い（カウント数が多い）メンバである"ｂ"が最上位ビットを含むビット位置（"６"）に配置されている。図６（Ｂ）は、同様の手法でタグ"ｓｔ２"についての再設定を行った後の情報である。
【００３７】
図７は、ビットフィールド情報再設定部１２３による再設定後のビット配置を示す概念図である。図７（Ａ）は、図６（Ａ）に対応するタグ"ｓｔ１"のビット配置を示す。図示するように、複数ビット幅のメンバのうち最も使用頻度が高いメンバである"ｃ"が最下位ビットを含むビット位置に配置され、複数ビット幅のメンバのうち２番目に使用頻度が高い（カウント数が多い）メンバである"ｂ"が最上位ビットを含むビット位置に配置される。同様に、図７（Ｂ）は、図６（Ｂ）に対応するタグ"ｓｔ２"のビット配置を示す。
【００３８】
構文解析部１２は、ビットフィールド情報再設定部１２３が再設定したビットフィールドメンバ情報１２４を含む解析情報をコード出力部１３に供給する。
【００３９】
続いて、本実施の形態にかかるプログラム処理装置１０の効果について説明する。本実施の形態にかかる構文解析部１２は、ビットフィールドに含まれる各メンバの出現頻度に応じて、各メンバのビット位置を変更している。詳細には、構文解析部１２は、出現頻度の高いメンバを最上位ビットまたは最下位ビットを含む位置に変更している。図１９及び図２０を参照して説明したように、最上位ビットまたは最下位ビットを含むビット位置に配置されたメンバは、オブジェクトコード内での命令数を少なくできる。そのため、出現頻度の高いメンバを、オブジェクトコード内での命令数を少なくできるビット位置に配置することにより、オブジェクトコードのサイズ削減を図ることができる。
【００４０】
構文解析部１２は、最も使用頻度の高いメンバを、最下位ビットを含むビット位置に配置している。この効果について図８を参照して説明する。
【００４１】
図８は、最下位ビットを含むビット位置にメンバを配置した場合に最もコード削減効果が望めるソースコード及び当該ソースコードから生成したオブジェクトコードを示す図である。図８（Ａ）は、対象となるメンバ（"ｃ"）を最上位ビット、最下位ビットのいずれも含まないビット位置に配置したソースコードである。このソースコードにおいて、ソースコード行（"(y.c & 3）"）を変換したオブジェクトコードを図８（Ｂ）に示す。なお、図８（Ｂ）には、説明の便宜のため、命令の記述に加えて説明文も記載している（図８（Ｄ）及び図８（Ｆ）についても同様である）。図８（Ｂ）に示すように、当該ソースコード行（"(y.c & 3）"）に対応する命令として、シフト命令（ビット位置調節）及びＡＮＤ演算（対象メンバ（"ｃ"）以外を削除し、同時にＡＮＤ演算）を行う必要がある。なお、図８（Ｂ）においてシフト命令とＡＮＤ演算に下線を付している。
【００４２】
図８（Ｃ）は、対象となるメンバ（"ｃ"）を最上位ビットを含むビット位置に配置したソースコードである。このソースコードにおいて、ソースコード行（"(y.c & 3）"）を変換したオブジェクトコードを図８（Ｄ）に示す。図８（Ｄ）に示すように、当該ソースコード（"(y.c & 3）"）に対応する命令として、シフト命令（ビット位置を調節するとともに対象メンバ以外を削除）及びＡＮＤ演算を行う必要がある。なお、図８（Ｄ）においてシフト命令とＡＮＤ演算に下線を付している。
【００４３】
図８（Ｅ）は、対象となるメンバ（"ｃ"）を最下位ビットを含むビット位置に配置したソースコードである。このソースコードにおいて、ソースコード行（"(y.c & 3）"）を変換したオブジェクトコードを図８（Ｆ）に示す。図８（Ｆ）に示すように、当該ソースコード行（"(y.c & 3）"）に対応する命令として、ＡＮＤ演算を行うのみで、対象メンバ以外を削除し同時にＡＮＤ演算を行うことができる。すなわち、このソースコード行（"(y.c & 3）"）をオブジェクトコードに変換する場合、最下位ビットを含むビット位置にメンバを配置すると最もオブジェクトコードのサイズ削減の効果が得られることになる。なお、図８（Ｆ）においてＡＮＤ演算に下線を付している。構文解析部１２は、最も使用頻度が高いメンバを最下位ビットを含むビット位置に配置するため、最も効率的にオブジェクトコードのサイズ削減を図ることができる。
【００４４】
図９は、各ビット位置に応じた処理概要を説明する概念図である。メンバが最上位ビット及び最下位ビットのいずれも含まない位置にある場合（図９（Ａ））、上位ビットと下位ビットのメンバを削除する必要がある。シフト命令によるビット位置の調整も必要である。
【００４５】
メンバが最上位ビットを含むビット位置にある場合（図９（Ｂ））、下位ビットのメンバを削除する必要がある。ここで、ビット位置を調整するためのシフト命令が対象メンバ以外を削除する処理を兼ねるため、オブジェクトコード内での命令を１つ削減できる可能性がある。
【００４６】
メンバが最下位ビットを含むビット位置にある場合（図９（Ｃ））、上位ビットのメンバを削除する必要がある。ビット位置の調整が不要となるため、オブジェクトコード内での命令を１つ削減できる。
【００４７】
本実施の形態にかかる構文解析部１２は、図９に示す性質を利用し、利用頻度の高いメンバを最上位ビットまたは最下位ビットのいずれかを含むビット位置に配置することにより、オブジェクトコードのサイズ削減を実現している。
【００４８】
さらに、構文解析部１２は、各メンバの出現頻度のみならずビット幅をも考慮して、ビット位置の再設定を行っている。上述のように、各マイコンには、１ビットを扱う各種命令（単一命令）を持つことが一般的である。構文解析部１２は、ビットフィールド内の１ビット幅のメンバを最上位ビットまたは最下位ビットを含まないビット位置に配置する。すなわち、構文解析部１２は、どのビット位置にあってもオブジェクトコードのコードサイズを増大させないメンバ（１ビット幅のメンバ）を、コード削減効果のあるビット位置（最上位ビットまたは最下位ビットを含む位置）に配置することを回避している。これにより、構文解析部１２は、各メンバのビット幅を考慮しない場合と比べて、オブジェクトコードの更なる削減効果を実現することができる。なお、対象とするマイコンが１ビットを扱う各種命令（単一命令）を持たない場合、構文解析部１２は、ビット幅を考慮しなくても良い。すなわち、構文解析部１２は、出現頻度のみに応じて、上述のビット位置の再設定を行えばよい。
【００４９】
複数のバイトにまたがるビットフィールド構造においても、構文解析部１２は、上述のビットフィールド内のメンバの再設定を同様に行えばよい。図１０を参照して、複数のバイトにまたがるビットフィール構造体の取り扱いを説明する。
【００５０】
図１０は、整数型（unsigned short int）に関するビットフィールドのビット配置を示す模式図である。本例では、２バイト幅の中に各メンバを配置することになる。ここで、最上位ビットまたは最下位ビット（図中の斜線部分）を含み、かつ複数のバイトを跨がずに（図中の矢印個所を含まずに）配置したメンバについてのオブジェクトコードは、他のメンバと比べてコードサイズを削減できる。構文解析部１２は、使用頻度が高く、複数ビット幅を持つメンバを、最上位ビットまたは最下位ビット（図中の斜線部分）を含むビット位置に配置する（好適には最も使用頻度が高いメンバを最下位ビットに配置する）ことにより、オブジェクトコードのサイズ削減を図ることができる。
【００５１】
また、構文解析部１２は、タグ毎に各メンバの出現頻度をカウントしたが、変数毎に各メンバの出現頻度をカウントしても良いことは勿論である。この際、構文解析部１２は、はじめにタグのコピー処理を内部的に行い、カウント処理を行う。当該処理について図１１を参照して説明する。
【００５２】
図１１（Ａ）は、複数の変数（ｘ、ｙ）が定義されたビットフィールドのタグである。構文解析部１２は、このようなタグが定義されていた場合、各変数（ｘ、ｙ）に応じたタグをコピー処理により内部的に生成する。すなわち、構文解析部１２は、タグ内の各メンバの定義（変数名、型定義、ビット幅定義）が同じタグを変数の数だけ生成する。この後、構文解析部１２は、上述のビットフィールド内の各メンバのカウント処理及びビット位置の調整処理を行う。これにより、変数毎にビット位置の再設定を行うことができる。
【００５３】
＜実施の形態２＞
本実施の形態にかかるプログラム処理装置は、ビットフィールド情報再設定部１２３による再設定を行うか否かをユーザが指定できることを特徴とする。以下、実施の形態１と異なる点を説明する。
【００５４】
図１２は、本実施の形態にかかるプログラム処理装置の構成を示すブロック図である。本実施の形態にかかるプログラム処理装置１０には、オプション情報（いわゆるコンパイルオプション相当の情報）が入力される。また、入力部１１は、オプション解析部１１１を備える。
【００５５】
オプション解析部１１１は、入力されるオプション情報を解析する。はじめに、オプション情報の例を示す。オプション情報として、例えばＣ言語の"-C"、"-D"、"-fast"等が挙げられる。さらに、本実施の形態にかかるプログラム処理装置１０には、オプション情報としてビットフィールド情報再設定部１２３による上述の再設定を行うことを示す"-bitfield_arrangement"、"-bitfield_arrangement 50"、"-ba"等を指定できる。
【００５６】
"-bitfield_arrangement"は、ビットフィールドの再設定を指示するオプション情報である。また、-ba"は、"-bitfield_arrangement"の省略記載である。"-bitfield_arrangement"は、ビットフィールドの再設定を行うか否かを示す判定指標を指定することもできる。例えば、"-bitfield_arrangement 50"は、最も使用頻度の多いメンバの出現回数が５０回以上である場合、ビットフィールドの再設定を行うことを指定している。なお、最も使用頻度の多いメンバの出現回数と、最も使用頻度の少ないメンバの出現回数と、の差についての閾値をオプション情報に含めても良い。例えば"-bitfield_arrangement_diff 30"は、最も使用頻度の多いメンバの出現回数と、最も使用頻度の少ないメンバの出現回数と、の差が３０回以上である場合にビットフィールドの再設定を行うことを指定している。すなわち、オプション情報には、ビットフィールドの再設定を行うか否かの任意の判定指標（例えば最も使用頻度の多いメンバの出現回数が５０回以上）を指定できる。
【００５７】
なお、オプション情報"-bitfield_arrangement"、"-bitfield_arrangement 50"、"-ba"は、あくまでも一例であり、この他の文字列によって、ビットフィールド情報再設定部１２３による再設定を指定しても良い。
【００５８】
オプション解析部１１１は、ビットフィールドの再設定を指定するオプション情報（上述の"-bitfield_arrangement"等）が入力されたか否かを解析する。入力されている場合、オプション解析部１１１は、ビットフィールドの再設定を実行するように通知を行う。ここで、上述のビットフィールドの再設定を行うか否かの判定指標（例えば最も使用頻度の多いメンバの出現回数が５０回以上）も指定されている場合、オプション解析部１１１は、この判定指標も併せて構文解析部１２に通知する。一方、ビットフィールドの再設定を指定するオプション情報が入力されていない場合、オプション解析部１１１は、構文解析部１２に対してビットフィールドの再設定を行わないことを通知する。
【００５９】
構文解析部１２は、オプション解析部１１１からの通知に応じてビットフィールドの再設定を行うか否かを判断する。ビットフィールドの再設定を行わないことが通知された場合、構文解析部１２は、一般的な構文解析処理のみを実行する。ビットフィールドの再設定を行うことが通知された場合、構文解析部１２は、一般的な構文解析処理に加えて、実施の形態１と同様のビットフィールドの再設定処理を行う。上述の判定指標が通知された場合、構文解析部１２内の出現頻度カウント部１２２は、ソースコード２０内のビットフィールドの各メンバのカウント処理を実行する。そして、ビットフィールド情報再設定部１２３は、カウント結果と判定指標とを比較し（たとえば最も使用頻度が高いメンバの使用回数と判定指標を比較し）、ビットフィールドの再設定を行うか否かを判定する。ビットフィールドの再設定を行うと判定した場合、ビットフィールド情報再設定部１２３は、実施の形態１と同様のビットフィールドの再設定処理を行う。
【００６０】
続いて、本実施の形態にかかるプログラム処理装置１０の効果について説明する。本実施の形態にかかるプログラム処理装置１０は、ビットフィールド内のメンバのビット位置を再設定するか否かを指定するオプション情報の指定に応じて、当該再設定処理を行う。前述のように、ビット位置を変更した場合、ＡＮＳＩ  Ｃの規約に準拠することは出来ない。そのため、ユーザが上述のビット位置の再設定を望まない場合がある。本実施の形態では、ユーザの要求（すなわちオプション情報の指定）に応じて、ビットフィールド内の各メンバのビット位置を再設定するか否かを決定するため、ユーザの意図に沿ったオブジェクトコードを生成することができる。
【００６１】
さらに、オプション情報として上述の判定指標（例えば最も使用頻度の多いメンバの出現回数が５０回以上）を記述できる。構文解析部１２は、当該判定指標と各メンバの使用頻度に応じて、ビットフィールド内の各メンバのビット位置を再設定するか否かを決定する。これにより、ユーザがビットフィールド内の各メンバのビット位置の再設定を行いたい場合を詳細に設定することができる。例えば、オブジェクトコードの削減量が多いと想定される場合には上述の再設定を行い、削減量が少ないと想定される場合にはＡＮＳＩ  Ｃの規定に沿ったオブジェクトコードを生成することを指定できる。
【００６２】
＜実施の形態３＞
実施の形態３にかかるプログラム処理装置１０は、オブジェクトード３０のみならず、修正ソースコード４０やビットフィールド情報５０を出力可能なことを特徴とする。以下、本実施の形態にかかるプログラム処理装置１０について説明する。
【００６３】
図１３は、本実施の形態にかかるプログラム処理装置１０の構成を示すブロック図である。本実施の形態にかかるプログラム処理装置１０は、図１１に示す構成と同様であるが、オブジェクトコード３０に加えて、修正ソースコード４０及びビットフィールド情報５０を出力可能な点が異なる。修正ソースコード４０及びビットフィールド情報５０については後述する。
【００６４】
図１４は、本実施の形態にかかる構文解析部１２の構成を示すブロック図である。本実施の形態にかかる構文解析部１２は、図２に示す構成に加えてビットフィールド情報出力部１２５を有する。
【００６５】
ビットフィールド情報出力部１２５は、ビットフィールド内の各メンバの出現頻度が把握できる情報であるビットフィールド情報５０を出力する。ビットフィールド情報５０の一例を図１５（Ａ）に示す。図示するように、ソースコード２０に含まれるビットフィールド内の各メンバの出現回数が記載された情報（例えばファイル）が出力される。なお、ビットフィールド情報５０は、図１５（Ａ）に示す書式である必要はなく、図１５（Ｂ）のようにソースコードに従った形式であっても良く、例えば図６のように表形式の情報であっても良い。
【００６６】
再び図１３を参照する。コード出力部１３は、構文解析部１２からビットフィールド情報１２４を含む構文解析結果及びソースコード２０を受け取る。そして、コード出力部１３は、ビットフィールド情報１２４を参照して、ソースコード２０内のビットフィールドの各メンバのビット位置を変更した修正ソースコード４０を生成する。ここで、ビット位置の決定方法は、実施の形態１と同様である。コード出力部１３は、内部に既知のファイル入出力（"ｆｏｐｅｎ"関数等）を行うオブジェクトコードを有し、当該オブジェクトコードを用いてソースコード２０のビット位置を変更した修正ソースコード４０を作成する。
【００６７】
図１６に修正ソースコード４０の一例を示す。図１６（Ａ）は入力されたソースコード２０を示す図であり、図１６（Ｂ）は図１６（Ａ）に示すソースコード２０から生成された修正ソースコード４０を示す図である。図示するように、各タグ（"ｓｔ１"、"ｓｔ２"内）のメンバのビット位置（出現順序）が変更されている。詳細には、タグ"ｓｔ１"内のメンバの出現順序が"ａ"、"ｂ"、"ｃ"、"ｄ"であったのに対し、"ｃ"、"ａ"、"ｄ"、"ｂ"に変更されている。同様に、詳細には、タグ"ｓｔ２"内のメンバの出現順序が"ｅ"、"ｆ"、"ｇ"、"ｈ"であったのに対し、"ｆ"、"ｅ"、"ｈ"、"ｇ"に変更されている。
【００６８】
なお、コード出力部１３は、実施の形態１及び２と同様にビット位置の修正を行ったオブジェクトコード３０を出力することも可能である。
【００６９】
なお、本実施の形態において、プログラム処理装置１０が何を出力するか（オブジェクトコード３０、修正ソースコード４０、ビットフィールド情報５０）はオプション情報により指定可能である。例えば、"-make_bitfield_arrangement_source"、"-make_bitfield_arrangement_info"等のオプション情報を指定可能とする。オプション解析部１１１は、これらのオプション情報を解析し、構文解析部１２及びコード出力部１３に対して、処理の指示を行う。処理の指示に応じて、各処理部は上述の処理を行う。なお、上述のオプション情報は、あくまで一例である。
【００７０】
続いて、本実施の形態にかかるプログラム処理装置１０の効果について説明する。上述のように、プログラム処理装置１０は、オブジェクトコード３０のみならず、修正ソースコード４０またはビットフィールド情報５０を出力できる構成である。上述のように、構文解析部１２が内部でビット位置を修正した上でオブジェクトコード３０を生成した場合、オブジェクトコード２０がＡＮＳＩ  Ｃに準拠しないという問題がある。しかし、本実施の形態では、オブジェクトコード３０を生成することなく、ビット位置を修正した修正ソースコード４０を生成することができる。そのため、ＡＮＳＩ  Ｃに準拠したオブジェクトコードを生成したい場合、ユーザは一度修正ソースコード４０を生成し、この修正ソースコード４０をコンパイル対象のソースコードとすればよい。これにより、コードサイズを削減し、かつＡＮＳＩ  Ｃに準拠したオブジェクトコードを生成することができる。同様に、ビットフィールド情報５０を参照してユーザがソースコード２０を編集することによっても、コードサイズを削減し、かつＡＮＳＩ  Ｃに準拠したオブジェクトコードを生成することができる。
【００７１】
なお、ビットフィールド情報５０を入力部１１に入力するオプション情報に使用することも可能である。すなわち、プログラム処理装置１０内のコード出力部１３は、再度読み込みが可能な形式でビットフィールド情報５０を出力する。図１７を参照して説明する。ユーザは、プログラム処理装置１０が出力したビットフィールド情報５０を適宜編集する。図１７は、図１５（Ａ）に示すビットフィールド情報５０をユーザが編集した情報を示す。例えば、図１７のように、各タグについてビット位置を調整するか否かを示す情報（"ｅｎａｂｌｅ"，"ｄｉｓａｂｌｅ"）を付与する。オプション解析部１１１は、この情報（"ｅｎａｂｌｅ"，"ｄｉｓａｂｌｅ"）を解析し、構文解析部１２に対して処理（再設定）対象となるタグやメンバの情報を通知する。構文解析部１２は、この通知に応じてビット位置の調整処理を行う。なお、プログラム処理装置１０に入力されるオプション情報は、図１７に示す書式に限られないのは勿論である。またユーザは、ビットフィールド情報５０を用いて、上述の編集（"ｅｎａｂｌｅ"，"ｄｉｓａｂｌｅ"）以外の編集を行っても良い。
【００７２】
以上、本発明を上記実施形態に即して説明したが、上記実施形態の構成にのみ限定されるものではなく、本願特許請求の範囲の請求項の発明の範囲内で当業者であればなし得る各種変形、修正、組み合わせを含むことは勿論である。
【００７３】
例えば、上述の説明では、構文解析部１２内の出現頻度カウント部１２２は、ソースコード２０内の出現頻度を単純にカウントしていたが、必ずしもこれに限られず、例えば読み出し処理または書込み処理の一方のみをカウントしても良い。例えば、ユーザは、書込みのみをカウントすることを指定するオプション情報（"-bitfield_arrangement_write"）を入力する。これに応じて、オプション解析部１１１は、書込みのみのカウントを出現頻度カウント部１２２に指示する。指示を受けた出現頻度カウント部１２２は、ビットフィールド内の各メンバが書込み処理に用いられた場合にのみカウントアップを行う。このカウントに応じてビットフィールド位置の再設定を行うことにより、書込み処理に特化したオブジェクトコードの最適化を行うことができる。
【００７４】
また、上述の説明では、ビットフィールドのメンバを下位ビットから順番に割り当てる方式を前提として説明したが、上位ビットから順番に割り当てる方式であっても上述した手法を用いることができる。さらにリトルエンディアン（little endian）形式、ビッグエンディアン（big endian）形式に関わらず上述の手法を適応することが可能である。
【００７５】
上述の入力部１１、構文解析部１２、及びコード出力部１３の処理は、任意のコンピュータ内で動作するプログラムとして実現してもよい。プログラムは、様々なタイプの非一時的なコンピュータ可読媒体（non-transitory computer readable medium）を用いて格納され、コンピュータに供給することができる。非一時的なコンピュータ可読媒体は、様々なタイプの実体のある記録媒体（tangible storage medium）を含む。非一時的なコンピュータ可読媒体の例は、磁気記録媒体（例えばフレキシブルディスク、磁気テープ、ハードディスクドライブ）、光磁気記録媒体（例えば光磁気ディスク）、ＣＤ−ＲＯＭ（Read Only Memory）、ＣＤ−Ｒ、ＣＤ−Ｒ／Ｗ、半導体メモリ（例えば、マスクＲＯＭ、ＰＲＯＭ（Programmable ROM）、ＥＰＲＯＭ（Erasable PROM）、フラッシュＲＯＭ、ＲＡＭ（random access memory））を含む。また、プログラムは、様々なタイプの一時的なコンピュータ可読媒体（transitory computer readable medium）によってコンピュータに供給されてもよい。一時的なコンピュータ可読媒体の例は、電気信号、光信号、及び電磁波を含む。一時的なコンピュータ可読媒体は、電線及び光ファイバ等の有線通信路、又は無線通信路を介して、プログラムをコンピュータに供給できる。
【００７６】
プログラム処理装置１０のハードウェア構成の一例を、図１８を参照して説明する。プログラム処理装置１０は、中央処理装置（ＣＰＵ, Central Processing Unit）２１０と、メモリ２２０と、を含んでいる。ＣＰＵ２１０及びメモリ２２０は、バスを介して補助記憶装置としてのハードディスク装置（ＨＤＤ）２３０に接続される。ハードディスク装置２３０等の記憶媒体にはオペレーティングシステムと協働してＣＰＵ２１０等に命令を与え、上述したプログラム処理装置１０の各処理を実施するためのコンピュータ・プログラムを記憶することができる。
【符号の説明】
【００７７】
１０  プログラム処理装置
１１  入力部
１１１  オプション解析部
１２  構文解析部
１２１  ビットフィールド情報設定部
１２２  出現頻度カウント部
１２３  ビットフィールド情報再設定部
１２４  ビットフィールドメンバ情報
１２５  ビットフィールド情報出力部
１３  コード出力部
２０  ソースコード
３０  オブジェクトコード
４０  修正ソースコード
５０  ビットフィールド情報
２１０  ＣＰＵ
２２０  メモリ
２３０  ハードディスク装置
【図１】
2013246602.tif 000003
【図２】
2013246602.tif 000004
【図３】
2013246602.tif 000005
【図４】
2013246602.tif 000006
【図５】
2013246602.tif 000007
【図６】
2013246602.tif 000008
【図７】
2013246602.tif 000009
【図８】
2013246602.tif 000010
【図９】
2013246602.tif 000011
【図１０】
2013246602.tif 000012
【図１１】
2013246602.tif 000013
【図１２】
2013246602.tif 000014
【図１３】
2013246602.tif 000015
【図１４】
2013246602.tif 000016
【図１５】
2013246602.tif 000017
【図１６】
2013246602.tif 000018
【図１７】
2013246602.tif 000019
【図１８】
2013246602.tif 000020
【図１９】
2013246602.tif 000021
【図２０】
2013246602.tif 000022