11
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Scala入門 (0) -環境構築-

Last updated at Posted at 2017-02-23

Scala入門目次

Scalaは、柔軟な言語表現・安全性を実現するために、コンパイルタイムをある程度犠牲にしている言語です。しかし、学習時にコンパイルタイムが長いのは、ストレスが溜まりモチベーションの低下にも繋がります。ですが、安心してください、適切なコンパイル・実行環境を整えればコンパイル時間を抑えながら学習ができます

JDKのインストール

省略します。お好きなJDK(1.8)をお好きな方法で入れてください。JAVA_HOMEの設定もお忘れなく。物ぐさな方は、IntelliJ IDEAを使えば、IDEAがJDKを持ってきてくれます。

Scalaコンパイラ と REPL のインストール

Scalaバイナリを持ってくるか、ご自分の環境に合わせてパッケージマネージャ等を使って入れてください。

以下のように、実行してバージョンが返ってくれば無事インストール完了です

$ scala -version
Scala code runner version 2.12.0 -- Copyright 2002-2016, LAMP/EPFL and Lightbend, Inc.
$ scalac -version
Scala compiler version 2.12.0 -- Copyright 2002-2016, LAMP/EPFL and Lightbend, Inc.

scalacコマンドを利用したコンパイル

scalacコマンドを利用して、コンパイル・実行する場合は、以下のようにします。しかし、この手法はコンパイルの度にJVMが再起動されるためコンパイルタイムが長く、あまり良くない実行方法です。

$ scalac Hello.scala
$ scala Hello

REPLで簡単な文法・メソッド確認

単純に文法を確認するだけの場合は、REPL(Read Eval Print Loop)を利用しましょう。コンパイルタイムを挟むこと無く文法を実行・確認できます。

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

scala> (1 to 100).filter(_ % 2 == 0).map(_ + 10).toList
res0: List[Int] = List(12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110)

:pasteを使うと複数行に渡るコマンドも実行できます。

scala> :paste
// Entering paste mode (ctrl-D to finish)

class A(val x: Int) {
    def hoge: String = (x * 2).toString
}

// Exiting paste mode, now interpreting.

defined class A

sbt or activator のインストール

複雑なプログラムを記述する場合には、Scalaをファイルに保存し、コンパイルする手順が必要不可欠です。ビルドツールsbt (simple build tool) は、対話環境を立ち上げている間、JVMを立ち上げ続け、さらに変更部分のみを部分コンパイル(インクリメンタルコンパイル)するため、高速にコンパイルするために最適な方法です。

sbtは、GradleBundlerと同じようなScalaで書かれたビルドツールです。CoCの要素も含んでいます。そのため、予め決められたディレクトリ構成にする必要があります。手動でディレクトリ構成を構築するのは面倒なため、sbtには、(gitter8)というテンプレートディレクトリを生成するための仕組みが備わっています。

// sbt new テンプレート(Gitリポジトリ)名
$ sbt new scala/scala-seed.g8
[info] Loading global plugins from /Users/abab/.sbt/0.13/plugins
[info] Set current project to desktop (in build file:/Users/abab/Desktop/)
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Minimum Scala build.

name [My Something Project]: [空エンター]

Template applied in ./my-something-project

生成されたディレクトリは、この様な構成になっています。中身については、その都度説明していきたいと思いますが、しばらくの間はsrc以下のコードのみに集中して書けば問題ありません。

$ cd my-something-project
$ tree
.
├── build.sbt
├── project
│   ├── Dependencies.scala
│   └── build.properties
└── src
    ├── main
    │   └── scala
    │       └── example
    │           └── Hello.scala
    └── test
        └── scala
            └── example
                └── HelloSpec.scala

8 directories, 5 files

sbtコマンドをプロジェクトのルートで実行すると、対話環境が立ち上がります。この対話環境を起ち上げる == JVMの起動と同義になるので、連続してコンパイルする場合には、この対話環境を立ち上げ続けてください。また、ライブラリを利用したい場合は、build.sbtからライブラリを追加すると良いでしょう。

$ sbt
> compile
> run // compileして実行
[info] Compiling 1 Scala source to /Users/abab/Desktop/my-something-project/target/scala-2.12/classes...
[info] Running example.Hello
hello
[success] Total time: 5 s, completed 2017/02/21 23:29:08
> exit

対話環境を立ち上げずにコンパイルや実行をする手段もあります。

$ sbt run
[info] Loading global plugins from /Users/abab/.sbt/0.13/plugins
[info] Loading project definition from /Users/abab/Desktop/my-something-project/project
[info] Set current project to Hello (in build file:/Users/abab/Desktop/my-something-project/)
[info] Running example.Hello
hello
[success] Total time: 1 s, completed 2017/02/21 23:35:26

もう一つの方法として、activatorを利用することができます。activatorは、sbtのリッチラッパーです。豊富なsbtテンプレート、Webアプリとして編集・デバッグ環境なども提供されています。

newコマンドでは、テンプレート名を指定せずに対話的にテンプレートを選択することができます。

$ activator new

Fetching the latest list of templates...

Browse the list of templates: http://lightbend.com/activator/templates
Choose from these featured templates or enter a template name:
  1) minimal-akka-java-seed
  2) minimal-akka-scala-seed
  3) minimal-java
  4) minimal-scala
  5) play-java
  6) play-scala
(hit tab to see a list of all templates)
> 4
> Enter a name for your application (just press enter for 'minimal-scala')
>
There already is a project with name: minimal-scala. Either remove the existing project or create one with a unique name.

生成されたディレクトリは、この様な構成になっています。個人的には、binディレクトリにactivatorのラッパが用意されていたり、.gitignoreが用意されていたりと、しっかりしたテンプレートのため評価が高いです。

$ cd minimal-scala
$ tree
.
├── LICENSE
├── bin
│   └── activator
├── build.sbt
├── libexec
│   └── activator-launch-1.3.12.jar
├── project
│   └── build.properties
└── src
    ├── main
    │   └── scala
    │       └── com
    │           └── example
    │               └── Hello.scala
    └── test
        └── scala
            └── HelloSpec.scala

10 directories, 7 files

$ ls -a
./          .gitignore  LICENSE     build.sbt   project/
../         .idea/      bin/        libexec/    src/

実行は、sbtを利用してもactivator・ラッパを利用しても構いません。お好きな方法でコンパイル・実行を行ってください。

$ sbt run
$ activator run
$ bin/activator run

エディタ・IDE

好みのものをお使いください。筆者の場合は、状況に応じて使い分けているので、参考程度にどうぞ。

  • 軽量エディタ(vim, emacs?)
  • 中量エディタ(VSCode, Atom)
  • IDE(IntelliJ IDEA, Scala IDE for Eclipse, Eclipse)

スペックが高いPCをお使いの方は、やはりIntelliJ IDEAをオススメします。補完機能やリファクタリング機能の質が段違いです。より良い書き方がある場合は、その書き方を提供し書き換えてくれたりするので、学習の効率が上昇すること間違い無しです。

IDEAのプロジェクト作成機能からsbtテンプレートを生成することもできますが、Scalaやsbtのバージョンアップに追従していないケースがあるため推奨しませんsbt newactivator newでプロジェクトを作成し、それをIDEAが開く形の方が安定するでしょう。コンパイル・実行もsbt対話環境から行ったほうが良いと思われます。

まとめ

文法等を確認したい

scala(REPL)コマンドを使う。

複雑なプログラムやライブラリを利用したプログラムを書きたい

sbt or activator を利用する。

プログラムの編集は何を使うか

状況に応じて、お好きなエディタを使う。スペックに問題が無ければ、IntelliJ IDEAを利用する。

11
6
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?