LoginSignup
5
3

More than 5 years have passed since last update.

「Scalaスケーラブルプログラミング」まとめ ~ 1章 ~

Last updated at Posted at 2017-10-31

この記事は?

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

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

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

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

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

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

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

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

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

Scalaは関数型言語である

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

  1. 関数を一人前の値(first class value)として扱うことができる。整数や文字列と同様に関数を他の引数に渡したり、処理結果として返すことができる。
  2. データはイミュータブル(書き換えができない)ものであるべきという発想。メソッドは副作用(side effect)を持ってはならず。参照透明(referentially transparent)1であるべきという発想がある。

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の影響を受けている。


  1. 参照透明とはJavaのStringクラスのreplaceメソッドのように元のデータを書き換えない、他の作用を持たないこと  

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3