(57)【要約】【課題】本発明は、元のソースコードを、可能な限り多彩な変換パターンの中から、適切なパターンのソースコードに変換することが可能なソースコード変換装置及びソースコード変換方法を提供する。【解決手段】ソースコードの構造を解析して構造木を作成する解析部２，３と、ソースコードの複数の変換パターンを示すパターン表を記憶する記憶部４と、ソースコードを変換するためのポリシ４０を有するとともに、パターン表を前記ポリシ４０に照らし合わせて変換式の組み合わせを作成する一致性解析部５と、変換式の組み合わせに基づいてソースコードを変換する作成部６と、を備えた。【選択図】  図１
2008243019.tif 000002
【特許請求の範囲】
【請求項１】
ソースコードの構造を解析して構造木を作成する解析部と、
ソースコードの複数の変換パターンを示すパターン表を記憶する記憶部と、
ソースコードを変換するためのポリシを有するとともに、前記記憶部が記憶するパターン表を前記ポリシに照らし合わせて変換式の組み合わせを作成する一致性解析部と、
前記一致性解析部により作成された変換式の組み合わせに基づいて前記解析部が作成した構造木を変換することによりソースコードを変換する作成部と、
を備えたことを特徴とするソースコード変換装置。
【請求項２】
前記解析部は、ソースコード内のループ文について、「ｆｏｒ」文に変換した際の第３式を前記構文木に記述する請求項１に記載のソースコード変換装置。
【請求項３】
前記解析部は、２のべき乗になっている定数について、前記構造木にその旨を記述する請求項１記載のソースコード変換装置。
【請求項４】
前記解析部は、ソースコード内の任意のローカル変数が、グローバル変数または他のローカル変数と同名であった場合には、この任意のローカル変数について名前を変更して前記構造木に記述する請求項１記載のソースコード変換装置。
【請求項５】
前記作成部により予め作成された複数パターンのソースコードに基づいてコンパイラ特性を作成するフィードバック解析部を備え、
前記一致性解析部は、前記パターン表に、このフィードバック解析部により作成されたコンパイラ特性及び前記ポリシに照らし合わせて変換式の組み合わせを作成する請求項１記載のソースコード変換装置。
【請求項６】
ソースコードの構造を解析して構造木を作成する解析ステップと、
ソースコードの複数の変換パターンを示すパターン表を、ソースコードを変換するためのポリシに照らし合わせて変換式の組み合わせを作成する一致性解析ステップと、
前記一致性解析ステップにより作成された変換式の組み合わせに基づいてソースコードを変換する作成ステップと、
を行うことを特徴とするソースコード変換方法。
【請求項７】
前記解析ステップにて、ソースコード内のループ文について、「ｆｏｒ」文に変換した際の第３式を前記構文木に記述する請求項６に記載のソースコード変換方法。
【請求項８】
前記解ステップにて、２のべき乗になっている定数について、前記構造木にその旨を記述する請求項６記載のソースコード変換方法。
【請求項９】
前記解析ステップにて、ソースコード内の任意のローカル変数が、グローバル変数または他のローカル変数と同名であった場合には、この任意のローカル変数について名前を変更して前記構造木に記述する請求項６記載のソースコード変換方法。
【請求項１０】
前記一致性解析ステップにて、前記作成ステップにより予め作成された複数パターンのソースコードに基づいてコンパイラ特性を作成するとともに、前記パターン表を、このフィードバック解析部により作成されたコンパイラ特性及び前記ポリシに照らし合わせて変換式の組み合わせを作成する請求項１記載のソースコード変換方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソースコードを複数のパターンに変換するソースコード変換装置及びソースコード変換方法に関する。
【背景技術】
【０００２】
組み込みシステムにおいてはソースコードの性能が優先される局面が多い。しかし、時間的性能と空間的性能はトレードオフの関係にあることが多く、そのトレードオフを充分に検討する必要がある。特に組込みシステムでは、プラットフォーム（ＣＰＵ等）の変更が頻繁に発生し、その度にコンパイラが変更される。その上、組込みシステムで使用されるコンパイラは、コードの書き方により最適化の利き具合が異なる。しかしながら、ソースコードの最適化のノウハウを習得するコストを多くかけることは望ましくない。
【０００３】
また、組み込みシステムにおいて最適化オプションを用いることも考えられるが、例えばテスト版と製品版とで同じオブジェクトファイルを使いたいとか、デバッガでソースコードとの対応がとりにくくなる等の理由により、最適化オプションを使いたくない場面も想定し得る。
【０００４】
よって、組み込みシステムに使用されるソースコードは、コンパイラや性能面での要求に合わせて記述される必要がある。しかし、開発の際には常に同じコンパイラが使われるとは限らず、また性能面での要求もＣＰＵやメモリ搭載量等はターゲットシステムにより異なっている。従って、どのようなソースコードが開発環境にあったソースコードなのかを知る必要もある。
【０００５】
そのためには、多くのソースコードが試験されることにより最適なものが選択されることが望ましい。コンパイラを変更した際に、当初のコンパイラに最適化したソースコードのままだと、逆に最適化の機会を逃したり必要もないのに可読性が低下したままになっていたりする。これらの試行には多くの組み合わせのソースコードが必要となるが、それを人手で生成するのは、現実的ではない。実際に現場のソースコードを読むとあちこちに当初のコンパイラに合わせて記述された名残が存在することがあり、その場合、可読性が低下している。
【０００６】
そこで、ソースコードの最適化を行うシステムが提案されている（特許文献１参照）。このシステムは、ソースコードにおいてループ処理内で使用されるコードの一部を削除することにより、処理速度の向上やコードサイズの低減を図っている。
【特許文献１】特開平７−３６７０７号公報
【発明の開示】
【発明が解決しようとする課題】
【０００７】
ソースコードを最適化する際には、以下のような課題がある。
【０００８】
人間系での試行においては、ある開発環境において、どのような記述法が良いか知るにはコンパイラのマニュアルや試行が必要である。ただし、等価な機能を生成する書法は多くあり、それを一々人が試すのは時間的に現実的な作業ではなく問題となっている。
【０００９】
コンパイラにおいては、ターゲットとなるマシン上で効率よく動作するようにコードを最適化をする必要がある。また、コンパイル中の後工程で利用（最適化）しやすいように変換を実施しているが、その方法は、ユーザが評価を行いフィードバックをかけることができず、他コンパイラで利用することもできないため、開発環境が変わりコンパイラが変わることが多い分野では大きな問題となる。
【００１０】
さらに、オプション設定によりユーザからトレードオフの選択を受ける方法も用いられているが、その設定の粒度は荒く、細かな設定を実施することができない。数十ｋバイト以下に収まるように速度優先等を考慮する必要があるが、速度優先やメモリ優先等の簡単な条件程度しか決定できない。
【００１１】
その上、コンパイラにより予めどのような最適化を可能かが決まってしまい、書法などにより最適化のばらつきが生じる可能性がある。そのため、コンパイラを変えた場合にかえって最適化を妨げたり、最適化に影響がないにもかかわらず可読性が低下したままとなっている可能性があり問題である。
【００１２】
ケースツールにおいては、ソースコードのリバースエンジニアリングを行いモデルを出力することが望まれる。また、モデルからソースコードを（半）自動生成することが望まれる。この方法は、全体を見れば、ソースコードからソースコードを出力しているように見えるが、下記の制約がある。
【００１３】
・リバースエンジニアリングでは、ケースツールに対応したダイアグラムで表現できるものに対応するソースコードしか変換できない。また、ソースコードの書式を指定するものもある。これでは、既に書いてしまったソースコードをケースツールに入力することは難しい。
【００１４】
・モデルからソースコードを生成する際に最適化を行うものもあるが、モデル上の情報を基に最適化を行っているため、モデルにない部分についてまで考慮できるわけではない。最適化を行うためには、プログラマがモデルや指定のフォーマットでソースコードを記述する必要がある。既にソースコードが存在している場合、指定のフォーマットに書き直す作業が必要である。
【００１５】
リファクタリングツールにおいては、ソースコードについて、ユーザの指示に従って修正する必要がある部分をできる限り少なくすることが望ましい。この際、手作業で書き直すのに比べ間違い等が少なくなるのは確かであるが、一度に複数のソースコードを生成するわけではなく、ある程度、ユーザがどこをどう直せばよいのかわかっている必要がある。したがって、この方法では、コンパイラに関するノウハウが蓄積されていない時点で、つまり試行錯誤が必要な状況では、手間を大きく削減することはできない。
【００１６】
本発明は、上記課題を鑑みなされたもので、元のソースコードを、可能な限り多彩な変換パターンの中から、適切なパターンのソースコードに変換することができるソースコード変換装置及びソースコード変換方法を提供することを目的とする。
【課題を解決するための手段】
【００１７】
上記課題を解決するために、本発明に係るソースコード変換装置は、ソースコードの構造を解析して構造木を作成する解析部と、ソースコードの複数の変換パターンを示すパターン表を記憶する記憶部と、ソースコードを変換するためのポリシを有するとともに、前記記憶部が記憶するパターン表を前記ポリシに照らし合わせて変換式の組み合わせを作成する一致性解析部と、前記一致性解析部により作成された変換式の組み合わせに基づいてソースコードを変換する作成部と、を備えたことを特徴とする。
【００１８】
また、本発明に係るソースコード変換方法は、ソースコードの構造を解析して構造木を作成する解析ステップと、ソースコードを変換するためのポリシを有するとともに、ソースコードの複数の変換パターンを示すパターン表を前記ポリシに照らし合わせて変換式の組み合わせを作成する一致性解析ステップと、前記一致性解析ステップにより作成された変換式の組み合わせに基づいてソースコードを変換する作成ステップと、を行うことを特徴とする。
【発明の効果】
【００１９】
本発明に係るソースコード変換装置及びソースコード変換方法によると、元のソースコードを、可能な限り多彩な変換パターンの中から、適切なパターンのソースコードに変換することが可能となる。
【発明を実施するための最良の形態】
【００２０】
本発明に係るソースコード変換装置及びソースコード変換方法の実施形態を、添付図面に基づいて詳細に説明する。
【００２１】
〔第１実施形態〕
図１は、本発明に係るソースコード変換装置の第１実施形態を示すシステム構成図である。
【００２２】
第１実施形態のソースコード変換装置１は、ソースコード２０の変換を行うＰＣ（Ｐｅｒｓｏｎａｌ  Ｃｏｍｐｕｔｅｒ）等の装置であり、ソースコード２０の構文解析を行って構文木を作成する構文解析部２と、構文解析部２により作成された構文木に対して文脈解析を行う文脈解析部３と、構文のバリエーションパターンを記憶するバリエーションパターン記憶部４と、バリエーションパターン記憶部４が記憶するバリエーションパターンを変換ポリシ４０に照らし合わせて変換式の組み合わせを作成するバリエーションパターン一致性解析部５と、バリエーションパターン一致性解析部５により作成された変換式の組み合わせに基づいて複数パターンのソースコード２０を変換するバリエーション生成部６と、バリエーション生成部６により生成されたソースコード２０Ａに対してコンパイルやプロファイリング、解析を行うコンパイラ・プロファイラ・静的解析ツール７と、を備えている。
【００２３】
ソースコード変換装置１による変換の対象となるソースコード２０は、Ｃ言語等のプログラミング言語の文法に則り、動作確認ができた既存のソースコード２０をプリプロセッサ（前処理系）にかけたものとする。
【００２４】
構文解析部２は、ソースコード２０を構文解析し、その解析結果を図２に示すような構造木形式で出力する。構造木の各ノードには、行番号、予約語、数値、条件式、代入式、単項演算式、スコープの情報が蓄積される。
【００２５】
行番号の情報は、変換時に変更箇所を指定するために利用される。予約語は、プログラミング言語の仕様で定められた、変数名や関数名として定義できない単語であり、「ｉｆ」、「ｆｏｒ」、「ｗｈｉｌｅ」、「ｒｅｔｕｒｎ」、「ｔｒｕｅ」等を予約語としているプログラム言語が多い。この予約語の情報は、他形式の条件文へ変換する際に利用される。数値の情報は、例えば２のべき乗であるか否か等の情報である。条件式は、等値演算に使われる変数で、例えば「ｉｆ」等の条件文において使用される。この条件式の情報は、「ｓｗｉｔｃｈ」文等への変換に利用される。代入式や単項演算式は、繰り返し文のカウンタとして利用されているか否かを調べるために利用される。スコープとは変数や関数の有効範囲である。
【００２６】
文脈解析部３は、構文解析部２による構文解析の解析結果（構造木)をたどり、文脈、すなわちコードの前後関係から導かれる情報をこの構造木に付加する。
【００２７】
例えば、「ｗｈｉｌｅ」文の条件式に使われている変数が、サブ文（ループ文）中でカウンタ（「ｆｏｒ」文の第３式）として利用されているかを確認する。また、スコープ内で新たに定義した変数が既に定義済みの変数を隠蔽する場合、隠蔽しない変数名を新たに生成し、ノードに記録する。
【００２８】
バリエーションパターン記憶部４は、図３に示すようなバリエーションパターン表３０を予め記憶している。バリエーションパターン表３０は、繰り返し文や条件文、２のべき乗を用いた乗除算のバリエーションを生成する様々なパターンが記述されている表である。
【００２９】
例えば図３に示すバリエーションパターン表３０においては、ソースコード２０のパターンとして、パターンＡ、パターンＢ、パターンＣの３種類のパターンが示されている。パターンＡの１行目（「１Ａ」の欄）は、「ｆｏｒ  （＜Ａ＞；＜ｂ＞；＜Ｃ＞）  ＜Ｄ＞」と示されていて、パターンＢの１行目（「１Ｂ」の欄）には、「＜Ａ＞；  ｗｈｉｌｅ（＜Ｂ＞）  〔＜Ｄ＞＜Ｃ＞〕」と示されていて、また、パターンＣの１行目（「１Ｃ」の欄）には、「＜Ａ＞；  ｄｏ｛＜Ｄ＞；＜Ｃ＞｝  ｗｈｉｌｅ  （＜Ｂ＞）；」と示されている。これらの１Ａ、１Ｂ、１Ｃはパターンは違うが同義である。同様に、２Ａ、２Ｂ、２Ｃ、及び、３Ａ、３Ｂ、３Ｃも同義である。
【００３０】
バリエーションパターン一致性解析部５は、ソースコード変換を行うための方針を示した変換ポリシ４０とバリエーションパターン表３０とを照らし合わせ、バリエーションパターン表３０の各々の変換パターンから変換ポリシ４０の変換方針と一致している構文を見つけ出す。例えば、繰り返し文であれば、構文解析の解析結果において、図３に示した＜Ａ＞、＜Ｂ＞、＜Ｃ＞、＜Ｄ＞に一致する部分が現れているとする。このとき、バリエーションパターン一致性解析部５は、変換ポリシ４０に基づいて、不要なバリエーションを生成する変換式を削除する。
【００３１】
変換ポリシ４０は、図４に示すように、変換する際に、バリエーション指定で利用しないパターンや変換しない関数を選択するための方針を示したものであり、バリエーション一致性解析部が予め記憶している。なお、変換ポリシ４０には、効果的に変換パターンを抑制するために、読みやすさといった指標も与えられている。バリエーションパターン一致性解析部５は、この変換ポリシ４０に基づいてソースコード２０の変換を行う。
【００３２】
図４に示した変換ポリシ４０において、「Ｒｅａｄａｂｌｅ」では、図３のセル（例えば「１Ａ」等）を続けて記述することで、可読性が高い変換パターンを指定する。変換ポリシ４０において複数のセルが指定されている場合は、先（左側）に書かれたセルの方が可読性が高いこととする。「Ｕｎｕｓｅ」では、変換パターンとして利用しないセルや関数を指定する。これは、可読性が著しく落ちる変換や性能等に特に貢献しない無用な変換を抑制するためのものである。
【００３３】
また、「Ｎｏｔ  Ｏｐｔｉｍｉｚｅ  Ｆｕｎｃｔｉｏｎ」では、変換しない関数を指定する。「Ｎｏｔ  Ｏｐｔｉｍｉｚｅ  Ｆｉｌｅ」では、変換しないファイルを指定する。「Ｏｐｔｉｍｉｚｅ  Ｐｒｉｏｒｉｔｙ」では、変換する際に優先する項目（Ｓｐｅｅｄ、ＲｏｍＳｉｚｅ、ＳｔａｃｋＳｉｚｅ、ＲａｍＳｉｚｅ等）を指定する。
【００３４】
なお、各変換ポリシ４０でトレードオフが生じる場合、より上に書かれた変換ポリシ４０が優先される。
【００３５】
変換ポリシにおける変換方針の典型的な例を、以下の（１）〜（６）に挙げる。（１）〜（４）は所定のコンパイラに対して最適化する際の方針であり、（５）〜（６）はソースコード２０の可読性をあげるための方針である。  
（１）ポインタを用いた間接メモリアクセスは最適化されにくいのでポインタアクセスを局所化する。  
（２）一般的に「ｄｏ」〜「ｗｈｉｌｅ」が最もＲＯＭサイズを消費しないので、「ｄｏ」〜「ｗｈｉｌｅ」を優先して利用する。  
（３）一般的に「ｉｆ」文が最もＲＯＭサイズを消費しないので、「ｉｆ」文に統一する。  
（４）コンパイラのバグに該当するパターンを除く。  
（５）排他的な条件分岐には、「ｉｆ」〜「ｅｌｓｅ」文を用いる。  
（６）「ｓｗｉｔｃｈ」文が使える場合には、「ｓｗｉｔｃｈ」文を用いる。
【００３６】
また、バリエーションパターン一致性解析部５は、変換式の組み合わせを生成する。変換を行うスコープは、構文解析時に得たソースコード２０のファイル名とソースコード２０の行番号の情報から知ることができる。変換式は、正規表現に基づくｓｅｄ（ＵＮＩＸ（登録商標）等のコマンドライン環境で使われる、定型的なテキストデータの処理を行うプログラム）等の文字列変換ツールで扱える変換式とする。
【００３７】
そして、バリエーションパターン一致性解析部５は、バリエーションパターン表３０の各セル毎に生成された変換式をリストとしてつなぎ、変換式の組み合わせ毎にリストを生成する。
【００３８】
バリエーション生成部６は、バリエーションパターン一致性解析部５により作成された変換式の組み合わせを利用し、構文解析部２により構文解析される前の元のソースコード２０のバリエーションパターンを、変換式の組み合わせの分だけ生成する。
【００３９】
コンパイラ・プロファイラ・静的解析ツール７は、開発環境に合わせたコンパイラやプロファイラ、静的解析ツール７であり、必要に応じて設けられる。この静的解析ツール７は、ユーザがバリエーション生成部６により生成されたソースコード２０Ａを評価する際に用いられる。
【００４０】
ソースコード変換装置１では、ソースコード２０を元のコードと等価な様々なバリーションの複数のソースコード２０Ａに変換するソースコード変換処理を行う。ソースコード変換装置１がソースコード変換処理を行う際の手順について、図５、図６、図８、及び図９に示すフローチャートに基づいて説明する。
【００４１】
始めに、構文解析部２が、ソースコード２０のデータ構造を解析して、構造木を作成する（Ｓ１０１）。
【００４２】
次に、文脈解析部３が文脈解析を行う。文脈解析部３は、文脈解析として、例えば「ｆｏｒ」文の第３式（「ｆｏｒ」文の中で指定される３つの構文のうちの３番目の構文）を抽出する第３式抽出処理（Ｓ１０３）、例えばビットシフト可能な計算式を抽出する計算式抽出処理（Ｓ１０５）、例えばグローバル変数に隠蔽されてしまうローカル変数を検出する隠蔽変数検出処理（Ｓ１０７）を行う。
【００４３】
図６は、文脈解析部３が第３式抽出処理を行う手順を示すフローチャートである。文脈解析部３は、「ｗｈｉｌｅ」文等のループ文を「ｆｏｒ」文に変換する際に、「ｆｏｒ」文の第３式（「ｆｏｒ」文において指定される３つの構文のうちの３番目の構文）の候補をいくつか抽出し、これらから第３式を確定する。
【００４４】
まず、文脈解析部３は、構文解析部２により作成された構造木を取得する（Ｓ２０１）。また文脈解析部３は、Ｓ２０１で取得した構造木から、例えば「ｗｈｉｌｅ」文等の繰り返しの条件式で使われている変数群を取得する（Ｓ２０３）。
【００４５】
文脈解析部３は、Ｓ２０３で取得した変数群から構文を取得する（Ｓ２０５）。そして文脈解析部３は、Ｓ２０５で取得した構文が、「ｆｏｒ」文の第３式候補で使われている変数を参照しているか否かを判断する（Ｓ２０７）。この「ｆｏｒ」文の第３式候補は、後述するＳ２１９の処理で既に選出されたものとする。その変数を参照している場合（Ｓ２０７のＹｅｓ）、例えばインクリメント等で使用している場合には「ｆｏｒ」文の第３式ではないので、参照している変数を用いる「ｆｏｒ」文の第３式候補から外す（Ｓ２０９）。なお、第３式候補が選出されていない場合は、そのままＳ２１１に進む。
【００４６】
文脈解析部３は、Ｓ２０５で取得した構文が代入文（単項演算も含む）を含むか否かを判断する（Ｓ２１１）。構文が代入式を含まない場合（Ｓ２１１のＮｏ）は、文脈解析部３は、Ｓ２０５に戻り、次の構文を取得する（Ｓ２０５）。
【００４７】
構文が代入文を含む場合（Ｓ２１１のＹｅｓ）は、文脈解析部３は、Ｓ２０５で取得した構文に含まれる代入文を取得し、検査対象の代入文とする（Ｓ２１３）。文脈解析部３は、代入文から代入される変数を取得する（Ｓ２１５）。
【００４８】
文脈解析部３は、Ｓ２１３で取得した変数が、条件式で使用されている変数群（Ｓ２０３で取得しされた変数群）の中にあるか否かを判断する（Ｓ２１７）。変数が変数群の中にある場合（Ｓ２１７のＹｅｓ）は、文脈解析部３は、検査対象とした代入文を「ｆｏｒ」文の第３式候補とする（Ｓ２１９）。この「ｆｏｒ」文の第３式候補は、Ｓ２０７、Ｓ２０９の処理で使用される。
【００４９】
変数が変数群にない場合（Ｓ２１７のＮｏ）は、文脈解析部３は、Ｓ２０５で取得した構文に、Ｓ２１５からＳ２１７の処理が行われていない未処理の代入文があるか否かを判断する（Ｓ２２１）。未処理の代入文がある場合（Ｓ２２１のＹｅｓ）は、文脈解析部３は、Ｓ２１３に戻って、未処理の代入式を検査対象の代入文とする。
【００５０】
未処理の代入文がない場合、すなわち全ての代入文に対してＳ２１３からＳ２１７（またはＳ２１９）までの処理を行った場合（Ｓ２２１のＮｏ）、または、代入文を「ｆｏｒ」文の第３式候補とした場合（Ｓ２１９）は、文脈解析部３は、未処理の構文があるか否かを判断する（Ｓ２２３）。未処理の構文があった場合（Ｓ２１３のＹｅｓ）は、Ｓ２０５に戻って次の構文を取得し（Ｓ２０５）、再びＳ２０７からＳ２２３の処理を行う。
【００５１】
未処理の構文がない場合、すなわち全ての構文に対してＳ２０５からＳ２２１（またはＳ２１９）までの処理を行った場合は、文脈解析部３は、Ｓ２１３で検査対象とした代入文を「ｆｏｒ」文の第３式として決定する（Ｓ２２５）。
【００５２】
また文脈解析部３は、Ｓ２２５で決定した「ｆｏｒ」文の第３式を、構造木に追加する（Ｓ２２７）。なお、追加後の構造木を図７に示す。図７に示す記述Ａのように、図２に示した構造木に、『「ｆｏｒ」文にした場合の第３式』、『「ｆｏｒ」文の第３式として利用可能か』の情報が追加される。
【００５３】
また、Ｓ２２５で決定された第３式に使われている変数について、Ｓ２０３で取得した変数群において最初に定義がされていた場合は、文脈解析部３は、これを「ｆｏｒ」文の第１式として、構造木に『「ｆｏｒ」文にした場合の第１式』の情報を追加する。
【００５４】
このようにして、文脈解析部３により第３式候補抽出処理が行われる。
【００５５】
次に文脈解析部３は、ビットシフト可能な計算式を抽出する計算式抽出処理を行う（Ｓ１０５）。文脈解析部３がこの計算式抽出処理を行う手順を、図８に示すフローチャートに基づいて説明する。
【００５６】
まず文脈解析部３は、Ｓ２２５により「ｆｏｒ」文の第３式候補が追加された構造木を取得する（Ｓ３０１）。また文脈解析部３は、Ｓ３０１で取得した構造木から、例えば「ｗｈｉｌｅ」文等の繰り返しの条件式で使われている変数群を取得する（Ｓ３０３）。
【００５７】
文脈解析部３は、Ｓ３０３で取得した変数群から構文を取得する（Ｓ３０５）。そして文脈解析部３は、Ｓ３０５で取得した構文の中に２のべき乗になっている定数値があるか否かを判断する（Ｓ３０７）。２のべき乗になっている定数値がある場合（Ｓ３０７のＹｅｓ）は、文脈解析部３は、その定数値を取得する（Ｓ３０９）。
【００５８】
文脈解析部３は、Ｓ３０９で取得した定数値が乗除算に利用されているか否かを判断する（Ｓ３１１）。Ｓ３０９で取得した定数値が乗除算に利用されている場合（Ｓ３１１のＹｅｓ）は、文脈解析部３は、この定数値がビットシフト可能であるとする（Ｓ３１３）。そして、文脈解析部３は、この定数値がビットシフト可能である旨を、Ｓ３０１で取得した構造木に追加する（Ｓ３１５）。具体的には、図７に示す記述Ｂのように、図２に示した構造木に、『２のべき乗』の情報が追加される。
【００５９】
また、Ｓ３０９で取得した定数値が乗除算に利用されていない場合（Ｓ３１１のＮｏ）は、文脈解析部３は、その低数値がビットシフト可能でないとする（Ｓ３１７）。この場合は、文脈解析部３はＳ３０１で取得した構造木への追加は行わない。
【００６０】
Ｓ３１５またはＳ３１７の処理が完了すると、あるいはＳ３０５で取得した構文の中に２のべき乗になっている定数値がなかった場合（Ｓ３０７のＮｏ）は、文脈解析部３は、Ｓ３０３で取得した変数群の中に、Ｓ３０５からＳ３１５（またはＳ３１７）までの処理が行われていない未処理の構文があるか否かを判断する（Ｓ３１９）。
【００６１】
未処理の構文があった場合（Ｓ３１９のＹｅｓ）は、文脈解析部３は、Ｓ３０５に戻って未処理の構文を取得する。また、未処理の構文がなかった場合、すなわちＳ３０３で取得した変数群の中の全ての構文についてＳ３０５からＳ３１５（またはＳ３１７）までの処理がなされた場合（Ｓ３１９のＮｏ）は、文脈解析部３は、計算式抽出処理を終了する。
【００６２】
文脈解析部３は、計算式抽出処理を終了すると、例えばグローバル変数に隠蔽されてしまうローカル変数を検出する隠蔽変数検出処理（Ｓ１０７）を行う。文脈解析部３がこの隠蔽変数検出処理を行う際の手順を、図９に示すフローチャートに基づいて説明する。
【００６３】
ソースコード２０内で複数のローカル変数が使用されるが、ローカル変数は局所的に宣言される関数であるため、同一のソースコード２０内に同定義のローカル変数が多数存在する可能性がある。同定義のローカル変数が複数存在した場合には、個々のローカル変数を識別することが困難になってしまう。これを防止するために、文脈解析部３は、同定義のローカル変数を検出する隠蔽変数検出処理を行う。
【００６４】
文脈解析部３は、計算式抽出処理を終えた構造木を取得する（Ｓ４０１）。また文脈解析部３は、Ｓ４０１で取得した構造木からグローバル変数を取得する（Ｓ４０３）。文脈解析部３は、Ｓ４０３で取得したグローバル変数を羅列することにより、変数リストを作成する（Ｓ４０５）。
【００６５】
文脈解析部３は、Ｓ４０１で取得した構造木から、例えば「ｗｈｉｌｅ」文等の繰り返しの条件式で使われている変数群を取得する（Ｓ４０７）。また文脈解析部３は、Ｓ４０７で取得した変数群から構文を取得する（Ｓ４０９）。
【００６６】
文脈解析部３は、未処理のローカル変数があるか否かを判断する（Ｓ４１１）。未処理のローカル変数とは、後述するＳ４１３からＳ４２１の処理が行われていないローカル変数とする。
【００６７】
未処理のローカル変数があった場合（Ｓ４０７のＹｅｓ）は、文脈解析部３は、このローカル変数を取得する（Ｓ４１３）。そして文脈解析部３は、Ｓ４０５で作成した変数リストの中に、Ｓ４１３で取得したローカル変数と同定義（例えば同名）のものが含まれているか否かを判断する（Ｓ４１５）。
【００６８】
ローカル変数が変数リストに含まれている場合（Ｓ４１５のＹｅｓ）は、ローカル変数が他のローカル変数またはグローバル変数と重複しているため、このローカル変数を、変数リストに含まれていない任意のローカル変数に変更する（Ｓ４１７）。この際、ローカル変数は、例えば名前を変更すること等により、変更される。
【００６９】
文脈解析部３は、ローカル変数を変数リストに追加する（Ｓ４１９）。この際、文脈解析部３は、Ｓ４１７にてローカル変数を変更した場合には、変更後のローカル変数を変数リストに追加し、ローカル変数が変数リストに含まれていなかった場合（Ｓ４１５のＮｏ）には、Ｓ４１３で取得したローカル変数を変数リストに追加する。
【００７０】
また文脈解析部３は、ローカル変数を構造木に追加する（Ｓ４２１）。この場合もＳ４１９と同様に、文脈解析部３は、Ｓ４１７にてローカル変数を変更した場合には、変更後のローカル変数を構造木に追加し、ローカル変数が変数リストに含まれていなかった場合（Ｓ４１５のＮｏ）には、Ｓ４１３で取得したローカル変数を構造木に追加する。具体的には、図７に示す記述Ｃのように、図２に示した構造木に、ローカル変数の『別名候補』の情報が追加される。
【００７１】
文脈解析部３は、Ｓ４０９からＳ４２１までの処理を行っていない未処理の構文があるか否かを判断する（Ｓ４２３）。未処理の構文がある場合（Ｓ４２３のＹｅｓ）は、Ｓ４０９に戻り、未処理の構文を取得し、Ｓ４１１からＳ４２１までの処理を行う。未処理の構文がない場合（Ｓ４２３のＮｏ）は、文脈解析部３は、隠蔽変数検出処理を終了する。
【００７２】
文脈解析部３による隠蔽変数検出処理が終了すると、バリエーションパターン一致性解析部５は、変換ポリシ４０に基づいて、バリエーションパターンの一致性を解析する。
【００７３】
まず、バリエーションパターン一致性解析部５は、バリエーションパターン記憶部４が記憶しているバリエーションパターン表３０（図３）を取得する（Ｓ１１１）。また、バリエーションパターン一致性解析部５は、自身が記憶している変換ポリシ４０（図４）を取得する（Ｓ１１３）。
【００７４】
バリエーションパターン一致性解析部５は、Ｓ１１１で取得したバリエーションパターン表３０とＳ１１３で取得した変換ポリシ４０とを比較し、変換ポリシ４０に適合したバリエーションパターンを一つまたは複数選出して、それぞれソースコード２０を変換するための変換式の組み合わせを作成する（Ｓ１１５）。
【００７５】
そしてバリエーション生成部６は、Ｓ１１５にてバリエーションパターン一致性解析部５が作成した変換式の組み合わせに基づいて、元のソースコード２０を変換し、各々のバリエーションパターンのソースコード２０Ａを生成する（Ｓ１１７）。
【００７６】
なお、第１実施形態として、第３式抽出処理、計算式抽出処理、及び隠蔽変数検出処理を別々に行う例を説明したが、これに限らず、構文を取得する処理（Ｓ２０５、Ｓ３０５、Ｓ４０９）までを同時に行うことにより、並列して各処理を行っても良い。この際には、Ｓ４０３及びＳ４０５の処理は、前もって行われているものとする。
【００７７】
また、ソースコード変換装置１を用いてソースコード２０を複数のパターンのソースコード２０Ａに変換した後に、ユーザがコンパイラ・プロファイラ・静的解析ツール７を用いて、ソースコード２０Ａをコンパイラにかけたり変換されたソースコードを評価したりして、利用すべき変換パターンを決定すると良い。
【００７８】
さらに、第１実施形態において隠蔽変数検出処理にてローカル変数がグローバル変数または他のローカル変数に隠蔽されていることを例に挙げて説明したが、これに限らず、グローバル変数がローカル変数に隠蔽されている場合にも同様の処理を行う。
【００７９】
ソースコード変換装置１によると、ソースコード２０に対して、複数のバリエーションパターンから可能な限りの変換パターンを選出することにより、様々なパターンのソースコード２０Ａに変換することが可能となる。
【００８０】
また、ソースコード変換装置１によると、変換ポリシ４０を明らかに不要な変換を行わないように設定することにより、ソースコード２０を、所望のパターンのソースコード２０Ａに狙いを定めて変換させることが可能となる。
【００８１】
また、ソースコード変換装置１によると、ソースコード２０を変換する際に、例えばローカル変数がグローバル変数に隠蔽されている場合等に、単純に変数名のみを使って変換していくと変数の隠蔽が生じてしまう可能性がある。変数が隠蔽されている箇所を把握しておくことにより、変換範囲を指定する事で、変換する際に隠蔽されている箇所を除いたり、その部分だけを変換したりすることが可能になる。
【００８２】
〔第２実施形態〕
本発明に係るソースコード変換装置及びソースコード変換方法の第２実施形態について、図１０及び図１１に基づいて説明する。なお、第１実施形態と同一の構成には同一の符号を付し、重複する説明を省略する。
【００８３】
図１０は、第２実施形態のソースコード変換装置１Ａを示すシステム構成図である。第２実施形態のソースコード変換装置１Ａは、第１実施形態と同様に、ソースコード２０の変換を行うＰＣ（Ｐｅｒｓｏｎａｌ  Ｃｏｍｐｕｔｅｒ）等の装置であり、ソースコード２０の構文解析を行って構文木を作成する構文解析部２と、構文解析部２により作成された構文木に対して文脈解析を行う文脈解析部３と、構文のバリエーションパターンを記憶するバリエーションパターン記憶部４と、バリエーションパターン記憶部４が記憶するバリエーションパターンを変換ポリシ４０Ａに照らし合わせて変換式の組み合わせを作成するバリエーションパターン一致性解析部５Ａと、バリエーションパターン一致性解析部５Ａにより解析された変換式の組み合わせに基づいてソースコード２０を複数のパターンに変換するバリエーション生成部６と、コンパイルやプロファイリング、解析を行うコンパイラ・プロファイラ・静的解析ツール７と、を備えている。
【００８４】
ソースコード変換装置１Ａによる変換の対象となるソースコード２０は、第１実施形態と同様に、Ｃ言語等のプログラミング言語の文法に則り、動作確認ができた既存のソースコード２０をプリプロセッサ（前処理系）にかけたものとする。
【００８５】
第２実施形態のソースコード変換装置１Ａが第１実施形態のソースコード変換装置１と異なる点はバリエーションパターン一致性解析部５Ａにより変換式を作成する際に、コンパイラ特性５０を用いている点である。第２実施形態のソースコード変換装置１Ａは、予めソースコード変換を行って得た複数パターンのソースコード２０を解析、プロファイリングし、フィードバック情報としてコンパイラ特性５０を作成するとともに、このコンパイラ特性５０を加えた変換ポリシ４０を利用してソースコード２０の変換を行う。
【００８６】
よって、ソースコード変換装置１Ａのバリエーションパターン一致性解析部５Ａが保持している変換ポリシ４０Ａには、図１１に示すように、コンパイラ特性５０と連携させる記述が含まれている。
【００８７】
例えば「Ｏｐｔｉｍｉｚｅ  Ｐｒｉｏｒｉｔｙ」は、ソースコード２０を変換する際に優先する項目（Ｓｐｅｅｄ、ＲｏｍＳｉｚｅ、ＳｔａｃｋＳｉｚｅ、ＲａｍＳｉｚｅ、Ｒｅａｄａｂｌｅ）を指定する。「Ｓｐｅｅｄ」は、時間的効率性を優先する場合、「ＲｏｍＳｉｚｅ」は、ロムサイズ削減を優先する場合、「ＳｔａｃｋＳｉｚｅ」は、スタックサイズ削減を優先する場合、「ＲａｍＳｉｚｅ」はラムサイズ削減を優先する場合、「Ｒｅａｄａｂｌｅ」は可読性を優先する場合に用いる。複数の項目が指定された場合、左側の項目がより優先される。ソースコード変換装置１Ａがソースコード変換を行う際には、これらの項目に貢献しないことが分かっている変換は行われない。
【００８８】
「Ｏｐｔｉｍｉｚｅ  ＲｏｍＳｉｚｅ」には、ソースコード変換時に、どの程度のロムサイズを削減すべきかをバイト単位で指定する。変換前のソースコード２０に比べ、指定された分だけＲｏｍＳｉｚｅを削減したらＲｏｍＳｉｚｅ削減を優先する変換を行わない。それまでは、ＲｏｍＳｉｚｅ削減に貢献する変換を優先して変換する。
【００８９】
「Ｏｐｔｉｍｉｚｅ  ＲｕｎｎｎｉｎｇＴｉｍｅ」には、ソースコード変換時にどの程度、実行性能を向上させるべきかを指定する。指定された数値の分だけ実行時間を削減できたら、ソースコード変換を行わない。この変換ポリシ４０が指定されていた場合、実行効率向上に貢献する変換を優先して変換する。
【００９０】
「Ｏｐｔｉｍｉｚｅ  ＲｕｎｎｎｉｎｇＴｉｍｅ％」は、よく実行される箇所を優先して変換することを指定する。指定された数値は、変換箇所の実行時間に占める割合を指す。実行時間に占める割合を超えたら、残りのファイルや関数に対して変換を行わない。実行時間の多い関数から変換し、変換した関数の累積値が実行時間に占める割合を超えたら変換をやめる。
【００９１】
コンパイラ特性５０は、図１２に示すように、各種変換されたソースコード２０Ａをコンパイル、プロファイリングした結果が記述される。コンパイラ特性５０には、プロファイリング結果、各変換で有意な差が生じなければ、差がないことを記述される。またコンパイラ特性５０には、コンパイルオプションにより、プロファイリング結果に差が出るのであれば、コンパイラオプションごとに記述する。コンパイラ特性５０は、変換ポリシ４０と組み合わせて、コードの変換量を抑制する効果をもたらす。
【００９２】
例えば「Ｓｐｅｅｄ」には、ソースコードの速度的な性能が、ソースコード変換によりどの程度変化したかが記述される。この項目は、図３に示したバリエーションパターン表３０のセル名と、カッコ内の数値で表される。カッコ内の数値は、一番左に示されたセル名のパターンに対する速度の増減であり、所要時間（μ秒単位）で記述される。すなわち、図１２に示すコンパイル特性の１行目は、「Ａ１」のパターンに比べて「Ｂ１」のパターンでは、所要時間が＋３０μ秒であることを意味する。なお、具体的な数値を記述できない場合は、左から速い順に並べて記述するのみでも良い。
【００９３】
「ＲｏｍＳｉｚｅ」、「ＳｔａｃｋＳｉｚｅ」、「ＲａｍＳｉｚｅ」には、図３に示すバリエーションパターン表３０の各パターンにおいて、どの程度ロムサイズ（スタックサイズ、ラムサイズ）が変換するかが記述される。これらの項目は、バリエーションパターン表３０のセル名と、カッコ内の数値で表される。カッコ内の数値は、一番左に示されたセル名のパターンに対する増減量であり、バイト単位で記述される。
【００９４】
「ＲｕｎｎｉｎｇＴｉｍｅＲａｔｅ」には、シナリオ名を定義し、そのシナリオでの各関数の実行時間の割合を記述する。例えば図１２に示すように、カッコ内にシナリオ名を記述し、関数名の後にプロファイル時の実行時間の割合（％単位）を記述する。
【００９５】
「ＢＵＧ」には、変換されたソースコード２０Ａをコンパイルした際に、コンパイラのバグやコンパイルエラーにひっかかる恐れのある変換パターンを記述する。例えばバリエーションパターン表３０のセル名で記述される。
【００９６】
ここで、変換ポリシ４０Ａとコンパイラ特性５０との関係性について説明する。変換ポリシ４０Ａ中の「Ｏｐｔｉｍｉｚｅ  Ｐｒｉｏｒｉｔｙ」で優先される項目がコンパイラ特性５０から取得され、優先される項目に対して貢献しない項目が検出される。この優先される項目に対して貢献しない変換はソースコード変換時に実施されない。また、複数の項目が書かれている場合は、全ての項目に貢献しない変換はソースコード変換時に実施されない。
【００９７】
変換ポリシ４０Ａ中の「Ｏｐｔｉｍｉｚｅ  ＲｏｍＳｉｚｅ」の後に数値が指定されている場合、変換前のソースコード２０と比較してその数値（単位はバイトとみなす）の分だけロムサイズを削減されたら、ロムサイズ削減を実施する変換を行わない。この際のロムサイズの削減量は、コンパイラ特性５０に基づいて計算される。変換する順番は、他に優先される指定がなければロムサイズを削減しやすい項目から優先的に変換を行う。コンパイラ特性５０に何も記述されていなければ、無視される。
【００９８】
変換ポリシ４０Ａ中の「Ｏｐｔｉｍｉｚｅ  ＲｕｎｎｎｉｎｇＴｉｍｅ」で指定されている数値の分だけ実行時間が削減されたら、ソースコード２０の変換を行わない。どれだけ実行時間を削減できるかは、コンパイラ特性５０に基づいて計算される。この項目が指定されている場合、実行時間を削減しやすい項目をコンパイラ特性５０を元に選択し、削減しやすい項目から優先的に変換を行う。コンパイラ特性５０に何も記述されていなければ、無視される。
【００９９】
変換ポリシ４０Ａ中の「Ｏｐｔｉｍｉｚｅ  ＲｕｎｎｎｉｎｇＴｉｍｅＲａｔｅ」で指定されている数値は、実行時間に占める割合を指す。実行時間の多い関数から変換され、変換された関数の累積値が実行時間に占める割合を超えたら変換をやめる。実行時間は、コンパイラ特性５０から取得する。コンパイラ特性５０に何も記述されていなければ、無視される。
【０１００】
次に、ソースコード変換装置１Ａがソースコード変換処理を行う際の手順を、図１３に示すフローチャートに基づいて説明する。
【０１０１】
まずソースコード変換装置１Ａは、Ｓ５０１乃至Ｓ５０９の処理として、Ｓ１０１乃至Ｓ１０９と同様の処理を行う。なお、Ｓ５０１乃至Ｓ５０９の処理の説明は省略する。
【０１０２】
バリエーションパターン一致性解析部５Ａは、バリエーションパターン記憶部４から図３に示すバリエーションパターン表３０を取得すると（Ｓ５０９）、図１１に示す変換ポリシ４０及び図１２に示すコンパイラ特性５０を取得する（Ｓ５１１）。
【０１０３】
バリエーションパターン一致性解析部５Ａは、Ｓ５０９で取得したバリエーションパターン表３０を、Ｓ５１１で取得した変換ポリシ４０Ａ及びコンパイル特性とに照らし合わせて、変換ポリシ４０Ａ及びコンパイル特性に適合したバリエーションパターンを一つまたは複数選出して、それぞれソースコード２０を変換するための変換式の組み合わせを作成する（Ｓ５１３）。
【０１０４】
そしてバリエーション生成部６は、Ｓ５１３にてバリエーションパターン一致性解析部５Ａが作成した変換式の組み合わせに基づいて、元のソースコード２０を変換し、各々のバリエーションパターンのソースコード２０Ａを生成する（Ｓ５１５）。
【０１０５】
コンパイル・プロファイラ・静的解析ツール７は、Ｓ５１５で生成されたソースコード２０Ａに対して、コンパイラにかけたりプロファイリングや解析を行ったりして、変換されたソースコード２０Ａを評価し、バリエーションパターン一致性解析部５が保持するコンパイラ特性５０に記述する（Ｓ５１７）。
【０１０６】
第２実施形態のソースコード変換装置１Ａによると、ソースコード変換のフィードバック情報として速度やメモリサイズ等に関するコンパイラ特性５０を取得することにより、コンパイラ特性５０に基づいて速度向上やメモリサイズ削減に有効なソースコード変換を優先して行うことが可能となる。
【０１０７】
また、第２実施形態のソースコード変換装置１Ａによると、ソースコード変換時に、最適化に貢献しない変換を削減したり、特定の部分（例えば実行時間の８０％を占める部分だけ）を最適化したりすることが可能となる。
【０１０８】
特に組込みシステムでは、所要の制約に収まるのであれば、最適化する必要のない場面も存在するので、不必要な最適化を避けて不必要な可読性の低下を防止することが可能となる。
【０１０９】
さらに、第２実施形態のソースコード変換装置１Ａでは、コンパイラ特性５０を取得することにより、コンパイラのバグの原因となる変換を避けることが可能となる。
【０１１０】
なお、第１実施形態及び第２実施形態では、装置内部に発明を実施する機能が予め記録されている場合で説明をしたが、これに限らず、同様の機能がネットワークから装置にダウンロードされても良いし、同様の機能を記録媒体に記憶させたものが装置にインストールされてもよい。
【０１１１】
記録媒体としては、ＣＤ−ＲＯＭ等プログラムを記憶でき、かつ装置が読み取り可能な記録媒体であれば、その形態は何れの形態であっても構わない。
【０１１２】
また、このように予めインストールやダウンロードにより得る機能は、装置内部のＯＳ（オペレーティング・システム）等と協働してその機能を実現させるものであってもよい。
【図面の簡単な説明】
【０１１３】
【図１】本発明に係るソースコード変換装置の第１実施形態を示すシステム構成図。
【図２】ソースコードの変換前のデータ構造を示す図。
【図３】バリエーションパターン表の一例を示す図。
【図４】第１実施形態のソースコード変換装置で用いられる変換ポリシの一例を示す図。
【図５】第１実施形態のソースコード変換装置によるソースコード変換処理の手順を示すフローチャート。
【図６】第１実施形態のソースコード変換装置による第３式抽出処理の手順を示すフローチャート。
【図７】ソースコードの変換後のデータ構造を示す図。
【図８】第１実施形態のソースコード変換装置による計算式置換処理の手順を示すフローチャート。
【図９】第１実施形態のソースコード変換装置による隠蔽変数検出処理の手順を示すフローチャート。
【図１０】本発明に係るソースコード変換装置の第２実施形態を示すシステム構成図。
【図１１】第２実施形態のソースコード変換装置で用いられる変換ポリシの一例を示す図。
【図１２】第２実施形態のソースコード変換装置で用いられるコンパイラ特性の一例を示す図。
【図１３】第２実施形態のソースコード変換装置によるソースコード変換処理の手順を示すフローチャート。
【符号の説明】
【０１１４】
１、１Ａ  ソースコード変換装置
２  構文解析部
３  文脈解析部
４  バリエーションパターン記憶部
５、５Ａ  バリエーションパターン一致性解析部
６  バリエーション生成部
７  コンパイラ・プロファイラ・静的解析ツール
２０、２０Ａ  ソースコード
３０  バリエーションパターン表
４０、４０Ａ  変換ポリシ
５０  コンパイラ特性
【図１】
2008243019.tif 000003
【図２】
2008243019.tif 000004
【図３】
2008243019.tif 000005
【図４】
2008243019.tif 000006
【図５】
2008243019.tif 000007
【図６】
2008243019.tif 000008
【図７】
2008243019.tif 000009
【図８】
2008243019.tif 000010
【図９】
2008243019.tif 000011
【図１０】
2008243019.tif 000012
【図１１】
2008243019.tif 000013
【図１２】
2008243019.tif 000014
【図１３】
2008243019.tif 000015