3

[Processing][仕様]どこで”color”が”int”に変わるのか

Tag: processinguechoco @ 02 : 20 : 56

 前の[Processing][仕様]color型はcolorクラスではないでは、Processingのcolor型がint型のエイリアス(別名)であることを調査したのですが、今回はコンパイル時にどのように"color"が"int"に置換されるのかを調査しようと思い立ちました(何故かわかりませんがw)。ただし、今回は全ての挙動を追っているわけではないので、間違いや説明不足な部分があるかもしれません。その点はご了承ください。

 スケッチを実行したり、エクスポートしたりすると、Sketch.javaのbuildメソッドが呼ばれ(ると思い)ます。buildメソッド内の大まかな流れは、

  1. Javaのクラスパスを調べたり、複数のpdeファイルがある場合は1つにまとめたりした後、
  2. プリプロセッサを実行してp5 syntax(Processing文法)をJavaでコンパイル可能な文法に変換し、
  3. コンパイラを実行します

 プリプロセッサというのは、コンパイラがソースコードをコンパイルする前に、ソースコードになんらかの処理をするためのプログラムのことです。例えばC言語では、#includeや#define、#pragmaなどの#(シャープ記号)がつく命令を"プリプロセッサ指令"と呼んでいて、プリプロセッサになんらかの処理をさせるための印としています。
 ProcessingのベースとなっているJavaには、プリプロセッサが開発者に開放されていないので、Processingの開発環境では自前のプリプロセッサを用いて処理しています。今回調査している"color"を"int"に置換するような処理も、PDEのプリプロセッサが行っているようです。

 Processingのプリプロセッサに相当するクラスは、PdePreprocessor.javaです。このクラスはANTLR(Javaなどの文法を解析するオープンソースのパーサ生成器)のラッパーという位置づけのようです。ソースコードを見てみると、使用するJDKのバージョンによって読み込む設定を変えたり、pdeファイルの書き方(直書きか、setup()/draw()を使うか、Javaのクラスとして完結しているか)によって、前後にmain()メソッドやクラス定義を付加していたりしています。どうやらp5 syntaxからJavaのソースコードを吐き出す処理をしているのは別のクラスに任せているようです。

 実際にJavaのソースコードを吐き出しているのは、PdeEmitter.javaです。このクラスでは、字句解析したp5 syntaxを字句ごとにばらして、さまざまな処理を行っています。このレベルになってくると私はソースコードを追えないのですが、少なくとも1箇所だけは意味を理解できそうです。print()メソッド内の、case文の羅列の中の以下のコードです。

Java:
  1. // the color datatype is just an alias for int
  2.     case LITERAL_color:
  3.       out.print("int");
  4.       dumpHiddenAfter(ast);
  5.       break;

コメントも付いていてわかりやすいですね。どうやらここが今回の調査の終着点のようです。実際の処理がどうなのかはわかりませんが、ソースコードの英語から読み取れることは、「"color"というリテラルが現れたとき、"int"を出力する」という処理です。

 今回の調査では、"color"型が"int"に変わるまでにかなりの処理が必要だとわかりました。今回はC言語のプリプロセッサにありがたみを覚えたのと、Processingという開発環境が内部では相当頑張っているということが実感できました。自分の中ではもっといい加減に"color"が"int"に変わっているような気がしていたのですが、こんなことを言うと開発者に失礼ですね。

 自分が想像している以上に、Processingの開発環境が良くできているんだと知ることができて、ますますProcessingが好きになれそうです。

Leave a Reply