Scala Scalaのロゴ |
パラダイム | オブジェクト指向言語、関数型言語 |
---|
登場時期 | 2003年 (2003) |
---|
設計者 | Martin Odersky |
---|
開発者 | LAMP/EPFL, Scala Center |
---|
最新リリース | 3.5.0 / 2024年8月22日[1] |
---|
型付け | 強い静的型付け |
---|
主な処理系 | Scala |
---|
影響を受けた言語 | Java,Haskell,Standard ML,OCaml,Smalltalk,Erlang |
---|
影響を与えた言語 | Java,Chisel,F#,Kotlin,Flix |
---|
プラットフォーム | Linux,Windows,Mac,JVM,JavaScript,Android |
---|
ライセンス | Apache 2.0[2] |
---|
ウェブサイト | The Scala Programming Language |
---|
拡張子 | .scala |
---|
テンプレートを表示 |
Scala(スカラ、SKAH-lah[3])はオブジェクト指向言語と関数型言語の特徴を統合したマルチパラダイムのプログラミング言語である。名前の「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がリリースされ、多くの機能が追加された。[7]
また、現在も活発に開発が続けられている。
主に以下のような特徴がある。
- 開発生産性を高める簡潔な表記が可能である。
- Javaの豊富なライブラリが使える(Scala.jsの場合、JavaScriptのライブラリが使える)。
- 全てがオブジェクトとして扱われるオブジェクト指向言語である。
- 静的型付けを行う関数型言語である。静的型付けのため、コンパイル時点でのエラー(特に型関連の)検出が得意である。
- 型(クラス)をJavaなどと比べてより容易に作ることができ、また、型を使った条件分岐をはじめとして、型に関する機能が豊富なため、メソッドやフィールドを束ねるだけのクラスではなく、型に積極的な意味を持たせてのプログラミングが可能である。
- 型推論をサポートし、多くの場面で型を自動的に補ってくれる。
- 純粋関数型言語的な、val(定数)と不変List, Set, Mapという組み合わせでもプログラミングできるし、より手続き型的なvar(変数)と可変List, Set, Mapという組み合わせでもプログラミングができる。
- 関数もオブジェクトとして利用可能であり、カリー化が可能。
- パターンマッチを利用可能であり、任意のクラスをグループ化してパターンマッチで判定させることが可能(caseクラス)。
- implicit def と言う宣言を用いて、既存のクラスを拡張したような記述が可能。
- traitクラスを用いた、Mix-in機能を持つ。
- クロージャをサポートする。
- XMLを直接プログラム内部に記述可能。
- 遅延評価のある関数型言語であるため、無限リストを扱え、標準ライブラリにそのためのクラスが提供されている。
- 構文解析のための、パーサーコンビネータ(英語版)が2.12まで標準ライブラリに入っていた。2.13以降は外部ライブラリとなった。
- 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'という文字が存在するか判定する」という例を挙げる。
手続き型言語的なコードを書くと以下のようになる。
defhasLowerCaseA(s:String):Boolean={for(i<-0untils.length){if(s(i)=='a')returntrue}returnfalse}
上のコードは、添え字を使わずに、次のように書くことができる。
defhasLowerCaseA(s:String):Boolean={for(c<-s){if(c=='a')returntrue}returnfalse}
上のコードは、トレイトscala.collection.Traversable
を使って、次のように書くことができる。
defhasLowerCaseA(s:String)=s.exists(_=='a')
典型的な関数型言語では再帰をよく使う。再帰に置き換えると以下のようになる。
defhasLowerCaseA(s:String,i:Int=0):Boolean={if(i==s.length)returnfalseif(s(i)=='a')returntruereturnhasLowerCaseA(s,i+1)}
Scalaの部分関数 (partial function) は数学における同名の概念をもとにして生まれた機能である。具体的には、定義域が制限された関数に相当する。以下は [-1, +1] の範囲で2乗を計算する部分関数の例である。
valmyPartialSquare:PartialFunction[Double,Double]={casexif-1<=x&&x<=1=>x*x}println(myPartialSquare(-0.5))// 0.25println(myPartialSquare(0.9))// 0.81println(myPartialSquare.isDefinedAt(1))// trueprintln(myPartialSquare.isDefinedAt(-10))// falseprintln(myPartialSquare(1.1))// MatchError
Martin Oderskyによると、Scala開発の動機は2つの仮説による。
- 汎用言語はスケーラブルでなくてはならない。同じ概念で、小さいプログラムも大きなプログラムも記述できるべきである。
- スケーラビリティは関数型言語とオブジェクト指向言語の2つのプログラミングの概念を統合し、一般化することにより実現できる。
TwitterがバックエンドをRubyからScalaに2009年に移行した[8]のを初め、大型のソフトウェアでの利用例がいくつか存在する。
以下の統合開発環境が Scala をサポートしている。括弧内の数字は 2019 Scala Developer Survey での複数回答ありでの利用している人の割合[12]。
Scala をベースにしたプログラミング環境としてKojo がある。
Apache Maven やGradle などの Java 汎用のビルドツールも利用可能だが、Scala 向けのビルドツールとして以下の物がある。括弧内の数字は 2019 Scala Developer Survey での複数回答ありでの利用している人の割合[12]。
Scala 用の主なWebアプリケーションフレームワークとして以下の物がある。
以下の4種がサポートされている。[13]
- Scala Next: Scala 3の通常版。
- Scala LTS: Scala 3の長期サポート版。2年以上の間隔でリリースされ、次の長期サポート版がリリースされても1年間は保守される。Scala 3のライブラリ作者はこのバージョンを相手にビルドすることが推奨されている。過去にリリースされたのは2023年5月30日にリリースされたScala 3.3[14]。
- Scala 2.13: サポート終了予定なし。Scala 2.13のリリース日は2019年6月11日[15]。
- Scala 2.12:sbt 1が利用していて、sbt 1が使い続ける限りサポート終了予定なし。Scala 2.12のリリース日は2016年11月3日[16]。
Scala 2.11以前のサポートは終了している。Scala 4のリリース予定はない。
|
---|
プラットフォーム | | |
---|
オラクルのテクノロジー | |
---|
プラットフォーム技術 | |
---|
主なサードパーティ技術 | |
---|
歴史 | |
---|
主要なJVM言語 | |
---|
コミュニティ | |
---|
|
|
---|
低水準言語 | |
---|
高水準言語 | 1950年代 | |
---|
1960年代 | |
---|
1970年代 | |
---|
1980年代 | |
---|
1990年代 | |
---|
2000年代 | |
---|
2010年代 | |
---|
|
---|
架空の言語 | |
---|
|