(57)【特許請求の範囲】
【請求項１】
第１プログラム言語によって記述された第１ソースコードを前記第１プログラム言語とは異なる第２プログラム言語によって記述された第２ソースコードに変換する処理をコンピュータに実行させるソースコード変換プログラムであって、前記コンピュータに、
前記第１プログラム言語上で規定されている第１規定語句を、前記第１プログラム言語上で規定されていない中間語句に変換するルールを記述した、第１変換ルールを取得するステップ、
前記中間語句を前記第２プログラム言語上で規定されている第２規定語句に変換するルールを記述した、第２変換ルールを取得するステップ、
前記第１変換ルールにしたがって前記第１ソースコード内の前記第１規定語句を前記中間語句に変換する第１変換ステップ、
前記第２変換ルールにしたがって前記中間語句を前記第２ソースコード内の前記第２規定語句として出力する第２変換ステップ、
を実行させ、
前記第１変換ステップにおいては、前記コンピュータに、
前記第１プログラム言語上において提供される規定モジュールではなくかつ前記第２変換ルール上で定義されていない外部モジュールを参照する外部参照語句が、前記第１ソースコード内に含まれているか否かを、前記外部モジュールが前記第１変換ルール上で定義されているか否かに基づき判断するステップ、
前記外部参照語句が前記第１ソースコード内に含まれている場合は、前記外部参照語句が指定する前記外部モジュールのモジュール名を前記第１ソースコードから読み取るとともに、その外部モジュールのメソッド名またはプロパティ名の少なくともいずれかを前記第１ソースコードから読み取るステップ、
を実行させ、
前記第２変換ステップにおいては、前記コンピュータに、
前記第１変換ステップにおいて読み取った前記モジュール名を有するモジュールを定義するモジュールソースコードを出力するとともに、前記第２ソースコード内において前記モジュールソースコードを参照する参照語句を出力するステップ、
前記第１変換ステップにおいて読み取った前記メソッド名を前記モジュールが有するメソッドとして前記モジュールソースコード内に出力するか、または前記第１変換ステップにおいて読み取った前記プロパティ名を前記モジュールが有するプロパティとして前記モジュールソースコード内に出力するかの少なくともいずれかを実施するステップ、
を実行させる
ことを特徴とするソースコード変換プログラム。
【請求項２】
前記第２変換ルールは、
前記第１ソースコード内に記述されているメソッドまたはプロパティであって前記第２ソースコード内で使用しないものを前記第２ソースコードに対して出力しない旨を定義する除外ルールを記述しており、
前記第２変換ステップにおいては、前記コンピュータに、
前記除外ルールが定義している前記第１ソースコード内のメソッドまたはプロパティを無視するステップを実行させる
ことを特徴とする請求項１記載のソースコード変換プログラム。
【請求項３】
前記第２変換ルールは、
前記第１ソースコード内に記述されていないメソッドまたはプロパティであって前記第２ソースコード内で使用するものを前記第２ソースコードに対して追加出力する旨を定義する追加ルールを記述しており、
前記第２変換ステップにおいては、前記コンピュータに、
前記追加ルールが定義しているメソッドまたはプロパティについては前記第１ソースコード内に記述されていなくとも前記第２ソースコードに対して出力するステップを実行させる
ことを特徴とする請求項１記載のソースコード変換プログラム。
【請求項４】
前記第１変換ステップにおいては、前記コンピュータに、
前記第１ソースコード上における前記外部モジュールのフルパス名を前記第１ソースコードから読み取るステップを実行させ、
前記第２変換ステップにおいては、前記コンピュータに、
前記第１変換ステップにおいて読み取った前記外部モジュールのフルパス名を、前記参照語句が参照する前記モジュールソースコードの前記第２ソースコード上におけるフルパス名として出力するステップを実行させる
ことを特徴とする請求項１記載のソースコード変換プログラム。
【請求項５】
前記第１変換ステップにおいては、前記コンピュータに、
前記第１プログラム言語によって記述された第３ソースコード内の前記第１規定語句を前記第１変換ルールにしたがって前記中間語句に変換するステップを実行させ、
前記第１ソースコードは、
前記外部モジュールが有する第１外部メソッドまたは前記外部モジュールが有する第１外部プロパティを呼び出すコードを記述しており、
前記第３ソースコードは、
前記外部モジュールが有する前記第１外部メソッドとは異なる第２外部メソッドまたは前記外部モジュールが有する前記第１外部プロパティとは異なる第２外部プロパティを呼び出すコードを記述しており、
前記第２変換ステップにおいては、前記コンピュータに、
前記第１外部メソッドに対応するメソッドと前記第２外部メソッドに対応するメソッドをともに有する前記モジュールを定義するコードを単一の前記モジュールソースコード内に出力するか、または前記第１外部プロパティに対応するプロパティと前記第２外部プロパティに対応するプロパティをともに有する前記モジュールを定義するコードを単一の前記モジュールソースコード内に出力する、ステップを実行させる
ことを特徴とする請求項１記載のソースコード変換プログラム。
【請求項６】
前記ソースコード変換プログラムは、前記コンピュータに、
前記第１変換ステップによって前記第１規定語句を前記中間語句に変換した結果を記述した中間ソースコードを出力するステップを実行させる
ことを特徴とする請求項１記載のソースコード変換プログラム。
【請求項７】
前記ソースコード変換プログラムは、
前記第１プログラム言語によって記述されたソースコードを開発するためのソースコード開発プログラムのアドインモジュールとして実装され、
または、
前記第２プログラム言語によって記述されたソースコードを開発するためのソースコード開発プログラムのアドインモジュールとして実装されている
ことを特徴とする請求項１記載のソースコード変換プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムソースコードを変換する技術に関する。
【背景技術】
【０００２】
プログラム言語のなかには、その言語を提供するベンダ独自の仕様にしたがって定義されているものがある。このようなプログラム言語は、当該プログラム言語の機能を追加拡張などするため、当該ベンダによってアップグレードされる場合がある。例えばＭｉｃｒｏｓｏｆｔ（登録商標）社のＶｉｓｕａｌ  Ｂａｓｉｃ（登録商標）６．０の後続バージョンとして、Ｖｉｓｕａｌ  Ｂａｓｉｃ  ．ＮＥＴが提供されている。
【０００３】
旧バージョンのプログラム言語を用いて開発されたソースコードを新バージョンのプログラム言語の実行環境において流用するための技術として、ソースコードを自動変換する手法が用いられる場合がある。
【０００４】
下記特許文献１は、プラットフォーム間でソースコードを移行する技術について記載している。同文献においては、知識ベースに対してソースコードを提供することを繰り返すことにより、知識ベースを更新することが記載されている（００１４参照）。
【０００５】
下記特許文献２は、既存プラットフォーム上で実行するよう設計されたプログラムを他プラットフォーム上で実行しようとするときに発生する不具合を緩和する技術について記載している（０００１参照）。同文献においては、他プラットフォーム上において欠落した型などに対する参照呼び出しが必然となる時点まで、エラーを延期している（要約、０００２参照）。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特表２００７−５１５０１３号公報
【特許文献２】特表２００９−５２８５８９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
ソースコード変換によって得られた新たなソースコードは、その変換プロセスの精度に応じて誤変換や不完全な変換結果を含んでいると考えられる。そのようなソースコードをコンパイルしようとすると、変換が完全ではない箇所においてコンパイルエラーが発生する。コンパイルエラーが発生した箇所については開発者が手作業により修正する必要があり、開発作業の効率を低下させる原因となる。
【０００８】
１例として、変換前のソースコードが、変換元プラットフォームにおいて提供されているものではないサードパーティベンダによって提供されている外部モジュールを利用している場合を考える。この場合、変換前のソースコードは当該外部モジュールに対して参照する記述部分を含んでいる。また変換前ソースコードを開発する開発環境においては、当該外部モジュールが読み込まれている。したがって変換前の開発環境においては、当該外部モジュールを参照する部分のコードと当該外部モジュールとがリンクされ、コンパイル時や実行時におけるエラーは生じない。
【０００９】
これに対し、変換後プラットフォームにおいて提供される開発環境は、必ずしも当該外部モジュールを読み込んでいない場合がある。そうすると、変換前において当該外部モジュールを参照する部分を変換後においてそのまま用いると、当該参照部分と当該外部モジュールをリンクすることができず、少なくともコンパイル時においてエラーが発生すると考えられる。また当該参照部分を変換しようとしても、変換後プラットフォームにおいて当該外部モジュールに対応する新たなモジュールが定義・読み込みされているとは限らない。したがってかかる外部モジュールを参照する部分は、コンパイルエラーなどによって開発効率を低下させる原因となっている。
【００１０】
上記特許文献１〜２記載の技術においては、ソースコードを変換することについて議論しているものの、変換後におけるプラットフォームがサポートしていない外部モジュールの取り扱いについては、充分に考慮されていない。したがってこれら文献記載の技術においては、上述のコンパイルエラーが発生する課題が残存していると考えられる。
【００１１】
コンパイルエラーは、開発効率を低下させる要因となることに加え、開発環境によってはコンパイル時に報告されるコンパイルエラーの個数上限が存在する場合がある。変換前における外部参照部分がその個数を超えている場合、全てのコンパイルエラーが報告されず、開発者はエラー規模やそのエラーに対して対処するための工数を的確に把握することが困難である。
【００１２】
本発明は、上記のような課題に鑑みてなされたものであり、外部モジュールを参照するソースコードを変換することによって得られたソースコードがコンパイルエラーを発生させる可能性を抑制することを目的とする。
【課題を解決するための手段】
【００１３】
本発明に係るソースコード変換プログラムは、変換後のプログラム言語において規定されていない外部モジュールを変換前のソースコードが使用している場合、その外部モジュールの代替となるモジュールソースコードを自動生成する。
【発明の効果】
【００１４】
本発明に係るソースコード変換プログラムによれば、変換後のプログラム言語において規定されていない外部モジュールを使用するソースコードであっても、変換後におけるコンパイルエラーを抑制することができる。
【図面の簡単な説明】
【００１５】
【図１】実施形態１に係るソースコード変換プログラム１２０を実行するコンピュータ１００およびその周辺構成を示す図である。
【図２】第１ソースコード３１１と第２ソースコード３２０の例である。
【図３】第１変換ルール２１０と第２変換ルール２２０の例である。
【図４】外部モジュール“ＥｘａＬｉｂ”を実装したソースコードの例である。
【図５】実施形態２における第１ソースコード３１１と第２ソースコード３２０の例である。
【図６】実施形態２における第２変換ルール２２０の例である。
【図７】第１ソースコード３１１および３１２の例である。
【図８】実施形態３においてソースコード変換プログラム１２０が生成するモジュールソースコードの例である。
【図９】実施形態３においてソースコード変換プログラム１２０が生成するモジュールソースコードの別例である。
【発明を実施するための形態】
【００１６】
＜実施の形態１＞
図１は、本発明の実施形態１に係るソースコード変換プログラム１２０を実行するコンピュータ１００およびその周辺構成を示す図である。コンピュータ１００は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）１１０とソースコード変換プログラム１２０を備える。
【００１７】
ＣＰＵ１１０は、ソースコード変換プログラム１２０を実行する演算装置である。以下では説明の便宜上、ソースコード変換プログラム１２０を動作主体として説明する場合があるが、実際にソースコード変換プログラム１２０を実行するのはＣＰＵ１１０であることを付言しておく。
【００１８】
ソースコード変換プログラム１２０は、第１プログラム言語によって記述された第１ソースコード３１１を第２プログラム言語によって記述された第２ソースコード３２０へ変換するプログラムである。第１プログラム言語の例としては例えばＶｉｓｕａｌ  Ｂａｓｉｃ ６．０が挙げられ、第２プログラム言語の例としてはＶｉｓｕａｌ  Ｂａｓｉｃ  ．ＮＥＴが挙げられるが、これらに限られるものではない。ソースコード変換プログラム１２０は、後述する記憶装置２００に格納することもできるし、その他適当な記憶装置に格納することもできる。
【００１９】
コンピュータ１００は、記憶装置２００に接続されている。記憶装置２００は、第１変換ルール２１０、第２変換ルール２２０、中間ソースコード２３０を格納する。
【００２０】
第１変換ルール２１０は、ソースコード変換プログラム１２０が第１ソースコード３１１を変換する過程において一時的に生成する中間ソースコード２３０を生成するための変換ルールを記述したデータファイルである。第２変換ルール２２０は、ソースコード変換プログラム１２０が中間ソースコード２３０を第２ソースコード３２０へ変換するための変換ルールを記述したデータファイルである。第１変換ルール２１０、第２変換ルール２２０、中間ソースコード２３０の例については後述する。
【００２１】
図２は、第１ソースコード３１１と第２ソースコード３２０の例である。各ソースコードの先頭部分は、当該ソースコード内において使用するライブラリ群を指定する箇所である。このライブラリ群としては、各ソースコードを記述するプログラム言語上であらかじめ規定されているライブラリを指定することもできるし、プログラム言語上では規定されていない外部モジュールとして提供されているライブラリを指定することもできる。この外部モジュールは、例えばサードパーティベンダが提供するクラスライブラリ（クラスの集合体）である。下線は強調のため付与したものであり、実際のソースコードにおいては下線を付与する必要はない。
【００２２】
第１ソースコード３１１においては、第１プログラム言語が提供するライブラリとして“Ｓｙｓｔｅｍ”パッケージと“Ｓｙｓｔｅｍ．Ｔｅｘｔ”パッケージを指定している。さらに外部モジュールとして、“ＥｘａＬｉｂ”パッケージを指定している。第１ソースコード３１１内に記述しているクラス名“ＥｘａＬｉｂＵｔｉｌ”は、フルパス名が“ＥｘａＬｉｂ．ＥｘａＬｉｂＵｔｉｌ”であり、先頭部分において“ＥｘａＬｉｂ”パッケージを読み込んでいるのでパッケージ名は省略することができる。
【００２３】
第２ソースコード３２０は、第２プログラム言語によって第１ソースコード３１１と同じ動作を実装することを意図したものである。例えば第２プログラム言語において、“Ｓｙｓｔｅｍ．Ｔｅｘｔ”パッケージは“Ｓｙｓｔｅｍ．Ｔｘｔ”パッケージに名称変更されていると仮定する。この場合第２ソースコード３２０の先頭部分において、“Ｓｙｓｔｅｍ．Ｔｘｔ”パッケージを読み込む旨を指定する必要がある。“Ｓｙｓｔｅｍ”パッケージと“ＥｘａＬｉｂ”パッケージはそのまま用いている。ＥｘａＬｉｂＵｔｉｌクラスのインスタンス“ｍ＿Ｕｔｉｌ”については後述する。
【００２４】
プログラム言語の違いに起因して、図２に例示するように変換前後において各プログラム言語上で規定されている規定語句を変換する必要が生じる場合がある。図２に示す例においては、使用するライブラリ群のパッケージ名を変換する必要がある例を示した。その他、例えばクラス名、クラスが備えているメソッド名、クラスが有するプロパティ名（当該クラスが有するメンバ変数名）などについても、プログラム言語のアップグレードなどにともなって変更される場合がある。かかる場合は、これら事項についても変換する必要がある。
【００２５】
図３は、第１変換ルール２１０と第２変換ルール２２０の例である。これら変換ルールは例えばＸＭＬ（ｅＸｔｅｎｓｉｂｌｅ  Ｍａｒｋｕｐ  Ｌａｎｇｕａｇｅ）などの形式で記述することができるが、記述形式はこれに限らない。
【００２６】
ソースコード変換プログラム１２０は、第１ソースコード３１１を変換するに際してまず第１変換ルール２１０を参照し、第１ソースコード３１１内において記述されている第１プログラム言語上の規定語句を変換するための基準となるルールを取得する。ここでは図２の例に準じて、パッケージ名“Ｓｙｓｔｅｍ．Ｔｅｘｔ”を“＠Ｔｅｘｔ＠”に変換するルールを例示した。ソースコード変換プログラム１２０は、第１変換ルール２１０にしたがって第１ソースコード３１１を変換した結果を、中間ソースコード２３０として記憶装置２００に格納する。
【００２７】
ソースコード変換プログラム１２０はさらに第２変換ルール２２０を参照し、中間ソースコード２３０を第２ソースコード３２０に変換するための基準となるルールを取得する。ここでは図２の例に準じて、“＠Ｔｅｘｔ＠”をパッケージ名“Ｓｙｓｔｅｍ．Ｔｘｔ”に変換するルールを例示した。ソースコード変換プログラム１２０は、第２変換ルール２２０にしたがって、中間ソースコード２３０を第２ソースコード３２０に変換する。
【００２８】
第１ソースコード３１１から第２ソースコード３２０へ直接変換せずにいったん中間ソースコード２３０を経由するのは、変換の汎用性を高めるためのものである。すなわちいったん中間ソースコード２３０に変換しておくことにより、第２プログラム言語以外のプログラム言語によって記述されたソースコードに変換する必要が生じた場合に、中間ソースコード２３０を再利用することができるからである。
【００２９】
第１プログラム言語上における規定語句を第２プログラム言語上における規定語句に変換するためには、上記例のように第１変換ルール２１０と第２変換ルール２２０それぞれにおいて変換前後の各規定語句の対応関係を定義することによりこれを実現することができる。ただし外部モジュールについては、規定語句を変換するのみでは対処できないコンパイルエラーが発生する可能性がある。以下その例について説明する。
【００３０】
＜実施の形態１：外部モジュール参照に関するエラーについて＞
第１ソースコード３１１が読み込んでいる外部モジュール“ＥｘａＬｉｂ”は、第１プログラム言語上では提供されていないライブラリである。したがって第１ソースコード３１１の開発者は、第１プログラム言語のソースコードを開発するための開発支援ツール（例えばＭｉｃｒｏｓｏｆｔ社のＶｉｓｕａｌ  Ｓｔｕｄｉｏ（登録商標））上で、当該外部モジュールを読み込むように設定する必要がある。その設定内容は、設定ファイルなどに格納される。設定ファイルには、例えば外部モジュールのファイルパス、バージョン番号などの情報が格納される。
【００３１】
一方で、第２ソースコード３２０に対してコンパイルや修正などの作業を実施するためには、第２プログラム言語のソースコードを開発するための開発支援ツール（例えばＭｉｃｒｏｓｏｆｔ社のＶｉｓｕａｌ  Ｓｔｕｄｉｏ  ．ＮＥＴ）などを用いる必要がある。開発支援ツールはプログラム言語毎に提供されているのが通常であるから、プログラム言語が異なれば開発支援ツールも異なる。
【００３２】
第２プログラム言語の開発支援ツール上においては、第１ソースコード３１１が参照している外部モジュールを読み込む設定をしていない。したがって、第２プログラム言語の開発支援ツール上で第２ソースコード３２０をそのままコンパイルしようとしても、当該外部モジュールを参照することができないので、コンパイルエラーが発生してしまう。
【００３３】
このようなコンパイルエラーを解消するためには、第２プログラム言語の開発支援ツール上で改めて当該外部モジュールを読み込むように設定する必要がある。この作業は第２ソースコード３２０そのものに対する開発作業ではないので、開発効率を低下させる要因となり得る。また第２ソースコード３２０内において外部モジュールを参照している箇所が多いとその分だけコンパイルエラーも発生するので、コンパイルエラーが多量に発生してその他エラーが埋没し、これも開発効率を低下させる要因となり得る。さらには、開発支援ツールの仕様によってはコンパイルエラーの上限個数が規定されている場合があり、このような場合において外部モジュールに対する参照箇所が多いと全てのコンパイルエラーが報告されない可能性がある。
【００３４】
以上説明したように、第２ソースコード３２０をコンパイルするとき外部モジュール参照に起因するコンパイルエラーが発生する可能性があり、したがってソースコード変換により開発効率の向上を妨げる要因となっている。本発明は、ソースコード変換にともなう上記のようなコンパイルエラーを抑制することを図る。
【００３５】
＜実施の形態１：外部モジュールのスタブについて＞
図２で説明した例においては、ＥｘａＬｉｂＵｔｉｌクラスのインスタンスｍ＿Ｕｔｉｌを生成し、同インスタンスを介してＥｘａＬｉｂＵｔｉｌクラスのメソッド“ＧｅｔＮａｍｅ（）”を呼び出している。第２ソースコード３２０はパッケージ“ＥｘａＬｉｂ”に対する参照を有していないので、第２プログラム言語の開発支援ツールは、インスタンスｍ＿Ｕｔｉｌを生成する際にＥｘａＬｉｂＵｔｉｌクラスを認識することができないことに加えて、ｍ＿Ｕｔｉｌが呼び出すメソッド“ＧｅｔＮａｍｅ（）”を認識することができない。これらはコンパイルエラーとして報告される。
【００３６】
図４は、外部モジュール“ＥｘａＬｉｂ”を実装したソースコードの例である。図４（ａ）は“ＥｘａＬｉｂ”のソースコードを示す。図４（ａ）において、パッケージ名“ＥｘａＬｉｂ”が冒頭で指定されるとともに、同パッケージ内に含まれるクラス“ＥｘａＬｉｂＵｔｉｌ”が定義されている。さらにＥｘａＬｉｂＵｔｉｌクラスは、Ｓｔｒｉｎｇ型のメンバ変数“ｍ＿ＳｔｒＮａｍｅ”、ｍ＿ＳｔｒＮａｍｅを返すメンバメソッド“ＧｅｔＮａｍｅ（）”、ｍ＿ＳｔｒＮａｍｅをセットするメンバメソッド“ＳｅｔＮａｍｅ（）”を有している。
【００３７】
図２で説明した第１ソースコード３１０は、図４（ａ）のうち、パッケージ名“ＥｘａＬｉｂ”、クラス名“ＥｘａＬｉｂＵｔｉｌ”、メソッド名“ＧｅｔＮａｍｅ（）”を参照している。第２ソースコード３２０のコンパイル時においてコンパイルエラーを生じさせないためには、これらを定義したソースコードが第２ソースコード３２０内（または第２ソースコード３２０から容易に参照することができるソースコード内）に記述されていればよい。したがってソースコード変換プログラム１２０は、図２〜図３で説明した変換ルールに加えて、以下に説明する手順にしたがって外部モジュール“ＥｘａＬｉｂ．ＥｘａＬｉｂＵｔｉｌ”のスタブとなるモジュールソースコードを自動生成する。
【００３８】
ソースコード変換プログラム１２０は、第１ソースコード３１１を読み取るとき、外部モジュールを参照している箇所を特定する。例えば第１ソースコード３１１内におけるパッケージ名やクラス名を指定している部分が第１変換ルール２１０内の変換ルールとして定義されていない（すなわち第２変換ルール２２０内の変換ルールとしても定義されていない）場合、当該パッケージ名やクラス名は外部モジュール上で定義されているとみなすことができる。図２の例においては、パッケージ名“ＥｘａＬｉｂ”とクラス名“ＥｘａＬｉｂＵｔｉｌ”がこれに相当する。
【００３９】
ソースコード変換プログラム１２０は、第１ソースコード３１１のなかで、外部モジュールとして特定したパッケージやクラスが有するメソッドやプロパティを呼び出している箇所を特定する。図２の例においては、“ＧｅｔＮａｍｅ（）”メソッドがこれに相当する。
【００４０】
ソースコード変換プログラム１２０は、特定したパッケージ名とクラス名を定義するモジュールソースコードを生成する。さらに生成したモジュールソースコードにおいて、先に特定したメソッドやプロパティを定義する。メソッドの内容を記述する必要はないのでメソッドの戻り型のみ第１ソースコード３１１内の記述に合わせればよい。
【００４１】
図４（ｂ）は、ソースコード変換プログラム１２０が上記手順にしたがって生成したモジュールソースコードの例である。同モジュールソースコード内において、パッケージ“ＥｘａＬｉｂ”とこれに属するクラス名“ＥｘａＬｉｂＵｔｉｌ”が定義され、さらにＥｘａＬｉｂＵｔｉｌクラスのメンバメソッドとして“ＧｅｔＮａｍｅ（）”が定義されている。ただし本来のＥｘａＬｉｂＵｔｉｌクラスが有するメンバ変数“ｍ＿ＳｔｒＮａｍｅ”とメンバメソッド“ＳｅｔＮａｍｅ（）”は定義されていない。第１ソースコード３１１内においてこれらを参照していないからである。またメソッド“ＧｅｔＮａｍｅ（）”の内容は何も記述されておらず、戻り型がＳｔｒｉｎｇであるので空文字をリターンするのみである。コンパイルエラーを生じさせないためには、パッケージ名、クラス名、メソッド名（および参照している場合はプロパティ名）の定義があれば十分であり、その内容は必要ないからである。
【００４２】
図４（ｂ）に示すモジュールソースコードにおいて、クラス“ＥｘａＬｉｂＵｔｉｌ”はパッケージ“ＥｘａＬｉｂ”に属しているので、そのフルパス名は“ＥｘａＬｉｂ．ＥｘａＬｉｂＵｔｉｌ”となる。したがって第２ソースコード３２０においても、第１ソースコード３１０内と同じフルパス名によりＥｘａＬｉｂＵｔｉｌを参照することができる（パッケージ名は省略可能）。
【００４３】
第２ソースコード３２０をコンパイルする際に、図４（ｂ）に示すモジュールソースコードを参照することにより、コンパイルエラーを回避することができる。第２ソースコード３２０が参照しているパッケージ名“ＥｘａＬｉｂ”、クラス名“ＥｘａＬｉｂＵｔｉｌ”、およびメソッド名“ＧｅｔＮａｍｅ（）”は、同モジュールソースコード内に全て定義されているからである。
【００４４】
例えば同モジュールソースコードを第２ソースコード３２０と同じフォルダに出力するか、または第２ソースコード３２０内に同モジュールソースコードを追加記述するなどにより、第２ソースコード３２０から同モジュールコードを参照することができる。具体的には開発支援ツールの仕様に応じて適宜定めればよい。第２ソースコード３２０と同モジュールソースコードはともにソースコード変換プログラム１２０からの出力であるため、これらを総括して第２ソースコード３２０として取り扱うこともできる。
【００４５】
＜実施の形態１：まとめ＞
以上のように、本実施形態１に係るソースコード変換プログラム１２０は、第１ソースコード３１１内において使用されている外部モジュールのパッケージ名、クラス名、メソッド名、プロパティ名などを定義するモジュールソースコードを、第２ソースコード３２０とともに出力する。これにより、第２プログラム言語の開発支援ツール上において当該外部モジュールを参照していない場合であっても、第２ソースコード３２０をコンパイルするときのコンパイルエラーを抑制することができる。
【００４６】
以上の説明においては、規定語句としてパッケージ名を変換する例を説明したが、クラス名、メソッド名、プロパティ名についても同様に変換するルールを記述することもできる。例えば第１プログラム言語におけるクラス“ＡＢＣ”が第２プログラム言語においては“ＤＥＦ”に変更されている場合、その変換ルールをそれぞれ第１変換ルール２１０と第２変換ルール２２０に定義することができる。すなわち、第１プログラム言語においてあらかじめ定義されているパッケージ名などの任意の規定語句を、第２プログラム言語における同様の規定語句に変換することができる。
【００４７】
規定語句以外の語句、例えば第１ソースコード３１１固有の語句についても同様に各変換ルールへ記述することによって変換することも可能ではあるが、かかる語句は例えば開発者が自ら開発したクラスなどであることが通常なので、一般的には第２ソースコード３２０内においてもそのまま用いることができると考えられる。
【００４８】
図２で例示した第１ソースコード３１１は、ＥｘａＬｉｂＵｔｉｌクラスのメソッドのみを使用しているので、図４（ｂ）で例示したモジュールソースコードはＧｅｔＮａｍｅ（）メソッドのみを有している。第１ソースコード３１１がＥｘａＬｉｂＵｔｉｌクラスのプロパティを直接参照している場合は、モジュールソースコード内において当該プロパティを定義すればよい。
【００４９】
以上の説明においては、パッケージ名を指定する部分は規定語句“ｎａｍｅｓｐａｃｅ”を用いるプログラム言語を例としたが、その他の規定語句を用いるのであればそれに応じた記述方式によってパッケージ名を記述することができる。
【００５０】
＜実施の形態２＞
実施形態１においては、第１プログラム言語上における規定語句を第２プログラム言語上における規定語句に変換する例を説明した。第２プログラム言語の仕様によっては、第１プログラム言語上で規定されている規定語句を全く使用しない場合もある。また第１プログラム言語上では定義されていないが第２プログラム言語上で定義されている規定語句を第２ソースコード３２０内で使用する可能性もある。そこで本発明の実施形態２においては、これらの実装例について説明する。その他構成および動作は実施形態１と同様であるため、以下では主に差異点について説明する。
【００５１】
図５は、本実施形態２における第１ソースコード３１１と第２ソースコード３２０の例である。第１ソースコード３１１内において使用されているパッケージ名“Ｓｙｓｔｅｍ”は第２プログラム言語上では使用されないものと仮定する。したがって図５において、第２ソースコード３２０はパッケージ名“Ｓｙｓｔｅｍ”を含んでいない。また第２プログラム言語においてはパッケージ“Ｃｏｎｆｉｇ”を必ず使用する必要があるが、第１プログラム言語においてパッケージ“Ｃｏｎｆｉｇ”は定義されていないものと仮定する。したがって図５において、第２ソースコード３２０のみがパッケージ名“Ｃｏｎｆｉｇ”を含んでいる。
【００５２】
図６は、本実施形態２における第２変換ルール２２０の例である。図３で説明したルール例に加えて、新たにルール２２１とルール２２２が追加されている。第１変換ルール２１０は実施形態１と同様である。
【００５３】
ルール２２１は、中間ソースコード２３０内にパッケージ名“Ｓｙｓｔｅｍ”が含まれる場合は、これを無視するよう指定している。ソースコード変換プログラム１２０は、ルール２２１にしたがって、中間ソースコード２３０からパッケージ“Ｓｙｓｔｅｍ”を指定する部分を削除した上で、第２ソースコード３２０を出力する。
【００５４】
ルール２２２は、中間ソースコード２３０に加えて新たにパッケージ名“Ｃｏｎｆｉｇ”を追加するよう指定している。ソースコード変換プログラム１２０は、ルール２２２にしたがって、中間ソースコード２３０に対してパッケージ“Ｃｏｎｆｉｇ”を利用する旨を宣言する部分を追加する。
【００５５】
以上の説明においては、規定語句としてパッケージを無視または追加する例を説明したが、クラス名、メソッド名、プロパティ名についても同様に無視または追加するルールを記述することができる。例えば第１プログラム言語においてクラス“ＡＢＣ”が有するプロパティ“ａｂｃ”が第２プログラム言語上においては定義されていない場合、当該プロパティを無視するよう指定するルールを定義することができる。
【００５６】
以上の説明においては、第２変換ルール２２０内でパッケージ名などを無視または追加するルールを記述しているが、中間ソースコード２３０内においてこれらを無視または追加した結果を記述することが許容されるのであれば、第１変換ルール２１０内で同様のルールを記述することもできる。
【００５７】
＜実施の形態３＞
本発明の実施形態３においては、複数の第１ソースコード３１１および３１２を変換する動作例について説明する。その他構成および動作は実施形態１〜２と同様であるので、以下では主に差異点について説明する。
【００５８】
図７は、第１ソースコード３１１および３１２の例である。第１ソースコード３１２は第１ソースコード３１１と同様に、パッケージ“ＥｘａＬｉｂ”およびクラス“ＥｘａＬｉｂ．ＥｘａＬｉｂＵｔｉｌ”を使用する。ただし第１ソースコード３１２は、第１ソースコード３１１において使用していないメソッド“ＳｅｔＮａｍｅ（）”を使用している。第１ソースコード３１１は実施形態１と同様である。
【００５９】
図８は、本実施形態３においてソースコード変換プログラム１２０が生成するモジュールソースコードの例である。図８（ａ）は、第１ソースコード３１１に基づき生成したモジュールソースコードである。図８（ｂ）は、第１ソースコード３１２に基づき生成したモジュールソースコードである。第１ソースコード３１１と３１２はそれぞれクラス“ＥｘａＬｉｂＵｔｉｌ”のメソッド“ＧｅｔＮａｍｅ（）”と“ＳｅｔＮａｍｅ（）”を使用しているので、これらから生成されるモジュールソースコードは異なっている。
【００６０】
図８（ａ）に示すソースコードは実施形態１と同様である。図８（ｂ）に示すソースコードは、第１ソースコード３１２内のＳｅｔＮａｍｅ（）メソッドの戻り値を受け取る変数が存在しないことに鑑み、ｖｏｉｄ型の戻り値を有するＳｅｔＮａｍｅ（）メソッドを定義している。メソッドの内容は空である。
【００６１】
図８に示す２つのモジュールソースコードは、いずれも同一のパッケージ“ＥｘａＬｉｂ”に属するクラス“ＥｘａＬｉｂＵｔｉｌ”について定義するものである。開発支援ツールによっては、同一パッケージ／クラスのソースコードを２つのファイルに分けて記述することを許容する場合もあるが、これが許容されない場合も考慮する必要がある。下記図９を用いて、かかる場合を考慮した例を説明する。
【００６２】
図９は、本実施形態３においてソースコード変換プログラム１２０が生成するモジュールソースコードの別例である。ソースコード変換プログラム１２０は、変換対象とする第１ソースコード（ここでは３１１および３１２）全てから外部モジュールに対する参照をあらかじめ抽出して集約し、図９に示すようにこれらを単一のモジュールソースコード内に記述することもできる。
【００６３】
本実施形態３においてはＧｅｔＮａｍｅ（）メソッドとＳｅｔＮａｍｅ（）メソッドを単一のモジュールソースコード内に定義する例を説明したが、プロパティについても同様に単一のモジュールソースコード内に出力することができる。メソッドとプロパティの組み合わせについても同様である。
【００６４】
＜本発明の変形例について＞
本発明は上記した実施例に限定されるものではなく、様々な変形例が含まれる。例えば、上記した実施例は本発明を分かりやすく説明するために詳細に説明したものであり、必ずしも説明した全ての構成を備えるものに限定されるものではない。また、ある実施例の構成の一部を他の実施例の構成に置き換える事が可能であり、また、ある実施例の構成に他の実施例の構成を加えることも可能である。また、各実施例の構成の一部について他の構成の追加・削除・置換をすることができる。
【００６５】
ソースコード変換プログラム１２０は、第１プログラム言語のソースコードを開発する開発支援ツールのアドインプログラム（開発環境に対してサードパーティベンダが追加するプラグインモジュール）として実装することもできるし、第２プログラム言語のソースコードを開発する開発支援ツールのアドインプログラムとして実装することもできる。あるいはスタンドアロンプログラムとして実装することもできる。
【００６６】
以上の実施形態において、ソースコード変換プログラム１２０は第１ソースコード３１１（または３１２）を中間ソースコード２３０に変換することを説明したが、例えば変換の汎用性が求められないような場合は、中間ソースコード２３０を省略して第１ソースコード３１１（または３１２）から第２ソースコード３２０を直接生成するようにしてもよい。その場合であっても、ソースコード変換プログラム１２０の内部処理としては中間ソースコード２３０を記憶装置２００へ書き出す場合と同様の処理を実施してもよい。
【００６７】
以上の実施形態においては、第１変換ルール２１０および第２変換ルール２２０の記述形式として図３や図８を例示したが、同様の変換ルールを定義できるのであればその他の記述形式によりこれらルールを定義してもよい。
【符号の説明】
【００６８】
１００：コンピュータ、１１０：ＣＰＵ、１２０：ソースコード変換プログラム、２００：記憶装置、２１０：第１変換ルール、２２０：第２変換ルール、２３０：中間ソースコード、３１１〜３１２：第１ソースコード、３２０：第２ソースコード。
【要約】
【課題】外部モジュールを参照するソースコードを変換することによって得られたソースコードがコンパイルエラーを発生させる可能性を抑制する。
【解決手段】本発明に係るソースコード変換プログラムは、変換後のプログラム言語において規定されていない外部モジュールを変換前のソースコードが使用している場合、その外部モジュールの代替となるモジュールソースコードを自動生成する。
【選択図】図４【図１】
0005942018.tif 000002
【図２】
0005942018.tif 000003
【図３】
0005942018.tif 000004
【図４】
0005942018.tif 000005
【図５】
0005942018.tif 000006
【図６】
0005942018.tif 000007
【図７】
0005942018.tif 000008
【図８】
0005942018.tif 000009
【図９】
0005942018.tif 000010