JavaOne2010 9/22 -- Polyglot Programming in the Java Virtual Machine (JVM)

9/21の「Code Generation on the Java Virtual Machine: Writing Code That Writes Code」と同じく、Groovyベースのデスクトップ系GUIアプリケーションのフルスタックフレームワーク(長い)であるGriffonのPJリーダのAndres Almirayのセッション。Groovyのコミッタでもあります。

導入部

まず彼はJavaがかつてOakと呼ばれていたころからをごく簡単に振り返りつつ、Javaへの不満を列挙します。


「2004年のJDK5以降は新しい機能も追加されてないし、JDK7も延期されてるし・・・。」
「他の言語に比べて記述は冗長だし、スレッド周りも物足りないし・・・。」


「とはいえ、JVMは実行環境としてはサイコーだよね!」


「だから、『プログラミング言語Java』はちょっと横に置いといて、その上で別の言語を動かそうよ」


「で、それぞれの言語というのは一長一短な特徴があるので、どれか一つに絞らなくてもいいよね。全部適材適所で使えばいいよね!ね!?」


というわけで、Polyglot Programming、すなわち、多言語プログラミングに至るわけです。

Groovy, Scala, Clojureの簡単な紹介

ということで、Groovy、ScalaClojure(!)の簡単な説明です。
言語の品揃えは最近のトレンドに乗っ取ってはいますがどちらかというと完全に彼の趣味が反映されてますね。

Bean

たとえば、↓こんなJavaBeansは

public class Bean {
  private String name;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

Groovyだと、

class Bean {
  String name
}

Scalaだと、

class Bean(var name:String)

class Bean {
  @scala.reflect.BeanProperty
  var name: String
}

Clojureだと、

(defstruct Bean :name)

と書けます。

Lambda

↓こんなラムダ式は、

public interface Adder {
  int add(int a, int b);
}

public class MyAdder implements Adder {
  public int add(int a, int b) {
    return a + b;
  }
}

Groovyだと、

def adder = { a , b -> a + b }

Scalaだと、

val adder = (a:Int, b:Int) => a + b

Clojureだと、

(defn adder [a b] (+ a b))

と書けます。


ちなみに、Java8で導入予定のクロージャ記法なら、

Adder adder = #{ a , b -> a + b }

と書けますね。*1

Javaとの相互運用性

GroovyもScalaClojureもコンパイルすれば、単なるJavaのクラスファイルなので、Javaプログラムから呼び出せるし、当然反対にJavaプログラムを呼び出すこともできます。
特別なブリッジ機構などは必要ありません。

その他特徴

共通
Groovy
  • コンパイル時と実行時のどちらでもメタプログラミング可能
  • BuilderによるDSL記法
  • 周辺プロダクトが充実: Grails, Griffon, Gant, Gradle, Spock, Gaelyk, Gpars, CodeNarc, etc...
Scala
  • リッチな型システム
  • 型推論
  • パターンマッチとcaseクラス
  • Actor model
  • Traits
Clojure
  • コードとしてのデータ
  • データとしてのコード
  • Immutable Structures
  • STM(Software Transactional Memory)

Demo

Groovyの応用例としてGriffonを使い、その上でScalaのコードとClojureのコードを動かすよ!、というもの。


このセッションのここまでは壮大な前置きであり、実はここがメインだったりして。


「つまり、これは、Griffonの宣伝セッションだったんだよーーーー!!! 」「な、なんだっ(ry」

気づいていそうで気づいていないちょっとだけ気づいている既存のPolyglot Programmingの例

Webアプリ開発だと、↓とか普通に混在して使ってるよね、という話。

まとめ

  • プログラミング言語Java』はもう既に十分成熟してるよね
  • 一方、他のJVM言語が急速に進化してきてる
  • Polyglot Programmingは今に始まった新しい概念じゃないよ
  • デモに使った言語をダウンロードして使ってみて!きっと気に入るやつがあるよ

*1:Andresの資料中では、以前のproposal記法だった #(int a, int b)(a + b) などが紹介されてました。