BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Xtend、Javaをエクステンドする

Xtend、Javaをエクステンドする

ブックマーク

原文(投稿日:2012/06/27)へのリンク

Eclipse Junoのリリースとともに、Eclipse FoundationはXtendのリリースを高らかに発表した。これはラムダを備えたJava互換の言語で、Javaランタイムに完全な互換性をもつ。XtendはXtextというDSLライブラリおよびエディタ生成のためのプラグインスイートをベースにしている。

ScalaやCeylon、Kotlinと違って、Xtendは独自のバイトコードコンパイラを必要としていない。その代わり、XtendのソースファイルはJavaのソースファイルに変換され、それから通常のJavaコンパイラでコンパイルされる。その結果、Xtendは、標準的なJavaプロジェクトで使えるJavaを生成する、開発時の変換ツールとして利用したり、コンパイル時にJavaソースファイルを生成するのに使うソースモデルとして利用することができる。

Xtendをコンパイルするには2つの方法がある。ひとつはEclipseビルダ経由(MavenプロジェクトがEclipseに組込まれているのと同じ方法)、もうひとつはヘッドレスビルドで使えるMavenプラグインとしてだ。生成されたソースをチェックインするかどうかは、個人の好みと実用性の問題だろう。まだScalaに投資していない組織なら、このXtendのアプローチを、インクリメンタルな移行が可能な、すっきりしたアプローチだと思うかもしれない。

Xtendにはいくつかの機能ライブラリと既存クラスの拡張メソッドも含まれている。暗黙の変換によって別の型のオブジェクトをラップするScalaとは違って、Xtendはコンパイル時の変換を使って、ターゲットを最初の引数として取るスタティックメソッドを呼び出している。これはJavaのCollections.sort()メソッドとよく似ている。しかしJavaと違って、コードはlist.sort()として実行でき、Collections.sort(list)に変換される。extension/defenderメソッドはJava 8で利用可能になる(既存のインターフェイスを実装したクラスに新しいメソッドを追加できる)が、Xtendを使うと現在のJavaランタイムにある既存のインターフェイスや既存のクラスにメソッドを追加できる。

最後に、Xtendは型ガード付きの拡張switch文(Scalaのmatch文ほど強力ではないが、同様の振舞いをする)と、コンパイル型の代わりにランタイム型に基づいた適切なメソッドの動的ディスパッチも追加している。

 

InfoQでは、Xtendの作者であるSven Efftinge氏にコンタクトして、プロジェクトとその開発について詳しく話を聞いた。話はまず、なぜXtendが作られたのか、から始まった。

Sven Efftinge氏: Javaにはすぐれた特性がいくつもあります。非常に素晴しいツールがあり、高品質なオープンソースソフトウェアが非常にたくさんあります。ところが残念なことに、Javaの柔軟性に欠ける構文とその儀式的なスタイルがそうした利点を損っています。ScalaやClojureのような新しい世界へとスイッチする人までいます。

私がやりたかったのは、Javaの決まり文句をすべて読み書きしなくても、Javaの世界に留まれるようにすることです。私が望んだのは、PythonやRubyと同等の表現力がありながら、JavaのようなIDEサポートがあり互換性問題のないJavaでした。この言語は、Javaの構文とコンセプトをできるだけ再利用することで、学習しやすく、既存のJavaプロジェクトと混ぜても問題を起こさないようにしなくてはなりません。XtendはJavaアプリケーションを読みやすく表現力高く書けるようにすることを目的としています。JavaにとってのCoffeeScriptだと考えてください。

InfoQ: XtendをGroovyやScalaと比べるとどうですか?

Sven Efftinge氏: Groovyも同じような目標で設計されていますが、残念ながら、近道をとりました。IDEサポートが限られること以外にも、静的型付けがないことはJavaの互換性に大きな影響を与えています。たとえば、Groovyでオーバーロードされたメソッドは、Javaと違ったやり方で解決されます。これには驚くかもしれません。複雑なメタオブジェクトプロトコルは理解するのもデバッグするのも非常に難しく、またGroovyのランタイムのパフォーマンス低下の大きな理由のひとつでもあります。.

Xtendを使うと、静的型付けやパフォーマンス、ツールのサポートを引き換えにすることなく、builder APIや内部DSLなどの表現力あるライブラリを構築できます。

Scalaはそれ自身で巨大なライブラリやフレームワークを備えたひとつのエコシステムです。私はScalaの大部分を気に入っていますが、型システムはちょっとやりすぎじゃないかと思っています。Xtendは間違いなくScalaから影響を受けていますが、Javaの互換性とIDEサポートにもっと注力しています。

InfoQ: IDEの外でXtendプログラムを作れますか?

Sven Efftinge氏: もちろんです。コンパイラはEclipseとは完全に独立しており、どんなJavaプロセスであっても動かせます。Mavenプラグインも利用できます。

InfoQ: バージョン間など、後方互換性はどうですか?

Sven Efftinge氏: 一般的に、APIの互換性がなくなるのは、メジャーバージョンが上がるときだけです。公開されたAPIは、ほかのすべてのバージョンで後方互換性を保つようメンテされます。一部@Betaアノテーションが使われているAPIもあります。これはまだ最終ではなく、注意して使う必要があることを意味しています。

InfoQ: Xtend固有のライブラリやフレームワークを作る計画はありますか? それとも、こうしたことは既存のJavaライブラリを通してやるのですか?

Sven Efftinge氏: Xtendは既存のJavaイディオムと極めて良好に動作するよう設計されています。したがって、そうした時間の大部分は、既存のJava APIに特別なXtendの糊付けをする必要はあまりありません。プロジェクト内では必須のライブラリに注力しており、java.lang.Stringjava.util.Collection APIのような標準のJava型に拡張を追加しています。

コミュニティには、Java FXやAndroidのようなフレームワークに向けた小さな拡張ライブラリに取り組み始めている人たちもいます。今後そういったものをたくさん目にすることを期待しています。

InfoQ: ほかにXtendを使っているEclipseプロジェクトはありますか?

Sven Efftinge氏: Xtextのコードの多くはXtendで実装されています。EMFの新規部分の一部でも使っているようです。また新しいクールなCode Recommendersプロジェクトでも、ユニットテストを書くのにXtendを使っています。テストを書くことから始めるのはよい考えですね。

InfoQ: Xtendを使うのにOSGiを使う必要はありますか?

Sven Efftinge氏: いいえ、Xtendは非常に薄いライブラリ以外、ランタイム依存性はまったくありません。もちろん、ほかのJavaツールを使えるのと同様にOSGiを使えますが、そうする必要はありません。

InfoQ: Xtendは以前のEclipseランタイムと互換性がありますか?

Sven Efftinge氏: プラグインはEclipse 3.6 - 4.2で動きます。コンパイラはまったくEclipseに依存していません。

InfoQ: ScalaやGroovyと比べて、Xtendのパフォーマンスはどうですか?

Sven Efftinge氏: XtendはランタイムのオーバーヘッドなしにJavaコードに変換します。ランタイムパフォーマンスはJava相当です。もちろん、どんな言語でもそうですが、パフォーマンスはあなたの書いたコード次第です。

InfoQ: 裏で起こるオートボクシングや型変換といったものはありますか?

Sven Efftinge氏: XtendはJavaと同じプリミティブとラッパー型をサポートしており、オートボクシングもJavaで起こるのとまったく同じように起こります。

型システムに大きな変更はありません。これは驚きを避けるのと、Javaとの100%互換を保証するためです。

InfoQ: "it"のよいところは何ですか? それがコードにあることで、どんな効果があるのですか?

Sven Efftinge氏: 'it'と名付けられた変数は、私たちがJavaで知っている'this'と同様、暗黙な変数です。'it'のメソッドを呼び出すときに明示的にレシーバーを書く必要はありません。

どんなローカル変数やパラメータも'it'になれますが、変数が自動的に設定されるのは、ある特定の状況のときです。

 

もっとも役立つ例は、ラムダ式の短縮構文です。Xtendでは単にこう書けます。

myFriends.sortBy[ lastName ]

単純に比較すると、Java 8では次のように書く必要があるでしょう。

myFriends.sortBy( it -> it.getLastName() )

 

InfoQ: Xtendプログラムをデバッグできますか?

Sven Efftinge氏: はい、デバッガはJavaデバッガに統合されており、JavaのソースとXtendのソースの両方を含んだコードをシームレスにデバッグできます。Xtendのデバッグや生成されたJavaコードのデバッグを、同一セッション内で切り替えることもできます。

さらに詳しい情報はXtendのホームページから入手できる。そこには構文の説明やXtendがもたらす新機能の紹介がある。

Xtendについて、あなたはどう思いますか?

 

この記事に星をつける

おすすめ度
スタイル

BT