「この間,スクリプト使いましたよね」
「うん」
「変数を宣言しないんで,必要になったらすぐに使えて便利だったんですけど」
「そうだろうね」
「どうして,C++やJavaだといちいち宣言しなきゃならないんですか」
「逆に便利な面もあったりするんだけどな」
「…そうかなぁ」
プログラムを作成しているとちょっと面倒なのが,データ型の存在である。変数を使うにはまず型を宣言してやらなければならないし,計算した結果をウインドウに表示するだけでも型変換が必要だったりする。こういった作業は本質的なロジックにかかわりがないので,軽くプロトタイプを作りたい場合には鬱陶しく感じることがあるかもしれない。
こういうときにスクリプト言語を使っていると,このようなことに頭を悩まさずに済むことがある。例えばVisual Basic Script(VBS)では,文字列として代入していようが,数字で代入していようが,変数に入れた値の取り扱いは同じだ(リスト1[拡大表示])。内部表現はともあれ,数字である限りは「+」で足し算ができる。逆に文字列連結演算子「&」を使えば,文字列として取り扱える。
スクリプト言語のように,データの「型」を宣言せずに使え,変数のデータ型を随時変えられるような体系のことを「柔らかい型システム」と呼ぶ。一方JavaやPascalなどのコンパイラ型言語は,データ型が厳密に決まっている。このようなプログラミング言語は,「堅い型システム」を採用している注1)。
そもそもデータの「型」とは,データの表現形式を決めるものである。単純なものでは整数型や浮動小数点数型,文字型などがある。少し複雑なもので,文字列型や配列型がある。複合的なデータを一つの単位として取り扱うものにCでいう「構造体」,Pascalでいう「レコード型」がある(図1[拡大表示])。オブジェクト指向言語における「クラス」は,この構造体を発展させた一種のデータ型と考えられる。プログラマが独自に定義できるデータ型であり,複雑な構造でも構わない。
データの型を決めるということは,ある目的で使うデータの器を決めることである。つまりそのデータで何をしたいのかを選択することになる。整数型や浮動小数点数型などの単純なものや,文字列型などは比較的多くの場面で使われるので,用途に応じて適宜使うことになる。
場面に応じて“柔らかく”使える
ただ同じ「1」であっても,場面に応じて求められる形態が違う(図2[拡大表示])。例えば単純にコンソールに結果を表示する程度であれば,数値型のままでもよい。しかしウインドウの一部に望み通りの文字を出力するには,何らかの形で文字列型に変換する必要がある。また文字コードを判別して制御するプログラムなら,文字列として受け取ったデータを文字単位に切り出したりする操作が出てくる。スクリプト言語は適切な範囲であれば,適宜自動的に型を変換してくれる。暗黙のうちに型変換されているのである。その代わり,同じ文でもデータの中身によってエラーが出たり出なかったりすることになる。また予想外の変換をしてしまっている可能性もある。Perlの場合,数字以外の文字列を計算しようとすると,強引に解釈して「0」として取り扱う。
ただすべてのスクリプト言語がこのように暗黙の型変換を実行するわけではない。Rubyの場合,型宣言をせずに変数を使えるが,文字列として代入した変数と整数を「足す」ことはできない(リスト2[拡大表示])。Rubyの場合,文字列の結合と加算がいずれも同じ「+」演算子を使うためだろう。どちらに合わせるかによって,結果が変わってしまう。数値を文字列として扱うには明示的にString()関数を使って型変換をする。こうすれば確実に文字列になるので,万が一その変数の値が文字列だったとしてもエラーが出ない。
こういった違いは,どちらがよいとか悪いとかいうものではない。プログラミング言語を設計する上での思想の違いであり,その思想を正しく理解したうえで利用する限りにおいては何ら問題とならないものだ。思想と言うと大袈裟かもしれないが,プログラミング言語には設計した目的がある。プロトタイプ的に“サクっと作ってサクっと使う”ものと,基幹業務システムの構築に使うものでは自ずと求められる資質が異なるのである。型変換の手間を惜しんででもロジックに没頭できることをスクリプト言語では目指しているので,データの型をいちいち定義したりしないし,ある程度自動的に変換してくれるというのはリーズナブルである。
|
|