Scala

**Scala**（スカラ、）はオブジェクト指向言語と関数型言語の特徴を統合したマルチパラダイムのプログラミング言語である。名前の「」は英語の「」に由来するものである。

## プラットフォーム
主にJavaプラットフォーム（Java仮想マシン）上で動作し、既存のJavaのプログラムと容易に連携させることができる。

対応プラットフォーム
* Scala - Javaプラットフォーム
* Scala.js - Scala から JavaScript へとトランスパイルする。
* Scala Native - LLVM を使用し、マシンネイティブの実行ファイルを出力

また、過去には下記のプラットフォームもサポートしていたが、現在は開発が中断している。
* .NET Framework
* Java Platform, Micro Edition CLDC

## 歴史
Scalaは2001年にスイス・ローザンヌにあるスイス連邦工科大学 (EPFL) 教授のによって設計された。マーティン・オーダスキーはFunnelという、関数型プログラミングとペトリネットとを合わせたプログラミング言語の開発に携わっていた。オーダスキーは過去にJavaの総称型（ジェネリクス）とjavacの開発に携わった事があった。

Scalaは2003年の暮れに内部で公開された後、2004年の始めにJavaのプラットフォームにリリースされ、2004年の6月に.NETのプラットフォームに公開された。Ver2.0は2006年3月にリリースされたが、.NETのサポートは2012年に中止になった。

2021年5月12日、コードネームdottyと呼ばれていたコンパイラを抜本的に再設計して作られたScala 3がリリースされ、多くの機能が追加された。

また、現在も活発に開発が続けられている。

## 特徴
主に以下のような特徴がある。

* 開発生産性を高める簡潔な表記が可能である。
* Javaの豊富なライブラリが使える（Scala.jsの場合、JavaScriptのライブラリが使える）。
* 全てがオブジェクトとして扱われるオブジェクト指向言語である。
* 静的型付けを行う関数型言語である。静的型付けのため、コンパイル時点でのエラー（特に型関連の）検出が得意である。
* 型（クラス）をJavaなどと比べてより容易に作ることができ、また、型を使った条件分岐をはじめとして、型に関する機能が豊富なため、メソッドやフィールドを束ねるだけのクラスではなく、型に積極的な意味を持たせてのプログラミングが可能である。
* 型推論をサポートし、多くの場面で型を自動的に補ってくれる。
* 純粋関数型言語的な、val（定数）と不変List, Set, Mapという組み合わせでもプログラミングできるし、より手続き型的なvar（変数）と可変List, Set, Mapという組み合わせでもプログラミングができる。
* 関数もオブジェクトとして利用可能であり、カリー化が可能。
* パターンマッチを利用可能であり、任意のクラスをグループ化してパターンマッチで判定させることが可能（caseクラス）。
* implicit def と言う宣言を用いて、既存のクラスを拡張したような記述が可能。
* traitクラスを用いた、Mix-in機能を持つ。
* クロージャをサポートする。
* XMLを直接プログラム内部に記述可能。
* 遅延評価のある関数型言語であるため、無限リストを扱え、標準ライブラリにそのためのクラスが提供されている。
* 構文解析のための、が2.12まで標準ライブラリに入っていた。2.13以降は外部ライブラリとなった。

### Scala 3の新機能
* Pythonと同様のインデント構文をサポート
* 代数的データ型の新しい標準をつくるために再設計されたEnumerations
* Opaque Types. Boxingのオーバーヘッドを起こすことなく抽象化できる新たな値型
* Intersection and union types. [A & B] や [A | B] と表現可能
* Implicitsの文法変更
* Dependent function types.
* Polymorphic function types.
* Type lambdas. 
* Match types. 
* Trait は class のように引数をとれるようになった。
* open classesの概念を導入
* traitsに transparent とマークすることで継承をユーザーに公開しない
* Composition over inheritance.　imports と対称的に、 export clauses はオブジェクトの特定のメンバーへアクセスするためのエイリアスを定義する
* No more NPEs.
* メタプログラミングも大幅に強化された

## 例
「文字列の中に'a'という文字が存在するか判定する」という例を挙げる。

手続き型言語的なコードを書くと以下のようになる。


```scala
def hasLowerCaseA(s: String): Boolean = {
  for (i <- 0 until s.length) {
    if (s(i) == 'a') return true
  }
  return false
}
```


上のコードは、添え字を使わずに、次のように書くことができる。


```scala
def hasLowerCaseA(s: String): Boolean = {
  for (c <- s) {
    if (c == 'a') return true
  }
  return false
}
```


上のコードは、トレイト`scala.collection.Traversable`を使って、次のように書くことができる。


```scala
def hasLowerCaseA(s: String) = s.exists(_ == 'a')
```


典型的な関数型言語では再帰をよく使う。再帰に置き換えると以下のようになる。


```scala
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乗を計算する部分関数の例である。


```scala
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年に移行したのを初め、大型のソフトウェアでの利用例がいくつか存在する。
* FoursquareはScalaとLiftフレームワークを利用している。（LiftはRuby on Rails類似の機能を持つScala上のフレームワーク）
* イギリスの大手新聞ガーディアンは2011年4月ウェブサイトの運用をJavaからScalaに移行すると発表した。
* LinkedIn
* スイス銀行
* ニコニコ生放送
* Apache Spark
* スタディサプリ
* Microsoftの機械学習ライブラリSynapseMLはScalaで開発されており、その開発者は「私たちはScalaが言語の女王だと感じているのでほとんどScalaでしか開発しません」とコメントしている。
* LEGO 

## 統合開発環境
以下の統合開発環境が Scala をサポートしている。括弧内の数字は 2019 Scala Developer Survey での複数回答ありでの利用している人の割合。
* IntelliJ IDEA (88.6%)
* Visual Studio Code + Metals (26.1%)
* Eclipse (2.7%)

Scala をベースにしたプログラミング環境として Kojo がある。

## ビルドツール
Apache Maven や Gradle などの Java 汎用のビルドツールも利用可能だが、Scala 向けのビルドツールとして以下の物がある。括弧内の数字は 2019 Scala Developer Survey での複数回答ありでの利用している人の割合。
* sbt (93.6%)
* Mill (4.1%)

## Webアプリケーションフレームワーク
Scala 用の主なWebアプリケーションフレームワークとして以下の物がある。
* Play Framework
* Lift
* Scalatra

## サポートバージョン
以下の4種がサポートされている。
# Scala Next: Scala 3の通常版。
# Scala LTS: Scala 3の長期サポート版。2年以上の間隔でリリースされ、次の長期サポート版がリリースされても1年間は保守される。Scala 3のライブラリ作者はこのバージョンを相手にビルドすることが推奨されている。過去にリリースされたのは2023年5月30日にリリースされたScala 3.3。
# Scala 2.13: サポート終了予定なし。Scala 2.13のリリース日は2019年6月11日。
# Scala 2.12: sbt 1が利用していて、sbt 1が使い続ける限りサポート終了予定なし。Scala 2.12のリリース日は2016年11月3日。
Scala 2.11以前のサポートは終了している。Scala 4のリリース予定はない。

## 脚注

## 関連項目
* Java
* Groovy
* Kotlin

## 外部リンク
* 
* Scala 3
* Scala Documentation 日本語版
* A Scala Tutorial for Java Programmer の和訳 - オフィシャルチュートリアルの和訳
* 日本Scalaユーザーズグループ (ScalaJP)