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、Scala、Clojure(!)の簡単な説明です。
言語の品揃えは最近のトレンドに乗っ取ってはいますがどちらかというと完全に彼の趣味が反映されてますね。
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もScalaもClojureもコンパイルすれば、単なるJavaのクラスファイルなので、Javaプログラムから呼び出せるし、当然反対にJavaプログラムを呼び出すこともできます。
特別なブリッジ機構などは必要ありません。
Demo
Groovyの応用例としてGriffonを使い、その上でScalaのコードとClojureのコードを動かすよ!、というもの。
このセッションのここまでは壮大な前置きであり、実はここがメインだったりして。
「つまり、これは、Griffonの宣伝セッションだったんだよーーーー!!! 」「な、なんだっ(ry」
気づいていそうで気づいていないちょっとだけ気づいている既存のPolyglot Programmingの例
Webアプリ開発だと、↓とか普通に混在して使ってるよね、という話。
- XML
- SQL
- JavaScript
- JSON
- CSS
- Flash/Flex/ActionScript
まとめ
*1:Andresの資料中では、以前のproposal記法だった #(int a, int b)(a + b) などが紹介されてました。