6月 13

ハイブリットなプログラミング言語 Scala を少し触ってみました(『7つの言語 7つの世界』第5章)

 『7つの言語 7つの世界』(オーム社)の第5章で紹介されているScalaです。

Scala
http://www.scala-lang.org/

1. 「はじめに」にもならない駄文

 いまさらの紹介で恐縮ですが、『7つの言語 7つの世界』は、1言語に1章を割いて7つの言語を紹介して、いろいろなプログラミング言語のパラダイムに触れてみることを目的とする書籍です。1章はおおよそ3節から4節で構成されており、お察しのとおり、数字が上がるごとに段々難易度が上がっていきます。この第5章のScalaの場合は

5.1 Scalaの概要
5.2 Scalaのオブジェクト指向言語機能について
5.3 Scalaの関数型言語機能について
5.4 並行処理、XML処理
※上は節名ではありません
 
 という構成になっています。5.2のオブジェクト指向言語機能まではまぁなんとか、5.3の関数言語言語では配列の説明を読んでいるかと思っていたけど、もしかして違う場所に迷い込んでしまったかという気分になり、その気分を引きずったままの並行処理の説明でしたので、肝心なところが理解できている気がしないのですが、書けるところまで書いてみます。

2.Scalaのインストール

今回は公式サイトからではなく、以下を参考にHomebrewでインストールしました。
Mac OS X 開発環境構築手順:Scalaインストール – Shinya’s Daily Report

3. Scalaについて

 Scalaはオブジェクト指向型言語と関数型言語の2つのパラダイムが融合したハイブリット型のプログラミング言語で、JVM上で動作し、Javaのライブラリが使用できるなど、Javaとの親和性が重視されています。変数も変更可能は(mutable)な変数と変更できない(immutable)な変数、どちらでも定義できるようになっています。Javaのような書き方もできるし、関数型言語的な書き方も可能になっているなど、少しずつ関数型言語のパラダイムに移行するということも可能です。

 Scalaは以下の3通りの実行方法が用意されています。

  1. Rubyにおけるirbのような対話形式
  2. インタプリタによる実行
  3. コンパイルして実行

 というわけで、私は基本的に1の対話形式でいろいろと試してみました。

4. Hello,World

 ”scala”とコマンドを打つとScalaのシェルが起動します。

$ scala
Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_31).
Type in expressions to have them evaluated.
Type :help for more information.

scala>

 というわけで、まずはHello,World。

scala> println("Hello,World!!")
Hello,World!!

 まずは数値と文字列の扱いから。 

scala> 1+1
res5: Int = 2

scala> "1"+"1"
res6: java.lang.String = 11

scala> 1+"1"
res7: String = 11

このあたりはRubyと同じですかね。

4. オブジェクト指向言語機能

 
  Javaを知らないのでRuby学習者からの見た意見ですが、この書籍を読む限りはオブジェクト指向型言語に触れたことがある方なら、ここはさほどむずかしくはないのではないかと。私の場合は静的な型付けに慣れていないのでそこで戸惑うところですが、それでもまぁなんとか。ということで、ここはさらりと飛ばします。
 1点、おもしろいと感じたのは、Nothingというクラスの存在ですべてのクラスのサブクラスだそうです(Scalaのルートのクラス階層はAnyだそう)。Javaにもあるのかしら?

5. 関数型機能

5.1 変数

 関数型言語は「副作用がない」といわれるように、同じ入力に対しては常に同じ値が返ってくる、他に影響を及びさないということが大きな特徴になっています。一度代入した変数の変更を認めないというものそれ故の特徴とされているようですが、Scalaは変更不能な変数もオブジェクト指向言語のような変更可能な変数もどちらも定義することが可能になっています。

変更可能な(mutable)変数を定義するときは var で定義する。

scala> var a = 1
a: Int = 1

scala> a = 2
a: Int = 2

変更不能な(immutable)変数を定義するときは valで定義する。一度定義したら変更はできない。

scala> val b = 1
b: Int = 1

scala> b = 2
<console>:8: error: reassignment to val
       b = 2
         ^

5.2 リスト・セット・マップ

リスト・・・、配列とどう違うのだろうと思いながら触っていました。

scala> List(1,2,3)
res0: List[Int] = List(1, 2, 3)

scala> List("a","b","c")
res1: List[java.lang.String] = List(a, b, c)

scala> List(1,2,"c")
res2: List[Any] = List(1, 2, c)

 正直、よくわかりません・・・・。この書籍にはリストを操作する関数も紹介されていましたが、ここでは省略。

  リストは順番が重要な意味を持っていますが、特に順番が意味をもたない「セット」というコレクションもあります。順番が意味をもたないというとキーと値をセットにしたハッシュを思い出しますが、それはそれでScalaにもありまして、後述する「マップ」というものがそれに該当します。

scala> Set("Taro","Jiro","Hanako")
res4: scala.collection.immutable.Set[java.lang.String] = Set(Taro, Jiro, Hanako)

 
 セットはキーを持たない、順番が意味を持たないコレクションということで、配列とハッシュの中間に位置するようなものなのでしょうか。でも、1つ1つの要素をどうやって取り出すのだろう?

 Rubyでいうハッシュに当たるのがマップです。Map関数を使用して定義しましたが、HashMap関数を使えば、キーと値の型も指定できるみたいですね。

scala> Map("Taro" -> "painting","Jiro" -> "photo","Hanako" -> "zen")
res5: scala.collection.immutable.Map[java.lang.String,java.lang.String] = Map(Taro -> painting, Jiro -> photo, Hanako -> zen)

6. 並行処理

  並行性を理解するのが、Scala学習最大の肝ではないかということは感じたのですが、あまりここで書くほど理解にいたらず。というわけで、今回はパスします。ここは後日ぜひやり直したいところですね。