Scala(スカラ)は、
オブジェクト指向プログラミングと関数型プログラミングの両方の特徴を兼ね備えた、マルチパラダイムの
プログラミング言語です。その名前は「scalable language(拡張可能な言語)」に由来し、小規模なプログラムから大規模なシステムまで、同じ概念で記述できることを目指しています。
プラットフォーム
Scalaは主に
Javaプラットフォーム(
Java仮想マシン)上で動作し、既存の
Javaプログラムとの連携が容易です。また、Scala.jsを使用すれば
JavaScriptにトランスパイルでき、Scala Nativeを使えば
LLVMを通じてマシンネイティブの実行ファイルも生成可能です。
過去には
.NET [[Framework]]や
Java ME CLDCもサポートされていましたが、現在は開発が中断されています。
- - Javaプラットフォーム
- - Scala.js (JavaScriptへのトランスパイル)
- - Scala Native (マシンネイティブ実行ファイル)
歴史
Scalaは、スイス連邦工科大学ローザンヌ校(EP
FL)のマーティン・オーダスキー教授によって2001年に設計されました。オーダスキー氏は以前、関数型プログラミングとペトリネットを組み合わせた言語「
Funnel」の開発や、
Javaのジェネリクス、javacの開発にも携わっていました。
Scalaは2003年末に内部公開され、2004年初めに
Javaプラットフォーム向けにリリースされました。その後、.NETプラットフォーム向けにもリリースされましたが、.NETサポートは2012年に中止されました。2021年5月には、コンパイラを大幅に再設計したScala 3がリリースされ、多くの新機能が追加されました。
現在も活発に開発が続けられており、その進化は止まりません。
特徴
Scalaには、以下のような特徴があります。
簡潔な記述: 開発生産性を高めるために、簡潔な記法が可能です。
Java/JavaScriptライブラリ: Javaの豊富なライブラリ(Scala.jsの場合は
JavaScriptライブラリ)を利用できます。
オブジェクト指向: すべてがオブジェクトとして扱われます。
静的型付け: コンパイル時にエラー(特に型関連のエラー)を検出しやすいため、堅牢なコードを書くのに役立ちます。
強力な型システム: 型を容易に作成でき、型を使った条件分岐など、型に関する機能が豊富です。
型推論: 多くの場面で型を自動的に補完してくれるため、型宣言の記述量を減らすことができます。
柔軟なプログラミングスタイル: 純粋関数型的なスタイル(`val`と不変コレクション)でも、手続き型的なスタイル(`var`と可変コレクション)でもプログラミングが可能です。
関数オブジェクト: 関数もオブジェクトとして扱え、カリー化が可能です。
パターンマッチ: パターンマッチを利用して、任意のクラスをグループ化し、条件分岐させることができます。
Implicit定義: `implicit def`を使って、既存のクラスを拡張したような記述が可能です。
Mix-in: traitクラスを利用したMix-in機能を持ちます。
クロージャ: クロージャをサポートします。
XMLリテラル: XMLをプログラム内に直接記述できます。
遅延評価: 遅延評価のある関数型言語であるため、無限リストを扱うことができます。
パーサーコンビネータ: 以前は標準ライブラリにありましたが、現在では外部ライブラリとして利用可能です。
Scala 3の新機能
Scala 3では、以下のような新機能が追加されました。
インデント構文: Pythonのようなインデント構文をサポートしました。
再設計されたEnumerations: 代数的データ型の新しい標準を構築しました。
Opaque Types: Boxingのオーバーヘッドなしに抽象化できる新しい値型。
Intersection and Union Types: `[A & B]`や`[A | B]`のように型を組み合わせることが可能。
Implicitsの文法変更: `implicit`の文法が変更されました。
Dependent Function Types: 依存関数型をサポート。
Polymorphic Function Types: 多相関数型をサポート。
Type Lambdas: 型ラムダをサポート。
Match Types: マッチ型をサポート。
Traitの引数: Traitがclassのように引数を取れるようになりました。
Open Classes: クラスをオープンにする概念を導入。
Transparent Traits: traitsに`transparent`とマークすることで継承を制限。
Composition over Inheritance: `export clauses`を使い、オブジェクトのメンバーへのエイリアスを定義。
NPEの解消: NullPointerException(NPE)が発生しないように改善。
メタプログラミング: メタプログラミング機能も大幅に強化。
例
以下に、文字列の中に特定の文字が存在するかを判定する例を示します。
手続き型:
scala
var found = false
var i = 0
while (i < str.length && !found) {
if (str(i) == 'a') {
found = true
}
i += 1
}
添え字を使わない記述:
scala
var found = false
for (c <- str) {
if (c == 'a') {
found = true
}
}
Traversableトレイトの使用:
scala
str.exists(_ == 'a')
再帰:
scala
def hasA(s: String): Boolean = {
if (s.isEmpty) false
else if (s.head == 'a') true
else hasA(s.tail)
}
部分関数:
部分関数は、定義域が制限された関数です。例えば、[-1, +1]の範囲で二乗を計算する部分関数は以下のようになります。
scala
val square: Partial
Function[Double, Double] = {
case x if x >= -1 && x <= 1 => x
x
}
Scala開発の動機
マーティン・オーダスキーによると、Scala開発の動機は以下の2つの仮説に基づいています。
汎用言語のスケーラビリティ: 小規模なプログラムも大規模なプログラムも同じ概念で記述できるべき。
関数型とオブジェクト指向の統合: スケーラビリティは関数型とオブジェクト指向の概念を統合することで実現できる。
利用例
TwitterがバックエンドをRubyからScalaに移行したのを皮切りに、多くの企業でScalaが採用されています。
Twitter: バックエンドの移行
Foursquare: ScalaとLiftフレームワークを使用
ガーディアン: Webサイトの運用を
JavaからScalaに移行
LinkedIn
スイス銀行
ニコニコ生放送
Apache Spark
スタディサプリ
Microsoft SynapseML: 機械学習ライブラリの開発
LEGO
以下の統合開発環境がScalaをサポートしています(2019年の調査に基づく)。
IntelliJ IDEA (88.6%)
Visual Studio Code + Metals (26.1%)
Eclipse (2.7%)
また、Scalaをベースにしたプログラミング環境としてKojoがあります。
ビルドツール
Scala向けのビルドツールとして、以下のものがあります(2019年の調査に基づく)。
sbt (93.6%)
Mill (4.1%)
また、Apache MavenやGradleなどの
Java汎用ビルドツールも利用可能です。
Scala用の主な
Webアプリケーションフレームワークとして、以下があります。
Play Framework
Lift
Scalatra
サポートバージョン
現在、以下の4つのバージョンがサポートされています。
Scala Next: Scala 3の通常版
Scala LTS: Scala 3の長期サポート版(2年以上間隔でリリース、次のLTSリリース後1年間は保守)
Scala 2.13: サポート終了予定なし
Scala 2.12: sbt 1が利用しているため、sbt 1が使い続ける限りサポート終了予定なし
Scala 2.11以前のサポートは終了しており、Scala 4のリリース予定はありません。
関連項目
Java
Groovy
Kotlin
外部リンク
公式ウェブサイト
Scala 3
Scala Documentation 日本語版
A Scala Tutorial for Java Programmer の和訳 - オフィシャルチュートリアルの和訳
*
日本Scalaユーザーズグループ (ScalaJP)