「この間,スクリプト使いましたよね」
「うん」
「変数を宣言しないんで,必要になったらすぐに使えて便利だったんですけど」
「そうだろうね」
「どうして,C++やJavaだといちいち宣言しなきゃならないんですか」
「逆に便利な面もあったりするんだけどな」
「…そうかなぁ」

 プログラムを作成しているとちょっと面倒なのが,データ型の存在である。変数を使うにはまず型を宣言してやらなければならないし,計算した結果をウインドウに表示するだけでも型変換が必要だったりする。こういった作業は本質的なロジックにかかわりがないので,軽くプロトタイプを作りたい場合には鬱陶しく感じることがあるかもしれない。

 こういうときにスクリプト言語を使っていると,このようなことに頭を悩まさずに済むことがある。例えばVisual Basic Script(VBS)では,文字列として代入していようが,数字で代入していようが,変数に入れた値の取り扱いは同じだ(リスト1[拡大表示])。内部表現はともあれ,数字である限りは「+」で足し算ができる。逆に文字列連結演算子「&」を使えば,文字列として取り扱える。

 スクリプト言語のように,データの「型」を宣言せずに使え,変数のデータ型を随時変えられるような体系のことを「柔らかい型システム」と呼ぶ。一方JavaやPascalなどのコンパイラ型言語は,データ型が厳密に決まっている。このようなプログラミング言語は,「堅い型システム」を採用している注1)。

 そもそもデータの「型」とは,データの表現形式を決めるものである。単純なものでは整数型や浮動小数点数型,文字型などがある。少し複雑なもので,文字列型や配列型がある。複合的なデータを一つの単位として取り扱うものにCでいう「構造体」,Pascalでいう「レコード型」がある(図1[拡大表示])。オブジェクト指向言語における「クラス」は,この構造体を発展させた一種のデータ型と考えられる。プログラマが独自に定義できるデータ型であり,複雑な構造でも構わない。

 データの型を決めるということは,ある目的で使うデータの器を決めることである。つまりそのデータで何をしたいのかを選択することになる。整数型や浮動小数点数型などの単純なものや,文字列型などは比較的多くの場面で使われるので,用途に応じて適宜使うことになる。

リスト1●Visual Basic Scriptは数値と文字列の区別がない。
演算子や状況に応じて適切なものにする。Perlも同様。ただし,数字以外の文字列を計算しようとすると実行時エラーが発生する
 
図1●レコード型や構造体の概念。
例えば「社員」というデータを定義する場合,社員にはいくつかの属性がある。こういった属性を組み合わせて一つの単位として操作できるようにするのがCの構造体であり,Pascalのレコード型である。プログラムの別の変数を使ってこういった関係を維持できないこともないが,非常に間違いを起こしやすい

場面に応じて“柔らかく”使える

 ただ同じ「1」であっても,場面に応じて求められる形態が違う(図2[拡大表示])。例えば単純にコンソールに結果を表示する程度であれば,数値型のままでもよい。しかしウインドウの一部に望み通りの文字を出力するには,何らかの形で文字列型に変換する必要がある。また文字コードを判別して制御するプログラムなら,文字列として受け取ったデータを文字単位に切り出したりする操作が出てくる。スクリプト言語は適切な範囲であれば,適宜自動的に型を変換してくれる。暗黙のうちに型変換されているのである。その代わり,同じ文でもデータの中身によってエラーが出たり出なかったりすることになる。また予想外の変換をしてしまっている可能性もある。Perlの場合,数字以外の文字列を計算しようとすると,強引に解釈して「0」として取り扱う。

 ただすべてのスクリプト言語がこのように暗黙の型変換を実行するわけではない。Rubyの場合,型宣言をせずに変数を使えるが,文字列として代入した変数と整数を「足す」ことはできない(リスト2[拡大表示])。Rubyの場合,文字列の結合と加算がいずれも同じ「+」演算子を使うためだろう。どちらに合わせるかによって,結果が変わってしまう。数値を文字列として扱うには明示的にString()関数を使って型変換をする。こうすれば確実に文字列になるので,万が一その変数の値が文字列だったとしてもエラーが出ない。

 こういった違いは,どちらがよいとか悪いとかいうものではない。プログラミング言語を設計する上での思想の違いであり,その思想を正しく理解したうえで利用する限りにおいては何ら問題とならないものだ。思想と言うと大袈裟かもしれないが,プログラミング言語には設計した目的がある。プロトタイプ的に“サクっと作ってサクっと使う”ものと,基幹業務システムの構築に使うものでは自ずと求められる資質が異なるのである。型変換の手間を惜しんででもロジックに没頭できることをスクリプト言語では目指しているので,データの型をいちいち定義したりしないし,ある程度自動的に変換してくれるというのはリーズナブルである。

図2●データの内部表現とデータ型。
データは最終的に何らかの数値に置き換えられる。例えば49という値は,整数として取り出せばそのまま計算できるし,文字列として取り出せば「4」と「9」という2文字のつながりとなる。ASCII文字だとすれば,「1」になる
 
リスト2●Rubyの場合,文字列として格納した値を計算できない。
関数を使って適切な型に変換する必要がある

(北郷 達郎、八木 玲子)