読者です 読者をやめる 読者になる 読者になる

GroovyとProce55ingでJavaをカコヨク

先日(id:ABA:20040826#p1)のネタの続きだが、わたしゃJava好き人間なので、Javaがちょっとでもクールになって欲しいと願っている。

Javaがダサい理由のひとつとして、なんだか知らんが必要以上にタイプ数が多いってのがある。同じ動作を実現する際にも、他の言語と比べて異常に冗長な記述が必要となる。まあそのおかげで誰にでも分かりやすいコードができあがりやすいという利点もあるのだが、少なくともハカー受けはしない。

そこでGroovyですよ。

GroovyはJavaVM上で動くRubyもどきだ。という説明をしてはいけない。JavaVM上で動く新しいスクリプト言語だ。Javaとの緊密な連携が売りで、Javaを呼び出すのも、Javaから呼び出されるのも非常に簡単にできる。

Groovyという名前は'Yet-Another-Good-Ruby'を略した「Go(ぐ)-Ruby」の発音に由来している。という嘘を教えてはいけない。でも言語仕様はRubyの影響を受けまくり。JavaでもRubyが使いたいんじゃーい、という印象ばかり受ける。

とりあえず現状だと、遅い、IDEとの連携が甘い、エラーが分かりにくい、といった欠点があるので、ちょいと使い勝手が悪いのだが、おいおい改良されていくだろう。

さらにこれにProce55ingを組み合わせるという合わせ技も可能だ。Groovyの持つスクリプト言語としての利点と、Proce55ingの持つメディアアート言語としての利点を組み合わせれば、なかなか強力な環境になる。

たとえば、よくあるラインアートの簡単なサンプルを、Groovy + Proce55ingで書くと、以下のようになる。

class GroovyP5Test extends BApplet {
  p = []
  void setup() {
    size(200, 200)
    framerate(30)
    stroke(255, 255, 200)
    5.times {
      p += ['x':random(200), 'y':random(200),
            'mx':random(10) - 5, 'my':random(10) - 5]
    }
  }
  void loop() {
    background(50, 80, 120)
    beginShape(BConstants.LINE_STRIP)
    p.each {
      it.x += it.mx
      it.y += it.my
      if (it.x < 0 || it.x >= width)
        it.mx *= -1
      if (it.y < 0 || it.y >= height)
        it.my *= -1
      vertex((Float) it.x, (Float) it.y)
    }
    endShape()
  }
}

LINE_STRIPにBConstantsを明示しなきゃいけないとか、vertexに値を渡すときにFloat(floatじゃないんだなこれが)にキャストしなきゃいけないとか、微妙な謎挙動はあるが、コード自体は非常にコンパクトにできる。

ただこのサンプル、Groovyが起動時にクラスローダを生成するため、デフォルトのセキュリティ設定のアプレットでは動作しない。ということはGroovyで書かれたProce55ingアプリはブラウザ上で動作させることができないということを意味する。これではProce55ingの利点がだいぶ殺されてしまっているため、現状ちょっとお勧めしかねるってのが本音だ。Groovyとアプレットの親和性が高まればいいのだけれども、そういったプランはあるのかなあ。