Scala
Scala
のロゴ
Screenshot
パラダイム 並行計算関数型プログラミング命令型プログラミングオブジェクト指向プログラミング ウィキデータを編集
登場時期
  • 2004年1月20日 ウィキデータを編集
開発者 マーティン・オーダスキー、スイス連邦工科大学ローザンヌ校 ウィキデータを編集
最新リリース 3.8.4 / 2026年6月5日[1]
型付け 強い静的型付け
主な処理系 Scala
影響を受けた言語 MLJavaErlangHaskellSmalltalkStandard MLOCamlCommon LispEiffelOz、Pizza、Scheme ウィキデータを編集
影響を与えた言語 Java, Chisel, F#, Kotlin, Flix
プラットフォーム Linux, Windows, Mac, JVM, JavaScript, Android
ライセンス Apache-2.0 ウィキデータを編集
ウェブサイト
拡張子 scala、sc ウィキデータを編集
テンプレートを表示

カテゴリ / テンプレート

Scala(スカラ、SKAH-lah[2])はオブジェクト指向言語関数型言語の特徴を統合したマルチパラダイムのプログラミング言語である。名前の「Scala」は英語の「scalable language」に由来するものである。

プラットフォーム

編集

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

対応プラットフォーム

また、過去には下記のプラットフォームもサポートしていたが、現在は開発が中断している。

歴史

編集

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がリリースされ、多くの機能が追加された。[6]

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

特徴

編集

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

  • 開発生産性を高める簡潔な表記が可能である。
  • 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'という文字が存在するか判定する」という例を挙げる。

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

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つの仮説による。

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

利用例

編集

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

統合開発環境

編集

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

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

ビルドツール

編集

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

  • sbt (93.6%)
  • Mill (4.1%)

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

編集

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

サポートバージョン

編集

以下の4種がサポートされている。[12]

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

Scala 2.11以前のサポートは終了している。Scala 4のリリース予定はない。

脚注

編集
  1. ^ 題名: Release 3.8.4, 出典URL: https://github.com/scala/scala3/releases/tag/3.8.4, 閲覧日: 2026年6月6日, 出版日: 2026年6月5日
  2. ^ Scala: Martin Odersky, Scala -- the Simple Parts
  3. ^ Scala.js
  4. ^ Scala Native — Scala Native documentation
  5. ^ A Brief History of Scala
  6. ^ [1]
  7. ^ The Secret Behind Twitter's Growth
  8. ^ Scala, Lift, and the Future
  9. ^ Announces General Availability of SynapseML
  10. ^ Woof, a pure Scala 3 logging library
  11. ^ a b 2019 Scala Developer Survey
  12. ^ Scala development guarantees”. scala-lang.org. 2025年1月3日閲覧。
  13. ^ Scala 3.3.0 released!”. scala-lang.org. 2025年1月3日閲覧。
  14. ^ Scala 2.13.0”. scala-lang.org. 2025年1月3日閲覧。
  15. ^ Scala 2.12.0”. scala-lang.org. 2025年1月3日閲覧。

関連項目

編集

外部リンク

編集

📚 Artikel Terkait di Wikipedia

細胞核

上述したサンティアゴ・ラモン・イ・カハールによって最初に記載された核内構造体(核小体、核スペックル、カハール小体)以外にも核には多くの構造体が含まれており、PIKA(polymorphic interphase karyosomal association)、PMLボディ(PML body)、パラスペックル(英語版)などの構

C++11

Doug Gregor (October 22, 2002) Doc No: N1402 A Proposal to add a Polymorphic Function Object Wrapper to the Standard Library D. Gregor, P. Dimov (April

Linuxにおけるマルウェア

^ herm1t (2008年8月). “Linux.42: Using CRC32B (SSE4.2) instruction in polymorphic decryptor”. 2010年1月17日閲覧。 ^ Ferrie, Peter (2008年9月). “Life, the Universe

フレカイニド

M. Roden et al. (2009-04-01). “Flecainide prevents catecholaminergic polymorphic ventricular tachycardia (CPVT) in mice and humans.”. Nature Medicine

CYP2C19

webの呼び出しエラー:引数 accessdate は必須です。 ^ “Geographical/interracial differences in polymorphic drug oxidation. Current state of knowledge of cytochromes P450 (CYP)

カボチャ属

Populations of Cucurbita pepo (Cucurbitaceae) as Assessed by Random Amplified Polymorphic DNA”. Systematic Botany (American Society of Plant Taxonomists) 27 (1):

ICAM-1

PubMed Reference: ^ Mouse PubMed Reference: ^ “Isolation and mapping of a polymorphic DNA sequence (pMCT108.2) on chromosome 18 [D18S24”]. Nucleic Acids Research

上皮成長因子受容体

Schmidt H, et al. "Length and loss of heterozygosity of an intron 1 polymorphic sequence of egfr is related to cytogenetic alterations and epithelial