目次
- 【講義】はじめての Scala
- 【講義】Scala とは
- 【実習】JVM のインストール
- 【実習】パッケージ管理システムと Scala の実行環境 sbt のインストール
- 【講義】sbt とは
- 【実習】sbt を動かしてみる
- 【実習】Scala の実行
【講義】はじめての Scala
今回は、Scala というプログラミング言語を動かすための環境を作成して、実際に Scala を使った簡単なプログラムを作る。
【講義】Scala とは
Scala は、2003 年にスイス連邦工科大学のMartin Odersky 教授によって開発されたプログラミング言語で、日本語では「スカラ」と読む。
Martin Odersky 教授は Java 5 で導入された機能であるジェネリクスの開発者であり、彼の書いた Java コンパイラは JDK 1.3 の頃から標準搭載されている。
そういう意味で、Java との縁も深い人だ。
Java というプログラミング言語は、1995 年に登場した言語で、20 年以上の歴史の中で多くの実績や既存のライブラリのほとんどを利用できるため、非常に多くの現場で使える言語。
Scala は、オブジェクト指向プログラミング と 関数型プログラミング の両方ができる特徴を持っている。
また Scala は、オブジェクト指向や関数型プログラミングというものの他に、非同期プログラミング、並行・並行処理を得意としている。
Scala は Java を動かすための Java Virtual Machine (JVM) という仮想マシン上で動くため、様々なデバイスの様々な OS 上で動かすことができるという特性を持っている。
【実習】JVM のインストール
スキップ
【実習】パッケージ管理システムと Scala の実行環境 sbt のインストール
スキップ
【講義】sbt とは
そもそも sbt とは何なのか。
sbt は、Scala で書いたコードを、JVM 上で動かすためのバイトコードに変換するためのツール。
Scala はプログラミング言語で書いたコードをバイトコードを言われるファイルに1回変換して、それを Java Virtual Machine (JVM) 上で実行する。
この工程のことを コンパイル と呼ぶ。
Scala や Java のようにコンパイルに必要なプログラミング言語を コンパイラ型言語 と呼ぶ。
複数のコードをコンパイルし、動く状態にすることを ビルド という。
sbt とは、このビルドをするためのツール。
Scala や Java で開発する場合は sbt などのビルドツールを使うことで、複数の Scala のバージョンを取り扱えたり必要なライブラリを自動的にダウンロードできたりするなどのメリットがある。
【実習】sbt を動かしてみる
sbt を実行するためにフォルダを作成して、早速 Scala の対話実行環境である REPL (Read eval pring loop) を起動しよう。
REPL は入力したコードを評価して実行し、その評価した結果を表示する。
$ cd ~
$ mkdir -p workspace/scala-study
$ cd workspace/scala-study
$ sbt console
...
Welcome to Scala 2.12.14 (OpenJDK 64-Bit Server VM, Java 1.8.0_292).
Type in expressions for evaluation. Or try :help.
scala>
以上のように表示されて、Scala の REPL が表示される。
以上で、Scala の環境の用意が整った。
まずは、:help
と入力して Enter キーを入力する。
scala> :help
All commands can be abbreviated, e.g., :he instead of :help.
:completions <string> output completions for the given string
:edit <id>|<line> edit history
:help [command] print this summary or command-specific help
:history [num] show the history (optional num is commands to show)
:h? <string> search the history
:imports [name name ...] show import history, identifying sources of names
:implicits [-v] show the implicits in scope
:javap <path|class> disassemble a file or class name
:line <id>|<line> place line(s) at the end of history
:load <path> interpret lines in a file
:paste [-raw] [path] enter paste mode or paste a file
:power enable power user mode
:quit exit the interpreter
:replay [options] reset the repl and replay all previous commands
:require <path> add a jar to the classpath
:reset [options] reset the repl to its initial state, forgetting all session entries
:save <path> save replayable session to a file
:sh <command line> run a shell command (result is implicitly => List[String])
:settings <options> update compiler options, if possible; see reset
:silent disable/enable automatic printing of results
:type [-v] <expr> display the type of an expression without evaluating it
:kind [-v] <type> display the kind of a type. see also :help kind
:warnings show the suppressed warnings from the most recent line which had any
以上のように表示される。
これは REPL 上のコマンドを説明したもの。
今後使っていく可能性が髙いコマンドとしては、コードを貼り付けることができる :paste
や REPL を終了させる :quit
、REPL で宣言した変数や関数などをリセットする :reset
などがある。
ここで一旦 :quit
して、REPL を終了させよう。
なお、REPL の終了には時間がかかる場合もある。
また、二度目以降立ち上げる時にはダウンロードは行われず、workspace/scala-study
で sbt console と実行するだけで大丈夫。
なお、:quit
で終了できないような場合には、 Ctrl + c または Ctrl + d で強制的に REPL を終了させることもできる。
それでは、先ほど作った workspace/scala-study
フォルダの中身を確認してみよう。
target
というフォルダができているのがわかる。
Scala というプログラミング言語はコンパイラ型言語だと紹介した。
この target
フォルダの中には、バイトコードと呼ばれる JVM 上の命令が書かれたバイナリファイルが出力される。
これは Scala のソースコードがコンパイルされた結果作成されたファイル。
以上からわかるとおり、sbt console
コマンドを利用して REPL を立ち上げる際には、その直下の target
フォルダにコンパイル結果が出力されるため、どこで実行するかが重要になる。
【実習】Scala の実行
では、再度 REPL を立ち上げてみよう。
sbt console
以上のコマンドを利用して、sbt を立ち上げる。
scala>
以上のように REPL のプロンプトが表示されれば成功。
それでは、簡単な計算をやってみよう。
scala> 25 + 25
res0: Int = 50
以上のように表示される。
次に、
scala> res0 + 100
res1: Int = 150
以上のように表示される。
Scala の REPL では入力の結果を res
とインデックスの数値で表される変数に自動的に代入する。
ここでは、25 + 25 の結果が res0
という変数に割り当てられ、50 という値を持つ res0
に 100 を足した 150 という結果が、res1
という変数に割り当てられた。
また res0
を説明する情報として、int という文字列が表示されている。
これは変数の 型 の情報。
int は英語で ineger すなわち整数の意味なので、今回の場合 res0 の結果の値が変数の方であることを表している。
なお、C や Java などの言語では型を変数の前に書くが、Scala では型を変数の後ろに書く。
従って、
res0: Int = 50
は、変数 res0
が Int という型つまり整数で、値は 50 であるという意味の表示。
この REPL は今後 Scala を学んでいく上でよく利用するので、Scala の記法で疑問に思うことがあった際には、すぐに REPL を起動して実際にコードを書いてみて確認してみよう。
まとめ
- Scala は、オブジェクト指向プログラミングと関数型プログラミングの両方の性質を持つ
- Scala は、コンパイラ型言語であり JVM 上で動く
- Scala は、Java の運用経験やライブラリを利用できる
挑戦
初級
scala> 8327 * 9874
res0: Int = 82220798
中級
scala> def fizzBuzz(n: Int) {
| if (n % 15 == 0) {
| println("FizzBuzz")
| } else if (n % 3 == 0) {
| println("Fizz")
| } else if (n % 5 == 0) {
| println("Buzz")
| } else {
| println(n)
| }
| }
fizzBuzz: (n: Int)Unit
scala> (1 to 100).foreach(fizzBuzz)
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
Fizz
49
Buzz
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
FizzBuzz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
FizzBuzz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz
上級
scala> def printCount(n: Int): Unit = {
| println(n)
| printCount(n + 1)
| }
printCount: (n: Int)Unit
scala> printCount(0)
0
1
2
...
638825
...