Java プログラマさんのための - Scala 紹介 -

はじめに

Scala を始めたいけど、いろいろ不安。。

そんな私のような Java プログラマさんが Scala のはじめの一歩を踏み出せるように。。

そんな意図で書いてます。

 

Scala 入門記事はすてきな記事が沢山公開されているので、ここでは

  • JavaScala はどこが同じで、どこが違うの?
  • Scala という言語はわかったけど、取り巻くツールやライブラリはどうなの?

なんて感じで、 Scala の全体像をざっくりまとめたいなーと思っています。

 

(書いてる私は Scala 初学者です。 間違いがありましたら教えていただけるとうれしいです。)

(2012年 12月 時点での内容です)

 

Java と比べた Scala の魅力

まずは、そもそも Scala ってなにが魅力なんでしょうー

そんな Scala の魅力は、例えばこちらのページにとっても詳しく書いてあります(*´ω`*)

Java使いをScalaに引き込むサンプル集

 

私も Scala 好きなんですが、とくにこんなところが好きです(*´ω`*)

  • Java と同じように使えます
    後ほど触れますが、導入の敷居が低いです。
    (Scala といえば関数型プログラミング
    関数型プログラミングは難しい用語がいっぱい出てくる。
    だから Scala は難しい!?
    でも、 Scalaオブジェクト指向言語としてもすぐれているので、 無理に関数型のスタイルを使わなくてもだいじょぶですー)
  • Java の冗長な記述を省いて簡潔に書けます
    冗長な記述は、書くのが面倒で、読むときにはノイズになったりします。 これを省くことができるのはうれしいんですー
  • Scala だと部品の共通化が捗るんです
    Scala は関数を変数として扱うことができ、このため Java では共通化が 難しいような処理も共通化することができるんです。
  • 標準ライブラリがとても強力
    リストなどのコレクションを操作したり、プロセスを制御したり、 並列処理を行ったり、、
    そんなライブラリがとても充実しているんです。

Scala の抵抗を感じる部分

いいところもあれば、抵抗を感じるところもあるものです。

私的に、ちょっと抵抗を感じる部分トップ3(´;ω;`)

  • 関数型プログラミングは難しい
    知らないものは難しいのです。。
    Scalaオブジェクト指向よりの言語なので、関数型プログラミングを無理に行う 必要はありません。それでも、関数型のスタイルで書かれたコードを読むのは関数型に不慣れなうちはなかなか大変なのです。。
    (Scala の問題じゃないですが。。) 
  • バイナリ互換性
    後述しますー
  • 開発環境
    Scala は言語として優れている反面、取り巻く環境はまさにいま発展中なう
    という感じですね。

    後述します

どんな企業が使っているの?

ここに一覧があります。

http://www.scala-lang.org/node/1658

Twitter, LinkedIn, Foursquare 等、 名だたる企業が使っているんですねー

 

なかでも Twitter はかなりのヘビーユーザーです。 いっぱいオープンソース化してますねー

http://twitter.github.com/

 

日本の企業だと GMO さんとかですかねー???

http://jp.scala-users.org/top%E3%83%9A%E3%83%BC%E3%82%B8/scala-cases-in-japan

 

逆に Scala から Java に移行した例として、 Yammer があります。

http://www.infoq.com/jp/news/2011/12/yammer-scala

Scala 導入を検討する際には、かなり気になる記事です。。

記事内容の正当性に対するコメントがコメント欄にあるので、 記事を読む際はコメント欄もぜひ参考にしてくださいませ。

 

JavaScala - 同じ所・違うところ

一言でいうと、 Java で作成したプログラムの一部を Scala に変更できる程度には、 JavaScala は相互運用性が高いんです。

も少し詳しく見ていきますね。

同じ所

ScalaJava はとっても仲がいいんです。

また、 Scalaソースコードをコンパイルすると Java と同様のクラスファイルになります。

なので、

違うところ

  • getter/setter のお作法
    Java の getter/setter は getFoo/setFoo のようなメソッドです。
    Scala はこれらを遜色なく使用できます。
    それに加え、 Scala は専用の getter/setter 機能を持っており、 そして、通常はこちらを使用します。
    そのため、 Java の getter/setter を要求するライブラリ (Jackson等) を Scala で使用する際には、 以下のいずれかのような対策をしなければだめなんです。
    1. Java と同様に getFoo/setFoo を定義
    2. Java の getter/setter を生成する Scala アノテーションを使用する
    3. Scala のお作法を扱えるライブラリを使用する
      (jackson-module-scala 等)
  • ビルド/ライブラリ管理ツール
    Java と同様 maven も使えますが、 Scala では sbt がよりメジャーです。 (sbt は Maven と、リポジトリやディレクトリ構造に互換性があります)
  • ライブラリのバイナリ互換方針/ライブラリの命名規約
    Scala のクラスファイルは、 Scala のバイナリバージョン※というものが変わると互換性がなくなります。
    つまり、 Scala 2.9.1 に対してビルドされたライブラリ(バイナリバージョン 2.9.1)は、 再コンパイルしないと Scala 2.10.x(バイナリバージョン 2.10) では使えません。

    また、そのため、ライブラリの名前にバイナリバージョンが入ります。
    例: lift-json_2.10 (バイナリバージョン 2.10 用の lift-json というライブラリ)
    ※ バイナリの互換性を表すバージョンナンバー。
  • IDE のサポート度合い
    Java の IDE は非常に高機能です。
    Scala の IDE も高機能ですが、 Java には見劣りしてしまいます。。

    Scala IDE でできること、できないことの一例 (IntelliJ IDEA 12 の場合)

    • リファクタリング: 名前変更/移動
    • × リファクタリング: メソッドシグネチャの変更
    • ○ 変数/メソッド等の使用箇所の列挙
    • ○ 補完(不自由なく可能。 ただし、 Java より遅いです)
    • ○ 定義先へのジャンプ
    • ○ 各種コード生成
    • × 依存ライブラリの自動 DL
      (DL には手動でコマンドを実行する必要があります。 対して、 IDE の Maven プラグインはとても賢いですよね)

    手前味噌ですが、こちらにもちょっと書いています。

    http://d.hatena.ne.jp/rinu/20120417/1334636425

 

長くなってしまったので、続きは後日。。 Scala を取り巻くライブラリやツールについて書こうと思いますー