Scala: オブジェクト指向プログラミングと関数型プログラミングを両立した汎用言語

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

Scala
Scala
Scalaのロゴ
パラダイム オブジェクト指向言語関数型言語
登場時期 2003年 (2003)
設計者 Martin Odersky
開発者 LAMP/EPFL, Scala Center
最新リリース 3.4.0 / 2024年2月29日
型付け 強い静的型付け
主な処理系 Scala
影響を受けた言語 Java, Haskell, Standard ML, OCaml, Smalltalk, Erlang
影響を与えた言語 Java, Chisel, F#, Kotlin, Flix
プラットフォーム Linux, Windows, Mac, JVM, JavaScript, Android
ライセンス Apache 2.0
ウェブサイト The Scala Programming Language
拡張子 .scala
テンプレートを表示

カテゴリ / テンプレート

プラットフォーム

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

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

特徴

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

  • 開発生産性を高める簡潔な表記が可能である。
  • 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年に移行したのを初め、大型のソフトウェアでの利用例がいくつか存在する。

統合開発環境

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

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

ビルドツール

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

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

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

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

脚注

関連項目

外部リンク

Tags:

Scala プラットフォームScala 歴史Scala 特徴Scala 開発の動機Scala 利用例Scala 統合開発環境Scala ビルドツールScala WebアプリケーションフレームワークScala 脚注Scala 関連項目Scala 外部リンクScalaen:Help:Pronunciation respelling keyオブジェクト指向言語プログラミング言語関数型言語

🔥 Trending searches on Wiki 日本語:

槇村香ロシアウエストランド【推しの子】永井佑一郎布施明星麻琴忘却バッテリーからかい上手の高木さん能登半島地震 (2024年)幽☆遊☆白書ぱーてぃーちゃん神武天皇松田悟志酒井菜摘金子勇 (プログラマー)関ヶ原の戦い竹内結子森村誠一チェッカーズジョーイ・メネセス和田誠Milet潘めぐみ白井カイウ田中史朗未来への10カウントマッシュル-MASHLE-花咲舞が黙ってないモーニング娘。桜田ひよりNATURE (音楽グループ)ジュード・ベリンガム舘ひろしハンフリー・ボガート菊地亜美広瀬アリスBLUE MOMENT ブルーモーメントMeta (企業)ツツジ鈴木サチ福原遥黒ずくめの組織飯山陽粗品 (お笑い芸人)花山瑞貴三淵忠彦周期表嵐 (グループ)綱啓永ジェイソン・ステイサム前山田健一芳根京子AFC U23アジアカップ河合優実上田麗奈筧美和子モモ (歌手)松坂慶子ソビエト連邦水原一平鈴木俊一 (衆議院議員)度会隆輝博多華丸参政党柴咲コウ坂本龍馬Vaundy椎名林檎首都圏連続不審死事件一億円拾得事件上地雄輔松原仁ジャックナイフ現象落合博満田中将大オセロ (ボードゲーム)北川景子🡆 More