Skip to content
Sohei Yamaga edited this page Jun 4, 2018 · 3 revisions

Scalaに関する論文

Scalaは、大学の研究室発の言語だけあって、数多くの関連論文が執筆されています。それらは、公式サイトの論文の ページ(メニューのAbout Scala -> Language Research -> Papers)から ダウンロードすることができます。ここでは、それらの論文について、どのような事を解説したものなのかについて簡単な紹介を行います。

The Expression Problem in Scala(PDF) Report by T.N. Esben & al., Aarhus University, May 31, 2005.

コンピュータサイエンスに関する有名な問題の一つに、Expression Problemというものがあります。一言で言うと、データ型とデータ型に対する処理の両方について、既存のコードに変更を加えず、型安全性を保ちつつ拡張するにはどうすればいいか、という問題です。

たとえば、GoFのVisitorパターンでは、データ型に対する処理(Visitor)を自由に追加できますが、データ型(Node)を追加するには、既存のコードを変更する必要があります。反対に、Interpreterパターンでは、データ型(Node)を自由に追加できますが、データ型の処理(Nodeのメソッド)を追加するには、既存のコードを変更する必要があります。

Javaなどの言語では、データ型と、データ型に対する処理は、あちらを立てればこちらを立たず状態で、どちらか片方の拡張性を取ると、もう片方の拡張性を捨てることになります。あるいは、型安全性を犠牲にすることになります。このテクニカルレポートでは、そのExpression ProblemをScalaではどのようにして解決できるかを述べています。

ちなみに、Expression Problemをうまく解決できる言語はScalaだけではありません。例えばOCamlでもExpression Problemをうまく解決することができます。

A Core Calculus for Scala Type Checking(PDF) by Vincent Cremet, EPFL, François Garillot, ENS Paris, Sergueï Lenglet, ENS Lyon, and Martin Odersky, EPFL Proceedings of MFCS 06, Stará Lesná, August 2006.

Scalaのサブセットの言語について、形式的な計算モデルを定義し、その上でうまく型チェックができることを示した論文です。型推論規則などを読みなれている方でないと、ちょっとつらいかもしれません。

Capabilities for Uniqueness and Borrowing(PDF) by Philipp Haller and Martin Odersky, EPFL ECOOP 2010, Maribor, Slovenia, June 2010

あるオブジェクトへの参照を他の箇所に受け渡すなどのときに、そのオブジェクトを参照している参照型変数が必ず一つである事(複数の参照型変数から共有されていないこと)を保証する型システムを設計し、Scalaのコンパイラプラグインとして実装したというものです。やはり、型推論規則などのやや難解な記号が出てきますが、コードサンプルを見ればどういう用途を想定しているのかは大体わかると思います。これは、実際にコンパイラプラグインとして公開されているので、実際に動かしてみて、挙動を試してみることもできます。

ちなみに、このようなアプローチの先行者としては、Cleanという言語の一意型というものがあります。

Implementing First-Class Polymorphic Delimited Continuations by a Type-Directed Selective CPS-Transform(PDF) by Tiark Rompf, Ingo Maier and Martin Odersky, EPFL, ICFP 2009, Edinburgh, Scotland, 31st August - 2nd September 2009

Scala 2.8で限定継続が導入されましたが、その型システムと実装に関する論文です。Scalaの限定継続については、コードサンプルなどはしばしば見かけるものの、型システムについては、未だに一般向けのわかりやすい解説がほとんど存在しないので、この論文が半分リファレンスのような状態になっています。