「Scalaスケーラブルプログラミング」で気になったところまとめ ~ 1章 ~
この記事は?
- 作者: Martin Odersky,Lex Spoon,Bill Venners,羽生田栄一,水島宏太,長尾高弘
- 出版社/メーカー: インプレス
- 発売日: 2016/09/20
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
第1章 スケーラブルな言語
Scalaはプログラマーが修正・拡張できるように設計されている
組み込み型(Scalaの中核機能として組み込まれている型)になくても、新しい型を作ることも可能。
型同様にScalaでは新しい制御構造も作ることができる
Scala APIのAkkaのreceive
ブロックやメッセージ送信(!
)はScalaの組み込み演算ではない。
Scalaはオブジェクト指向言語である
Scalaは純粋なオブジェクト指向言語である。例えばScalaの1 + 2
はIntクラスの+
と言うメソッドを呼び出している。
Scalaにはトレイト(traits)というものがある。トレイトはJavaで言うインタフェースのようなものだが、Javaのインターフェースと違い、メソッドの実装やフィールドを持つことができる。 またクラスにトレイトのメンバーを追加することでミックスイン合成(mixin composition)というテクニックを使うこともできる。
Scalaは関数型言語である
関数型言語には2つの特徴的な発想がある。
- 関数を一人前の値(first class value)として扱うことができる。整数や文字列と同様に関数を他の引数に渡したり、処理結果として返すことができる。
- データはイミュータブル(書き換えができない)ものであるべきという発想。メソッドは副作用(side effect)を持ってはならず。参照透明(referentially transparent)((参照透明とはJavaのStringクラスの
replace
メソッドのように元のデータを書き換えない、他の作用を持たないことをいう))であるべきという発想がある。
Scalaを選ぶべき理由
- 互換性
- 簡潔さ
- 高水準の抽象
- 高度な静的型付け
互換性
ScalaはJavaとの相互運用を実現するように設計されている。 ScalaプログラムはコンパイルするとJava仮想マシンバイトコードになる。
簡潔性
極端にいうとScalaのコード量はJavaの10分の1程度に短縮できる。 その理由は2つあり、1つはJavaのように必ず書かなければいけないコードが少ないこと。もう1つはScalaには型推論があり、型情報を反復する必要がないから。という理由があげられる。
高水準の抽象
Javaではループ処理を使った冗長なコードでしか実現できないことをScalaでは述語関数などを用いて簡潔にすることができる。 例えば文字列に大文字が含まれているかを調べる処理はScalaとJavaで以下の違いがある。
// これはScala val nameHasUpperCase = name.exists(_.isUpper)
// これはJava boolean nameHasUpperCase = name.chars().anyMatch( (int ch) -> Character.isUpperCase((char) ch) );
高度な静的型付け
ScalaにはJavaのような静的型システムを持ちつつ、静的言語によくある冗長性を型推論により取り除き、柔軟性のなさをパターンマッチングと型を記述したり合成できる方法で回避している。
Scalaのルーツ
Scalaは多くのプログラミング言語の影響を受けている。 表面的にはJavaやC#の構文を採用しているが、オブジェクトモデルはSmalltalk, Rubyから、関数型プログラミングはSML, OCaml, F#に近い。 またアクターベースの並行処理ライブラリであるAkkaはErlangの影響を受けている。