「Scalaスケーラブルプログラミング」で気になったところまとめ ~ 1章 ~

この記事は?

Scalaスケーラブルプログラミング第3版

Scalaスケーラブルプログラミング第3版

Scalaスケーラブルプログラミング」を読んで、個人的に気になった箇所や勉強になった箇所、逆によくわからなかった箇所のまとめです。 認識誤りなどがあればご指摘いただけると幸いです。

第1章 スケーラブルな言語

Scalaプログラマーが修正・拡張できるように設計されている

組み込み型(Scalaの中核機能として組み込まれている型)になくても、新しい型を作ることも可能。

型同様にScalaでは新しい制御構造も作ることができる

Scala APIのAkkaのreceiveブロックやメッセージ送信(!)はScalaの組み込み演算ではない。

Scalaオブジェクト指向言語である

Scalaは純粋なオブジェクト指向言語である。例えばScala1 + 2はIntクラスの+と言うメソッドを呼び出している。

Scalaにはトレイト(traits)というものがある。トレイトはJavaで言うインタフェースのようなものだが、Javaのインターフェースと違い、メソッドの実装やフィールドを持つことができる。 またクラスにトレイトのメンバーを追加することでミックスイン合成(mixin composition)というテクニックを使うこともできる。

Scala関数型言語である

関数型言語には2つの特徴的な発想がある。

  1. 関数を一人前の値(first class value)として扱うことができる。整数や文字列と同様に関数を他の引数に渡したり、処理結果として返すことができる。
  2. データはイミュータブル(書き換えができない)ものであるべきという発想。メソッドは副作用(side effect)を持ってはならず。参照透明(referentially transparent)((参照透明とはJavaのStringクラスのreplaceメソッドのように元のデータを書き換えない、他の作用を持たないことをいう))であるべきという発想がある。
Scalaを選ぶべき理由
  • 互換性
  • 簡潔さ
  • 高水準の抽象
  • 高度な静的型付け
互換性

ScalaJavaとの相互運用を実現するように設計されている。 ScalaプログラムはコンパイルするとJava仮想マシンバイトコードになる。

簡潔性

極端にいうとScalaのコード量はJavaの10分の1程度に短縮できる。 その理由は2つあり、1つはJavaのように必ず書かなければいけないコードが少ないこと。もう1つはScalaには型推論があり、型情報を反復する必要がないから。という理由があげられる。

高水準の抽象

Javaではループ処理を使った冗長なコードでしか実現できないことをScalaでは述語関数などを用いて簡潔にすることができる。 例えば文字列に大文字が含まれているかを調べる処理はScalaJavaで以下の違いがある。

// これはScala
val nameHasUpperCase = name.exists(_.isUpper)
// これはJava
boolean nameHasUpperCase = 
     name.chars().anyMatch(
         (int ch) -> Character.isUpperCase((char) ch)
);
高度な静的型付け

ScalaにはJavaのような静的型システムを持ちつつ、静的言語によくある冗長性を型推論により取り除き、柔軟性のなさをパターンマッチングと型を記述したり合成できる方法で回避している。

Scalaのルーツ

Scalaは多くのプログラミング言語の影響を受けている。 表面的にはJavaC#の構文を採用しているが、オブジェクトモデルはSmalltalk, Rubyから、関数型プログラミングはSML, OCaml, F#に近い。 またアクターベースの並行処理ライブラリであるAkkaはErlangの影響を受けている。