Dpttyは,Scalaの新しいツーリングのテクノロジ開発と,将来バージョンの新コンセプトの試行を目的としたプラットフォームである。そのDottyが先日,ブートストラップ段階に到達した。これはコンパイラがDottyで記述されて,自分自身でコンパイル可能になったという意味だ。これによって,コンパイラの更新が簡単にできるようになる。
Dottyは2014年初めにMartin Odersky氏(@odersky)が,Scalaに関する新アイデアを後方互換性の制約なしで試すプラットフォームを提供する,という目標を掲げて発表したものだ。Odersky氏によると,Dottyには,XMLリテラルなど言語機能の一部として重要ではないと思われる部分の削除と,より基本的なコンストラクタセットの導入によるScalaの型システムの簡略化を試す目的がある。また,Dottyの将来的な目標のひとつとしてOdersky氏がStack Overflowで返答したのは,完全なチューリング(Turing)を目指すのを止めて,型システムを簡略化することだ。それには構造型の型メンバのような機能を削除する必要がある。
Dotty言語のロードマップには,次のような新機能があげられている。
-
ユニオン(Union)およびインターセクション(Intersection)型。それぞれ
|
と&
で記述される。インターセクション型はScala 2の提供するwith
型に類似しているが,順序付けはされない。従ってA & B
とB & A
は等価になる。def foo(arg: Serializable & Comparable): Unit trait A { type T = Int } trait B { type T = Double } (A with B) # T == Int (A & B) # T == Int & Double
もうひとつのユニオン型は,Scalaには同等機能がないものだ。
class A(x: Int) class B(x: Int) class C(x: Array[Int]) object Test{ def foo(x: A | B): Int = x.x def bar(x: A | C): Int | Array[Int] = x.x }
ユニオン型は列挙型(Enumeration)内部でも使用することができる。
-
リテラルベースのシングルトン型。次のような記述が可能になる。
object Literals{ val fortyTwo: 42 = 42 val `2`: 2 = 2 val fortyFour: 44 = fortyTwo + `2` val text: "text" = "text" def id[T](a: T) = a val two: 2 = id(`2`) }
その他のDottyに実装済みの機能としては,名前付きの反復パラメータ,トレイト(trait)パラメータ,lazy val初期化遅延の改善などがある。
ツーリングの面では,構文木を保存する交換フォーマットのTASTYをサポートする。TASTYの基本的なアイデアは,Dottyと同じくScalaメタプログラミング改善を目標とする,Eugene Burmako氏(@xeno_by)のチームによるフレンドプロジェクトのScala.metaのものだ。
Dottyではパフォーマンスを重視し,コンパイル速度を考慮した開発が行われている。主要なコントリビュータのひとりであるDmitry Petrashko氏(@DarkDimius)はInfoQに対して,“ハンドチューニングは行っていませんが,dotcはすでにscalacと同等です”と述べている。
もうひとつのフレンドプロジェクトであるLinkerは,コンパイルされたコードのパフォーマンスに関するものだ。 Petrashko氏の目標である“メンテナンスが容易なコードを書く”ことの実現に寄与する一方で,意味認識(semantic-aware)オプティマイザによる最適化処理が今後の開発課題として残っている。
InfoQはPetrashko氏に,このプロジェクトについて詳しい話を聞いた。
Dootyがブートストラップを達成したことの重要性を説明して頂けますか?言語が発展する上で,これにはどのような意味があるのでしょう?
DottyはScalaの新機能を試すためのプラットフォームで,その中心となるのは,scalacから書き直したdotcコンパイラです。新たにクリーンな設計から始めたことによって,新しいアイデアの試行を,より早く繰り返すことができるようになりました。
言語の新機能を実験しようとする場合,前もってコンパイラの信頼性を確認しておく必要があります。コンパイラがブートストラップできるということは,コンパイラが自分自身をコンパイルできて,その結果をオリジナルのコンパイラに代えて使用できるということです。
コンパイラはそれ自体がさまざまな言語機能を駆使した,コンパイルすることの難しい,コードの巨獣のようなものですから,いろいろと不都合な問題が発生します。そのブートストラップに成功したということは,コンパイラが十分に成熟して,言語の新機能を試験するレベルに達したということの証明でもあるのです。
開発中の言語の新機能やツールは,どのようなプロジェクトでテストされているのでしょう?
Martinが先日,標準コレクションライブラリの再設計に関する議論をキックオフしました。最先端の技術を使ったエキサイティングな改良提案が,すでに数多く寄せられています。現在はDottyの新機能が,コレクションの開発や保守にどの程度役に立つのかを試している段階です。
メタプログラミングという意味ではscala.metaがDottyに関わっています。私たちはDottyのコンパイル時のメタプログラミングとツーリング(文法チェック,フォーマット等)のAPIに関して,一貫性と互換性を実現したいと考えています。そのためには,scala.metaによるサポートが必要なのです。
Dotty-Linkerは,高度にジェネリックなScalaコードの最適化を目指したプロジェクトです。 TASTYがエコシステムに存在することで,オンデマンドの特殊化やスマートインライン展開などによるランタイムパフォーマンス向上,あるいはアロケーション削減といった,新たな最適化のチャンスが生まれています。抽象化によるオーバヘッドを気にすることなく,ユーザが関数型形式のコードを記述できるレベルを実現したいと思っています。
次のマイルストンには,どのようなものが定義されているのでしょう?
次のメジャーマイルストンはツール関連が中心となる予定です。
私たちは現在,sbtのコンパイラとして利用可能なdotcの開発に取り組んでいるところです。これによってインクリメンタルなコンパイルが可能になれば,実際の開発現場でも利用しやすくなると思います。
言語の新機能については,それをサポートするIDEが必要です。現時点ではオプションとしての提供を考えています。Scala.metaベースのプレゼンテーションコンパイラAPIを実装して,ENSIMEなどで利用できるようにするのが,一番よい方法だと思っています。ただし,実際にこの通りの方法にするかどうかは,まだ何とも言えませんね。
DottyはGitHubから入手可能である。