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でオブジェクト指向 」 の一部を実行できます.
- https://mybinder.org/v2/gh/tamura70/scala-introduction/master?urlpath=lab/tree/notebooks/index.ipynb をアクセス
- しばらく待つ
- コンテンツ中の「Scalaでオブジェクト指向」を開く
- プログラムは Shift-Enter で実行できます
- 保存しておきたいノートブック (.ipynbファイル)は,ダウンロードしておくこと. そうでない場合,10分間操作しないとすべては消去される.
1.3 参考リンク
- 本家
- http://www.scala-lang.org
- Documentation / Manuals / Translations に日本語のマニュアル等がある
- http://www.scala-lang.org
- 英語
- Scala Wiki
- Programming in Scala, First Edition (by Martin Odersky, Lex Spoon, and Bill Venners)
- Twitter's Scala School!
- Effective Scala (by Marius Eriksen, translated by Yuta Okamoto and Satoshi Kobayashi)
- 日本語
- プログラミング言語Scala 日本語情報サイト
- Scala研修テキスト (ドワンゴ)
- プログラミング言語 Scala Wiki
- Scala勉強会@東北 勉強会資料
- スケーラブルで関数型でオブジェクト指向なScala入門 (@IT)
- 刺激を求める技術者に捧げるScala講座 (ITpro)
- 今からでも遅くない これから始めるScala (CodeZine)
- Scala (by ひしだまさん)
- 書籍
- 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.
- 問題集
- 本サイト内
- リスト処理の例: 多項式計算 (Scalaのプログラム例を含む)
- Project Eulerに挑戦 (Scalaのプログラム例を含む)
- Scalaと命題論理
- Copris: Constraint Programming in Scala (Scala上の制約プログラミング用DSL)
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の場合
- http://www.scala-lang.org を開き Download をクリックし,一番下のOther resourcesを見る.
- Version 2.12 系で現時点で最新の scala-2.12.8.zip をダウンロードする.
- パッケージを展開する.
- 例えば
C:\XXX
というフォルダ内で展開したとする. C:\XXX
フォルダ内にscala-2.12.8
というフォルダが作成される.
- 例えば
- 「コンピュータ」を右クリックして「プロパティ」を開く.
- 「コンピュータの詳細設定」の「環境変数」を開く.
- 「ユーザ環境変数」に以下を登録する.
(PATH環境変数の設定が既にあれば,値の最後に「;」を付けて追加する.)
変数 値 PATH
C:\XXX\scala-2.12.8\bin
2.2.2 Mac OS XおよびLinuxの場合
- http://www.scala-lang.org を開き Download をクリックし,一番下のOther resourcesを見る.
- Version 2.12 系で現時点で最新の scala-2.12.8.tgz をダウンロードする.
- パッケージを展開する.
- 例えば
~/XXX
というフォルダ内で展開したとする (~
はホームディレクトリを表す). ~/XXX
フォルダ内にscala-2.12.8
というフォルダが作成される.
- 例えば
- 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
(コロンが必要)と入力する. res0
やres1
は,結果が代入されている変数名である. 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
(コロンが必要)と入力する. res0
やres1
は,結果が代入されている変数名である. 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ページ上部のメニューから以下を参照できる.
- Scala言語の概要
- Scalaでオブジェクト指向
- Scalaでリスト処理
- Scalaで再帰プログラミング
- Scalaで複素数計算
- Scalaで素数ものさしを探す
- Scalaでエラトステネスの篩
- Scalaで言語処理
また,本サイト内には以下のページがある.
- リスト処理の例: 多項式計算 (Scalaのプログラム例を含む)
- Project Eulerに挑戦 (Scalaのプログラム例を含む)
- Scalaと命題論理
- Copris: Constraint Programming in Scala (Scala上の制約プログラミング用DSL)
6.1 練習問題
- 自分の興味のある応用分野でScalaが利用されているかどうか,検索してみよう.
- (解答例)
-
https://github.com にもScalaを用いた多くのプロジェクトが公開されている.