(57)【要約】【課題】型制約の存在しないプログラミング言語における引数や復帰値の型をチェックできるようにする。【解決手段】型チェック装置２０の型チェック処理埋込部２１は、まず、型チェック処理埋込部２１がコンパイル済みの実行モジュール２から型チェック処理３を生成して実行モジュール２に埋込む。型チェック処理３が埋込まれた実行モジュール４の実行時に、統計情報収集部２２が型チェック処理３によって取得された引数情報および復帰値情報を含む統計情報を収集し、統計情報記録部２３に記録する。統計情報解析部２４は、統計情報記録部２３に記録されている統計情報に対してデータ型を統計的に解析し、型誤りを検出した場合、エラー処理部２５が警告表示またはエラー通知を行う。これにより、型制約が存在しないプログラミング言語に対して型誤りの検出が可能になる。【選択図】図１
2014106770.tif 000002
【特許請求の範囲】
【請求項１】
コンパイル済みの第１の実行モジュールに対しファンクションに渡される引数および呼出し元ファンクションに返される復帰値のデータ型をチェックして引数情報および復帰値情報を取得する型チェック処理を埋込んで第２の実行モジュールを生成する型チェック処理埋込部と、
前記第２の実行モジュールの実行時に前記型チェック処理によって取得された前記引数情報および前記復帰値情報を含む統計情報を収集する統計情報収集部と、
前記統計情報収集部が収集した統計情報を記録する統計情報記録部と、
前記統計情報記録部に記録されている統計情報に対して同じファンクション名のデータ型を統計的に解析する統計情報解析部と、
前記統計情報解析部による解析の結果、前記データ型が統計的に少数となるファンクションがあるとき、警告表示またはエラー通知を行うエラー処理部と、
を備えていることを特徴とする型チェック装置。
【請求項２】
前記型チェック処理埋込部は、前記第１の実行モジュールからクラスを読込んで前記クラスからオブジェクトを生成するインスタンス生成時に、アスペクト処理により、前記第１の実行モジュールを操作して前記型チェック処理を動的に追加して前記第２の実行モジュールを生成することを特徴とする請求項１記載の型チェック装置。
【請求項３】
前記統計情報は、ファンクション名、種別、データ型、値、および呼出し元ファンクション名を含んでいることを特徴とする請求項１記載の型チェック装置。
【請求項４】
前記呼出し元ファンクション名は、前記第２の実行モジュールの実行環境において、呼出し元ファンクションが呼出しを行ったときに前記実行環境が作成して保持していた呼出し元情報から取得することを特徴とする請求項３記載の型チェック装置。
【請求項５】
コンパイル済みの第１の実行モジュールに対しファンクションに渡される引数および呼出し元ファンクションに返される復帰値のデータ型をチェックして引数情報および復帰値情報を取得する型チェック処理を埋込んで第２の実行モジュールを生成し、
前記第２の実行モジュールの実行時に前記型チェック処理によって取得された前記引数情報および前記復帰値情報を含む統計情報を収集し、
収集した統計情報を記録し、
記録された統計情報に対して同じファンクション名のデータ型を統計的に解析し、
解析の結果、前記データ型が統計的に少数となるファンクションがあるとき、警告表示またはエラー通知を行う、
ことを特徴とする型チェック方法。
【請求項６】
コンピュータに、
コンパイル済みの第１の実行モジュールに対しファンクションに渡される引数および呼出し元ファンクションに返される復帰値のデータ型をチェックして引数情報および復帰値情報を取得する型チェック処理を埋込んで第２の実行モジュールを生成し、
前記第２の実行モジュールの実行時に前記型チェック処理によって取得された前記引数情報および前記復帰値情報を含む統計情報を収集し、
収集した統計情報を記録し、
記録された統計情報に対して同じファンクション名のデータ型を統計的に解析し、
解析の結果、前記データ型が統計的に少数となるファンクションがあるとき、警告表示またはエラー通知を行う、
処理を実行させることを特徴とする型チェックプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は型チェック装置、型チェック方法および型チェックプログラムに関し、特に型制約が存在しないプログラミング言語におけるデータ型をチェックする型チェック装置、型チェック方法および型チェックプログラムに関する。
【背景技術】
【０００２】
一般的なプログラムは、ソースコードを記述したソースファイルから実行モジュールを作成し、その実行モジュールをコンピュータで動作させることにより実行される。実行モジュールは、コンパイラ（またはインタプリタ）というプログラムを利用してコンピュータが実行できる形に作成される。
【０００３】
ソースコードを記述するプログラミング言語には、型制約の存在するものと存在しないものとがある。型とは、コンピュータがプログラムを実行するときのデータの扱いに関する形式のことであって、データを、文字列として扱う文字列型、数値として扱う数値型、真偽の２値を扱うブーリアン型など、多くのデータ型が存在している。
【０００４】
図１２はコンパイラの処理フローを示す図であって、（Ａ）は型制約の存在する言語用の処理フローを示し、（Ｂ）は型制約の存在しない言語用の処理フローを示し、図１３はソースコードの一例を示す図であって、（Ａ）は型制約の存在する言語の記述例を示し、（Ｂ）は型制約の存在しない言語の記述例を示している。
【０００５】
一般的に、コンパイラは、ソースコードを読込み、トークンに分解する字句解析部、トークン列を元にプログラムの構文木を構築する構文解析部、構文木からオブジェクトコードを生成するコード生成部の機能を備えている。
【０００６】
型制約の存在する言語用のコンパイラの処理フローは、図１２の（Ａ）に示したように、ソースコードの字句解析を行い（ステップＳ１０１）、構文解析を行い（ステップＳ１０２）、そしてコード生成をして実行モジュールを作成する（ステップＳ１０３）。型制約の存在しない言語用のコンパイラも同様に、図１２の（Ｂ）に示したように、ソースコードの字句解析を行い（ステップＳ１１１）、構文解析を行い（ステップＳ１１２）、そしてコード生成をする（ステップＳ１１３）というステップを踏む。
【０００７】
型制約が存在するプログラミング言語（たとえば、Ｊａｖａ（登録商標）など）では、ソースコードは、変数の宣言のときにデータ型を明示的に定義した形で記述されているので、コンパイルのタイミングでは、データの型が厳密に定められている。そのため、コンパイラは、構文解析を行うときに、データ型の妥当性チェックが可能であるため、一般には、構文解析処理に型チェック処理を含んでいる。型チェック処理を含んでいることによって、コンパイラは、コーディングミスをコンパイルの段階で事前に検出することが可能となり、デバック作業を効率的に進めることができる。また、コンパイラに組み込むのではなく、コンパイルした実行モジュールに対して、別個に、型チェックを行うようにした技術も知られている（たとえば、特許文献１参照）。
【０００８】
Ｊａｖａ言語によるソースコードの例を示した図１３の（Ａ）によれば、他のクラスから呼出されることを想定したメソッドでは、変数の前に文字列型を宣言する「Ｓｔｒｉｎｇ」や整数型を宣言する「ｉｎｔ」が記述されている。また、同一クラスからのアクセスを想定しているメソッドでは、メソッドの前にブーリアン型の「ｂｏｏｌｅａｎ」が記述され、引数の前には、整数型の「ｉｎｔ」が記述されている。
【０００９】
なお、この図１３の（Ａ）に示したソースコードの例は、誤ったデータ型の宣言の例を示している。たとえば、ｊｕｄｇｅというメソッドは、数値の型で引数「ｐａｒａｍ」の呼出しを想定しているが、その引数「ｐａｒａｍ」は、ファンクション「ｍｅｔｈｏｄ１」の宣言では、文字列型で定義されている。また、このメソッドの復帰値は、真偽値で返すことを明示的に宣言しているが、この復帰値を受ける側は、数値で返ってくると想定している。したがって、このソースコードをコンパイルすると、コンパイラは、構文解析の型チェック処理が型誤り（コーディングミス）を検出し、コンパイルエラーを出力することになる。
【００１０】
一方、型制約が存在しないプログラミング言語（たとえば、ＪａｖａＳｃｒｉｐｔ（登録商標）など）では、図１３の（Ｂ）にソースコードの例を示したように、ソースコードに型宣言は存在しない。型制約が存在しないプログラミング言語でも、変数の宣言は存在する。しかし、その変数がどんなデータ型であるかの宣言はない。この型制約が存在しない言語の場合、データ型は、ソースコードに存在しないだけで、実際にプログラムを実行するタイミングで動的に変換されていて、その変換されたデータ型に従ってプログラムが実行されていく。したがって、型制約が存在しないプログラミング言語は、コンパイルのタイミングでデータ型を決定することはできないので、当然ながら、構文解析のときにデータ型の妥当性チェックを行うことはできない。このため、想定したデータ型とは異なる誤った型で記述したソースコードがあったとしても、コンパイルの際にコンパイルエラーになることなく実行モジュールが作成され、実行モジュールの動作時にその誤った型が検出されるか想定しない実行結果となる。
【００１１】
たとえば、図１３の（Ｂ）に示したソースコードによれば、型宣言のない変数「ｐａｒａｍ」の定義をしていて、その値は、数値の「２００」をダブルクオートで括って文字列型にしている。また、この変数の値を、ｊｕｄｇｅというファンクションに渡しているが、このファンクションのメソッドは、数値の比較を行う処理であり、数値型で呼出されることを想定している。したがって、このソースコードから生成した実行モジュールを動作させたとしても、型の異なるデータ同士ではあるが、比較処理ができてしまってエラーにはならないが、このソースコードのプログラムは、プログラマが想定した動きをしないことになる。このように、型制約が存在しないプログラミング言語では、プログラムが、想定した通りのデータ型にて動作しているか否かは、実際にプログラムを動作させ、実行結果やデバッガにより確認を行っている。
【先行技術文献】
【特許文献】
【００１２】
【特許文献１】特開２００３−３６１８８号公報
【発明の概要】
【発明が解決しようとする課題】
【００１３】
上記の通り、型制約が存在しないプログラミング言語では、型制約が存在するプログラミング言語であれば、コンパイルエラーとして検知できたデータ型の誤りをコンパイル時に機械的に検出することはできない。そのため、実際にプログラムを動作させることでデータ型の誤りを検出する必要はあるが、テスト不足による検出漏れの可能性があるという問題点があった。
【００１４】
また、型制約の存在しないプログラミング言語では、実行時に行われる動的型変換により、プログラマの想定しない型変換が行われ、潜在障害が検出されずに製品に残存してしまう可能性があった。
【００１５】
本発明はこのような点に鑑みてなされたものであり、型制約の存在しないプログラミング言語における引数や復帰値の型をチェックする型チェック装置、型チェック方法および型チェックプログラムを提供することを目的とする。
【課題を解決するための手段】
【００１６】
本発明では、上記の課題を解決するために、コンパイル済みの第１の実行モジュールに対しファンクションに渡される引数および呼出し元ファンクションに返される復帰値のデータ型をチェックして引数情報および復帰値情報を取得する型チェック処理を埋込んで第２の実行モジュールを生成する型チェック処理埋込部と、前記第２の実行モジュールの実行時に前記型チェック処理によって取得された前記引数情報および前記復帰値情報を含む統計情報を収集する統計情報収集部と、前記統計情報収集部が収集した統計情報を記録する統計情報記録部と、前記統計情報記録部に記録されている統計情報に対して同じファンクション名のデータ型を統計的に解析する統計情報解析部と、前記統計情報解析部による解析の結果、前記データ型が統計的に少数となるファンクションがあるとき、警告表示またはエラー通知を行うエラー処理部と、を備えていることを特徴とする型チェック装置が提供される。
【００１７】
また、本発明では、コンパイル済みの第１の実行モジュールに対しファンクションに渡される引数および呼出し元ファンクションに返される復帰値のデータ型をチェックして引数情報および復帰値情報を取得する型チェック処理を埋込んで第２の実行モジュールを生成し、前記第２の実行モジュールの実行時に前記型チェック処理によって取得された前記引数情報および前記復帰値情報を含む統計情報を収集し、収集した統計情報を記録し、記録された統計情報に対して同じファンクション名のデータ型を統計的に解析し、解析の結果、前記データ型が統計的に少数となるファンクションがあるとき、警告表示またはエラー通知を行う、ことを特徴とする型チェック方法が提供される。
【００１８】
さらに、本発明では、コンピュータに、コンパイル済みの第１の実行モジュールに対しファンクションに渡される引数および呼出し元ファンクションに返される復帰値のデータ型をチェックして引数情報および復帰値情報を取得する型チェック処理を埋込んで第２の実行モジュールを生成し、前記第２の実行モジュールの実行時に前記型チェック処理によって取得された前記引数情報および前記復帰値情報を含む統計情報を収集し、収集した統計情報を記録し、記録された統計情報に対して同じファンクション名のデータ型を統計的に解析し、解析の結果、前記データ型が統計的に少数となるファンクションがあるとき、警告表示またはエラー通知を行う、処理を実行させることを特徴とする型チェックプログラムが提供される。
【００１９】
このような型チェック装置、型チェック方法および型チェックプログラムによれば、型制約が存在しないプログラミング言語によるコンパイル済みの実行モジュールに型チェック処理を埋込む。その実行モジュールの実行時に、型チェック処理によって取得した引数情報および復帰値情報を収集し、統計的に型誤りを判断して、型誤りと思われる場合に、警告表示またはエラー通知を行う。
【発明の効果】
【００２０】
上記構成の型チェック装置、型チェック方法および型チェックプログラムは、型制約が存在しないプログラミング言語においても、型制約が存在するプログラミング言語と同様にデータ型のチェックが可能にするという利点がある。データ型のチェックができることで、プログラムにおける潜在バグを機械的に検出することが可能となる。
【図面の簡単な説明】
【００２１】
【図１】本発明の実施の形態に係るプログラム開発システムを示す図である。
【図２】本発明の実施の形態に用いるコンピュータのハードウェア構成例を示す図である。
【図３】型チェック処理埋込部の処理例を示すフローチャートである。
【図４】型チェック処理埋込部による処理前後の実行モジュールの変化をソースコードのイメージで表した図である。
【図５】統計情報収集部による統計情報の収集処理例を示すフローチャートである。
【図６】統計情報の引数情報の収集例を示す図である。
【図７】統計情報の復帰値情報の収集例を示す図である。
【図８】統計情報として呼出し元ファンクション名の収集方法を説明する図である。
【図９】統計情報解析部による引数の統計情報の解析およびエラー処理部によるエラー通知の処理例を示すフローチャートである。
【図１０】統計情報解析部による復帰値の統計情報の解析およびエラー処理部によるエラー通知の処理例を示すフローチャートである。
【図１１】エラー通知の例を示す図であって、（Ａ）は画面によるエラー通知の例を示し、（Ｂ）はログ出力によるエラー通知の例を示している。
【図１２】コンパイラの処理フローを示す図であって、（Ａ）は型制約の存在する言語用の処理フローを示し、（Ｂ）は型制約の存在しない言語用の処理フローを示している。
【図１３】ソースコードの一例を示す図であって、（Ａ）は型制約の存在する言語の記述例を示し、（Ｂ）は型制約の存在しない言語の記述例を示している。
【発明を実施するための形態】
【００２２】
以下、本発明の実施の形態について、型制約が存在しないプログラミング言語によりプログラムを開発するプログラム開発システムに適用した場合を例に図面を参照して詳細に説明する。
【００２３】
図１は本発明の実施の形態に係るプログラム開発システムを示す図である。
このプログラム開発システムは、コンパイラ１０と、型チェック装置２０とを備えている。コンパイラ１０は、型制約が存在しないプログラミング言語により記述されたプログラムのソースコード１を入力し、コンピュータが実行できる形式の実行モジュール２を生成して出力する。
【００２４】
型チェック装置２０は、実行モジュール２に対してデータ型のチェックを行う支援ツールとして使用されるもので、型チェック処理埋込部２１と、統計情報収集部２２と、統計情報記録部２３と、統計情報解析部２４と、エラー処理部２５とを備えている。
【００２５】
型チェック処理埋込部２１は、コンパイラ１０によってコンパイルされた実行モジュール２を読込んで、型チェックに必要な処理を生成し、生成した型チェック処理３を実行モジュール２に埋込んで実行モジュール４を生成する。型チェック処理３は、実行モジュール２の中でファンクションに渡される引数および呼出し元ファンクションに返される復帰値のデータ型をチェックして引数情報および復帰値情報を取得する。
【００２６】
統計情報収集部２２は、実行モジュール４の実行時に型チェック処理３によって取得された引数情報および復帰値情報を含む統計情報を収集する。統計情報記録部２３は、統計情報収集部２２が収集した統計情報を記録する。統計情報解析部２４は、統計情報記録部２３に記録されている統計情報に対して同じファンクション名のデータ型を統計的に解析する。そして、エラー処理部２５は、統計情報解析部２４による解析の結果、データ型が統計的に少数となるファンクションがあるとき、警告表示またはエラー通知を行う。
【００２７】
これにより、型制約が存在しないプログラミング言語に対しても、型制約が存在するプログラミング言語で可能であった型誤りの検出が可能になり、プログラムにおける潜在バグを確実に低減することが可能となる。
【００２８】
図２は本発明の実施の形態に用いるコンピュータのハードウェア構成例を示す図である。コンピュータ３０は、ＣＰＵ（Central Processing Unit）３１によって装置全体が制御されている。ＣＰＵ３１には、ＲＡＭ（Random Access Memory）３２、ハードディスクドライブ（ＨＤＤ：Hard Disk Drive）３３、グラフィック処理装置３４、入力インタフェース３５、光学ドライブ装置３６および機器接続インタフェース３７がバス３８を介して接続されている。
【００２９】
ＲＡＭ３２には、ＣＰＵ３１に実行させるＯＳ（Operating System）のプログラムやプログラム開発に用いられるアプリケーションプログラムの少なくとも一部が一時的に格納される。また、ＲＡＭ３２には、ＣＰＵ３１による処理に必要な各種データが格納される。ＨＤＤ３３には、ＯＳ、アプリケーションプログラム、各種データなどが格納される。アプリケーションプログラムとしては、たとえば、ソースコード１を作成するテキストエディタ、コンパイラ１０、実行モジュール４を実行するための基盤となる実行環境などを含む。
【００３０】
グラフィック処理装置３４には、モニタ３９が接続されている。グラフィック処理装置３４は、ＣＰＵ３１からの命令に従って画像をモニタ３９の画面に表示させる。入力インタフェース３５には、キーボード４０およびマウス４１が接続されている。入力インタフェース３５は、キーボード４０やマウス４１から送られてくる信号を、バス３８を介してＣＰＵ３１に送信する。
【００３１】
光学ドライブ装置３６は、光ディスク４２に記録されたプログラムなどのデータの読取りを行う。光ディスク４２には、ＯＳ、アプリケーションプログラム、各種データなどが記録され、光ディスク４２から読取られたデータは、バス３８を介してＨＤＤ３３に格納される。
【００３２】
機器接続インタフェース３７は、可搬型記録媒体４３に対してデータの読取り・書込みを行う。可搬型記録媒体４３に記録されたプログラムなどのデータは、機器接続インタフェース３７によって読込まれ、バス３８を介してＨＤＤ３３に格納され、またはバス３８を介してＲＡＭ３２に展開される。機器接続インタフェース３７は、また、ＨＤＤ３３またはＲＡＭ３２に格納されているプログラムなどのデータを可搬型記録媒体４３に記録することができる。
【００３３】
以上のようなハードウェア構成によって、本実施の形態の処理機能を実現することができる。なお、ソースコード１を作成するコンピュータおよびコンパイラ１０を実行させるコンピュータは、上記の型チェック装置を実行させるコンピュータ３０と相違してもよい。その場合、ソースコード１を作成するコンピュータおよびコンパイラ１０を実行させるコンピュータも、コンピュータ３０と同様のハードウェア構成で実現される。
【００３４】
図３は型チェック処理埋込部の処理例を示すフローチャート、図４は型チェック処理埋込部による処理前後の実行モジュールの変化をソースコードのイメージで表した図である。
【００３５】
型チェック処理埋込部２１は、実行モジュール４を動的に操作して型チェック処理３を実行モジュール４に追加するものであり、既知のアスペクト処理により実現している。アスペクト処理とは、アスペクト指向（ＳＯＣ：Separation Of Concerns）を実現するための仕組みであり、コンパイル済みの実行モジュールを操作して任意の処理を追加する機能を指す。
【００３６】
アスペクト指向（ＳＯＣ）とは、一般的に「関心事の分離」と呼ばれ、ソフトウェアの処理において、本来の処理とは直接関係がなく、共通的な処理を、「サブルーチン」という関心事としてメインとなる処理のソースコード上から排除することを目的としている。これにより、たとえば、呼出しログの取得などのような共通的な処理をコーディングする必要がないので、それぞれのソースコードでは本来意識すべき処理に注力することができるとともに、共通的な処理の内容、実行有無を任意に変更することが可能となる。
【００３７】
次に、型チェック処理埋込部２１がアスペクト処理によって実行モジュール２に型チェック処理３を追加して実行モジュール４を生成するフローについて説明する。ここで、コンパイルされた実行モジュール２は、クラスが定義され、そのクラスを元にインスタンスが生成されたモジュールであるとする。型チェック処理埋込部２１は、そのクラスを元にしてメソッドに対応する部分にアスペクト処理にて新たに型チェック処理３を埋込んでいって、インスタンスを生成することになる。
【００３８】
すなわち、型チェック処理埋込部２１の処理が開始すると、図３に示したように、まず、ＣＰＵ３１は、コンパイラ１０によってコンパイルされた実行モジュール２からクラスを読込む（ステップＳ１）。
【００３９】
次に、ＣＰＵ３１は、アスペクト処理が済んでいるかどうかをチェックし（ステップＳ２）、アスペクト処理が済んでいない場合に、アスペクト処理による型チェック処理３の埋込処理を行う（ステップＳ３）。このステップＳ３の処理は、すべてのメソッドの数だけ繰り返し行われる。
【００４０】
型チェック処理３の埋込処理が終了した場合、または、ステップＳ２の判断にてアスペクト処理が済んでいる場合には、ＣＰＵ３１は、インスタンスを生成して実行モジュール４を生成する（ステップＳ４）。
【００４１】
型チェック処理埋込部２１がアスペクト処理によって実行モジュール２に型チェック処理３を追加すると、図４に示したように、ｊｕｄｇｅというファンクションのメソッドは、引数および復帰値の情報を取得する処理が追加されている。換言すれば、ソースコードのイメージで表した実行モジュール２のファンクション「ｊｕｄｇｅ」のメソッド
ｒｅｔｕｒｎ  ｐａｒａｍ＞１００；
は、実行モジュール４においては、引数および復帰値のデータ型をチェックする型チェック処理３として次の４行の、
引数情報取得（ｐａｒａｍ）；
ｖａｒ  ｒｅｔＶａｌ＝ｐａｒａｍ＞１００；
復帰値情報取得（ｒｅｔＶａｌ）；
ｒｅｔｕｒｎ  ｒｅｔＶａｌ；
によって書き換えられている。
【００４２】
次に、型チェック装置２０によるデータ型の統計的なチェックおよびエラー処理について説明する。
図５は統計情報収集部による統計情報の収集処理例を示すフローチャート、図６は統計情報の引数情報の収集例を示す図、図７は統計情報の復帰値情報の収集例を示す図、図８は統計情報として呼出し元ファンクション名の収集方法を説明する図である。
【００４３】
統計情報収集部２２による統計情報の収集は、実行モジュール４の型チェック処理３が処理を開始することによって開始される。すなわち、統計情報収集部２２は、まず、型チェック処理３が取得した引数情報から実行モジュール４のファンクションの中で呼出しを行うファンクションの呼出し元ファンクション名を取得する（ステップＳ１１）。次に、統計情報収集部２２は、その呼出し元ファンクションが呼出す引数の型情報を取得し（ステップＳ１２）、それに関連する他の引数情報とともに統計情報記録部２３に記録し（ステップＳ１３）、これらステップＳ１２，Ｓ１３の処理を引数の数分繰り返す。ここで、統計情報記録部２３に記録する引数情報は、図６に示したように、ファンクション名、種別＝引数（順番）、データ型、値、および呼出し元ファンクション名である。
【００４４】
このように、引数の統計情報がすべて収集されると、次に、実行モジュール４が本来のメソッド処理を実行し、型チェック処理３が復帰値情報を取得する（ステップＳ１４）。その本来のメソッド処理を実行することで得られる復帰値について、統計情報収集部２２は、復帰値に例外が発生しているか否かを判断する（ステップＳ１５）。ここで、統計情報収集部２２は、復帰値の値として通常取り得るデータ型の値であれば、復帰値型情報を取得し（ステップＳ１６）、復帰値情報を統計情報記録部２３に記録する（ステップＳ１７）。
【００４５】
ステップＳ１５において、通常取り得るデータ型の値でない復帰値が収集された場合、統計情報収集部２２は、例外が発生したと判断して例外型情報を取得し（ステップＳ１８）、取得した例外型情報を統計情報記録部２３に記録する（ステップＳ１９）。
【００４６】
なお、ステップＳ１７，Ｓ１９において、統計情報記録部２３に記録する引数情報は、図７に示したように、ファンクション名、種別＝復帰値、データ型、値、呼出し元ファンクション名およびメソッド結果である。
【００４７】
なお、図５におけるステップＳ１１では、呼出し元ファンクション名を取得しているが、この情報は、型チェック処理３により直接取得することはできない。しかし、呼出し元ファンクション名なる統計情報は、プログラムの実行環境５０より取得することができる。
【００４８】
すなわち、図８に示したように、ＪａｖａＳｃｒｉｐｔ言語でコーディングされたモジュールＡ，Ｂがあった場合、そのモジュールＡ，Ｂは、ＪａｖａＳｃｒｉｐｔ実行エンジンなる実行環境５０の元で実行される。ここで、モジュールＢのファンクションＹがモジュールＡのファンクションＸを呼出すとした場合、ファンクションＸの引数（ａ，ｂ，ｃ）がファンクションＹに渡されるが、そのとき、実行環境５０では、一般に、呼出し元の情報を保持している。たとえば、図示のような呼出しがあったとき、そのときに、呼出し元情報を保持するスタック５１が実行環境５０内に作成される。この呼出し元情報を、たとえば、ファンクションＹが知りたいとした場合、実行環境５０が提供するＡＰＩ（Application Programming Interface）を利用して呼出し情報取得処理５２がスタック５１を参照することにより呼出し元情報を取得することができる。したがって、この型チェック装置２０においても、統計情報収集部２２が取得する呼出し元ファンクション名については、実行環境５０のＡＰＩを利用してスタック５１を参照することにより取得することができる。
【００４９】
以上のようにして、統計情報収集部２２により収集され、統計情報記録部２３に記録された統計情報は、統計情報解析部２４において解析され、データ型に統計的に誤りがあると思われる場合、エラー処理部２５が警告表示またはエラー通知を行う。以下、その統計情報の解析およびエラー処理を、引数の場合と復帰値の場合とに分けて説明する。
【００５０】
図９は統計情報解析部による引数の統計情報の解析およびエラー処理部によるエラー通知の処理例を示すフローチャート、図１０は統計情報解析部による復帰値の統計情報の解析およびエラー処理部によるエラー通知の処理例を示すフローチャートである。
【００５１】
引数の統計情報の解析では、図９に示したように、統計情報解析部２４は、統計情報記録部２３に記録された統計情報からすべてのファンクションの統計情報を登録する（ステップＳ２１）。
【００５２】
次に、統計情報解析部２４は、登録された１つの登録情報を選択してその登録情報が統計情報のファンクション名と一致するかどうかを判断し（ステップＳ２２）、一致する場合には、登録情報と引数順番が一致するかどうかを判断する（ステップＳ２３）。ここで、引数順番が一致する場合、統計情報解析部２４は、さらに、これら登録情報のデータ型が一致するかどうかを判断する（ステップＳ２４）。そして、ステップＳ２４において、データ型が一致しないときには、エラー処理部２５により警告・エラー通知候補として記録が行われる（ステップＳ２５）。なお、ステップＳ２２において、ファンクション名が一致しないとき、ステップＳ２３において、引数順番が一致しないとき、または、ステップＳ２４において、データ型が一致するときには、ステップＳ２５の警告・エラー通知候補記録の処理はパスされる。
【００５３】
以上のステップＳ２２〜Ｓ２５の処理は、すべての登録情報数について繰り返し実行され、さらに、引数の数分、繰り返し実行される。このようにして、統計情報解析部２４では、ファンクション名および引数順番が一致するファンクションの中で、データ型が一致しないものがあれば、警告・エラー通知候補として記録する。
【００５４】
すべての登録情報について繰り返し実行後、統計情報解析部２４は、警告・エラー通知候補が存在しているかチェックを行う（ステップＳ２６）。警告・エラー通知候補が存在した場合、データ型が統計的に少数となるファンクションについて、エラー処理部２５にて警告・エラー通知が行われる（ステップＳ２７）。エラー処理部２５では、警告・エラー通知処理を行うと判断された引数情報について、不正な呼出しの可能性があるとして警告表示またはエラー通知を行うことになる。たとえば、引数情報の例を示した図６の「データ型」の項によれば、殆どの呼出しがＮｕｍｂｅｒ型となっており、統計的には、Ｎｕｍｂｅｒ型を引数に取るメソッドであると想定することができる。そのメソッドにおいて、Ｎｕｍｂｅｒ型以外のデータ型による呼出しが存在した場合（たとえば、図６のＥ１の場合）、型情報の誤りの可能性があると判断することができるため、エラー処理部２５は、警告（またはエラー）として出力する。
【００５５】
その後、統計情報解析部２４は、再度、登録された１つの登録情報を選択してその登録情報が統計情報のファンクション名と一致するかどうかを判断し（ステップＳ２８）、一致する場合には、引数の数を保持する（ステップＳ２９）。登録情報がファンクション名と一致しない場合、ステップＳ２９の処理をパスする。そして、このステップＳ２８およびステップＳ２９の処理は、すべての登録情報数について繰り返し実行される。
【００５６】
最後に、統計情報解析部２４は、ステップＳ２９の処理で保持された引数の数が妥当であるか否かをチェックし（ステップＳ３０）、登録情報の引数の数が保持された引数の数と一致しない場合、エラー処理部２５は、警告（またはエラー）として出力する（ステップＳ３１）。たとえば、引数情報の例を示した図６には「種別（順番）」の項があるが、ここで、引数の数に相違がある場合（図６のＥ２の場合）、不正な呼出しの可能性があるとして、エラー処理部２５は、警告（またはエラー）として出力することになる。これにより、統計情報解析部２４は、引数なしで呼出された場合にも、型チェックを可能にしている。
【００５７】
復帰値の統計情報の解析では、図１０に示したように、統計情報解析部２４は、統計情報記録部２３に記録された統計情報からすべてのファンクションの統計情報を登録する（ステップＳ４１）。
【００５８】
次に、統計情報解析部２４は、登録された１つの登録情報を選択してその登録情報が統計情報のファンクション名と一致するかどうかを判断し（ステップＳ４２）、一致する場合には、登録情報とデータ型が一致するかどうかを判断する（ステップＳ４３）。ステップＳ４３において、データ型が一致しないときには、警告・エラー通知候補として記録を行う（ステップＳ４４）。ステップＳ４２において、ファンクション名が一致しないとき、および、ステップＳ４３において、データ型が一致するときには、それぞれステップＳ４４の警告・エラー通知候補記録の処理はパスされる。以上のステップＳ４２〜Ｓ４４の処理は、すべての登録情報数について繰り返し実行される。
【００５９】
すべての登録情報に対して繰り返し実行後、統計情報解析部２４は、警告・エラー通知候補が存在しているかチェックを行う（ステップＳ４５）。警告・エラー通知候補が存在した場合、データ型が統計的に少数となるファンクションについて、エラー処理部２５により警告・エラー通知処理が行われる（ステップＳ４６）。このようにして、統計情報解析部２４では、ファンクション名が一致するファンクションの中で、復帰値のデータ型が一致しないものがあれば、エラー処理部２５にて警告・エラー通知処理が行われることになる。たとえば、復帰値情報の例を示した図７によれば、呼出し毎に値を記録し、異なるデータ型であれば（たとえば、図７のＥ３の場合）、エラー処理部２５は、警告（またはエラー）として出力する。なお、復帰値の場合、メソッド結果（正常／例外発生）も併せて記録しているが、メソッド結果が例外発生の場合には、大多数の復帰値と異なるデータ型であってもエラーと判断しない（たとえば、図７のＥ４の場合）。
【００６０】
図１１はエラー通知の例を示す図であって、（Ａ）は画面によるエラー通知の例を示し、（Ｂ）はログ出力によるエラー通知の例を示している。
エラー処理部２５は、その通知方法としては、アプリケーション画面上に通知する場合、ログファイルへの出力により通知する場合、または、画面通知およびログ出力の両方で行う場合がある。
【００６１】
画面通知の場合、図１１の（Ａ）に示したように、実行モジュール４が実行されていてモニタ３９にアプリケーション画面６１が表示されているとする。このとき、統計情報解析部２４がプログラムに何らかの誤りを検出した時点で、エラー処理部２５は、通知用のダイアログ６２をアプリケーション画面６１上にポップアップ表示させて、利用者に通知を行う。
【００６２】
通知用のダイアログ６２が表示されると、利用者は、その段階で警告内容を確認し、ソースコード１を見直して、再度、コンパイルと、型チェック装置２０による型チェック処理を行い、以上の処理を型誤りがなくなるまで繰り返し行うことになる。
【００６３】
一方、ログ出力の場合、図１１の（Ｂ）に示したように、実行モジュール４の実行時に、統計情報解析部２４がプログラムに何らかの誤りを検出した時点で、エラー処理部２５は、警告／エラーログをログファイル６３に出力する。なお、警告／エラーログをログファイル６３に出力するタイミングを統計情報解析部２４が誤りを検出した時点としているが、実行モジュール４の実行終了時でもよい。
【符号の説明】
【００６４】
１  ソースコード
２  実行モジュール
３  型チェック処理
４  実行モジュール
１０  コンパイラ
２０  型チェック装置
２１  型チェック処理埋込部
２２  統計情報収集部
２３  統計情報記録部
２４  統計情報解析部
２５  エラー処理部
３０  コンピュータ
３１  ＣＰＵ
３２  ＲＡＭ
３３  ハードディスクドライブ（ＨＤＤ）
３４  グラフィック処理装置
３５  入力インタフェース
３６  光学ドライブ装置
３７  機器接続インタフェース
３８  バス
３９  モニタ
４０  キーボード
４１  マウス
４２  光ディスク
４３  可搬型記録媒体
５０  実行環境
５１  スタック
５２  呼出し情報取得処理
６１  アプリケーション画面
６２  ダイアログ
６３  ログファイル
【図１】
2014106770.tif 000003
【図２】
2014106770.tif 000004
【図３】
2014106770.tif 000005
【図４】
2014106770.tif 000006
【図５】
2014106770.tif 000007
【図６】
2014106770.tif 000008
【図７】
2014106770.tif 000009
【図８】
2014106770.tif 000010
【図９】
2014106770.tif 000011
【図１０】
2014106770.tif 000012
【図１１】
2014106770.tif 000013
【図１２】
2014106770.tif 000014
【図１３】
2014106770.tif 000015