kentsu.dat

何かその時の興味でいろいろする人。最近はScala使ってる。アルゴリズムと自然言語処理、深層学習が大好き。

Java使いのScala入門 〜Scala入門のはじめの一歩〜

Scala入門のはじめの一歩

これから何回かに分けてScala入門についての記事を書いていこうと思う。
教材はScala スケーラブルプログラミング[第3版]を元にJavaとの違いをまとめていく。


今回は「Scala入門のはじめの一歩」ということで、Scalaとは何か。ということをまとめる。

Scalaとは何か

Scalaとは、使うユーザに合わせて大規模システムや小規模システムを構築することが可能な
極めて広範囲のプログラミングニーズに応える言語である。

Scalaは標準javaプラットフォームのうえで動作しすべてのJavaライブラリを相互運用できる。
これはScalaがBetter Javaと言われる要因の一つとなっている。

またScala関数型言語の特徴を持っている。
それに加えて、Javaと互換があるのでオブジェクト指向言語的特徴も持っている。

この2つのプログラミングスタイルを持つが故にScalaは広範囲のプログラミングニーズに応えることができる。


それをScala スケーラブルプログラミングでは以下のコードを例に挙げて説明している。

var capital = Map("US" -> "Washington")
capital += ("Japan" -> "Tokyo")
println(capital("Japan")) //Tokyo

Scalaでは連想マップをつかってこのように書くことができる。
これを見たJavaユーザは驚くかもしれないが、恐ろしいほどに短いコードで
一見するとそれこそ、python,ruby,perlのようなスクリプト言語的なコードになっている。

同じコードをJavaで書こうとすると、もっと長く冗長で細かい条件を設定する必要がある。


ただScalaの強さはそれだけではない。
このように簡単にMapをかけるがこれはデフォルトの仕様に過ぎず
必要に応じてhashmapやtreemapなどなどScalaでサポートされているものに関して
もっと細かく設定を拡張、修正できるようになっている。

つまりScalaJavaと比べて恐ろしく柔軟で書きやすい言語であると言える。

Javaと互換性を持つこと、拡張できるということ

Javaとの互換性はこの記事内で詳しく紹介するが前述した特徴をJava比較するのではなく
ScalaJavaと互換性を持つということがどういうことなのかをここでは簡単にまとめる。

例えば次のscalaライブラリークラスを使用すると想定する。

scala.BigInt

これはBigIntegerといえばscalaに馴染みのない人にも伝わると思うが
オーバーフローやアップアラウンドが発生せず扱える数の上限が決まっていない(正確には決まっているが)整数の型である。

これを使って、よくオーバーフローする階乗の計算をやってみる。

def fact(x:BigInt):BigInt = 
  if (x == 0) 1 else x*fact(x-1)

これを実行するとこうなる

res:BigInt = 265252859812191058636308480000000

ここで示したようにBigInt型を使って整数リテラルのように演算できるので一見組み込み型のようだが
ここで使ったクラスはScalaの標準ライブラリーで定義されているクラスに過ぎない。

もし仮にこのようなクラスがなかったとしても自ら実装することでScalaプログラマは簡単にこれらの作業を行うことができる。


それが面倒だというなら、Javaと互換性があることが大きな武器となる。
Javaと互換性があるので次のような実装を考えることができる。

import java.math.BigInteger //これがすごく重要

def fact(x:BigInteger):BigInteger = {
    if (x == BigInteger.ZERO)
        BigInteger.ONE
    else
       x.multiply(fact(x.subtract(BigInteger.ONE)))
}

このコードを実行してもはじめに紹介したコードの実行結果と同じ実行結果が返ってくる。

つまりjavaのライブラリであっても使用できる。

この機能があるが故にScalaの、あたかもネイティブサポートしてこのような型が使えるかのように感じられる。


もし必要な型がscalaになく,javaにあるのなら独自実装せずにこのようにJavaから持ってくることもできる。

これがScalaJavaと互換性を持つことと、拡張性に優れていることを表している。

ここまでのまとめ

ここまで出てきたScalaの特徴をまとめる

これらからScalaをもっとざっくりとまとめると
Javaと互換性があるが簡潔で高水準の抽象を備えた強い静的型付け言語と言える。

つまり「Better Java