Scalaプログラミング入門

Table of Contents

1 Scalaの概要

  • Martin Oderskyによる 関数型かつオブジェクト指向プログラミング言語
    • Java 1.1–1.4コンパイラの開発者
    • Pizzaの開発者 (Philip Wadlerと共同)
  • オープンソース
    • 活発に開発が行われている
  • 応用
    • Twitterの分散DBフレームワークGizzardはScalaで記述されている
    • Foursquare, Tumblr, LinkedIn, Amazon, VMware, はてな, ドワンゴなどでも利用されている
    • WebアプリケーションフレームワークとしてPlayなどがある
    • プログラミング言語別年収ランキング 2017年は1位, 2018年は2位
  • 言語の特徴
    • 関数型プログラミング言語とオブジェクト指向プログラミング言語の融合
    • 強力な型推論
    • 高階関数
    • Immutable Collections
    • 並行計算
    • Java言語もJava 8から,関数型プログラミングの特徴が取り入れられている
    • Android用の開発言語KotlinにもScalaと同様の特徴が取り入れられている
  • 処理系の特徴
    • JVM(Java Virtual Machine)へのコンパイラ処理系
    • インタラクティブな実行環境(REPL)も用意されている
    • Javaのクラス・ライブラリをそのまま利用できる

1.1 注意

本Webページの作成には Emacs org-mode を用い, 数式等の表示は MathJax を用いています. IEでは正しく表示されないことがあるため, Firefox, Safari等のWebブラウザでJavaScriptを有効にしてお使いください. また org-info.js を利用しており, 「m」キーをタイプするとinfoモードでの表示になります. 利用できるショートカットは「?」で表示されます.

1.2 News!

Martin Oderskyが EPFLのMOOC でオンラインレクチャーを実施中! こんな機会はめったにない! ぜひ登録して勉強してみよう!

  • Functional Programming Principles in Scala
  • Functional Program Design in Scala

Almond/Binderを使えば,ScalaをWebブラウザ上で勉強できる!

  • https://almond.sh をアクセス
  • "TRY IT ONLINE" をクリックして,しばらく待つ
  • "notebooks" を開く
  • "scala-tour" を開く
  • "tour-of-scala.ipynb" を開く
  • 読み終わったら "Next" をクリック

私も作成しました.「 Scalaでオブジェクト指向 」 の一部を実行できます.

1.3 参考リンク

  • 書籍
    • Martin Odersky 他著: Scalaスケーラブルプログラミング,インプレスジャパン (Amazon)
    • デイビッド・ポラック 著: Scalaプログラミング入門,日経BP社 (Amazon)
    • Dean Wampler, Alex Payne 著: プログラミングScala,オライリー・ジャパン (O'Reilly)
    • 長瀬 嘉秀,町田 修一 著: オブジェクト指向プログラマが次に読む本—Scalaで学ぶ関数脳入門, 技術評論社 (Amazon)
    • 浅海 智晴 著: ボクらのScala—次世代Java徹底入門, ソフトバンククリエイティブ (Amazon)
    • Cay Horstmann: Scala for the Impatient, Addison-Wesley 2012.
    • Joshua D. Suereth: Scala in Depth, Manning, 2012.
  • 問題集

2 Scalaのインストール

2.1 Javaのインストール

Java 8がインストールされている必要がある.

2.1.1 Windows系OSの場合

「コマンド プロンプト」を開いて,以下のコマンドを実行し, バージョン1.8がインストールされていることを確認する.

> java -version
java version "1.8.0_162"
Java(TM) SE Runtime Environment (build 1.8.0_162-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)

2.1.2 Mac OS XおよびLinuxの場合

「ターミナル」を開いて,以下のコマンドを実行し, バージョン1.8がインストールされていることを確認する.

$ java -version
java version "1.8.0_162"
Java(TM) SE Runtime Environment (build 1.8.0_162-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)

2.2 Scalaのインストール

ここでは Version 2.12 系をインストールする.

2.2.1 Windows系OSの場合

  1. http://www.scala-lang.org を開き Download をクリックし,一番下のOther resourcesを見る.
  2. Version 2.12 系で現時点で最新の scala-2.12.8.zip をダウンロードする.
  3. パッケージを展開する.
    • 例えば C:\XXX というフォルダ内で展開したとする.
    • C:\XXX フォルダ内に scala-2.12.8 というフォルダが作成される.
  4. 「コンピュータ」を右クリックして「プロパティ」を開く.
  5. 「コンピュータの詳細設定」の「環境変数」を開く.
  6. 「ユーザ環境変数」に以下を登録する. (PATH環境変数の設定が既にあれば,値の最後に「;」を付けて追加する.)
    変数
    PATHC:\XXX\scala-2.12.8\bin

2.2.2 Mac OS XおよびLinuxの場合

  1. http://www.scala-lang.org を開き Download をクリックし,一番下のOther resourcesを見る.
  2. Version 2.12 系で現時点で最新の scala-2.12.8.tgz をダウンロードする.
  3. パッケージを展開する.
    • 例えば ~/XXX というフォルダ内で展開したとする (~ はホームディレクトリを表す).
    • ~/XXX フォルダ内に scala-2.12.8 というフォルダが作成される.
  4. PATH環境変数に ~/XXX/scala-2.12.8/bin を追加する.
    export PATH=/XXX/scala-2.12.8/bin:$PATH
    

以下はコマンドラインで上記のインストール作業を行う例である (情報基盤センターのiMacを利用する「言語工学」の履修者の場合).

デスクトップのディレクトリに移動
$ cd ~/Desktop
デスクトップにtfplのディレクトリを作成
$ mkdir tfpl
tfplのディレクトリに移動
$ cd tfpl
scalaのパッケージを取得
$ curl -O https://downloads.lightbend.com/scala/2.12.8/scala-2.12.8.tgz
scalaのパッケージを展開
$ tar xvzf scala-2.12.8.tgz
scalaコマンドのパスを .profile ファイルに設定
$ echo 'export PATH=~/Desktop/tfpl/scala-2.12.8/bin:$PATH' >>~/.profile
.profile ファイルの実行
$ . ~/.profile
パス環境変数にscalaコマンドのディレクトリが含まれていることを確認
$ echo $PATH

3 Scala REPLの利用

Scala REPLの利用方法を説明する.

  • REPLはRead Eval Print Loopの省略で,Scalaを対話的に利用するプログラムである.
  • REPLに入力した文は,コンパイルされてから実行されているため, 正確にはインタープリタではない.
  • 下で説明するように,カーソルキーやEmacsと同様のコントロールキーで入力の編集が行える.

3.1 Windows系OSの場合

「コマンド プロンプト」からscala.batと入力する.

> scala.bat
Welcome to Scala 2.12.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_162).
Type in expressions for evaluation. Or try :help.

scala> 1+2
res0: Int = 3

scala> (BigInt(1) to 100).product
res1: BigInt = 93326215443944152681......4000000000000000000000000

scala> res1.toSring.length
res2: Int = 158
  • 最初の入力は,結果が出るまで少し時間がかかる.
  • 次の入力は,100の階乗を計算している.
  • REPL中ではカーソルキーで,以前の入力を再入力したり入力の編集ができる.
  • 終了は Ctrl-D あるいは :quit (コロンが必要)と入力する.
  • res0res1 は,結果が代入されている変数名である. REPL中で,その変数名を用いれば,再利用できる. ただし,後述の「Scalaコンパイラの利用」や「Scalaスクリプトの利用」の場合は, いちいちこれらの変数に代入されるわけではない.

なお,以下の「Mac OS XおよびLinuxの場合」中で説明しているように, REPL中でEmacsと同様のキーで編集が可能である.

3.2 Mac OS XおよびLinuxの場合

「ターミナル」あるいは「端末」からscalaと入力する.

$ scala
Welcome to Scala 2.12.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_162).
Type in expressions for evaluation. Or try :help.

scala> 1+2
res0: Int = 3

scala> (BigInt(1) to 100).product
res1: BigInt = 93326215443944152681......4000000000000000000000000

scala> res1.toSring.length
res2: Int = 158
  • 最初の入力は,結果が出るまで少し時間がかかる.
  • 次の入力は,100の階乗を計算している.
  • REPL中ではカーソルキーで,以前の入力を再入力したり入力の編集ができる.
  • 終了は Ctrl-D あるいは :quit (コロンが必要)と入力する.
  • res0res1 は,結果が代入されている変数名である. REPL中で,その変数名を用いれば,再利用できる. ただし,後述の「Scalaコンパイラの利用」や「Scalaスクリプトの利用」の場合は, いちいちこれらの変数に代入されるわけではない.

REPL中では,Emacsと同様に以下のキーで編集が可能である( C- はCtrlキーを表す).

キー動作
C-p前の入力行へ移動 (↑と同じ)
C-n次の入力行へ移動 (↓と同じ)
C-b左の文字へ移動 (←と同じ)
C-f右の文字へ移動 (→と同じ)
C-a行頭へ移動
C-e行末へ移動
C-h左の文字を削除 (Backspaceと同じ)
C-d現在の文字を削除 (Deleteと同じ)
C-k行末までカット
C-yカットした内容をペースト
C-g入力取り消し
C-rインクリメンタルサーチ
Tab補完

4 Scalaコンパイラの利用

Scalaコンパイラを用いるには, まずScalaのソースファイルを作成する. 情報基盤センターのiMacの場合は,エディタとして mi などを利用すると良い.

まず,以下の内容のファイル Hello.scala を作成してみる.

1:  object Hello {
2:    def main(args: Array[String]) {
3:      println("Hello Kobe!")
4:    }
5:  }

Windows系OSでは,以下のようにコンパイルし,実行する.

> scalac.bat Hello.scala
> scala.bat Hello
Hello Kobe!

Mac OS XおよびLinuxでは,以下のようにコンパイルし,実行する.

$ scalac Hello.scala
$ scala Hello
Hello Kobe!

コンパイルせずに,REPL実行中にロードし実行することもできる.

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

scala> Hello.main(Array())
Hello Kobe!

その他,Scala開発ツールとして sbt あるいは Eclipse IDE 上のプラグインなどがあるが, ここでは詳細は紹介しない.

5 Scalaスクリプトの利用

実は,上の Hello.scala はscalacでコンパイルしなくても直接実行できる.

Windows系OSでは,以下のように実行する.

> scala.bat Hello.scala
Hello Kobe!

Mac OS XおよびLinuxでは,以下のように実行する.

$ scala Hello.scala
Hello Kobe!

6 Scalaプログラミング入門の内容

本Webページ上部のメニューから以下を参照できる.

  1. Scala言語の概要
  2. Scalaでオブジェクト指向
  3. Scalaでリスト処理
  4. Scalaで再帰プログラミング
  5. Scalaで複素数計算
  6. Scalaで素数ものさしを探す
  7. Scalaでエラトステネスの篩
  8. Scalaで言語処理

また,本サイト内には以下のページがある.

6.1 練習問題

  1. 自分の興味のある応用分野でScalaが利用されているかどうか,検索してみよう.
    (解答例)

    https://github.com にもScalaを用いた多くのプロジェクトが公開されている.

Date: 2020-12-15 00:31:02 JST

Author: 田村直之

Validate XHTML 1.0