Scala

提供: miniwiki
2018/8/19/ (日) 20:03時点におけるAdmin (トーク | 投稿記録)による版 (1版 をインポートしました)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
移動先:案内検索
Scala
拡張子 .scala
パラダイム オブジェクト指向言語関数型言語
登場時期 2003年 (2003)
設計者 Martin Odersky
開発者 LAMP/EPFL
最新リリース 2.12.6/ 2018年4月28日(6年前) (2018-04-28
型付け 強い静的型付け
主な処理系 Scala
影響を受けた言語 Java, Haskell, Standard ML, OCaml, Smalltalk, Erlang
プラットフォーム Javaプラットフォーム
ライセンス BSDライセンス
ウェブサイト The Scala Programming Language
テンプレートを表示


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

プラットフォーム

ScalaはJavaプラットフォームJava仮想マシン)上で動作し、既存のJavaのプログラムと容易に連携させることができる。また、過去には下記のプラットフォームもサポートしていたが、現在は開発が中断している。

歴史

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

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

特徴

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

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

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

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

 def hasA(s:String):Boolean = {
   for(i <- 0 until s.length) {
     if(s(i) == 'a') return true
   }
   return false
 }

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

 def hasA(s:String):Boolean = {
   for(c <- s) {
     if(c == 'a') return true
   }
   return false
 }

上のコードは、部分関数(Scala)English版を使って、次のように書くことができる。

 def hasA(s:String) = s.exists(_ == 'a')

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

 def hasA(s:String, i:Int = 0):Boolean = {
   if(i == s.length) return false
   if(s(i) == 'a') return true
   return hasA(s, i + 1)
 }

Scala開発の動機

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

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

利用例

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

脚注

関連項目

外部リンク

テンプレート:Java