Scala

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

1. プラットフォーム
-----------

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

対応プラットフォーム

Scala - Javaプラットフォーム
Scala.js - Scala から JavaScript へとトランスパイルする。
Scala Native - LLVM を使用し、マシンネイティブの実行ファイルを出力また、過去には下記のプラットフォームもサポートしていたが、現在は開発が中断している。

.NET Framework
Java Platform, Micro Edition CLDC

2. 歴史
-----

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

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

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

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

3. 特徴
-----

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

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

3.1. 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.
メタプログラミングも大幅に強化された

4. 例
----

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

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

def hasLowerCaseA: Boolean = { for  { if  == 'a') return true } return false }

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

def hasLowerCaseA: Boolean = { for  { if  return true } return false }

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

def hasLowerCaseA = s.exists

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

def hasLowerCaseA: Boolean = { if  return false if  == 'a') return true return hasLowerCaseA }

4.1. 部分関数
---------

Scalaの部分関数  は数学における同名の概念をもとにして生まれた機能である。具体的には、定義域が制限された関数に相当する。以下は [-1, +1] の範囲で2乗を計算する部分関数の例である。

val myPartialSquare: PartialFunction[Double, Double] = { case x if -1 <= x && x <= 1 => x * x }

println) // 0.25 println) // 0.81 println) // true println) // false println) // MatchError<WtXmlEndTag />

5. Scala開発の動機
-------------

Martin Oderskyによると、Scala開発の動機は2つの仮説による。

汎用言語はスケーラブルでなくてはならない。同じ概念で、小さいプログラムも大きなプログラムも記述できるべきである。
スケーラビリティは関数型言語とオブジェクト指向言語の2つのプログラミングの概念を統合し、一般化することにより実現できる。

6. 利用例
------

TwitterがバックエンドをRubyからScalaに2009年に移行したのを初め、大型のソフトウェアでの利用例がいくつか存在する。

FoursquareはScalaとLiftフレームワークを利用している。
イギリスの大手新聞ガーディアンは2011年4月ウェブサイトの運用をJavaからScalaに移行すると発表した。
LinkedIn
スイス銀行
ニコニコ生放送
Apache Spark
スタディサプリ
Microsoftの機械学習ライブラリSynapseMLはScalaで開発されており、その開発者は「私たちはScalaが言語の女王だと感じているのでほとんどScalaでしか開発しません」とコメントしている。
LEGO

7. 統合開発環境
---------

以下の統合開発環境が Scala をサポートしている。括弧内の数字は 2019 Scala Developer Survey での複数回答ありでの利用している人の割合。

IntelliJ IDEA 
Visual Studio Code + Metals 
Eclipse Scala をベースにしたプログラミング環境として Kojo がある。

8. ビルドツール
---------

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

sbt 
Mill 

9. Webアプリケーションフレームワーク
---------------------

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

Play Framework
Lift
Scalatra

10. 脚注
------

11. 関連項目
--------

Java
Groovy
Kotlin

12. 外部リンク
---------

[1]
[2]
[3] - オフィシャルチュートリアルの和訳
[4]