JPH06266561A - プログラムの型検査方法およびシステム - Google Patents
プログラムの型検査方法およびシステムInfo
- Publication number
- JPH06266561A JPH06266561A JP5104593A JP5104593A JPH06266561A JP H06266561 A JPH06266561 A JP H06266561A JP 5104593 A JP5104593 A JP 5104593A JP 5104593 A JP5104593 A JP 5104593A JP H06266561 A JPH06266561 A JP H06266561A
- Authority
- JP
- Japan
- Prior art keywords
- type
- class
- checking
- program
- variable
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Landscapes
- Devices For Executing Special Programs (AREA)
Abstract
(57)【要約】
【目的】強く型付けされたオブジェクト指向プログラミ
ング言語における型検査を効率よく行う方法を提供す
る。 【構成】データ管理システム120に格納されたクラス
定義121は、計算機システム10内のコンパイラ10
0でコンパイルされ、オブジェクト131、実行コード
133および型検査プログラム135が生成されて、該
オブジェクト131、実行コード133および型検査プ
ログラム135はオブジェクト管理システム130に格
納される。実行部110は、オブジェクト131を参照
しつつ型検査プログラム135を実行して型検査を行い
実行結果を出力する。
ング言語における型検査を効率よく行う方法を提供す
る。 【構成】データ管理システム120に格納されたクラス
定義121は、計算機システム10内のコンパイラ10
0でコンパイルされ、オブジェクト131、実行コード
133および型検査プログラム135が生成されて、該
オブジェクト131、実行コード133および型検査プ
ログラム135はオブジェクト管理システム130に格
納される。実行部110は、オブジェクト131を参照
しつつ型検査プログラム135を実行して型検査を行い
実行結果を出力する。
Description
【0001】
【産業上の利用分野】本発明は、強く型付けされたオブ
ジェクト指向プログラミング言語の型検査の方法に関す
る。
ジェクト指向プログラミング言語の型検査の方法に関す
る。
【0002】
【従来技術】プログラミング言語による表現・記述とい
う立場から、プログラム中に出現する特定の式が取りう
る値に関する制約として、プログラムの「型」が導入さ
れる。
う立場から、プログラム中に出現する特定の式が取りう
る値に関する制約として、プログラムの「型」が導入さ
れる。
【0003】本明細書で用いるオブジェクト指向プログ
ラミング言語など抽象データを扱うプログラミング言語
の型は、コンパイラに対して、コンパイルのための情報
(データの記憶領域の大きさなど)を知らせるためのも
のではなく、関数呼出やメッセージ送信などの整合性、
すなわち、プログラムの整合性を検査するための情報で
あることを明記しておく。
ラミング言語など抽象データを扱うプログラミング言語
の型は、コンパイラに対して、コンパイルのための情報
(データの記憶領域の大きさなど)を知らせるためのも
のではなく、関数呼出やメッセージ送信などの整合性、
すなわち、プログラムの整合性を検査するための情報で
あることを明記しておく。
【0004】また、プログラム中で実行される演算が適
正な型を持つデータに適用されるかどうかを検査する作
業を、「型検査」という。オブジェクト指向プログラミ
ング言語の型検査については、“岩波講座ソフトウエア
科学17 モデルと表現”(米澤明憲,柴山悦哉著、岩
波書店、1992年)pp.44〜61に詳述されてい
る。また、一般の型検査については、“コンパイラ
I”(A.V.エイホ,R.セシィ,J.D.ウルマン
共著、原田賢一訳、サイエンス社、1990年)pp.
417〜470に詳述されている。
正な型を持つデータに適用されるかどうかを検査する作
業を、「型検査」という。オブジェクト指向プログラミ
ング言語の型検査については、“岩波講座ソフトウエア
科学17 モデルと表現”(米澤明憲,柴山悦哉著、岩
波書店、1992年)pp.44〜61に詳述されてい
る。また、一般の型検査については、“コンパイラ
I”(A.V.エイホ,R.セシィ,J.D.ウルマン
共著、原田賢一訳、サイエンス社、1990年)pp.
417〜470に詳述されている。
【0005】この型検査には、静的型検査と動的型検査
の2種類がある。このうち、静的型検査は、プログラム
のコンパイル時に実行される。動的型検査は、ソースプ
ログラムをコンパイルしたコードに、型検査用のコード
を埋め込み、実行時に演算が適正な型を持つデータに適
用されるか否かを調べる検査である。
の2種類がある。このうち、静的型検査は、プログラム
のコンパイル時に実行される。動的型検査は、ソースプ
ログラムをコンパイルしたコードに、型検査用のコード
を埋め込み、実行時に演算が適正な型を持つデータに適
用されるか否かを調べる検査である。
【0006】プログラミング言語が強く型付けされてい
るとは、その言語の意味論として、コンパイラを通った
プログラムは、その言語が定める型検査に合格し、型安
全(適正でないデータに演算が適用されることはない)
であるということを保証することである。
るとは、その言語の意味論として、コンパイラを通った
プログラムは、その言語が定める型検査に合格し、型安
全(適正でないデータに演算が適用されることはない)
であるということを保証することである。
【0007】従来の静的型検査(以下、静的型検査を型
検査と呼ぶ)は、コンパイラ内部の一つのルーチンとし
て実現されている。型検査は字句・構文解析部によって
生成された構文木に従って行われる。逆に言えば、字句
・構文解析部と独立に型検査を行うことはできない。
検査と呼ぶ)は、コンパイラ内部の一つのルーチンとし
て実現されている。型検査は字句・構文解析部によって
生成された構文木に従って行われる。逆に言えば、字句
・構文解析部と独立に型検査を行うことはできない。
【0008】図2は、従来のオブジェクト指向プログラ
ミング言語のコンパイラにおける各フェーズを表したも
のである。200はコンパイラであり、クラス定義12
1を読み込み、メソッド実行コード133を伴うクラス
オブジェクト131を生成する。読み込んだクラス定義
121は、字句・構文解析部201によって構文木に変
換される。
ミング言語のコンパイラにおける各フェーズを表したも
のである。200はコンパイラであり、クラス定義12
1を読み込み、メソッド実行コード133を伴うクラス
オブジェクト131を生成する。読み込んだクラス定義
121は、字句・構文解析部201によって構文木に変
換される。
【0009】この構文木に従い、型検査部202は、型
推論(プログラムの文面に与えられた、非明示な型に関
する情報を手がかりにして、文面中に現れる式の持ちう
る型を厳密な論理によって決定してゆくこと)を行い、
プログラムに型の誤りがないか検査する。もし、型の誤
り(適正でないデータに演算が適用されること)がなけ
れば、構文木は中間コード生成部203に渡され、中間
コードが生成される。
推論(プログラムの文面に与えられた、非明示な型に関
する情報を手がかりにして、文面中に現れる式の持ちう
る型を厳密な論理によって決定してゆくこと)を行い、
プログラムに型の誤りがないか検査する。もし、型の誤
り(適正でないデータに演算が適用されること)がなけ
れば、構文木は中間コード生成部203に渡され、中間
コードが生成される。
【0010】中間コードは、コード最適化部204で最
適化処理を施され、コード生成部205で実行コードと
なる。一方、コンパイラのそれぞれのフェーズで解析さ
れた様々なクラス(所属する類)に関する情報は、クラ
スオブジェクトとして生成され、コード生成部205で
生成された実行コードをオブジェクトとしたメソッド実
行コード133とともに出力される。
適化処理を施され、コード生成部205で実行コードと
なる。一方、コンパイラのそれぞれのフェーズで解析さ
れた様々なクラス(所属する類)に関する情報は、クラ
スオブジェクトとして生成され、コード生成部205で
生成された実行コードをオブジェクトとしたメソッド実
行コード133とともに出力される。
【0011】
【発明が解決しようとする課題】このような従来の型検
査の方法では、次の様な場合に問題が起こる。
査の方法では、次の様な場合に問題が起こる。
【0012】一つは、未定義の型を参照しているメソッ
ドの型検査である。
ドの型検査である。
【0013】一般に、型検査の対象となるプログラムに
出現する型は、全て定義済みのものでなければならな
い。このために、そのメソッドを定義する前に、メソッ
ドが参照する型をクラスの定義に先だって全て定義しな
ければならないという定義順序の制約を設けたり、ファ
イルなどのコンパイル単位内に必ず参照された型が定義
されるという前提で、型変数を用いる方法などがとられ
ている。
出現する型は、全て定義済みのものでなければならな
い。このために、そのメソッドを定義する前に、メソッ
ドが参照する型をクラスの定義に先だって全て定義しな
ければならないという定義順序の制約を設けたり、ファ
イルなどのコンパイル単位内に必ず参照された型が定義
されるという前提で、型変数を用いる方法などがとられ
ている。
【0014】しかし、一般にオブジェクト指向プログラ
ミング言語においては、型を宣言することなしにコンパ
イルすることが可能である。また、柔軟なオブジェクト
指向プログラミング環境の提供のために、クラス定義は
それぞれが独立していること、すなわち、定義順序やコ
ンパイル単位などを意識する必要がないことが望まし
い。
ミング言語においては、型を宣言することなしにコンパ
イルすることが可能である。また、柔軟なオブジェクト
指向プログラミング環境の提供のために、クラス定義は
それぞれが独立していること、すなわち、定義順序やコ
ンパイル単位などを意識する必要がないことが望まし
い。
【0015】したがって、参照している型が未定義であ
っても、とりあえずコンパイルを行い、参照している型
が定義されたとき、型検査を行い、プログラムの整合性
を検査する方法が考えられる。
っても、とりあえずコンパイルを行い、参照している型
が定義されたとき、型検査を行い、プログラムの整合性
を検査する方法が考えられる。
【0016】図3は、型の参照関係の例である。310
は、クラスtype1の定義であり、型type0を参照するメソ
ッドm11の定義311とメソッドm12の定義313をも
つ。同様に、320はクラスtype2の定義であり、型typ
e0を参照していないm21の定義321とtype0を参照する
メソッドm22の定義323をもつ。300はクラスtype0
の定義であり、メソッドm01の定義301とメソッドm02
の定義303をもつ。ここでtype0が未定義であったと
する。このとき、メソッド311、313、323の型
検査を行うことができない。そこで、とりあえず、この
3つのメソッドを型検査なしでコンパイルし、クラスty
pe0の定義300が行われたとき、型検査を行う。ここ
で問題なのは、メソッド311、313、323のコン
パイル時に行った字句・構文解析と全く同一の字句・構
文解析を、再び、型検査のときに行わなければならない
ということである。
は、クラスtype1の定義であり、型type0を参照するメソ
ッドm11の定義311とメソッドm12の定義313をも
つ。同様に、320はクラスtype2の定義であり、型typ
e0を参照していないm21の定義321とtype0を参照する
メソッドm22の定義323をもつ。300はクラスtype0
の定義であり、メソッドm01の定義301とメソッドm02
の定義303をもつ。ここでtype0が未定義であったと
する。このとき、メソッド311、313、323の型
検査を行うことができない。そこで、とりあえず、この
3つのメソッドを型検査なしでコンパイルし、クラスty
pe0の定義300が行われたとき、型検査を行う。ここ
で問題なのは、メソッド311、313、323のコン
パイル時に行った字句・構文解析と全く同一の字句・構
文解析を、再び、型検査のときに行わなければならない
ということである。
【0017】問題が起こるもう一つの場合として、クラ
スの更新(クラスの定義を変えること)に係わる型検査
がある。これは特に永続的オブジェクトを扱うシステ
ム、例えばオブジェクト指向データベースなどで大きな
問題となる。
スの更新(クラスの定義を変えること)に係わる型検査
がある。これは特に永続的オブジェクトを扱うシステ
ム、例えばオブジェクト指向データベースなどで大きな
問題となる。
【0018】前述の図3を用いて説明する。クラスtype
0の定義300を更新し、このために型type0の定義も更
新された場合を考える。この更新が矛盾なく行われたか
どうかを検査するためには、クラスtype0の定義300
の再コンパイルと型type0を参照していメソッド31
1、313、323の型検査を行う必要がある。
0の定義300を更新し、このために型type0の定義も更
新された場合を考える。この更新が矛盾なく行われたか
どうかを検査するためには、クラスtype0の定義300
の再コンパイルと型type0を参照していメソッド31
1、313、323の型検査を行う必要がある。
【0019】従来の型検査の方法では、各メソッドの型
検査を字句・構文解析から行わなければならない。オブ
ジェクト指向データベースなど多くのクラスを管理する
システムでは、参照しているメソッドは非常に多くなる
と考えられ、これらをすべて、字句・構文解析から型検
査を行うのはかなりの負荷となる。
検査を字句・構文解析から行わなければならない。オブ
ジェクト指向データベースなど多くのクラスを管理する
システムでは、参照しているメソッドは非常に多くなる
と考えられ、これらをすべて、字句・構文解析から型検
査を行うのはかなりの負荷となる。
【0020】さらに問題が起こる場合として、メソッド
の再利用、特に、オブジェクト指向プログラミング言語
では標準的な機能となっている継承(あるクラスが、他
のクラスの変数およびメソッドをそのまま受け継ぐこ
と)に伴う型検査がある。
の再利用、特に、オブジェクト指向プログラミング言語
では標準的な機能となっている継承(あるクラスが、他
のクラスの変数およびメソッドをそのまま受け継ぐこ
と)に伴う型検査がある。
【0021】このとき、メソッドで使用されている、メ
ソッド外部で宣言された変数の型が、継承された先で変
化することがある。このため、メソッドは継承された先
で、プログラムの整合性が保てるかどうか、型検査を行
う必要がある。
ソッド外部で宣言された変数の型が、継承された先で変
化することがある。このため、メソッドは継承された先
で、プログラムの整合性が保てるかどうか、型検査を行
う必要がある。
【0022】図4は、メソッドの継承の様子を表してい
る。400はクラスtype0の定義であり、type00型の変
数Xを宣言している。401は、このメソッド外部で宣
言された変数Xを用いて定義されたメソッドm0である。
410はクラスtype1の定義であり、メソッド401を
クラスtype0から継承している。他に、メソッドm10とメ
ソッドm11もつ。クラスtype1の定義410では、変数X
は型type11と宣言されている。したがって、メソッド4
01は変数Xが型type11であってもプログラムの整合性
が保てるかどうか、型検査を行わなければならない。同
様に、420はクラスtype2の定義であり、メソッド4
01を継承し、他に、メソッドm2をもつ。変数Xは、型t
ype22として宣言されており、メソッド401は、変数X
の型をtype22として、型検査を行う必要がある。ここで
注意したいのは、クラスtype0の定義400におけるメ
ソッド401の型検査とクラスtype1の定義410にお
けるメソッド401の型検査とクラスtype2の定義42
0におけるメソッド401の型検査は、変数Xの型が異
なるだけで、他は全く同一である。しかし、それぞれの
型検査において、メソッド401の字句・構文解析から
行わなければならない。
る。400はクラスtype0の定義であり、type00型の変
数Xを宣言している。401は、このメソッド外部で宣
言された変数Xを用いて定義されたメソッドm0である。
410はクラスtype1の定義であり、メソッド401を
クラスtype0から継承している。他に、メソッドm10とメ
ソッドm11もつ。クラスtype1の定義410では、変数X
は型type11と宣言されている。したがって、メソッド4
01は変数Xが型type11であってもプログラムの整合性
が保てるかどうか、型検査を行わなければならない。同
様に、420はクラスtype2の定義であり、メソッド4
01を継承し、他に、メソッドm2をもつ。変数Xは、型t
ype22として宣言されており、メソッド401は、変数X
の型をtype22として、型検査を行う必要がある。ここで
注意したいのは、クラスtype0の定義400におけるメ
ソッド401の型検査とクラスtype1の定義410にお
けるメソッド401の型検査とクラスtype2の定義42
0におけるメソッド401の型検査は、変数Xの型が異
なるだけで、他は全く同一である。しかし、それぞれの
型検査において、メソッド401の字句・構文解析から
行わなければならない。
【0023】前述の3つの場合が示すように、すでにコ
ンパイルされたメソッドに対して型検査だけが必要な場
合にも、再び、字句・構文解析から行わなければならな
い。しかも、全く同一のメソッドの定義を何度も行わな
ければならないことが多いという問題が存在する。
ンパイルされたメソッドに対して型検査だけが必要な場
合にも、再び、字句・構文解析から行わなければならな
い。しかも、全く同一のメソッドの定義を何度も行わな
ければならないことが多いという問題が存在する。
【0024】本発明の目的は、強く型付けされたオブジ
ェクト指向プログラミング言語の型検査を効率よく行
う、さらに、詳しく述べれば、型検査をコンパイラのフ
ェーズから独立させるとともに、型検査の際に字句・構
文解析を行わないような型検査の方法を提供することに
ある。
ェクト指向プログラミング言語の型検査を効率よく行
う、さらに、詳しく述べれば、型検査をコンパイラのフ
ェーズから独立させるとともに、型検査の際に字句・構
文解析を行わないような型検査の方法を提供することに
ある。
【0025】本発明の他の目的は、コンパイルの際に、
クラス定義とは別に予め型の定義を宣言したりコンパイ
ルの順序を指定したりする必要がなく、強く型付けされ
たオブジェクト指向プログラミング言語のプログラマに
対する制約をできるだ少なくする方法を提供することに
ある。
クラス定義とは別に予め型の定義を宣言したりコンパイ
ルの順序を指定したりする必要がなく、強く型付けされ
たオブジェクト指向プログラミング言語のプログラマに
対する制約をできるだ少なくする方法を提供することに
ある。
【0026】
【課題を解決するための手段】上記従来の問題点を考慮
して、本発明によれば、オブジェクト指向プログラミン
グ言語によって記述されたメソッドの定義および変数の
宣言を含むクラス定義をコンパイルするコンパイラを備
えた計算機システムにおいて、コンパイラは、クラス定
義により定義されるクラスの型に関する型情報を生成す
る型情報生成手段と、この型情報を保持する第1の保持
手段と、保持された型情報に基づいてメソッドの各々に
対して型検査を行なうための型検査プログラムを生成す
る型検査プログラム生成手段とを備えることができる。
して、本発明によれば、オブジェクト指向プログラミン
グ言語によって記述されたメソッドの定義および変数の
宣言を含むクラス定義をコンパイルするコンパイラを備
えた計算機システムにおいて、コンパイラは、クラス定
義により定義されるクラスの型に関する型情報を生成す
る型情報生成手段と、この型情報を保持する第1の保持
手段と、保持された型情報に基づいてメソッドの各々に
対して型検査を行なうための型検査プログラムを生成す
る型検査プログラム生成手段とを備えることができる。
【0027】さらに、前記システムは、コンパイラによ
り生成された型検査プログラムを保持する第2の保持手
段と、メソッドが参照すべき型に関する型情報を生成さ
れると、前記メソッドに対応する前記型検査プログラム
を前記第2の保持手段から取りだし、前記型に関する情
報に基づき実行する実行手段を備えることができる。
り生成された型検査プログラムを保持する第2の保持手
段と、メソッドが参照すべき型に関する型情報を生成さ
れると、前記メソッドに対応する前記型検査プログラム
を前記第2の保持手段から取りだし、前記型に関する情
報に基づき実行する実行手段を備えることができる。
【0028】
【作用】構文木に基づく型検査の手順は型検査プログラ
ムに記録されるため、その後の型検査においては、字句
・構文解析を行う必要がない。したがって、繰り返し型
検査を行う場合、型検査の効率が良くなる。
ムに記録されるため、その後の型検査においては、字句
・構文解析を行う必要がない。したがって、繰り返し型
検査を行う場合、型検査の効率が良くなる。
【0029】メソッド内部では確定しない型は、型変数
として扱われるため、様々な場合の型検査に柔軟に対応
することができる。
として扱われるため、様々な場合の型検査に柔軟に対応
することができる。
【0030】コンパイルと型検査が独立して行うことが
できるので、型検査によるプログラマへの制約が緩和さ
れる。
できるので、型検査によるプログラマへの制約が緩和さ
れる。
【0031】
【実施例】以下、本発明の1実施例を図面を参照して説
明する。図1は、永続的オブジェクトを扱うシステムに
おける本発明の構成を表したものである。図5は、図1
におけるコンパイラ100の各フェーズの流れである。
明する。図1は、永続的オブジェクトを扱うシステムに
おける本発明の構成を表したものである。図5は、図1
におけるコンパイラ100の各フェーズの流れである。
【0032】図1において、10は演算装置と記憶装置
をもつ計算機システムである。図1及び図5において、
120はファイルシステムやデータベースなどのテキス
トデータを管理することのできるシステムである。13
0は、オブジェクト指向データベースなどオブジェクト
を管理することのできるシステムである。121はクラ
ス定義であり、オブジェクトの構造や手続きを定義して
いる。これはプログラムに相当する。131はクラスオ
ブジェクトであり、そのクラスのインスタンスオブジェ
クトの生成器であり、クラス全体の様々を情報を管理す
る。133はメソッド実行コードであり、オブジェクト
がメッセージを受け取ったときに起動する手続きであ
る。135は、型検査プログラムであり、各メソッドに
対応している。133と135もオブジェクトであり、
クラスオブジェクト131の管理下にある。
をもつ計算機システムである。図1及び図5において、
120はファイルシステムやデータベースなどのテキス
トデータを管理することのできるシステムである。13
0は、オブジェクト指向データベースなどオブジェクト
を管理することのできるシステムである。121はクラ
ス定義であり、オブジェクトの構造や手続きを定義して
いる。これはプログラムに相当する。131はクラスオ
ブジェクトであり、そのクラスのインスタンスオブジェ
クトの生成器であり、クラス全体の様々を情報を管理す
る。133はメソッド実行コードであり、オブジェクト
がメッセージを受け取ったときに起動する手続きであ
る。135は、型検査プログラムであり、各メソッドに
対応している。133と135もオブジェクトであり、
クラスオブジェクト131の管理下にある。
【0033】図1において、コンパイラ100は、クラ
ス定義121を読み込み、クラスオブジェクト131を
生成する。この時、メソッド実行コードの他に型検査プ
ログラムも生成する。
ス定義121を読み込み、クラスオブジェクト131を
生成する。この時、メソッド実行コードの他に型検査プ
ログラムも生成する。
【0034】生成されたクラスオブジェクト131は1
30によって管理され、クラス名(型名)によって、そ
れぞれのクラスオブジェクトを呼び出すことができる。
クラス名と型名は同じであるので、型名によってその型
の定義情報があるクラスオブジェクトを得ることができ
る。
30によって管理され、クラス名(型名)によって、そ
れぞれのクラスオブジェクトを呼び出すことができる。
クラス名と型名は同じであるので、型名によってその型
の定義情報があるクラスオブジェクトを得ることができ
る。
【0035】110は型検査プログラム実行部であり、
型検査プログラム135を実行し、135が対応するメ
ソッドの型検査を行う。型検査プログラムの実行に必要
な型の情報は型名に対応するクラスオブジェクトから得
る。もし、型検査プログラムが正しく実行できない場合
は、対応するメソッドに型の誤りが存在することを示
す。このとき、型検査プログラム実行部110は、型の
誤り情報112を出力する。このように、型検査プログ
ラム実行部は型検査プログラムを実行することによっ
て、型検査を行うことができる。したがって、型検査プ
ログラムをもつメソッドは、必要に応じて型検査を行う
ことが可能であり、その時、そのメソッドが定義されて
いるクラス定義の字句・構文解析を行う必要がない。
型検査プログラム135を実行し、135が対応するメ
ソッドの型検査を行う。型検査プログラムの実行に必要
な型の情報は型名に対応するクラスオブジェクトから得
る。もし、型検査プログラムが正しく実行できない場合
は、対応するメソッドに型の誤りが存在することを示
す。このとき、型検査プログラム実行部110は、型の
誤り情報112を出力する。このように、型検査プログ
ラム実行部は型検査プログラムを実行することによっ
て、型検査を行うことができる。したがって、型検査プ
ログラムをもつメソッドは、必要に応じて型検査を行う
ことが可能であり、その時、そのメソッドが定義されて
いるクラス定義の字句・構文解析を行う必要がない。
【0036】クラスオブジェクト131、メソッド実行
コード133、型検査プログラム135がコンパイラの
どのフェーズで生成されるかを図5をもちいて説明す
る。
コード133、型検査プログラム135がコンパイラの
どのフェーズで生成されるかを図5をもちいて説明す
る。
【0037】クラス定義121は、まず、字句・構文解
析部101によって構文木に変換される。この構文木を
解析し、文法規則と型推論規則の対応をもちいて型検査
プログラム生成部102で型検査プログラムを生成す
る。この部分は図2における従来のコンパイラ200の
型検査部203に相当する。しかし、型検査部203で
は、構文木に従って型推論を直接行っている。図5にお
ける、型検査プログラム生成部102では型推論そのも
のは行わずに、その型推論の方法を型検査プログラムと
して出力する。
析部101によって構文木に変換される。この構文木を
解析し、文法規則と型推論規則の対応をもちいて型検査
プログラム生成部102で型検査プログラムを生成す
る。この部分は図2における従来のコンパイラ200の
型検査部203に相当する。しかし、型検査部203で
は、構文木に従って型推論を直接行っている。図5にお
ける、型検査プログラム生成部102では型推論そのも
のは行わずに、その型推論の方法を型検査プログラムと
して出力する。
【0038】構文木は、さらに、中間コード生成部10
3に渡され、中間コードを生成し、コード最適化部10
4で最適化処理を施され、コード生成部105によっ
て、メソッド実行コードとなる。コンパイラの一連の処
理において解析された様々な情報はクラスオブジェクト
としてオブジェクト生成部106によって出力される。
3に渡され、中間コードを生成し、コード最適化部10
4で最適化処理を施され、コード生成部105によっ
て、メソッド実行コードとなる。コンパイラの一連の処
理において解析された様々な情報はクラスオブジェクト
としてオブジェクト生成部106によって出力される。
【0039】ここで、上述した実施例をさらに詳細に説
明するために前提となるクラスの定義方法とオブジェク
トの型について説明する。図6はオブジェクトの型の概
念図である。図7はクラスの定義例である。
明するために前提となるクラスの定義方法とオブジェク
トの型について説明する。図6はオブジェクトの型の概
念図である。図7はクラスの定義例である。
【0040】図6において、オブジェクトの型は、その
オブジェクトにどのようなメッセージを送ることができ
るかというオブジェクトのインタフェースによって特徴
づけられる。このような型の定義を用いれば、型検査は
オブジェクトに正しくメッセージを送っているかどう
か、すなわち、メソッドの呼出が正しく行われるかどう
か−プログラムの整合性−の検査である。611、61
3はそれぞれメソッドの仕様であり、611はメソッド
名m01:であり、引数の型がtype2、戻り値の型がtype3で
あることを示す。同様に、613はメソッド名m02で、
引数無し、戻り値の型はtype1である。611と613
のようなメソッドが、クラスtype0において外部に公開
される形で定義されているとき、メソッドの仕様61
1、613の集合610を型type0の特徴と呼ぶ。オブ
ジェクト600が、型type0の特徴をもつとき、すなわ
ち、m01:やm02というメッセージを送ることができると
き、オブジェクト600は型type0であるという。逆
に、オブジェクト600が型type0として宣言されてい
るのであれば、オブジェクト600にメソッドの仕様6
15の様なメッセージを送ることは型の誤りとなる。
オブジェクトにどのようなメッセージを送ることができ
るかというオブジェクトのインタフェースによって特徴
づけられる。このような型の定義を用いれば、型検査は
オブジェクトに正しくメッセージを送っているかどう
か、すなわち、メソッドの呼出が正しく行われるかどう
か−プログラムの整合性−の検査である。611、61
3はそれぞれメソッドの仕様であり、611はメソッド
名m01:であり、引数の型がtype2、戻り値の型がtype3で
あることを示す。同様に、613はメソッド名m02で、
引数無し、戻り値の型はtype1である。611と613
のようなメソッドが、クラスtype0において外部に公開
される形で定義されているとき、メソッドの仕様61
1、613の集合610を型type0の特徴と呼ぶ。オブ
ジェクト600が、型type0の特徴をもつとき、すなわ
ち、m01:やm02というメッセージを送ることができると
き、オブジェクト600は型type0であるという。逆
に、オブジェクト600が型type0として宣言されてい
るのであれば、オブジェクト600にメソッドの仕様6
15の様なメッセージを送ることは型の誤りとなる。
【0041】図6で説明した型type0の特徴を定義した
ものが、図7のクラスtype0の定義である。図7におい
て、太字はプログラミング言語の予約語である。001
行において、このクラスの名前がtype0であることを宣
言している。002行は002行から012行までは、
クラスtype0のインスタンスオブジェクトに関する定義
であることを示す。003行はクラスtype0のインスタ
ンスオブジェクトがもつ変数の宣言で、変数Xは型type1
である。004行は以後の行で定義されたメソッドはオ
ブジェクトの外側から起動することができる、すなわ
ち、オブジェクト外部に公開されるメソッドであるとい
うことを表している。005行から009行までは、メ
ソッドm01:の定義である。005行はメソッドの名前が
m01:であり、引数x1の型はtype2、戻り値の型はtype3で
あることを示している。006行は、メソッド内で用い
る一時的な作業変数の宣言である。007行は、x1にメ
ッセージm2を送り、その結果を引数として、Xにメッセ
ージm1を送り、この結果をx2に代入するということを示
す式である。008行は、x2にメッセージm2を送り、そ
の結果をメソッドm01:の戻り値とするという意味の文で
ある。011行はメソッドm02の定義である。引数は持
たず、戻り値の型はtype1である。ただし、その詳細な
プログラムは省略している。以下、図中のクラス定義に
おいて“…”は省略を表すことにする。
ものが、図7のクラスtype0の定義である。図7におい
て、太字はプログラミング言語の予約語である。001
行において、このクラスの名前がtype0であることを宣
言している。002行は002行から012行までは、
クラスtype0のインスタンスオブジェクトに関する定義
であることを示す。003行はクラスtype0のインスタ
ンスオブジェクトがもつ変数の宣言で、変数Xは型type1
である。004行は以後の行で定義されたメソッドはオ
ブジェクトの外側から起動することができる、すなわ
ち、オブジェクト外部に公開されるメソッドであるとい
うことを表している。005行から009行までは、メ
ソッドm01:の定義である。005行はメソッドの名前が
m01:であり、引数x1の型はtype2、戻り値の型はtype3で
あることを示している。006行は、メソッド内で用い
る一時的な作業変数の宣言である。007行は、x1にメ
ッセージm2を送り、その結果を引数として、Xにメッセ
ージm1を送り、この結果をx2に代入するということを示
す式である。008行は、x2にメッセージm2を送り、そ
の結果をメソッドm01:の戻り値とするという意味の文で
ある。011行はメソッドm02の定義である。引数は持
たず、戻り値の型はtype1である。ただし、その詳細な
プログラムは省略している。以下、図中のクラス定義に
おいて“…”は省略を表すことにする。
【0042】型検査プログラム及びその実行に必要な情
報を提供するクラスオブジェクトの構成を図8を用いて
詳細に説明する。
報を提供するクラスオブジェクトの構成を図8を用いて
詳細に説明する。
【0043】図8はクラスオブジェクトの構成図であ
る。クラスオブジェクト131には、型検査プログラム
の実行に必要な、そのクラスによって定義された型の情
報が管理されている。801はクラス定義である。型検
査のときに型の誤りが見つかった場合、その誤りの位置
をクラス定義上で示すことができる。これはプログラマ
が誤りを訂正する際に有効である。803は変数表であ
る。この変数はオブジェクトの構造を示すものであり、
メソッドの外部で宣言されている。805はクラスオブ
ジェクトが表す型を参照しているクラスオブジェクトを
指す。クラスが更新されると影響を受けるクラスのこと
である。807は型階層情報である。オブジェクト指向
プログラミング言語では、継承機能などにより型に順序
をつけることがある。これを型階層という。型階層は型
T1であるオブジェクトが、必ず、型T2であるとき、T1≦
T2と定義することができる。このときT1はT2のサブタイ
プという。809はメソッド表である。メソッドの情報
が管理される。
る。クラスオブジェクト131には、型検査プログラム
の実行に必要な、そのクラスによって定義された型の情
報が管理されている。801はクラス定義である。型検
査のときに型の誤りが見つかった場合、その誤りの位置
をクラス定義上で示すことができる。これはプログラマ
が誤りを訂正する際に有効である。803は変数表であ
る。この変数はオブジェクトの構造を示すものであり、
メソッドの外部で宣言されている。805はクラスオブ
ジェクトが表す型を参照しているクラスオブジェクトを
指す。クラスが更新されると影響を受けるクラスのこと
である。807は型階層情報である。オブジェクト指向
プログラミング言語では、継承機能などにより型に順序
をつけることがある。これを型階層という。型階層は型
T1であるオブジェクトが、必ず、型T2であるとき、T1≦
T2と定義することができる。このときT1はT2のサブタイ
プという。809はメソッド表である。メソッドの情報
が管理される。
【0044】図9は、図8における変数表803の詳細
な構成図である。変数名をキーとして、その変数がどの
型として宣言されているか、そして、その宣言は、クラ
ス定義の何行目で行われているかを管理している。した
っがて、変数名901、型903、行番号905の項目
をもつ表である。
な構成図である。変数名をキーとして、その変数がどの
型として宣言されているか、そして、その宣言は、クラ
ス定義の何行目で行われているかを管理している。した
っがて、変数名901、型903、行番号905の項目
をもつ表である。
【0045】図10は、図8におけるメソッド表809
の詳細な構成図である。メソッド名1001をキーとし
てメソッドの仕様1003やメソッド実行コード13
3、型検査プログラム135を取り出せるようにしてい
る。1005はメソッドにおける型参照情報であり、こ
れは図8における型参照情報805の部分集合として表
現される。クラス間の型参照情報の他にメソッドレベル
での型参照情報を設けたのは、クラス更新の際の型検査
をできるだけ抑えようとしたためである。クラス間の型
参照情報だけでは、クラスに定義されたメソッド全てを
型検査の対象としなければならない。1007はメソッ
ド実行コードへのポインタ、1009は型検査プログラ
ムへのポインタである。
の詳細な構成図である。メソッド名1001をキーとし
てメソッドの仕様1003やメソッド実行コード13
3、型検査プログラム135を取り出せるようにしてい
る。1005はメソッドにおける型参照情報であり、こ
れは図8における型参照情報805の部分集合として表
現される。クラス間の型参照情報の他にメソッドレベル
での型参照情報を設けたのは、クラス更新の際の型検査
をできるだけ抑えようとしたためである。クラス間の型
参照情報だけでは、クラスに定義されたメソッド全てを
型検査の対象としなければならない。1007はメソッ
ド実行コードへのポインタ、1009は型検査プログラ
ムへのポインタである。
【0046】ここで、型検査プログラムの構成を図11
を参照して説明する。図11はメソッドの型検査プログ
ラム135の構成図である。型検査プログラムは、型変
数宣言部1110と型検査コード部1120からなる。
型変数宣言部はメソッド内部では型が確定できない外部
変数の型を型検査プログラム生成部が型変数として登録
する。したがって、外部変数名1111をキーとして型
検査プログラム生成部が生成した型変数1113を参照
する表となっている。
を参照して説明する。図11はメソッドの型検査プログ
ラム135の構成図である。型検査プログラムは、型変
数宣言部1110と型検査コード部1120からなる。
型変数宣言部はメソッド内部では型が確定できない外部
変数の型を型検査プログラム生成部が型変数として登録
する。したがって、外部変数名1111をキーとして型
検査プログラム生成部が生成した型変数1113を参照
する表となっている。
【0047】型検査コード部1120は、型検査の手順
を記述したものであり、例えば、型推論式などで実現す
る。行番号1123は型推論式が生成された文法要素の
クラス定義の行番号である。この行番号は、型推論式に
おいて、型の誤りが発見されたとき、その誤りの位置を
プログラマに知らせるものである。
を記述したものであり、例えば、型推論式などで実現す
る。行番号1123は型推論式が生成された文法要素の
クラス定義の行番号である。この行番号は、型推論式に
おいて、型の誤りが発見されたとき、その誤りの位置を
プログラマに知らせるものである。
【0048】図11の型検査プログラムを生成する過程
を、図7のクラス定義と、図12の図7のクラス定義に
おいて定義されているメソッドに対応する型検査プログ
ラムの例を用いて説明する。図12において、1200
は、図7のクラスtype0の定義の005行から009行
において定義されたメソッドm01:の型検査プログラムで
ある。1210は型変数宣言部であり、1220は型検
査コード部である。型検査プログラムは構文解析に基づ
いて生成する。この様子を図7のクラス定義の行ごとに
説明する。
を、図7のクラス定義と、図12の図7のクラス定義に
おいて定義されているメソッドに対応する型検査プログ
ラムの例を用いて説明する。図12において、1200
は、図7のクラスtype0の定義の005行から009行
において定義されたメソッドm01:の型検査プログラムで
ある。1210は型変数宣言部であり、1220は型検
査コード部である。型検査プログラムは構文解析に基づ
いて生成する。この様子を図7のクラス定義の行ごとに
説明する。
【0049】(1)005行 メソッドm01:は型type2の引数x1を入力とし、型type3の
オブジェクト出力とすることが解析される。この解析結
果をコンパイラの記号表(図示せず)に登録する。同様
に、 (2)006行 一時変数x2が型type2であることが解析され、記号表に
登録される。
オブジェクト出力とすることが解析される。この解析結
果をコンパイラの記号表(図示せず)に登録する。同様
に、 (2)006行 一時変数x2が型type2であることが解析され、記号表に
登録される。
【0050】(3)007行 この行は、次の3つの式に分解することができる。 (a)引数x1にメッセージm2を送る。 (b)(a)の結果を引数として、変数Xにメッセージm
1:を送る。 (c)(b)の結果を一時変数x2に代入する。
1:を送る。 (c)(b)の結果を一時変数x2に代入する。
【0051】この3つの式について、型検査プログラム
の生成の過程を説明する。
の生成の過程を説明する。
【0052】(a)記号表を引き、引数x1は、型type2
であることが判明する。したがって、型検査は、型type
2のオブジェクトは、メッセージm2を送ることができ、
その結果、何らかのオブジェクトを出力するかどうかを
検査することになる。これを型推論式として表現すると
type2 => m2:→t1となる。引数の型はメソッド内部で
宣言されたものであるから、メソッドの外部がどう変更
されようとも、引数x1の型がtype2であることは不変で
ある。したがって、確定した値type2として表現する。
しかし、型type2のオブジェクトにメッセージm2を送っ
た結果、出力されるオブジェクトの型は、クラスtype2
の定義に依存するものである。したがって、型は確定で
きず、型変数t1とする。この型推論式と、この型推論式
がクラス定義の007行から生成されたことを記録する
ための行番号007を型検査プログラムの型検査コード
部1220に登録する。
であることが判明する。したがって、型検査は、型type
2のオブジェクトは、メッセージm2を送ることができ、
その結果、何らかのオブジェクトを出力するかどうかを
検査することになる。これを型推論式として表現すると
type2 => m2:→t1となる。引数の型はメソッド内部で
宣言されたものであるから、メソッドの外部がどう変更
されようとも、引数x1の型がtype2であることは不変で
ある。したがって、確定した値type2として表現する。
しかし、型type2のオブジェクトにメッセージm2を送っ
た結果、出力されるオブジェクトの型は、クラスtype2
の定義に依存するものである。したがって、型は確定で
きず、型変数t1とする。この型推論式と、この型推論式
がクラス定義の007行から生成されたことを記録する
ための行番号007を型検査プログラムの型検査コード
部1220に登録する。
【0053】(b)変数Xは、メソッド外部の変数であ
るため、その型をメソッド内部で確定することはできな
い。そこで、変数Xの型を型変数t0として表現し、型変
数宣言部1210に外部変数名X、型変数t0として登録
する。この時の型推論式は、引数x1にメッセージm2を送
った結果のオブジェクトの型t1を用いて、t0 => m1::t
1→t2と表現する。これは、型t0のオブジェクトはメッ
セージm1:を送ることができ、その引数の型はt1で、出
力の型はt2であることを表す。この型推論式をそのクラ
ス定義における行番号007と共に、型検査コード部1
220に登録する。
るため、その型をメソッド内部で確定することはできな
い。そこで、変数Xの型を型変数t0として表現し、型変
数宣言部1210に外部変数名X、型変数t0として登録
する。この時の型推論式は、引数x1にメッセージm2を送
った結果のオブジェクトの型t1を用いて、t0 => m1::t
1→t2と表現する。これは、型t0のオブジェクトはメッ
セージm1:を送ることができ、その引数の型はt1で、出
力の型はt2であることを表す。この型推論式をそのクラ
ス定義における行番号007と共に、型検査コード部1
220に登録する。
【0054】(c)記号表から一時変数x2は、型type2
であることがわかる。一時変数は、メソッド内部で宣言
されるので、その型は確定している。したがって、変数
Xにメッセージm1:を送った結果、出力されたオブジェク
トの型t2は、type2のサブタイプであれば良いことにな
る。これをt2≦type2と表現し、行番号007と共に型
検査コード部1220に登録する。
であることがわかる。一時変数は、メソッド内部で宣言
されるので、その型は確定している。したがって、変数
Xにメッセージm1:を送った結果、出力されたオブジェク
トの型t2は、type2のサブタイプであれば良いことにな
る。これをt2≦type2と表現し、行番号007と共に型
検査コード部1220に登録する。
【0055】(4)008行 型type2である一時変数x2にメッセージm2を送り、その
結果をメソッドm01:の出力とする。型type2のオブジェ
クトにメッセージm2を送るという式に対しての型推論式
はすでに登録されているので、省略が可能である。本実
施例の型検査コード部1220では、省略を行ってい
る。したがって、型type2のオブジェクトにメッセージm
2を送った結果、出力されるオブジェクトの型はt1と言
うことになる。メソッドm01:の出力の型は記号表から、
型type3であることがわかるので、型t1はtype3のサブタ
イプであるという型推論式t1≦type3を行番号008を
付けて、型検査コード部1220に登録する。
結果をメソッドm01:の出力とする。型type2のオブジェ
クトにメッセージm2を送るという式に対しての型推論式
はすでに登録されているので、省略が可能である。本実
施例の型検査コード部1220では、省略を行ってい
る。したがって、型type2のオブジェクトにメッセージm
2を送った結果、出力されるオブジェクトの型はt1と言
うことになる。メソッドm01:の出力の型は記号表から、
型type3であることがわかるので、型t1はtype3のサブタ
イプであるという型推論式t1≦type3を行番号008を
付けて、型検査コード部1220に登録する。
【0056】(5)009行 メソッドm01:の定義が終了したことがわかり、メソッド
m01:の実行コードと型検査プログラム1200を生成す
る。このように、構文解析に基づいて、メソッドごとに
型検査プログラムを生成し、クラスオブジェクトによっ
て管理する。
m01:の実行コードと型検査プログラム1200を生成す
る。このように、構文解析に基づいて、メソッドごとに
型検査プログラムを生成し、クラスオブジェクトによっ
て管理する。
【0057】次に、型検査プログラムを用いて、クラス
をコンパイルし、型検査を行う場合の処理手順を図13
の流れ図を参照して説明する。クラスをコンパイルし、
型検査を行うためには、コンパイルされるクラスが参照
する型がすべて定義されてなければならない。したがっ
て、参照する型を定義しているクラス定義はすでに、コ
ンパイルされているか、または、一緒にコンパイルされ
る必要がある。ここでは、参照し合う複数のクラスを一
緒にコンパイルすることを前提として説明を行う。
をコンパイルし、型検査を行う場合の処理手順を図13
の流れ図を参照して説明する。クラスをコンパイルし、
型検査を行うためには、コンパイルされるクラスが参照
する型がすべて定義されてなければならない。したがっ
て、参照する型を定義しているクラス定義はすでに、コ
ンパイルされているか、または、一緒にコンパイルされ
る必要がある。ここでは、参照し合う複数のクラスを一
緒にコンパイルすることを前提として説明を行う。
【0058】図13は、複数のクラス定義をコンパイル
する手順を示した流れ図である。ステップ1310で
は、各クラス定義をコンパイルする。各クラス定義のコ
ンパイル順序(定義順序)は任意である。この一つのフ
ェーズとして、各クラスに定義されている各メソッド定
義のコンパイルがある(ステップ1311)。ステップ
1311において、メソッドの実行コードを生成すると
ともに、型検査プログラム135を生成する。この時点
では、コンパイルされていないクラス定義がある、すな
わち、未定義の型が存在するために、型検査プログラム
を実行することはできない。
する手順を示した流れ図である。ステップ1310で
は、各クラス定義をコンパイルする。各クラス定義のコ
ンパイル順序(定義順序)は任意である。この一つのフ
ェーズとして、各クラスに定義されている各メソッド定
義のコンパイルがある(ステップ1311)。ステップ
1311において、メソッドの実行コードを生成すると
ともに、型検査プログラム135を生成する。この時点
では、コンパイルされていないクラス定義がある、すな
わち、未定義の型が存在するために、型検査プログラム
を実行することはできない。
【0059】コンパイルされた各クラスは、継承処理が
施され(ステップ1302)、各クラスオブジェクトを
生成する(ステップ1303)。クラスオブジェクトは
それぞれの型の情報を管理しているため、ステップ13
03が終了すると、ステップ1311において生成した
型検査プログラム135が実行可能となる。そこで、ク
ラスオブジェクトを参照しながら、型検査プログラムを
実行し、各クラスに定義されたメソッドの型検査を行う
(ステップ1304)。この型検査の結果を判定し(ス
テップ1305)、型の誤りが存在しなければ終了(ス
テップ1307)、型の誤りが存在するならば、エラー
メッセージの出力などの誤り処理を行い(ステップ13
06)終了する。
施され(ステップ1302)、各クラスオブジェクトを
生成する(ステップ1303)。クラスオブジェクトは
それぞれの型の情報を管理しているため、ステップ13
03が終了すると、ステップ1311において生成した
型検査プログラム135が実行可能となる。そこで、ク
ラスオブジェクトを参照しながら、型検査プログラムを
実行し、各クラスに定義されたメソッドの型検査を行う
(ステップ1304)。この型検査の結果を判定し(ス
テップ1305)、型の誤りが存在しなければ終了(ス
テップ1307)、型の誤りが存在するならば、エラー
メッセージの出力などの誤り処理を行い(ステップ13
06)終了する。
【0060】図13のステップ1304の型検査、すな
わち、型検査プログラムの実行方法の一例を上述した図
12の型検査プログラム1200を中心にして説明す
る。型検査プログラム1200は、図7のメソッドm01:
の定義から生成したものであり、型type1、型type2、型
type3を参照している。したがって、図12の型検査プ
ログラムを実行するためには、クラスtype1、クラスtyp
e2、クラスtype3の定義がコンパイルされている必要が
ある。ただし、これらのクラスの定義が、図7のクラス
type0の定義よりも先である必要はない。
わち、型検査プログラムの実行方法の一例を上述した図
12の型検査プログラム1200を中心にして説明す
る。型検査プログラム1200は、図7のメソッドm01:
の定義から生成したものであり、型type1、型type2、型
type3を参照している。したがって、図12の型検査プ
ログラムを実行するためには、クラスtype1、クラスtyp
e2、クラスtype3の定義がコンパイルされている必要が
ある。ただし、これらのクラスの定義が、図7のクラス
type0の定義よりも先である必要はない。
【0061】クラスtype1、クラスtype2、クラスtype3
の定義を図14に示した。1401はクラスtype1、1
403はクラスtype2、1405はクラスtype3の定義で
ある。クラスtype3の定義1405の002行はクラスt
ype3のスーパークラスがクラスtype2であること表し、
クラスtype3はクラスtype2の性質を継承する。
の定義を図14に示した。1401はクラスtype1、1
403はクラスtype2、1405はクラスtype3の定義で
ある。クラスtype3の定義1405の002行はクラスt
ype3のスーパークラスがクラスtype2であること表し、
クラスtype3はクラスtype2の性質を継承する。
【0062】図14のクラスtype1、type2、type3の定
義をコンパイルした結果得られる型に関する情報は、図
15の型名とその型のオブジェクトがインタフェースと
してもつメソッドの仕様の対1510と、型階層の情報
1520である。これらはクラス(型)別にクラスオブ
ジェクトによって管理されるが、説明の便宜上、一つの
図にまとめた。図15の1510において、図14の1
401のクラス定義から、型名がtype1、インタフェー
スとしてメソッドm1:をもち、その引数のオブジェクト
のはtype2であり、出力されるオブジェクトの型はtype3
であるような型が定義される。図14の1403のクラ
ス定義からは、型名がtype2、インタフェースとしてメ
ソッドm2をもち、出力されるオブジェクトの型はtype3
であるような型が定義され、さらに、図14の1405
のクラス定義からは、型名がtype3、インタフェースと
してメソッドm2とm3をもち、メソッドm2は、型type2か
ら継承されたものであり、メソッドm3は、型type2のオ
ブジェクトを出力するような型が定義される。
義をコンパイルした結果得られる型に関する情報は、図
15の型名とその型のオブジェクトがインタフェースと
してもつメソッドの仕様の対1510と、型階層の情報
1520である。これらはクラス(型)別にクラスオブ
ジェクトによって管理されるが、説明の便宜上、一つの
図にまとめた。図15の1510において、図14の1
401のクラス定義から、型名がtype1、インタフェー
スとしてメソッドm1:をもち、その引数のオブジェクト
のはtype2であり、出力されるオブジェクトの型はtype3
であるような型が定義される。図14の1403のクラ
ス定義からは、型名がtype2、インタフェースとしてメ
ソッドm2をもち、出力されるオブジェクトの型はtype3
であるような型が定義され、さらに、図14の1405
のクラス定義からは、型名がtype3、インタフェースと
してメソッドm2とm3をもち、メソッドm2は、型type2か
ら継承されたものであり、メソッドm3は、型type2のオ
ブジェクトを出力するような型が定義される。
【0063】また、これらの型の定義から、型type2の
オブジェクトと型type3のオブジェクトにはメッセージm
2を送ることができるが、メッセージm3を送ることがで
きるのは型type3のオブジェクトだけであることがわか
る。このことは、型type2のオブジェクトが現れること
ができるところには、型type3のオブジェクトを用いて
もかまわないことを表している。しかし、その逆はでき
ない。このとき、type3はtype2のサブタイプであり、図
15の1520のように表現する。
オブジェクトと型type3のオブジェクトにはメッセージm
2を送ることができるが、メッセージm3を送ることがで
きるのは型type3のオブジェクトだけであることがわか
る。このことは、型type2のオブジェクトが現れること
ができるところには、型type3のオブジェクトを用いて
もかまわないことを表している。しかし、その逆はでき
ない。このとき、type3はtype2のサブタイプであり、図
15の1520のように表現する。
【0064】では、型検査プログラムの実行の手順を図
16の流れ図に基づき、上述の図11を参照して説明す
る。型検査プログラムの実行が開始(ステップ160
1)されると、まず、型変数宣言部1110の型変数に
型を代入する(ステップ1603)。代入される型は、
外部変数名1111で示される変数が、型検査を行うと
きに宣言されている型である。この情報は、型検査プロ
グラム実行部が起動されるときに外部から渡される。型
変数が代入されると、型検査コード部1120の型推論
式1121を実行する(ステップ1611)。
16の流れ図に基づき、上述の図11を参照して説明す
る。型検査プログラムの実行が開始(ステップ160
1)されると、まず、型変数宣言部1110の型変数に
型を代入する(ステップ1603)。代入される型は、
外部変数名1111で示される変数が、型検査を行うと
きに宣言されている型である。この情報は、型検査プロ
グラム実行部が起動されるときに外部から渡される。型
変数が代入されると、型検査コード部1120の型推論
式1121を実行する(ステップ1611)。
【0065】この実行が正常に終了したかどうか判断
(ステップ1613)し、正常終了であれば、次の型推
論式に移る。もし、実行エラーが起こった場合は、実行
エラーの内容からエラーの原因を解析し、クラス定義で
の行番号とともに記録する(ステップ1615)。ステ
ップ1611、ステップ1613及びステップ1615
を全ての型推論式が実行されるまで繰り返す(161
0)。全ての型推論式の実行が終了した後、ステップ1
615で記録された実行エラーが存在するかを調べる
(ステップ1605)。もし、実行エラーが存在しない
のであれば、型の誤りが無いという情報を返して終了す
る(ステップ1607)。実行エラーが存在すれば、ス
テップ1615で記録された情報を型の誤り情報として
返し、終了する(ステップ1609)。
(ステップ1613)し、正常終了であれば、次の型推
論式に移る。もし、実行エラーが起こった場合は、実行
エラーの内容からエラーの原因を解析し、クラス定義で
の行番号とともに記録する(ステップ1615)。ステ
ップ1611、ステップ1613及びステップ1615
を全ての型推論式が実行されるまで繰り返す(161
0)。全ての型推論式の実行が終了した後、ステップ1
615で記録された実行エラーが存在するかを調べる
(ステップ1605)。もし、実行エラーが存在しない
のであれば、型の誤りが無いという情報を返して終了す
る(ステップ1607)。実行エラーが存在すれば、ス
テップ1615で記録された情報を型の誤り情報として
返し、終了する(ステップ1609)。
【0066】図16の流れ図で説明した型検査プログラ
ムの実行方法を、例を用いて具体的に説明する。例は、
図12の型検査プログラムを、図7のクラスtype0の定
義における変数の型宣言に基づいて、実行する過程であ
る。なお、図7のクラス定義はコンパイル済みであり、
図7の003行において、変数Xが、型type1であること
は、クラスtype0のクラスオブジェクトによって管理さ
れている。また、参照している型に関する情報は、図1
5を参照する。ただし、実際はクラスオブジェクトによ
って管理されている。
ムの実行方法を、例を用いて具体的に説明する。例は、
図12の型検査プログラムを、図7のクラスtype0の定
義における変数の型宣言に基づいて、実行する過程であ
る。なお、図7のクラス定義はコンパイル済みであり、
図7の003行において、変数Xが、型type1であること
は、クラスtype0のクラスオブジェクトによって管理さ
れている。また、参照している型に関する情報は、図1
5を参照する。ただし、実際はクラスオブジェクトによ
って管理されている。
【0067】図12において、型検査プログラムの実行
は、まず、型変数宣言部1210に宣言されている型変
数の値を外部変数名を用いて確定する。型変数t0は、そ
の外部変数名Xを用いて、クラスtype0のクラスオブジェ
クトから、値type1が代入される。
は、まず、型変数宣言部1210に宣言されている型変
数の値を外部変数名を用いて確定する。型変数t0は、そ
の外部変数名Xを用いて、クラスtype0のクラスオブジェ
クトから、値type1が代入される。
【0068】次に、型検査コード部1220の各型推論
式を並びの順に実行する。型推論式type2=>m2:→t1
は、まず、型名type2をもちいて、メッセージm2によっ
て起動されるメソッドm2を調べる。図15の1510か
ら、型名type2の型はm2というメソッドをもち、出力の
オブジェクトの型がtype3であることがわかる。よっ
て、型変数t1にtype3を代入する。次に型推論式t0=>m
1::t1→t2を実行する。型変数t0にはtype1、t1にはtyp
e3が代入されているので、型名type1をもちいて、引数
として型type3のオブジェクトをとるようなメソッドm1:
を調べる。同様に図15の1510から型変数t2にtype
3を代入する。ここで図15の1510の型名type1のメ
ソッドm1:の仕様は、引数として型type2のオブジェクト
をとることになっている。しかし、図15の1520の
型階層から、型type3は型type2のサブタイプであるの
で、引数として型type3のオブジェクトをとることは誤
りではない。
式を並びの順に実行する。型推論式type2=>m2:→t1
は、まず、型名type2をもちいて、メッセージm2によっ
て起動されるメソッドm2を調べる。図15の1510か
ら、型名type2の型はm2というメソッドをもち、出力の
オブジェクトの型がtype3であることがわかる。よっ
て、型変数t1にtype3を代入する。次に型推論式t0=>m
1::t1→t2を実行する。型変数t0にはtype1、t1にはtyp
e3が代入されているので、型名type1をもちいて、引数
として型type3のオブジェクトをとるようなメソッドm1:
を調べる。同様に図15の1510から型変数t2にtype
3を代入する。ここで図15の1510の型名type1のメ
ソッドm1:の仕様は、引数として型type2のオブジェクト
をとることになっている。しかし、図15の1520の
型階層から、型type3は型type2のサブタイプであるの
で、引数として型type3のオブジェクトをとることは誤
りではない。
【0069】次に型推論式t2≦type2を実行する。型変
数t2にはtype3が代入されているので、図15の152
0より、正しく実行できる。型推論式t1≦type3は、型
変数t1にtype3が代入されているのでこの式も正しい。
したがって、図12の型検査プログラムは図7のクラス
定義においては、誤りなく実行することができる。すな
わち、図7のクラス定義のメソッドm01:の定義には型の
誤りがなく、プログラムの整合性が保証される。
数t2にはtype3が代入されているので、図15の152
0より、正しく実行できる。型推論式t1≦type3は、型
変数t1にtype3が代入されているのでこの式も正しい。
したがって、図12の型検査プログラムは図7のクラス
定義においては、誤りなく実行することができる。すな
わち、図7のクラス定義のメソッドm01:の定義には型の
誤りがなく、プログラムの整合性が保証される。
【0070】本発明の型検査の方法は、継承処理によっ
てプログラムの整合性を保つことができるかどうかの検
査にも有効である。次に、継承処理に伴う型検査の方法
を図17の流れ図と図18のクラス定義の例を用いて説
明する。
てプログラムの整合性を保つことができるかどうかの検
査にも有効である。次に、継承処理に伴う型検査の方法
を図17の流れ図と図18のクラス定義の例を用いて説
明する。
【0071】図18はクラスtype4の定義である。00
2行でクラスtype0はクラスtype4のスーパークラスであ
ることを宣言している。したがって、クラスtype4はク
ラスtype0で定義されたメソッドm01:などを継承する。
上述したように、メソッドm01:は外部変数Xを参照す
る。クラスtype0では、変数Xは型type1として宣言され
ている。この宣言のもとでは、メソッドm01:はプログラ
ムの整合性が保証されることは上述した通りである。し
かし、クラスtype4では、変数Xは型type2として宣言さ
れている(図18の004行)。このとき、メソッドm0
1:のプログラムの整合性の検査が必要となる。このプロ
グラムの整合性の検査を、型検査プログラムをもちいる
ことにより、メソッドの再コンパイルをすることなく、
行うことができる。ただし、図17の流れ図で説明する
継承処理に伴う型検査は、すでに、他のクラスはコンパ
イルされ、クラスオブジェクトとして管理されている中
に、新たなクラスを定義し、コンパイルするという状況
を前提としている。図13の流れ図で説明した複数のク
ラスをコンパイルする場合、継承処理に伴う型検査は、
他の型検査と同じように、継承処理の後、図13のステ
ップ1304で行う。
2行でクラスtype0はクラスtype4のスーパークラスであ
ることを宣言している。したがって、クラスtype4はク
ラスtype0で定義されたメソッドm01:などを継承する。
上述したように、メソッドm01:は外部変数Xを参照す
る。クラスtype0では、変数Xは型type1として宣言され
ている。この宣言のもとでは、メソッドm01:はプログラ
ムの整合性が保証されることは上述した通りである。し
かし、クラスtype4では、変数Xは型type2として宣言さ
れている(図18の004行)。このとき、メソッドm0
1:のプログラムの整合性の検査が必要となる。このプロ
グラムの整合性の検査を、型検査プログラムをもちいる
ことにより、メソッドの再コンパイルをすることなく、
行うことができる。ただし、図17の流れ図で説明する
継承処理に伴う型検査は、すでに、他のクラスはコンパ
イルされ、クラスオブジェクトとして管理されている中
に、新たなクラスを定義し、コンパイルするという状況
を前提としている。図13の流れ図で説明した複数のク
ラスをコンパイルする場合、継承処理に伴う型検査は、
他の型検査と同じように、継承処理の後、図13のステ
ップ1304で行う。
【0072】クラスtype0のメソッドm01:の型検査プロ
グラム(図12)はすでに生成されている。この型検査
プログラムを用いて、クラスtype4に継承されたメソッ
ドm01:のプログラムの整合性の検査、すなわち、型検査
を行う。
グラム(図12)はすでに生成されている。この型検査
プログラムを用いて、クラスtype4に継承されたメソッ
ドm01:のプログラムの整合性の検査、すなわち、型検査
を行う。
【0073】図17において、まず、クラスtype0のク
ラスオブジェクトから、継承するメソッドm01:の型検査
プログラム(図12)を得る(ステップ1701)。型
検査プログラムの型変数宣言部(図12の1210)か
ら、継承先であるクラスtype4において外部変数が再宣
言されているかを調べる。再宣言されていなければ、そ
のまま継承処理を行う(ステップ1707)。クラスty
pe4では、変数Xが型type2として再宣言されているの
で、図12の1210の型変数t0に型type2を代入する
(ステップ1703)。
ラスオブジェクトから、継承するメソッドm01:の型検査
プログラム(図12)を得る(ステップ1701)。型
検査プログラムの型変数宣言部(図12の1210)か
ら、継承先であるクラスtype4において外部変数が再宣
言されているかを調べる。再宣言されていなければ、そ
のまま継承処理を行う(ステップ1707)。クラスty
pe4では、変数Xが型type2として再宣言されているの
で、図12の1210の型変数t0に型type2を代入する
(ステップ1703)。
【0074】この後、上述した通り、図12の型検査コ
ード部1220の型推論式を順に実行する(ステップ1
704)。そして、実行の結果、型の誤りの有無を調べ
(ステップ1705)、無ければ継承処理(ステップ1
707)を、あれば誤り処理(ステップ1706)を行
い、継承処理を終了する。この場合は、図12の型推論
式t0=>m1::t1→t2が正しく実行できない。なぜなら
ば、型変数t0には型type2が代入されており、型type2は
m1:というメッセージを送ることができないことが、図
15から判明するからである。したがって、型の誤りが
存在し、誤り処理として、型推論式t0=>m1::t1→t2に
付けられた行番号007と共にエラーメッセージを出力
する。したがって、クラスtype0からクラスtype4へのメ
ソッドm01:の継承は正しく行われないことがわかる。
ード部1220の型推論式を順に実行する(ステップ1
704)。そして、実行の結果、型の誤りの有無を調べ
(ステップ1705)、無ければ継承処理(ステップ1
707)を、あれば誤り処理(ステップ1706)を行
い、継承処理を終了する。この場合は、図12の型推論
式t0=>m1::t1→t2が正しく実行できない。なぜなら
ば、型変数t0には型type2が代入されており、型type2は
m1:というメッセージを送ることができないことが、図
15から判明するからである。したがって、型の誤りが
存在し、誤り処理として、型推論式t0=>m1::t1→t2に
付けられた行番号007と共にエラーメッセージを出力
する。したがって、クラスtype0からクラスtype4へのメ
ソッドm01:の継承は正しく行われないことがわかる。
【0075】さらに本発明の型検査の方法はクラス更新
(クラス定義の変更)におけるプログラムの整合性の検
査にも有効である。クラスの更新を行ったとき、そのク
ラスを参照しているクラスに影響を与える場合が多い。
その影響によって、影響を与えられたクラスのプログラ
ムの整合性が保証できるのかどうかを検査する必要があ
る。もし、プログラムの整合性が保証できないのであれ
ば、クラスの更新をやり直すなり、影響を与えたクラス
を更新するなどの必要があるからである。この検査は、
永続的オブジェクトを扱うシステムにおいては、より重
大なものとなる。
(クラス定義の変更)におけるプログラムの整合性の検
査にも有効である。クラスの更新を行ったとき、そのク
ラスを参照しているクラスに影響を与える場合が多い。
その影響によって、影響を与えられたクラスのプログラ
ムの整合性が保証できるのかどうかを検査する必要があ
る。もし、プログラムの整合性が保証できないのであれ
ば、クラスの更新をやり直すなり、影響を与えたクラス
を更新するなどの必要があるからである。この検査は、
永続的オブジェクトを扱うシステムにおいては、より重
大なものとなる。
【0076】このクラス更新におけるプログラムの整合
性の検査を型検査プログラムを用いて行うことにより、
効率よく行うことができる。なぜならば、影響を受ける
各クラスを再びコンパイルすることなく、すでに生成さ
れている型検査プログラムを実行するだけでよいからで
ある。
性の検査を型検査プログラムを用いて行うことにより、
効率よく行うことができる。なぜならば、影響を受ける
各クラスを再びコンパイルすることなく、すでに生成さ
れている型検査プログラムを実行するだけでよいからで
ある。
【0077】では、このクラス更新における型検査の方
法を、図19の流れ図に従い、図7のクラスtype0及び
図15のクラスtype1,type2,type3の定義をもちいて
説明する。図14のクラスtype1の定義1401を更新
する。更新の内容は004行の引数xの型type2をtype3
に修正するというものである。図19において、まず、
更新したクラスtype1の定義をコンパイルする(ステッ
プ1901)。コンパイルが終了した時点でクラスtype
1を参照しているクラスがあるかどうかを調べる(ステ
ップ1902)。クラスの参照情報は、それぞれのクラ
スオブジェクトで管理されている。更新したクラスtype
1を参照しているクラスがないのであれば、更新による
影響はないので終了する(ステップ1905)。
法を、図19の流れ図に従い、図7のクラスtype0及び
図15のクラスtype1,type2,type3の定義をもちいて
説明する。図14のクラスtype1の定義1401を更新
する。更新の内容は004行の引数xの型type2をtype3
に修正するというものである。図19において、まず、
更新したクラスtype1の定義をコンパイルする(ステッ
プ1901)。コンパイルが終了した時点でクラスtype
1を参照しているクラスがあるかどうかを調べる(ステ
ップ1902)。クラスの参照情報は、それぞれのクラ
スオブジェクトで管理されている。更新したクラスtype
1を参照しているクラスがないのであれば、更新による
影響はないので終了する(ステップ1905)。
【0078】しかし、更新したクラスtype1を参照して
いるクラスがあるのであれば、参照しているクラスすべ
てについて、プログラムの整合性の検査を行う(ステッ
プ1910)。どのクラスも型の誤りがないかどうかを
調べ(ステップ1903)、なければ、クラスtype1の
更新は正しく行われたことになり、終了する(ステップ
1905)。一つでも誤りが存在すれば、クラスtype1
の更新は正しく行えないために、更新の取消など誤り処
理を行い(ステップ1920)、終了する(ステップ1
905)。
いるクラスがあるのであれば、参照しているクラスすべ
てについて、プログラムの整合性の検査を行う(ステッ
プ1910)。どのクラスも型の誤りがないかどうかを
調べ(ステップ1903)、なければ、クラスtype1の
更新は正しく行われたことになり、終了する(ステップ
1905)。一つでも誤りが存在すれば、クラスtype1
の更新は正しく行えないために、更新の取消など誤り処
理を行い(ステップ1920)、終了する(ステップ1
905)。
【0079】図20は、クラスtype0、type1、type2、t
ype3の参照関係をグラフとして表したものである。節は
クラスを表す。すなわち、節2001はクラスtype1
を、節2002はクラスtype2を、節2003はクラスt
ype3を、節2004はクラスtype0を表す。矢印は参照
関係を表し、矢印の方向は影響を与える方向である。例
えば節2001のクラスtype1を更新すると、節200
4のクラスtype0に影響を与える。矢印の方向を逆に読
めば、クラスtype0はクラスtype1を参照しているという
ことになる。
ype3の参照関係をグラフとして表したものである。節は
クラスを表す。すなわち、節2001はクラスtype1
を、節2002はクラスtype2を、節2003はクラスt
ype3を、節2004はクラスtype0を表す。矢印は参照
関係を表し、矢印の方向は影響を与える方向である。例
えば節2001のクラスtype1を更新すると、節200
4のクラスtype0に影響を与える。矢印の方向を逆に読
めば、クラスtype0はクラスtype1を参照しているという
ことになる。
【0080】上述したとおり、クラスtype0はクラスtyp
e1を参照しているので、クラスtype1の更新によって影
響を受ける。したがって、クラスtype0は、プログラム
の整合性の検査を行わなければならない。ここで、図1
9にもどり、ステップ1910の参照しているクラスの
プログラムの整合性の検査の過程をクラスtype0の場合
を用いて説明する。まず、クラスtype0の情報を得る
(ステップ1911)。これは、クラスtype0のクラス
オブジェクトを得ることである。
e1を参照しているので、クラスtype1の更新によって影
響を受ける。したがって、クラスtype0は、プログラム
の整合性の検査を行わなければならない。ここで、図1
9にもどり、ステップ1910の参照しているクラスの
プログラムの整合性の検査の過程をクラスtype0の場合
を用いて説明する。まず、クラスtype0の情報を得る
(ステップ1911)。これは、クラスtype0のクラス
オブジェクトを得ることである。
【0081】次に、type1を参照しているすべてのメソ
ッドの型検査プログラムを得る(ステップ1912)。
そして、それぞれについて型検査プログラムを実行する
(ステップ1913)。実行の結果を調べ(ステップ1
903)、型の誤りがあれば、そのメソッドはクラスty
pe1の更新によって、プログラムの整合性を保てなくな
ったことを表す。したがって、誤り処理を行い(ステッ
プ1920)、次のメソッドの検査に進む。クラスtype
0のメソッドm01:は、クラスtype1を参照するが、上述し
たクラスtype1の更新によって、プログラムの整合性が
破壊されることはない。図12のメソッドm01:の型検査
プログラムにおいて、クラスtype1を参照している型推
論式はt0=>m1::t1→t2であり、型変数t0には型type1
が、型変数t1には型type3が代入されている。クラスtyp
e1におけるメソッドm1:の引数がtype3に変わっても、正
しく実行することができる。
ッドの型検査プログラムを得る(ステップ1912)。
そして、それぞれについて型検査プログラムを実行する
(ステップ1913)。実行の結果を調べ(ステップ1
903)、型の誤りがあれば、そのメソッドはクラスty
pe1の更新によって、プログラムの整合性を保てなくな
ったことを表す。したがって、誤り処理を行い(ステッ
プ1920)、次のメソッドの検査に進む。クラスtype
0のメソッドm01:は、クラスtype1を参照するが、上述し
たクラスtype1の更新によって、プログラムの整合性が
破壊されることはない。図12のメソッドm01:の型検査
プログラムにおいて、クラスtype1を参照している型推
論式はt0=>m1::t1→t2であり、型変数t0には型type1
が、型変数t1には型type3が代入されている。クラスtyp
e1におけるメソッドm1:の引数がtype3に変わっても、正
しく実行することができる。
【0082】オブジェクト指向プログラム言語では、型
をパラメタで表現するクラスの定義方法が提供されてい
る場合がある。例えば、要素の型をパラメタとしてリス
トのクラスを定義する。このクラスは、要素の型を定め
て、整数のリスト、文字列のリストなどとして使用す
る。一つのリストのクラスの定義によって、様々な型の
要素をもつリストのクラスを生成することになる。
をパラメタで表現するクラスの定義方法が提供されてい
る場合がある。例えば、要素の型をパラメタとしてリス
トのクラスを定義する。このクラスは、要素の型を定め
て、整数のリスト、文字列のリストなどとして使用す
る。一つのリストのクラスの定義によって、様々な型の
要素をもつリストのクラスを生成することになる。
【0083】図21は、型をパラメタで表現するクラス
定義の例である。001行は型$typeをパラメタとした
クラスtype5($type)の定義であることを表している。太
字はプログラミング言語の予約語である。002行、0
03行は図7において説明した通りである。004行は
メソッドm5:が引数x1をとり、型type3のオブジェクトを
出力することを表す。ただし、引数x1の型はパラメタ$t
ypeである。005行はメソッドm5:の本体であり、引数
x1にメッセージm2を送った結果をメソッドの出力として
返す。
定義の例である。001行は型$typeをパラメタとした
クラスtype5($type)の定義であることを表している。太
字はプログラミング言語の予約語である。002行、0
03行は図7において説明した通りである。004行は
メソッドm5:が引数x1をとり、型type3のオブジェクトを
出力することを表す。ただし、引数x1の型はパラメタ$t
ypeである。005行はメソッドm5:の本体であり、引数
x1にメッセージm2を送った結果をメソッドの出力として
返す。
【0084】このクラスを使用する場合は、type5(type
2)などと表現する。このとき、パラメタ$typeはtype2に
置き換わる。パラメタ$typeは、任意の型と置き換える
ことができるわけではない。図21の場合、パラメタ$t
ypeで型宣言した引数x1にメッセージm2を送っているの
で、少なくとも、パラメタ$typeと置き換えることので
きる型は、メッセージm2を送ることのできる型でなけれ
ばならない。パラメタに正しい型を指定しているかどう
かを検査しなければ、実行時にエラーを起こす可能性が
大きくなる。このような検査も、型検査プログラムを用
いることにより、パラメタに型を指定するたびに、パラ
メタを用いたクラスtype5($type)のコンパイルをする
ことなく、行うことができる。
2)などと表現する。このとき、パラメタ$typeはtype2に
置き換わる。パラメタ$typeは、任意の型と置き換える
ことができるわけではない。図21の場合、パラメタ$t
ypeで型宣言した引数x1にメッセージm2を送っているの
で、少なくとも、パラメタ$typeと置き換えることので
きる型は、メッセージm2を送ることのできる型でなけれ
ばならない。パラメタに正しい型を指定しているかどう
かを検査しなければ、実行時にエラーを起こす可能性が
大きくなる。このような検査も、型検査プログラムを用
いることにより、パラメタに型を指定するたびに、パラ
メタを用いたクラスtype5($type)のコンパイルをする
ことなく、行うことができる。
【0085】図22は、パラメタを用いたクラスtype5
($type)に定義されているメソッドm5:の型検査プログ
ラムである。図21の004行において、パラメタ$typ
eによって型宣言されている引数x1の型は、メソッドの
中では確定しないので、外部変数の型と同じように、型
変数t0をもちいて表現される。これは、型変数宣言部2
210に登録される。型検査コード部2220は、図1
2の型検査コード部1220と同様に生成する。
($type)に定義されているメソッドm5:の型検査プログ
ラムである。図21の004行において、パラメタ$typ
eによって型宣言されている引数x1の型は、メソッドの
中では確定しないので、外部変数の型と同じように、型
変数t0をもちいて表現される。これは、型変数宣言部2
210に登録される。型検査コード部2220は、図1
2の型検査コード部1220と同様に生成する。
【0086】例えば、図14の型type2を用いて、クラ
スtype5(type2)を生成し、型検査プログラム2200を
実行すると、型変数t0にtype2が代入され、型推論式t0=
>m2:→t1は正しく実行できる。しかし、図14の型typ
e1を用いて、クラスtype5(type1)を生成し、型検査プロ
グラム2200を実行すると、型変数t0にtype1が代入
され、型推論式t0=>m2:→t1は正しく実行できない。し
たがって、type5(type1)という使い方は誤りであること
が、この検査によりわかる。
スtype5(type2)を生成し、型検査プログラム2200を
実行すると、型変数t0にtype2が代入され、型推論式t0=
>m2:→t1は正しく実行できる。しかし、図14の型typ
e1を用いて、クラスtype5(type1)を生成し、型検査プロ
グラム2200を実行すると、型変数t0にtype1が代入
され、型推論式t0=>m2:→t1は正しく実行できない。し
たがって、type5(type1)という使い方は誤りであること
が、この検査によりわかる。
【0087】上述の実施例では、永続的オブジェクトを
扱うシステムが前提となっている。しかし、本発明の型
検査の方法は、ファイルシステムなどを用いたオブジェ
クト指向プログラミング言語に対しても適用が可能であ
る。図23は、ファイルシステムを用いた、本発明の構
成図である。上述の実施例における永続的オブジェクト
を管理する機能や、クラスオブジェクトなどの代わり
に、型情報辞書をもつことを特徴とする。
扱うシステムが前提となっている。しかし、本発明の型
検査の方法は、ファイルシステムなどを用いたオブジェ
クト指向プログラミング言語に対しても適用が可能であ
る。図23は、ファイルシステムを用いた、本発明の構
成図である。上述の実施例における永続的オブジェクト
を管理する機能や、クラスオブジェクトなどの代わり
に、型情報辞書をもつことを特徴とする。
【0088】10は図1と同様な計算機システムであ
る。2300はコンパイラで、プログラムのモジュール
の定義2320を読み込み、モジュールの実行コード2
330、型情報辞書2340及びモジュールの型検査プ
ログラム2350を生成する。型検査プログラムの実行
は、型検査プログラム実行部2310において、型情報
辞書2340を参照しながら行う。型検査プログラムの
実行、すなわち、型検査の結果、型の誤りが存在するの
であれば、型検査プログラム実行部2310は型の誤り
情報を出力する。型検査プログラムの構成、生成方法、
実行方法などは、上述の実施例と同様である。
る。2300はコンパイラで、プログラムのモジュール
の定義2320を読み込み、モジュールの実行コード2
330、型情報辞書2340及びモジュールの型検査プ
ログラム2350を生成する。型検査プログラムの実行
は、型検査プログラム実行部2310において、型情報
辞書2340を参照しながら行う。型検査プログラムの
実行、すなわち、型検査の結果、型の誤りが存在するの
であれば、型検査プログラム実行部2310は型の誤り
情報を出力する。型検査プログラムの構成、生成方法、
実行方法などは、上述の実施例と同様である。
【0089】図24は型情報辞書の構成である。上述の
実施例における個々のクラスオブジェクトが管理してい
る情報をまとめて管理する。すなわち、型名によって、
その型の情報や型が定義されたクラスの情報を管理す
る。2401は型名であり、型及びクラス情報へのエン
トリとなる。2402は変数表であり、オブジェクトの
静的構造を表す変数の一覧である。関数などのモジュー
ルからみれば、外部変数になる。2403は型参照情報
である。2404はそのクラスが定義されているファイ
ル名である。2405はファイルにおけるクラス定義の
位置を示す行番号である。2406はそのクラスに定義
されている関数(モジュール)の表である。上述の実施
例におけるメソッド表(図8の809)に相当する。関
数表2406は、関数名2411、関数の仕様241
2、実行コード2413、型検査プログラム2414を
管理する。
実施例における個々のクラスオブジェクトが管理してい
る情報をまとめて管理する。すなわち、型名によって、
その型の情報や型が定義されたクラスの情報を管理す
る。2401は型名であり、型及びクラス情報へのエン
トリとなる。2402は変数表であり、オブジェクトの
静的構造を表す変数の一覧である。関数などのモジュー
ルからみれば、外部変数になる。2403は型参照情報
である。2404はそのクラスが定義されているファイ
ル名である。2405はファイルにおけるクラス定義の
位置を示す行番号である。2406はそのクラスに定義
されている関数(モジュール)の表である。上述の実施
例におけるメソッド表(図8の809)に相当する。関
数表2406は、関数名2411、関数の仕様241
2、実行コード2413、型検査プログラム2414を
管理する。
【0090】このように、永続的オブジェクト管理機能
やクラスオブジェクトを用いなくとも、型情報辞書を生
成することにより、型検査プログラムを用いた型検査が
可能となる。
やクラスオブジェクトを用いなくとも、型情報辞書を生
成することにより、型検査プログラムを用いた型検査が
可能となる。
【0091】なお、上記実施例においては、コンパイラ
におけるコンパイル時に型検査プログラムを生成するよ
うにしているが、これに限らず、クラス定義を直接解析
して型情報を生成し、この型情報に基づいて型検査プロ
グラムを生成するようにしてもよい。
におけるコンパイル時に型検査プログラムを生成するよ
うにしているが、これに限らず、クラス定義を直接解析
して型情報を生成し、この型情報に基づいて型検査プロ
グラムを生成するようにしてもよい。
【0092】
【発明の効果】以上述べたように、本発明によれば、構
文解析など従来のコンパイラの各フェーズと独立に型検
査を行うことができるため、継承処理、クラスの更新、
型のパラメタをもつクラス定義など、同一のソースプロ
グラムに対し、何度も型検査を行わなければならない場
合において、効率的な型検査を行うことができる。さら
に、コンパイルに対し、型検査を遅延することができる
ため、クラス定義とは別に、予め型の定義を宣言した
り、コンパイルの順序を指定する必要がなくなり、強い
型付けによるプログラマに対する制約を軽減することが
できる。
文解析など従来のコンパイラの各フェーズと独立に型検
査を行うことができるため、継承処理、クラスの更新、
型のパラメタをもつクラス定義など、同一のソースプロ
グラムに対し、何度も型検査を行わなければならない場
合において、効率的な型検査を行うことができる。さら
に、コンパイルに対し、型検査を遅延することができる
ため、クラス定義とは別に、予め型の定義を宣言した
り、コンパイルの順序を指定する必要がなくなり、強い
型付けによるプログラマに対する制約を軽減することが
できる。
【図1】本発明を永続的オブジェクト管理システムにお
いて適用した場合の構成図である。
いて適用した場合の構成図である。
【図2】従来の一般的なコンパイラの各フェーズを示す
図である。
図である。
【図3】型の参照関係の模式図である。
【図4】クラスの継承の模式図である。
【図5】本発明によるコンパイラの各フェーズを示す図
である。
である。
【図6】オブジェクトの型の概念図である。
【図7】クラス定義の例を示す図である。
【図8】クラスオブジェクトの構成図である。
【図9】図8における変数表の構成図である。
【図10】図8におけるメソッド表の構成図である。
【図11】型検査プログラムの構成図である。
【図12】図7の例において定義されたメソッドに対応
する型検査プログラムの例を示す図である。
する型検査プログラムの例を示す図である。
【図13】複数のクラスをコンパイルし、型検査する処
理手順を表した流れ図である。
理手順を表した流れ図である。
【図14】図7のクラス定義が参照しているクラスの定
義例を示す図である。
義例を示す図である。
【図15】図14のクラス定義をコンパイルすることに
よって得られる型に関する情報の一覧を示す図である。
よって得られる型に関する情報の一覧を示す図である。
【図16】型検査プログラム実行の処理手順を表した流
れ図である。
れ図である。
【図17】継承処理に伴う型検査の処理手順を表した流
れ図である。
れ図である。
【図18】継承処理に伴う型検査の過程を説明するため
のクラス定義例を示す図である。
のクラス定義例を示す図である。
【図19】クラス更新に伴う型検査の処理手順を表した
流れ図である。
流れ図である。
【図20】クラスの参照関係を表した有向グラフを示す
図である。
図である。
【図21】型をパラメタとしてもつクラス定義の例を示
す図である。
す図である。
【図22】図21の例において定義されたメソッドに対
応する型検査プログラムの例を示す図である。
応する型検査プログラムの例を示す図である。
【図23】本発明をファイルなどで管理されるオブジェ
クト指向プログラミング言語に適用した場合のシステム
ブロック図である。
クト指向プログラミング言語に適用した場合のシステム
ブロック図である。
【図24】図23における型情報辞書の構成図である。
10…計算機システム、100…コンパイラ、110…
型検査プログラム実行部、112…型の誤り情報、12
0…データ管理システム、121…クラス定義、130
…オブジェクト管理システム、131…クラスオブジェ
クト、133…メソッド実行コード、135…型検査プ
ログラム。
型検査プログラム実行部、112…型の誤り情報、12
0…データ管理システム、121…クラス定義、130
…オブジェクト管理システム、131…クラスオブジェ
クト、133…メソッド実行コード、135…型検査プ
ログラム。
Claims (14)
- 【請求項1】オブジェクト指向プログラミング言語によ
って記述された、メソッドの定義および変数の宣言を含
む第1のクラス定義をコンパイルし、 該コンパイルにより、前記クラス定義により定義される
クラスの型に関する第1の型情報を生成し、 該第1の型情報に基づいて前記メソッドの各々に対して
型検査を行なうための型検査プログラムを生成し、 前記メソッドが参照すべき型に関する第2のクラス定義
がコンパイルされて該クラス定義により定義されるクラ
スの型に関する第2の型情報を生成し、 前記メソッドに対応する前記型検査プログラムを前記第
1および第2の型情報に基づき実行することを特徴とす
るプログラムの型検査方法。 - 【請求項2】請求項1において、前記クラス定義をコン
パイルせずに直接解析することにより、前記型情報を生
成することを特徴とするプログラムの型検査方法。 - 【請求項3】請求項1において、前記メソッドが自己の
内部で宣言している型以外の型を参照している場合にの
み、前記メソッドの型検査を行なうための型検査プログ
ラムを生成することを特徴とするプログラムの型検査方
法。 - 【請求項4】請求項1において、前記型検査プログラム
を生成するステップにおいて、対応するメソッドが参照
している外部の変数の変数名と該変数の型を表す型変数
との対応関係を管理する型変数宣言部と、前記型変数を
用いて型検査を行なう手順を示した型検査コード部とを
生成し、前記型検査プログラムが前記型変数宣言部と前
記型検査コード部とで構成されるようにすることを特徴
とするプログラムの型検査方法。 - 【請求項5】請求項4において、前記型検査コード部
は、対応するメソッドの引数や前記メソッド内部の変数
の型宣言から直接推論することができない型を型変数と
し、前記メソッドの引数および前記メソッド内部の変数
の型を型定数とすることを特徴とするプログラムの型検
査方法。 - 【請求項6】請求項4において、前記型検査コード部
は、型を推論するための型推論式と該型推論式に対応す
る行番号とを有し、該行番号は前記型推論式を生成する
基となったクラス定義内における位置を示すための情報
を格納していて、前記型検査プログラムの前記型推論式
を前記第1および第2の型情報に基づき実行して型の誤
りが検出されると、該誤りが検出された型推論式に対応
する行番号を出力することを特徴とするプログラムの型
検査方法。 - 【請求項7】請求項6において、前記メソッドの型検査
を行なう際に、前記メソッドに対応する型検査プログラ
ムの型変数宣言部に宣言されている型変数に、該型変数
に対応する型を代入し、前記型推論式を実行し、該実行
により型の誤りが検出されると、該誤りに関する情報お
よび前記型推論式に対応する行番号を出力することを特
徴とするプログラムの型検査方法。 - 【請求項8】請求項6において、前記型の誤りが検出さ
れるのは、前記第1および第2の型情報を参照できなか
った場合または型変数に型を代入できなかった場合であ
ることを特徴とするプログラムの型検査方法。 - 【請求項9】請求項4において、コンパイルされたメソ
ッドを継承する場合において、継承されるメソッドが、
継承先で正しく実行できるかどうかの検査を、前記メソ
ッドに対応する型検査プログラムの型変数宣言部の型変
数に、継承先のクラス定義において宣言された対応する
変数の型を代入し、前記型検査プログラムを実行するこ
とを特徴とするプログラムの型検査方法。 - 【請求項10】請求項9において、前記継承されるメソ
ッドが定義されたクラス定義における変数の型を、前記
メソッドに対応する型検査プログラムの型変数宣言部の
前記型変数の初期値として記憶しておくことにより、継
承先のクラス定義における変数の型と前記初期値とが異
なる場合にのみ型検査を行うことを特徴とするプログラ
ムの型検査方法。 - 【請求項11】請求項1において、前記クラス定義を変
更する更新を行なう際に、該更新がすでにコンパイルさ
れているクラス定義に対して整合性を保証できるもので
あるかどうかの検査を、更新したクラスを参照するクラ
スの各メソッドに対応する型検査プログラムを実行する
ことにより行うことを特徴とするプログラムの型検査方
法。 - 【請求項12】請求項1において、前記クラスの型に関
する情報は、クラス名すなわち型名、前記クラスのクラ
ス定義、該クラス定義で宣言されている変数と継承され
た変数の表、型の参照情報、および前記クラス定義で定
義されたメソッドと継承されたメソッドの表から成り、
クラス名を指定することにより、前記クラスの型に関す
る情報を得ることができることを特徴とするプログラム
の型検査方法。 - 【請求項13】オブジェクト指向プログラミング言語に
よって記述された型をパラメタとした第1のクラス定義
において、前記パラメタの値が確定しないままコンパイ
ルを行い、前記パラメタを含む型に関する第1の型情報
と、前記パラメタを含む第1の型検査プログラムとを生
成し、第2のクラス定義をコンパイルして前記パラメタ
に代入される型を含む第2の型情報が生成されると、前
記代入される型が前記第1のクラス定義に対して正しい
か否かの検査を、前記第1の型検査プログラムに前記型
を代入して実行することにより行なうことを特徴とする
プログラムの型検査方法。 - 【請求項14】オブジェクト指向プログラミング言語に
よって記述されたメソッドの定義および変数の宣言を含
むクラス定義をコンパイルするコンパイラを備えた計算
機システムにおいて、 前記コンパイラは、 前記クラス定義により定義されるクラスの型に関する型
情報を生成する型情報生成手段と、 前記生成された型情報を保持する第1の保持手段と、 前記保持された型情報に基づいて前記メソッドの各々に
対して型検査を行なうための型検査プログラムを生成す
る型検査プログラム生成手段と、 を備え、 前記システムは、さらに、 前記コンパイラにより生成された型検査プログラムを保
持する第2の保持手段と、 前記メソッドが参照すべき型に関する型情報が生成され
ると、前記メソッドに対応する前記型検査プログラムを
前記第2の保持手段から取りだし、前記型に関する情報
に基づき実行する実行手段を備えることを特徴とする計
算機システム。
Priority Applications (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP5104593A JPH06266561A (ja) | 1993-03-11 | 1993-03-11 | プログラムの型検査方法およびシステム |
Applications Claiming Priority (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP5104593A JPH06266561A (ja) | 1993-03-11 | 1993-03-11 | プログラムの型検査方法およびシステム |
Publications (1)
| Publication Number | Publication Date |
|---|---|
| JPH06266561A true JPH06266561A (ja) | 1994-09-22 |
Family
ID=12875838
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| JP5104593A Pending JPH06266561A (ja) | 1993-03-11 | 1993-03-11 | プログラムの型検査方法およびシステム |
Country Status (1)
| Country | Link |
|---|---|
| JP (1) | JPH06266561A (ja) |
Cited By (3)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| JP2006302285A (ja) * | 2005-04-18 | 2006-11-02 | Sun Microsyst Inc | 移行互換性を維持したままのジェネリック型の具体化 |
| JP2013214255A (ja) * | 2012-04-04 | 2013-10-17 | Meidensha Corp | ソフトウェアの開発支援システムにおけるシミュレーション方法 |
| JP2017516210A (ja) * | 2014-04-22 | 2017-06-15 | オラクル・インターナショナル・コーポレイション | 動的に生成されたパターンベースクラスの構造識別 |
-
1993
- 1993-03-11 JP JP5104593A patent/JPH06266561A/ja active Pending
Cited By (3)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| JP2006302285A (ja) * | 2005-04-18 | 2006-11-02 | Sun Microsyst Inc | 移行互換性を維持したままのジェネリック型の具体化 |
| JP2013214255A (ja) * | 2012-04-04 | 2013-10-17 | Meidensha Corp | ソフトウェアの開発支援システムにおけるシミュレーション方法 |
| JP2017516210A (ja) * | 2014-04-22 | 2017-06-15 | オラクル・インターナショナル・コーポレイション | 動的に生成されたパターンベースクラスの構造識別 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| US7962904B2 (en) | Dynamic parser | |
| Ernst et al. | An empirical analysis of C preprocessor use | |
| US5313387A (en) | Re-execution of edit-compile-run cycles for changed lines of source code, with storage of associated data in buffers | |
| US20070226720A1 (en) | System and Method for Efficiently Passing Information Between Compiler and Post-Compile-Time Software | |
| Wood | On the equivalence of XML patterns | |
| Sadilek et al. | Prototyping visual interpreters and debuggers for domain-specific modelling languages | |
| Zhou et al. | VST-A: a foundationally sound annotation verifier | |
| Devanbu et al. | Generating testing and analysis tools with Aria | |
| Schröer | The GENTLE Compiler Construction System | |
| Varró et al. | Automated program generation for and by model transformation systems | |
| Bajczi et al. | C for yourself: comparison of front-end techniques for formal verification | |
| Evans | Using specifications to check source code | |
| Christiansen et al. | Symbolic constraints for meta-logic programming | |
| Farnum | Pattern-based languages for prototyping of compiler optimizers | |
| Öqvist | Contributions to declarative implementation of static program analysis | |
| Blazy et al. | Partial evaluation for the understanding of Fortran programs | |
| van Laarhoven et al. | Formalising and analysing SMMT models using the mCRL2 toolset | |
| Atterer | Automatic test data generation from VDM-SL specifications | |
| Aldrich | Coverage analysis for model-based design tools | |
| Blunk et al. | Prototyping domain specific languages as extensions of a general purpose language | |
| de Bruin et al. | Improving Agda’s module system | |
| Nita et al. | Automatic transformation of bit-level C code to support multiple equivalent data layouts | |
| EP1785848A1 (en) | Method and apparatus for semantic checking of program code | |
| Di Iorio et al. | A Self-Applicable Partial Evaluator for ASM | |
| David | Attribute grammars for C++ disambiguation |