Archive for 3 月 8th, 2008

[Processing][仕様]color型はcolorクラスではない

3 月 08th, 2008 | Category: processing
このエントリをはてなブックマークに追加[Processing][仕様]color型はcolorクラスではないのはてなブックマーク被リンク数このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをBuzzurl(バザール)に追加

 Processingの言語仕様としてすばらしいところの1つに、color型があります。color型は、そのcolorModeに応じて、RGB色空間、HSB色空間を表現することができます。colorModeに関係なくグレースケール色空間も表現することができます。

 このcolor型ですが、colorクラスというのがあるんだと思っている人が多いと思います。私もその1人でした。

 ところが、次のプログラムは動きません。

color c = null;

 

 color型がクラスで実装されているのであれば、インスタンスにnullを代入することが可能なはずですが、ProcessingのIDEは次のようなエラーを返しました。

Semantic Error: The type of the right sub-expression, “null”, is not assignable to the variable, of type “int”.
(うえちょこ訳:右辺式の”null”はint型の変数に代入することができません。)

 

 このエラーから推測できることは、Processingではcolor型のことをint型と思っているようです。実際にProcessingのcoreパッケージ内のPGraphics.javaPApplet.javaのソースコードを見てみると、color関数(colorメソッド)は存在するのですが、color型、colorクラスのようなものは見当たりません。そして、color関数(colorメソッド)の返り値が全てint型です。やはりProcessingのcolor型はint型と等しいようです。

 この現象を技術的な視点で見ると、int型(32ビット)の表現領域があれば、透明度を含めたフルカラーを表現することは可能です。よって、色を整数値で保持しておくことに関しては何の問題はありません。

 しかしプログラミング言語的な視点から見ると、そもそもJavaには、C言語のtypedefに相当する型を再定義する命令が存在しないのに、なぜcolor型はint型と同等に扱われているのかが気になるところです。

 結論から言ってしまえば、ProcessingのIDEがコンパイル時に”color”型を”int”に書き換えています。わかりやすく書くと、プログラム中に

color c= 0;

と書いた部分は、ProcessingのIDEがコンパイルするときには

int c = 0;

に置き換えられています。詳しく見てみたい人は、ProcessingのIDEからスケッチをエクスポートしてみてください。Java Applet一式が出力されますが、Applet用のソースコードを見てみると既に”color”型は”int”に置換されていることがわかると思います。

 Processingは、デザイナーが簡単に習得できるように設計されている言語なので、Javaで在りながらJavaらしさを極力抑えられていると言えます。color型にはProcessingのデザイナーへの思いやりが込められているわけですね。プログラマにとっては面白い研究材料(=ネタ?)でもあります。

 Processingって面白いですね。

2 comments