Xtendとは?

XtendはEclipse Foundationで開発されている新しいプログラミング言語だ。高度な型推論やクロージャなどJavaにはない多くの機能を持っているほか、XtextというDSLを作成するためのフレームワーク/ツールキットをベースに開発されているため、言語だけでなくEclipse上で利用可能な開発環境が提供されているという特徴がある。

図1 : XtendのWebサイト

なお、Xtendはマーケットプレイスからインストールすることができるが、XtendのWebサイトからはEclipseに予めXtendがインストールされたディストリビューションも用意されている。Xtendを手っ取り早く試すのであればこちらを利用するのもいいだろう。

図2 : マーケットプレイスからのインストール

Xtendを使ってみよう

まずはXtendのチュートリアルを見てみよう。新規プロジェクト作成ウィザードからXtendのチュートリアルプロジェクトを作成することができる。

図3 : チュートリアルプロジェクトの作成

図4 : チュートリアルプロジェクトを作成したところ

作成されたプロジェクトにはsrcディレクトリ配下にxtendのソースコード、そしてxtend-genディレクトリにXtendのソースファイルから生成されたJavaソースファイルが格納されている。たとえばチュートリアルプロジェクトの中には以下のようなXtendコードがある。

def String sayHelloTo(String to) {
 return "Hello "+to+"!"
}

このコードから生成されたJavaコードは以下のようになっている。機械的に自動生成されたJavaコードであるため変数名など可読性の面でやや問題はあるものの、確かに実行可能なJavaコードであることがわかる。

public String sayHelloTo(final String to) {
 String _operator_plus = StringExtensions.operator_plus("Hello ", to);
 String _operator_plus_1 = StringExtensions.operator_plus(_operator_plus, "!");
 return _operator_plus_1;
}

このように、Xtendはいわば「Xtextを用いて構築されたJavaコードを生成するためのDSL」とでも呼ぶべき言語だ。また、Xtendコード用のエディタはコードアシストやエラーチェック機能などを備えた非常に高機能なもので、EclipseでのJavaプログラミングに慣れた開発者であればすぐに使いこなすことができるだろう。

チュートリアルにはXtendの様々な機能を理解するためのサンプルコードが含まれているので一通り目を通してみるといいだろう。

Xtendの特徴的な機能

続いて言語としてのXtendの特徴を見てみよう。Xtendでは型推論により、変数やメソッドの戻り値の型などを省略することができる。また、アクセサメソッド経由でのプロパティアクセスもシンプルに記述することができる。

// 変数の型を省略できる
val s = "文字列"

// returnや戻り値の型を省略できる
def hello(String name) {
 "Hello " + name + "!"
}

val p = new Person()
// p.setName("Naoki") と同じ
p.name = "Naoki"
// println(p.getName()) と同じ
println(p.name)

クロージャは以下のように [ 引数 | 処理内容] という形で定義する。また、クロージャはapplyメソッドで呼び出すことができる。

// クロージャの作成と実行
val f = [ String s | "Hello " + s + "!"  ]
f.apply("Naoki")

// 既存のJava APIに渡すオブジェクトもクロージャで記述できる
Collections::sort(persons, [ a, b | a.name.compareTo( b.name ) ])

また、Xtendには既存のクラスにメソッドを追加したように見せる拡張メソッドという機能がある。以下のようにメソッドの第一引数の型のオブジェクトをレシーバとして呼び出すことができる。

// Stringを第一引数に取るメソッドを定義しておくと...
def sayHello(String name) {
 println("Hello " + name "!")
}

// Stringのメソッドとして呼び出すことができる
"Naoki".sayHello()

Xtendにはこの他にも文字列リテラル中にテンプレートを埋め込むことができたり、型や細かい条件を指定可能なswitch文などJavaにはない様々な便利な機能が存在する。

まとめ

Javaベースの次世代言語として近年Scalaが注目を集めているが、言語の機能面ではXtendとScalaには似た部分が多い。ただし、コンセプトは大きく異なり、ScalaはJavaの置き換えも可能な汎用プログラミング言語であるのに対し、XtendはJavaソースを生成するという処理方式を見てもわかる通り、あくまでJavaの補助的なツールとしての利用を想定しているように見受けられる。用途にもよるが、ScalaなどよりもXtendのほうが導入しやすいケースも多いのではないだろうか。