PR

堅い型システムは偶発的エラーを防ぐ

図3●プリミティブな型であれば,メモリ空間上の固定した領域にデータの入れ物を確保できる。
あらかじめ器を用意できるので効率がよい

 一方,大規模なシステム開発においては,JavaやPascal,C++のような堅い型システムの言語が有効である。自動的に型変換してくれるのはとても便利ではあるが,実行してみないとどうなるかわからない面が残されているということでもある。このことは,予測できないエラーを含みうるということを意味している。また変数の型が厳密に決められていないので,予想しない値が変数に格納されていることがあり得る。堅い型システムではこういった偶発的なトラブルを避けることができる。

 コンパイラ方式の言語の多くで堅い型システムを採用しているのは,大きく二つの理由がある。一つは前述の安全性の問題。単に実行してみなければわからないだけでなく,型を明示的に固定することによって正しいデータの取り扱いを可能にする(詳細は後述)。もう一つは,効率の問題である。型宣言をあらかじめしておくことにより,変数のデータ領域を確実に確保できる。変数の型がプリミティブ(原始的)であればそれだけ,固定した大きさを確保すればよい(図3[拡大表示] )。プログラム実行中にデータ領域の大きさが変わると,そのたびに領域確保を実行しなければならない。

リスト3●C++やJavaでは変数を必要な場所で宣言できる。
ただし変数宣言とオブジェクトの生成に指定するメソッドの両方で,同じ情報が必要となるので若干冗長な感がする

 型宣言をせずに変数を使えるようにするには,すべて共通の入れ物に入れるようにすればよい。実行時にその変数に入れられているオブジェクトによって,変数の型を決める。これがスクリプト言語のやり方である。もちろん,変数の型宣言をしないからと言って,その値(すなわちオブジェクト)が対応していない操作はできない。したがって,一つの変数は一つの型(クラス)で使うことが望ましい。この原則を守っておかないと,予想外の実行時エラーに出くわす可能性がある。JavaやC++などの場合,変数を使う時点で型宣言が可能なので,必要に応じて追加できるという点では変わらない。ただしスクリプトに比べ多少冗長な表現になる(リスト3[拡大表示])。

 もう一つの方法として,暗黙の型宣言を決めておくことによって変数の型宣言を不要にしている言語もある。ちょっと昔のFORTRANなどがその例だ。FORTRANでは宣言していない変数は,変数名の先頭の文字がIからNであれば整数型,そうでなければ実数型になる。変数を宣言せずに,好きなときに使える。ループ・カウンタなどに手軽に変数を追加できる半面,大きな問題がある。次の二つの文をよく見比べて頂きたい。

DO 100 I=1, 10
DO 100 I=1. 10
どちらも文法的には正しい文である。上は固定回数ループを作るDO文である。そして下は,「DO100I」という変数に1.10を代入するという文である注2)。FORTRANでは空白文字は無視されるためだ。後者が前者のタイプミスであることはほぼ明らかだが,文法上正しいためコンパイラはエラーを出さない。しかもカンマとピリオドという,大量のソース・コードの中では埋もれてしまいそうな間違いである。型宣言が不要であるということは,このような微妙な間違いではないにしても,ごく単純なスペルミスを許容してしまうということである。だから「あの名前のオブジェクトに入れたはず」のデータが,正しく入っていないためにうまく動作しないということがあり得る。逆に型宣言が必要な言語であれば,多少のスペル・ミスはコンパイラが発見してくれる。そういう意味では堅い型システムの方が便利な面もあるのだ。

 Visual Basicのように,オプションによって厳しい型チェックをするかどうかを決められるものもある。もともとBASICはFORTRANから派生して生まれた言語であり,基本的にはFORTRANのように特に変数を宣言しなくても使えるようになっている。これを大規模開発にも適用できるよう,オプションで型チェックを追加したのだ。またVisual Basicの場合,外部プログラムの呼び出しに関しては,Object型を利用できる。OLE(Object Linking and Embedding)Automationを利用してほかのプログラムを呼び出すときなどに利用する。あらかじめ変数宣言のときにオブジェクトの型(この場合は呼び出すOLEオブジェクトのクラス)を指定するとスタティック・リンクになり,Object型を使っているとダイナミック・リンクになる。

「うーん。でもまだ,型システムが柔軟な方が便利な気がするんですけど」
「それならLispを使ってみれば。muleとかに付いているから。ただボクは使ったことないから知らないけどね」
「なんか,今日の先輩,冷たいですね」
「そう?まあ,時代の流れは柔らかい方へ向かってる気はすんだけどね」

(北郷 達郎、八木 玲子)