Scala

出典: フリー百科事典『ウィキペディア(Wikipedia)』

Scala
パラダイム オブジェクト指向言語関数型言語
登場時期 2003年
設計者 Martin Odersky
型付け 強い静的型付け
主な処理系 Scala
影響を受けた言語 Java, Haskell, Standard ML, Objective Caml, Smalltalk, Erlang
拡張子 scala
ウェブサイト http://www.scala-lang.org/
  
Scala
開発元 LAMP/EPFL
最新版 2.7.4 / 2009年4月24日
プラットフォーム Javaプラットフォーム
ライセンス BSDライセンス
  

Scala (スカラ、Scalable Language) はオブジェクト指向言語関数型言語の特徴を統合したマルチパラダイムのプログラミング言語である。

目次

[編集] プラットフォーム

ScalaはJavaプラットフォーム(Java仮想マシン)上で動作し、既存のJavaのプログラムと容易に連携させることができる。 メインはJavaプラットフォームであるが、他も.NET Framework、また携帯電話で使われている、Java Platform, Micro Edition Connected Limited Device Configuration の実装もある。Googleが中心になって開発が進められている携帯電話向けプラットフォーム・Androidでの動作も確認されている。

[編集] 特徴

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

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

[編集]

「リストのような構造の物から条件を満たす物を探す」という例を挙げる。より具体的に、「文字列の中から'a'という文字が存在するか判定する」という例を挙げる。

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

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

これを、関数型言語的な再帰に置き換えると以下のようになる。

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

さらに、静的型付け関数型言語であることを最大限生かすと以下のコードになる。

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

_ == 'a'の部分は、 c => c == 'a'の省略記法であり、引数cをとり、 c == 'a'の結果を返すクロージャ(無名関数)である。

[編集] Scala開発の動機

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

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

[編集] 外部リンク