Scala
パラダイム | オブジェクト指向言語、関数型言語 |
---|---|
登場時期 | 2003年 |
設計者 | Martin Odersky |
開発者 | LAMP/EPFL |
最新リリース | 2.13.5/ 2021年2月22日[1] |
型付け | 強い静的型付け |
主な処理系 | Scala |
影響を受けた言語 | Java, Haskell, Standard ML, OCaml, Smalltalk, Erlang |
影響を与えた言語 | Java, Kotlin |
プラットフォーム | Javaプラットフォーム |
ライセンス | Apache 2.0[2] |
ウェブサイト | The Scala Programming Language |
拡張子 | .scala |
Scala(スカラ、SKAH-lah[3])はオブジェクト指向言語と関数型言語の特徴を統合したマルチパラダイムのプログラミング言語である。名前の「Scala」は英語の「scalable language」に由来するものである。
プラットフォーム
主にJavaプラットフォーム(Java仮想マシン)上で動作し、既存のJavaのプログラムと容易に連携させることができる。
対応プラットフォーム
- Scala - Javaプラットフォーム
- Scala.js[4] - Scala から JavaScript へとトランスパイルする。
- Scala Native[5] - LLVM を使用し、マシンネイティブの実行ファイルを出力
また、過去には下記のプラットフォームもサポートしていたが、現在は開発が中断している。
歴史
Scalaは2001年にスイス・ローザンヌにあるスイス連邦工科大学 (EPFL) 教授のマーティン・オーダスキーによって設計された。マーティン・オーダスキーはFunnelという、関数型プログラミングとペトリネットとを合わせたプログラミング言語の開発に携わっていた。オーダスキーは過去にGeneral Javaとjavacの開発に携わった事があった。
Scalaは2003年の暮れに内部で公開された後、2004年の始めにJavaのプラットフォームにリリースされ、2004年の6月に.NETのプラットフォームに公開された。Ver2.0は2006年3月にリリースされたが、.NETのサポートは2012年に中止になった。
特徴
主に以下のような特徴がある。
- 開発生産性を高める簡潔な表記が可能である。
- Javaの豊富なライブラリが使える(Scala.jsの場合、JavaScriptのライブラリが使える)。
- 全てがオブジェクトとして扱われるオブジェクト指向言語である。
- 静的型付けを行う関数型言語である。静的型付けのため、コンパイル時点でのエラー(特に型関連の)検出が得意である。
- 型(クラス)をJavaなどと比べてより容易に作ることができ、また、型を使った条件分岐をはじめとして、型に関する機能が豊富なため、メソッドやフィールドを束ねるだけのクラスではなく、型に積極的な意味を持たせてのプログラミングが可能である。
- 型推論をサポートし、多くの場面で型を自動的に補ってくれる。
- 純粋関数型言語的な、val(定数)と不変List, Set, Mapという組み合わせでもプログラミングできるし、より手続き型的なvar(変数)と可変List, Set, Mapという組み合わせでもプログラミングができる。
- 関数もオブジェクトとして利用可能であり、カリー化が可能。
- パターンマッチを利用可能であり、任意のクラスをグループ化してパターンマッチで判定させることが可能(CASEクラス)。
- implicit def と言う宣言を用いて、既存のクラスを拡張したような記述が可能。
- traitクラスを用いた、Mix-in機能を持つ。
- クロージャをサポートする。
- XMLを直接プログラム内部に記述可能。
- 遅延評価のある関数型言語であるため、無限リストを扱え、標準ライブラリにそのためのクラスが提供されている。
- 構文解析のための、パーサーコンビネータが標準ライブラリに入っている。
例
「文字列の中に'a'という文字が存在するか判定する」という例を挙げる。
手続き型言語的なコードを書くと以下のようになる。
def hasLowerCaseA(s: String): Boolean = {
for (i <- 0 until s.length) {
if (s(i) == 'a') return true
}
return false
}
上のコードは、添え字を使わずに、次のように書くことができる。
def hasLowerCaseA(s: String): Boolean = {
for (c <- s) {
if (c == 'a') return true
}
return false
}
上のコードは、トレイトscala.collection.Traversable
を使って、次のように書くことができる。
def hasLowerCaseA(s: String) = s.exists(_ == 'a')
典型的な関数型言語では再帰をよく使う。再帰に置き換えると以下のようになる。
def hasLowerCaseA(s: String, i: Int = 0): Boolean = {
if (i == s.length) return false
if (s(i) == 'a') return true
return hasLowerCaseA(s, i + 1)
}
部分関数
Scalaの部分関数 (partial function) は数学における同名の概念をもとにして生まれた機能である。具体的には、定義域が制限された関数に相当する。以下は [-1, +1] の範囲で2乗を計算する部分関数の例である。
val myPartialSquare: PartialFunction[Double, Double] = {
case x if -1 <= x && x <= 1 => x * x
}
println(myPartialSquare(-0.5)) // 0.25
println(myPartialSquare(0.9)) // 0.81
println(myPartialSquare.isDefinedAt(1)) // true
println(myPartialSquare.isDefinedAt(-10)) // false
println(myPartialSquare(1.1)) // MatchError
Scala開発の動機
Martin Oderskyによると、Scala開発の動機は2つの仮説による。
- 汎用言語はスケーラブルでなくてはならない。同じ概念で、小さいプログラムも大きなプログラムも記述できるべきである。
- スケーラビリティは関数型言語とオブジェクト指向言語の2つのプログラミングの概念を統合し、一般化することにより実現できる。
利用例
TwitterがバックエンドをRubyからScalaに2009年に移行した[7]のを初め、大型のソフトウェアでの利用例がいくつか存在する。
- FoursquareはScalaとLiftフレームワークを利用している[8]。(LiftはRuby on Rails類似の機能を持つScala上のフレームワーク)
- イギリスの大手新聞ガーディアンは2011年4月ウェブサイトの運用をJavaからScalaに移行すると発表した。
- スイス銀行
- ニコニコ生放送
- Apache Spark
- スタディサプリ
統合開発環境
以下の統合開発環境が Scala をサポートしている。括弧内の数字は 2019 Scala Developer Survey での複数回答ありでの利用している人の割合[9]。
- IntelliJ IDEA (88.6%)
- Visual Studio Code + Metals (26.1%)
- Eclipse (2.7%)
Scala をベースにしたプログラミング環境として Kojo がある。
ビルドツール
Apache Maven や Gradle などの Java 汎用のビルドツールも利用可能だが、Scala 向けのビルドツールとして以下の物がある。括弧内の数字は 2019 Scala Developer Survey での複数回答ありでの利用している人の割合[9]。
- sbt (93.6%)
- Mill (4.1%)
Webアプリケーションフレームワーク
Scala 用の主なWebアプリケーションフレームワークとして以下の物がある。
脚注
- ^ Scala 2.13.5 is now available! | The Scala Programming Language
- ^ scala/LICENSE at 2.13.x · scala/scala
- ^ Scala: Martin Odersky, Scala -- the Simple Parts
- ^ Scala.js
- ^ Scala Native — Scala Native documentation
- ^ A Brief History of Scala
- ^ The Secret Behind Twitter's Growth
- ^ Scala, Lift, and the Future
- ^ a b 2019 Scala Developer Survey