(58)【調査した分野】(Int.Cl.,DB名)
【背景技術】
【0002】
コンピュータソフトウェアを記述するプログラミング言語(以下、単に言語という)には、ISO規格のような標準化規格に基づく言語仕様を超えて独自に拡張した仕様(以下、拡張言語仕様という)を持つものがあり、例えば、配列、構造体、共用体、演算子、文法等の様々な仕様が拡張される。一例として、C言語およびC++言語のようなプログラミング言語には、例えばISO規格に準拠する標準仕様の他、GNUの拡張仕様のように、言語処理系によって独自に拡張した拡張言語仕様がある。
【0003】
コンパイル装置(コンパイラ)は、ソースプログラムの翻訳機能として、各々の言語仕様に沿って記述されたソースプログラムを翻訳するためのオプションを用意している。例えば、コンパイラは、ISO規格に準拠する翻訳処理を行うか、予め設定された拡張言語仕様に基づく翻訳処理を行うかをユーザが選択できるオプションを備え、ユーザが選択したオプションにしたがってソースプログラムの翻訳処理を実行する。または、コンパイラは、ISO規格または拡張言語仕様に違反した部分に対して診断メッセージを出力する。診断メッセージが出力された場合には、ユーザは、その内容に応じて適切な修正を行い、コンパイラが、再度翻訳して実行プログラムを作成する。
【0004】
ところで、ユーザは、ソースプログラムを自ら作成する場合もあるが、オープンソースソフトウェア(ソースコードが無償公開され、コードの改良や再配布が容認されているソフトウェア)のプログラムのように、既に世の中に流通しているものを利用したい場合があり、オープンソースのプログラムの翻訳および実行プログラム生成が必要となる。
【0005】
しかし、オープンソースのプログラムは、ISO規格に規定された仕様だけで記述されているものは少なく、何らかの拡張言語仕様が使用されている場合が多い。そのため、拡張言語仕様である可能性が高いオープンソースのプログラムを移植または改造等して再利用する場合に、そのままではコンパイラで翻訳することができないことが多い。
【0006】
コンパイラがオープンソースのプログラムを翻訳できなかった場合に、利用者は、コンパイラが出力する診断メッセージに基づいて、ソースプログラムの翻訳されなかった部分を手作業で修正する必要、もしくは、再利用したいオープンソースのプログラムに適したコンパイラのオプション機能を見つけだす必要がある。
【0007】
例えば、C言語のソースプログラムを入力し、例えばK&R仕様とANSI標準仕様とで相違するパターンを検出し、指定に応じたソース自動修正を行い、検出情報を出力するプログラム検査方法が知られている。
【発明の概要】
【発明が解決しようとする課題】
【0009】
プログラミング言語の拡張言語仕様がサポートする範囲は、言語処理系ごと、または、バージョンごとによってまちまちである。そのため、他の言語処理系で開発されたプログラムを移植または改造する場合に、次のような課題がある。
【0010】
・ 拡張言語仕様の使用が、プログラムの移植性や可搬性の妨げになる。
【0011】
・ ソースプログラム内で、どのような拡張言語仕様が使用されているか判らない。
【0012】
・ 診断メッセージの内容(翻訳不可な部分を示す情報)だけでは、翻訳不可が、拡張言語仕様の使用による原因であるかどうかを確定できない。
【0013】
・ 拡張言語仕様から標準規格(ISO規格準拠)のプログラムへの書き替え作業に手間がかかる。
【0014】
さらに、オープンソースのプログラムの翻訳を行いたいシステムエンジニア(SE)が、プログラムの拡張言語仕様の知識を持っていない場合や、コンパイラが診断メッセージを出力しプログラムの翻訳を完了しなかった場合には、システムエンジニア自身では課題を解決できず、コンパイラの開発元に翻訳できない原因の調査を依頼してくることがある。
【0015】
そのため、どのような拡張言語仕様であるかが不明なオープンソースのプログラムが処理対象となる場合に、コンパイラが、ソースプログラムが、標準仕様(ISO規格)や特定の拡張言語仕様に違反したことを表す診断メッセージを出力する機能だけではなく、拡張言語仕様が使用されている箇所や仕様の内容を理解させる手助けとなる機能を備えることが求められている。
【0016】
1つの側面では、本発明は、ソースプログラムの拡張言語仕様に関する情報を出力できる拡張言語仕様情報提供方法、拡張言語仕様情報提供プログラム、さらには、前記の拡張言語仕様情報の提供機能を有するコンパイル装置を実現することを目的とする。
【課題を解決するための手段】
【0017】
一態様の拡張言語仕様情報提供方法は、コンピュータが、(1)処理対象のソースプログラム
の解析処理において、前記ソースプログラムから所定の標準仕様
に該当しない記述である拡張箇所を検出し、(2)
前記標準仕様以外の仕様である拡張言語仕様の種別を示す種別情報をもとに、検出した前記拡張箇所
の仕様の種別を特定し、(3)
前記拡張言語仕様の種別ごとに前記拡張言語仕様での記述を前記標準仕様の記述に変換する規則と前記拡張箇所について特定した前記拡張言語仕様の種別とをもとに、検出した前記拡張箇所の記述を前記標準仕様の記述に変換した変換文字列を生成し、(4)
検出した前記拡張箇所
の前記ソースプログラムにおける位置
と特定された
前記拡張言語仕様の種別
と生成された
前記変換文字列
とを示すソース情報を
コンバートリストに登録し、(5)前記
コンバートリストのソース情報にもとづいて、前記ソースプログラム
の検出した前記拡張箇所に、拡張箇
所を示すマーク
と対応する前記変換文字列
とを挿入した拡張箇所通知情報を生成し
て出力する、処理を実行するものである。
【0018】
また、本発明の別の態様として開示する拡張言語仕様情報提供プログラムは、コンピュータに、上記の拡張言語仕様情報提供方法により実現される処理を実行させるためのものである。また、本発明の別の態様として開示するコンパイル装置は、上記の拡張言語仕様情報提供方法により実現される機能を有し、コンパイル処理を実行する装置である。
【発明の効果】
【0019】
一態様によれば、ソースプログラムで使用されている拡張言語仕様に関する情報をユーザに提供することができ、ソースプログラムの標準仕様へのコンバートが容易に行えるようになる。
【発明を実施するための形態】
【0021】
以下、本発明の一態様として開示するコンパイル装置について説明する。
【0022】
図1は、一実施例におけるコンパイル装置のブロック構成例を示す図である。実線が制御の流れを、点線がデータの流れを表す。
【0023】
本実施例において、コンパイル装置1は、C言語/C++言語のコンパイル処理を実行するものとし、入力したソースプログラム2を翻訳してオブジェクトプログラム3を生成、出力する。さらに、コンパイル装置1は、ソースプログラム2に関する情報の1つとして、ソースプログラム2で拡張言語仕様が使用されている箇所(拡張箇所)を示す拡張箇所通知情報4を生成、出力する。
【0024】
コンパイル装置1は、構文解析部11、拡張言語仕様収集・編集部13、リスティング部15、および出力生成部17を備える。
【0025】
構文解析部11は、処理対象とするソースプログラム2を取得し、構文解析処理を行い、構文解析結果を示す内部情報である中間言語5を生成する。
【0026】
構文解析部11は、予め、拡張言語仕様の種別を示す種別情報を保持し、ソースプログラム2を解析して中間言語5を生成する際に、ソースプログラム2の標準仕様に該当しない箇所(拡張箇所)を検出し、検出した拡張箇所に、拡張言語仕様を使用していることを示すフラグを設定する。さらに、構文解析部11は、種別情報をもとに、検出した拡張箇所で使用されている拡張言語仕様の種別を特定する。種別情報は、拡張言語仕様で記述される要素の種別を示し、一例として、変数、関数、文、式等ごとに拡張言語仕様の種別が設定されているものとする。
【0027】
拡張言語仕様収集・編集部13は、中間言語5からフラグをもとに抽出した拡張箇所ごとに、拡張箇所のコードを、標準仕様(ISO規格準拠の仕様)に基づいて表す場合の展開に変換する。変換後の記述をコンバート文字列と呼ぶ。
【0028】
拡張言語仕様収集・編集部13は、拡張言語仕様の種別ごとに、拡張言語仕様での記述を標準仕様での記述へ変換する規則を保持している。拡張言語仕様は、標準仕様(ISO規格)をベースとした拡張であるため、拡張言語仕様の記述の多くは標準仕様で記述することが可能である。拡張言語仕様収集・編集部13は、拡張言語仕様での記述をISO規格での記述に変換する規則を保持し、拡張箇所の種別にもとづいて拡張箇所の記述からコンバート文字列を生成する。
【0029】
拡張言語仕様収集・編集部13は、中間言語5から検出された各拡張箇所について、ソースプログラム2での位置、拡張言語仕様の種別、生成されたコンバート文字列とを示すソース情報を、内部リストであるソースコンバートリスト6に登録する。
【0030】
リスティング部15は、ソースプログラム2およびソースコンバートリスト6を参照して、ソースプログラム2の拡張言語仕様を使用している箇所(拡張箇所)に、拡張言語を使用していることを示すマークを設定し、その行の次行に、コンバート文字列を挿入した付加した拡張箇所通知情報4を生成し、コンパイル装置1に接続するディスプレイ画面、プリンタ等に出力する。
【0031】
さらに、リスティング部15は、ソースプログラム2で使用されている拡張言語仕様に関する統計値として、拡張箇所の全数、拡張言語仕様の種別ごとの拡張箇所数、拡張箇所のソースプログラム2の全行数に対する割合等を計算し、計算した統計値を含む統計情報7を出力する。
【0032】
出力生成部17は、構文解析部11が生成した中間言語5をもとに、実行プログラムであるオブジェクトプログラム3を生成し、出力する。
【0033】
出力生成部17は、ソースプログラム2に対するソースコンバートリスト6が作成されている場合に、中間言語5およびソースコンバートリスト6を参照して、中間言語5の拡張言語仕様が使用されている箇所のコードに必要な修正を施し、出力用コードを生成する。ソースプログラム2に対するソースコンバートリスト6が作成されていない場合に、出力生成部17は、中間言語5の拡張言語仕様が使用されている箇所は、拡張言語仕様のままのコードを出力用コードとする。
【0034】
図2は、ソースコンバートリスト6の例を示す図である。
【0035】
ソースコンバートリスト6は、中間言語5のコンバートした拡張箇所のソース情報である。詳しくは、ソースコンバートリスト6は、中間言語5で拡張言語仕様が使用されているとして検出し、コンバート文字列を生成した箇所(拡張箇所)のソース情報をリスティングしたデータである。
【0036】
各拡張箇所のソース情報は、「ソースファイル名」、「行番号」、「拡張仕様種別」、「コンバート文字列」の情報を含む。ソースファイル名は、ソースプログラム2を識別する情報である。行番号は、ソースプログラム2における拡張箇所の位置を示す情報である。拡張仕様種別は、拡張箇所が使用している拡張言語仕様の種別を示す情報である。コンバート文字列は、拡張箇所のコードを、標準仕様(ISO規格の仕様)で表す場合の文字列である。
【0037】
拡張言語仕様収集・編集部13は、中間言語5の各拡張箇所に対するコンバート文字列を、以下の手順で生成する。
【0038】
(1) 拡張箇所が変数である場合
例えば、拡張仕様種別が「Anonymous union」である場合に、変数名またはメンバ名が指定されていない共用体に対して、“__ANONYMOUS_UNION_”と通し番号を表す数字“n”とを結合した文字列を生成し、変数名またはメンバ名に相当する位置に挿入する。
【0039】
(2) 拡張箇所が関数である場合
例えば、拡張仕様種別が「Builtin C function」の場合に、関数名から“__builtin_”を除去した文字列を生成し、元の関数名と置き換える。
【0040】
(3) 拡張箇所が文である場合
例えば、拡張仕様種別が「Case range」の場合に、下限値から上限値までの値を持つcaseラベルが連続している文字列を生成し、元の範囲指定のcaseラベルと置き換える。
【0041】
(4) 拡張箇所が式である場合
例えば、拡張仕様種別が「Conditional」の場合に、条件演算子の1項(“?”の左辺)と同じものを条件演算子の2項(“?”と“:”との間)に挿入する。
【0042】
図2に例示するソースコンバートリスト6では、例えば、上から第1番目のソース情報は、拡張箇所が、ファイル名“test.c”のソースプログラム2の“第6行目”に位置し、拡張言語仕様の種別が「Anonymous union」であることを示している。さらに、拡張言語仕様収集・編集部13による上記(1)に例示する処理により、コンバート文字列として、“}_ANONYMOUS_UNION_1”が生成されたことを示している。
【0043】
また、第4番目のソース情報は、拡張箇所が、ファイル名“test.c”のソースプログラム2の“第23行目”に位置し、拡張言語仕様の種別が「Builtin C function」であること、および、上記(2)に例示する処理により、コンバート文字列として、“return strcmp(str1、 str2);”が生成されたことを示している。
【0044】
図3は、拡張箇所通知情報4の例を示す図である。
【0045】
図3に例示する拡張箇所通知情報4は、
図2に示すソースコンバートリスト6に対応するものであり、コンパイル装置1に接続するディスプレイ画面で表示されている場合の例である。
【0046】
図3に例示する拡張箇所通知情報4では、ソースコンバートリスト6の「行番号」をもとに、該当する箇所(拡張箇所)に、拡張言語仕様が使用されていることを示す文字“e”が設定される。さらに、その次行に、ソースコンバートリスト6の「コンバート文字列」をもとに、標準仕様(ISO規格)で表記した場合のソースコードを出力している。
【0047】
図3の例では、ファイル名“test.c”のソースプログラム2において、第6、14、16、23、32、40行目が、拡張箇所である。各拡張箇所は、ソースプログラム2の拡張言語仕様そのままの記述と、挿入されたコンバート文字列による標準仕様の記述とが表示される。
【0048】
これにより、ソースプログラム2で使用されている拡張言語仕様の箇所、および、拡張言語仕様の特徴を把握することができると共に、標準仕様(ISO規格)により記述する方法を理解することができる。
【0049】
図4は、統計情報の例を示す図である。
【0050】
統計情報7は、ソースプログラム2における拡張言語仕様の使われ方を統計的に示す情報であり、ソースプログラム2がどの程度拡張言語仕様を使用しているかを知ることができる。
【0051】
図4に例示する統計情報7は、ソースプログラム2の全行数を示す「Total line」、拡張箇所数および全行数に対する割合を示す「Extensions line」を含む。「Extensions line」は、さらに、拡張言語仕様の種別ごとに、該当する拡張箇所数および全行数に対する割合を示している。
【0052】
例えば、
図4の統計情報7では、ソースプログラム2の全行数は“33”であり、拡張箇所に該当する行数は“6”であり、その割合は“18%”であることを示している。また、確証言語仕様の1種別の「anonymous union」に分類される拡張箇所に該当する行数は“3”であり、その割合は“9%”、第6番目、14番目、16番目の行であることを示している。
【0053】
統計情報7により、拡張言語仕様が使用されるソースプログラム2を標準仕様(ISO規格)準拠のコンパイラ装置(C/C++コンパイラ)でコンパイル処理する場合の移植の容易性を把握することができる。
【0054】
図5は、コンパイル装置1の処理フローチャート例を示す図である。
【0055】
ステップS1: コンパイル装置1の構文解析部11は、ソースプログラム2を読み込み、構文解析を行い、中間言語5を生成する。
【0056】
ステップS2: コンパイル装置1のユーザインタフェース(
図1に図示しない)において、ユーザからリスティングオプションの選択の有無が判断される。リスティングオプションが選択されていれば(ステップS2の“あり”)、ステップS3〜S7の処理が実行される。リスティングオプションが選択されていなければ(ステップS2の“なし”)、ステップS8の処理が実行される。
【0057】
ステップS3: 構文解析部11は、構文解析の結果から、中間言語5の拡張言語仕様が使われた箇所(拡張箇所)に、拡張言語仕様が使用されていることを示すフラグと、使用された拡張言語仕様の種別とを設定する。
【0058】
ステップS4: 拡張言語仕様収集・編集部13は、ソースプログラム2および中間言語5から、フラグをもとに、拡張箇所の情報を収集する。
【0059】
ステップS5: 拡張言語仕様収集・編集部13は、拡張言語仕様の種別をもとに、拡張箇所のコードを、ISO規格に変換した場合の標記であるコンバート文字列を生成して、ソースコンバートリスト6に登録する。
【0060】
ステップS6: 拡張言語仕様収集・編集部13は、ソースプログラム2のソースコードの全行数に対する拡張箇所の個数(行数)、拡張言語仕様の使用率を算出する。
【0061】
ステップS7: リスティング部15は、ソースプログラム2およびソースコンバートリスト6をもとに、ソースプログラム2の拡張箇所に、拡張言語仕様を使用したことを示すマーク(文字e)およびコンバート文字列を挿入して生成した拡張箇所通知情報4をディスプレイ画面等に出力する。さらに、リスティング部15は、ソースプログラム2の全行数、拡張箇所の行番号、拡張箇所の個数、使用率等を含む統計情報7をディスプレイ画面等に出力する。
【0062】
ステップS8: 出力生成部17は、中間言語5から出力用のオブジェクトプログラム3を生成する。出力生成部17は、中間言語5に対しソースコンバートリスト6が生成されている場合に、ソースコンバートリスト6を参照して、中間言語5にフラグが設定された拡張箇所のコードを、コンバート文字列をもとに修正して、オブジェクトプログラム3を生成する。また、出力生成部17は、中間言語5に対しソースコンバートリスト6が生成されていない場合に、中間言語5の拡張言語仕様が使用されている部分を、拡張言語仕様のままにしてオブジェクトプログラム3を生成する。
【0063】
以上説明したコンパイル装置1は、
図1に示す処理部を備える専用ハードウェアまたは、コンピュータ100により実施することができる。
【0064】
図6は、コンパイル装置1が実施されるコンピュータのハードウェア構成例を示す図である。
【0065】
コンパイル装置1が実施されるコンピュータ100は、CPU101、メモリ102、表示装置103が接続された表示制御部104、ハードディスク等の記憶装置105、入力装置106、およびネットワーク接続のための通信制御部107が、バス108に接続されている。
【0066】
オペレーティングシステムおよびコンパイル装置1を実施するプログラムが記憶装置105に格納されており、CPU101により実行される際には記憶装置105からメモリ102に読み出される。CPU101はオペレーティングシステムおよびコンパイル装置1が実行する処理内容に応じて表示制御部104、通信制御部107を制御して所定の動作を行わせる。
【0067】
コンパイル装置1の処理対象のソースプログラム2は、記憶装置105または通信制御部107を介してアクセスできる他コンピュータ装置の記憶装置に格納されている。
【0068】
コンパイル装置1の実行時には、処理途中のデータは主としてメモリ102に格納されるが、記憶装置105に格納されるようにしてもよい。コンピュータ100は、上述のCPU101、メモリ102などのハードウェアとオペレーティングシステムおよびコンパイル装置1の構成要素を実現するプログラムとが有機的に協働することにより、上記説明したような各種の機能を実現する。
【0069】
コンパイル装置1を実現するプログラムは、CD−ROM、CD−RW、DVD−R、DVD−RAM、DVD−RW等やフレキシブルディスク等の記録媒体に格納されていてもよい。
【0070】
なお、コンパイル装置1を構成する要素は、任意の組合せで実現されてもよい。複数の構成要素が1つの部材として実現されてもよく、1つの構成要素が複数の部材から構成されてもよい。また、コンパイル装置1は、上述した実施形態に限定されず、本発明の要旨を逸脱しない範囲において各種の改良および変更を行ってもよいことは当然である。
【0071】
例えば、上記実施の形態において、コンパイラ装置1はC言語、C++言語を対象としているが、Fortran等の他言語のコンパイラ処理についても開示するコンパイラ装置1を適用して実施することが可能である。
【0072】
以上説明したコンパイル装置1は、以下に挙げる効果が期待される。
【0073】
・ コンパイル装置1によれば、ソースプログラムに拡張言語仕様が使用されている箇所に特定のマークを付けるため、ユーザは、ソースプログラム内で拡張言語仕様が使用されている部分を容易に明確にすることができる。
【0074】
・ コンパイル装置1によれば、ソースプログラムの拡張箇所を、標準仕様(ISO規格仕様)で表した場合の展開を出力するため、ユーザが拡張言語仕様を理解する一助になる。
【0075】
・ コンパイル装置1が出力する、ソースプログラムの拡張箇所を標準仕様で表した記述を利用することにより、ユーザは、ソースプログラムに含まれる拡張言語仕様の修正作業の負荷を軽減することができる。
【0076】
・ さらに、ユーザは、ソースプログラムの移植性・可搬性を考えたコーディング・修正ができる。
【0077】
・ コンパイル装置1が出力する拡張言語仕様情報では、ソースプログラムとともにコンバート文字列を表示するため、コンバートした部分に関する情報の閲覧性に優れる。
【0078】
・ コンパイル装置1が出力する拡張言語仕様統計情報により、ソースプログラムの移植性・可搬性を客観的に評価することができる。
【0079】
・ コンパイル装置1は、外部ツール、例えばワークベンチと呼ばれるプログラミング作業用の種々のプログラムツール、と連携することも可能である。
【0080】
以上の効果により、コンパイル装置1の開発元にとって、コンパイル装置1のオプションのデフォルト状態において翻訳が可能であれば、拡張言語仕様に対するサポートの軽減につながる。コンパイル装置1をプログラム開発者に提供することにより、その効果が期待できる。
【0081】
プログラムは、ISO規格等の標準仕様の範囲で記述することができれば、移植性・可搬性を高めることができる。よって、開示するコンパイル装置1により標準仕様へのコンバートが容易になれば、拡張言語仕様を含むプログラムが、より多くの他のコンパイル装置でも翻訳可能となり、より広く流通させることができる。