Scalaプログラミング入門を読んだ。

Scalaプログラミング入門を読みました。Scalaの存在は5年くらい前から知ってたんですが、TwitterもRubyからScalaに乗り換えたり、最近Scalaが盛り上がっているみたいなので勉強し始めました。

ScalaはJVM上で動作し、Javaの資産が全て使え、オブジェクト指向と関数型をミックスしている言語です。実際にこの本を読んでみて、Javaのダメなところの再確認とScalaの可能性を感じることができました。

なぜ今Scalaなのか?

Javaはプログラム言語として成功を収めています。言語としても枯れているし、いろんなところで使われています。ただ、そのお陰で時代の流れについていけなくなっている面もあります。例えば、テスト駆動開発などアジャイル的な開発手法をとろうとした場合、Javaのコードは冗長すぎて、さくさく作ることができません。これからの開発では動くところまで持っていくというのが特に大事になっていきます。また、冗長なせいで本質となるロジックがわかりにくいという欠点もあります。

また、Javaはオブジェクト指向言語ですが、完璧なオブジェクト指向ではありません。intやcharなどのプリミティブ型が存在していたり、nullがオブジェクト化されていないためにNullPointerExceptionが発生するのも、Javaの欠点と言えます。ハードウェアはマルチコアCPUが当たり前になってきていますが、マルチコアCPUを100%生かすためのスレッドセーフなコード書くのも、Javaは色々と気を遣います。

対してScalaはというと、

  1. 純粋なオブジェクト指向である。(プリミティブ型やnullは存在しない)
  2. JVM上で動くため、Javaと同等のパフォーマンスを実現。しかもJavaの資産は全て使える。
  3. 関数型とオブジェクト指向を融合している。
  4. 拡張性・再利用性が高い。(Scalaの名前の由来はScalable(拡張性)からきているそうです)
  5. アクター理論でマルチコア時代に対応した並行処理を実現。
というスーパーな言語です。

NullPointerExceptionとサヨナラする、Option[T]

Option[T]は指定された型の0個または1個の要素を格納します。Option[T]はSome[T]かNoneのどちらかです。Noneはシングルトンオブジェクトで、nullと同等に扱うことができます。しかし、Noneはオブジェクトであるため、map,flatMap,filter,foreachなどのメソッドが呼び出せます。

冗長な処理を排除する関数

関数についてはまだ十分に理解できていませんが、
  • Listに格納されているオブジェクトを同じルールで処理していく。
  • UNIXのパイプとフィルターのように関数を掛け合わせることで、検索・grep・ソートなどが高速に実現できる。
  • 関数もオブジェクトであるため、引数にして渡したり、関数を合成することができる。
などなど、ちゃんと使いこなせたらコード量をJavaの何分の1にできるんだろう、ってワクワクするような仕組みです。

強力な型推論

Scalaは静的型付け言語ですが、型宣言をかなり省略できます。
例えばJavaの場合、以下のように返り値が明確なメソッドを呼び出しても型宣言が必要ですが、
[java]int i = "string".length();[/java]
Scalaの場合、型推論が強力なため型宣言はしなくても大丈夫です。
[scala]var i = "aaa".length()[/scala]
もちろんあんまりやりすぎると可読性に問題が出てきますが、下記のようなJavaのジェネリクスでの冗長性は排除できます。
[java]List list = new ArrayList>(); Hashmap map = new Hashmap();[/java]

並行処理の申し子、アクター

アクターはスレッドとスタックと使わずにメッセージを直列で処理します。アクターはメッセージの処理をカプセル化しており、状態の変更や把握はメッセージを通じてしか行えません。メッセージは直列で処理されるため、アクターの内部状態に対してロックを行う必要がありません。そのため、アクターは常にスレッドセーフになります。

その他、数々の仕組み。

  • 複数の値を返り値に持たせられる、タプル
  • 実装コードを持てるインターフェースである、トレイト
  • あらゆる型、複数の型で行える、パターンマッチ
などなど。
僕のScalaへの理解が浅いばっかりに、こんなあやふやな説明しか出来ないのが申し訳ないくらいです。Scalaの他にもGroovyなどJavaを意識した次世代プログラム言語がどんどん出てきているので、Javaエンジニアはどんどん勉強していった方がいいですよ!