M.Hiroi's Home Page
http://www.geocities.jp/m_hiroi/

Scala Programming

[ Home | Java ]

WHAT'S NEW


CONTENTS


お気楽 Scala プログラミング入門

CONTENTS


はじめに

Scala はスイス連邦工科大学 (EPFL) の Martin Odersky 教授によって設計されたプログラミング言語です。Scala はオブジェクト指向言語と関数型言語を統合した言語で、Java プラットフォーム (Java 仮想マシン) 上で動作します。Scala のオブジェクト指向はクラスベースで、継承は「単一継承」のみサポートしています。「多重継承」はサポートされていませんが、そのかわり Trait (トレイト) を使って Ruby のような Mix-in (ミックスイン) が可能です。また、Java と簡単に連携できるので、Java のライブラリ資産を有効に活用することができます。

Scala は強く型づけされた言語で、コンパイル時に静的な型チェックを行うことで、多くのエラーを検出することができます。Scala には SML/NJ, OCaml, Haskell などの関数型言語で有名な「型推論」という機能があるので、型宣言を省略してプログラムを簡潔に記述することができます。もちろん、パターンマッチング、クロージャ、カリー化など、関数型言語でよく使われている便利な機能がサポートされています。

M.Hiroi は Scala でプログラミングするのは初めてです。また、Java にも詳しいわけではないので、いきなり Scala に挑むのは無謀なことなのかもしれません。そこで、最初は M.Hiroi が知っている関数型言語の機能を中心に、簡単なプログラムを作りながら Scala を勉強していきたいと思っております。なにぶん初心者が作るプログラムなので、間違いや Scala の作法に反することがあるかと思います。何かお気づきの点がありましたらご指摘お願いいたします。たいしたことはできませんが、よろしければお付き合いくださいませ。

●ダウンロード

Scala は次のサイトからダウンロードできます。Windows 用のバイナリが用意されているので、とても簡単にインストールすることができます。

なお、Scala を実行するには Java の実行環境が必要です。Oracle 社の Web サイト Java SE - Downloads からダウンロードすることができます。M.Hiroi は Java SE Development Kit 8 (JDK 8) をインストールしました。

●プログラムの実行

Scala はプログラムをコンパイルするコマンド scalac と、コンパイルしたプログラムを実行するコマンド scala があります。これは Java のコマンド javac, java と同じ関係です。また、引数を指定せずにコマンド scala を実行すると、対話モード (REPL : Read-Eval-Print-Loop) で Scala を使用することができます。

C>scala
Welcome to Scala version 2.11.1 (Java HotSpot(TM) Client VM, Java 1.8.0_05).
Type in expressions to have them evaluated.
Type :help for more information.

scala> 1 + 2 * 3;
res0: Int = 7

scala>:quit

C>

REPL で Scala のプログラムを入力して簡単に実行することができます。終了する場合はコマンド :quit (または :q) か CTRL-D を入力してください。

次はお馴染みの Hello, world! を表示するプログラムを作ってみましょう。

リスト : Hello.scala

object Hello {
    def main(args: Array[String]) {
        println("Hello, world!")
    }
}

ファイル名は Hello.scala とします。拡張子は scala です。ファイル名は object の名前 Hello と同じにしてください。 [*1] Scala の場合、ファイル名は object の名前 Hello と同じにする必要はありませんが、ここでは同じ名前にしています。たとえば、test.scala でもかまいません。

-- [修正] (2014/08/09) --------
[*1] Java と Scala を混同していました。修正するとともにお詫び申しあげます。

プログラムのコンパイルは scalac で行います。Windows の場合、コマンドプロンプトで scalac Hello.scala と入力すると、Hello.scala がコンパイルされて Hello.class というファイルが作成されます。ファイル名が test.scala の場合でもコンパイル後に生成されるファイルは Hello.class になります。

C>scalac Hello.scala

C>dir /B Hello.*
Hello.class
Hello.scala

C>scala Hello
Hello, world!

プログラムの実行は scala を使います。コマンドプロンプトで scala Hello と入力します。object Hello のメソッド main が呼び出されて Hello, world! が表示されます。

また、次のように対話モードでプログラムをロードして、実行することもできます。

scala> :load Hello.scala
Loading Hello.scala...
defined object Hello

scala> Hello.main(Array())
Hello, world!

scala>

●簡単なベンチマーク

Scala のプログラムは Java 仮想マシン上で動作するので、JIT (Just in Time) コンパイラなどの技術によりプログラムを高速に実行することができます。その実行速度ですが、たらいまわし関数を使って調べてみました。

リスト:たらいまわし関数 (Scala)

object Tarai {
    def tak(x: Int, y: Int, z: Int): Int = {
        if (x <= y) z
        else tak(tak(x - 1, y, z), tak(y - 1, z, x), tak(z - 1, x, y))
    }

    def main(args: Array[String]) {
        val start = System.currentTimeMillis
        tak(22, 11, 0)
        println((System.currentTimeMillis - start) + "msec")
    }
}
リスト:たらいまわし関数 (Java)

public class Tarai {
  static int tak(int x, int y, int z){
    if(x <= y)
      return z;
    else
      return tak(tak(x - 1, y, z), tak(y - 1, z, x), tak(z - 1, x, y));
  }

  public static void main(String[] args){
    long start = System.currentTimeMillis();
    System.out.println(tak(22, 11, 0));
    long end = System.currentTimeMillis();
    System.out.println((end - start)  + "ms");
  }
}

それでは実行結果を示します。tak(22, 11, 0) を計算しました。使用した Scala のバージョンは 2.11.1 です。比較のため、Java, GCC (C言語), SML/NJ, SBCL (Common Lisp), OCaml (ocamlopt), Haskell (GHC) の実行結果を示します。Java と Scala 以外の処理系はプログラムをネイティブコードにコンパイルするものです。

表 : tak(22, 11, 0) の結果
処理系
SBCL (ver 1.0.55)5.85
SML/NJ (ver 110.74)3.48
GCC -O (ver 4.5.3)2.37
SBCL (最適化)2.01
Go (ver 1.2)1.98
GHC -O (ver 7.4.1)1.92
GCC -O2 (ver 4.5.3)1.89
Scala (ver 2.11.1)1.79
Java (ver 1.8.0_05)1.09
ocamlopt (ver 3.12.1)1.09

Scala は SML/NJ や SBCL よりも速い結果になりましたが、Java と OCaml にはかないませんでした。それでも、GCC や Haskell と同程度の速度をたたき出しているのですから、Scala は大変優れたコンパイラ (処理系) だと思います。それにしても Java は速いですね。今まで Java の速度は計測したことがなかったので、その速さにちょっと驚きました。


Yet Another Scala Problems


参考文献, URL

  1. The Scala Programming Language (本家)
  2. Scala プログラミング入門 (神戸大学, 田村直之先生)
  3. スケーラブルで関数型でオブジェクト指向なScala入門 (@IT, 中村修太さん)
  4. ひしだま's ホームページ, Scalaメモ(Hisidama's Scala Memo) (ひしだまさん)

『お気楽 Scala プログラミング入門』の著作権は筆者「広井誠 (Makoto Hiroi) 」が保持します。無断使用や無断転載は禁止いたします。『お気楽 Scala プログラミング入門』で作成したプログラムはフリーソフトウェアとします。ご自由にお使いください。プログラムの改造や配布もご自由にどうぞ。その際は、出典を明記してくださるようお願いいたします。

ただし、これらのプログラムは無保証であり、使用したことにより生じた損害について、作者「広井誠 (Makoto Hiroi) 」は一切の責任を負いません。また、これらのプログラムを販売することで利益を得るといった商行為は禁止いたします。

Copyright (C) 2014 Makoto Hiroi
All rights reserved.

[ Home | Java ]