Java プログラマさんのための - Scala 紹介 -
はじめに
Scala を始めたいけど、いろいろ不安。。
そんな私のような Java プログラマさんが Scala のはじめの一歩を踏み出せるように。。
そんな意図で書いてます。
Scala 入門記事はすてきな記事が沢山公開されているので、ここでは
なんて感じで、 Scala の全体像をざっくりまとめたいなーと思っています。
(書いてる私は Scala 初学者です。 間違いがありましたら教えていただけるとうれしいです。)
(2012年 12月 時点での内容です)
Java と比べた Scala の魅力
まずは、そもそも Scala ってなにが魅力なんでしょうー
そんな 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 はかなりのヘビーユーザーです。 いっぱいオープンソース化してますねー
日本の企業だと 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 導入を検討する際には、かなり気になる記事です。。
記事内容の正当性に対するコメントがコメント欄にあるので、 記事を読む際はコメント欄もぜひ参考にしてくださいませ。
Java と Scala - 同じ所・違うところ
一言でいうと、 Java で作成したプログラムの一部を Scala に変更できる程度には、 Java と Scala は相互運用性が高いんです。
も少し詳しく見ていきますね。
同じ所
また、 Scala のソースコードをコンパイルすると Java と同様のクラスファイルになります。
なので、
- Java のライブラリがそのまま使えます
※ Scala では static protected を使用できない等、ごく少数の非互換があります。
https://sites.google.com/site/scalajp/home/scala-pitfalls/protected_static - Java と Scala で相互にメソッド呼び出しや継承が行えます
オーバーヘッドもありません( ー`дー´) - 1つのプログラムに Java と Scala を混在できます
- スレッドダンプ、スタックトレース等、問題解決の手段やツールは Java と同じです
(VisualVM, JMX 等も Java と同様に使用できます) - 同じ IDE(eclipse, IntelliJ IDEA etc.) が使えます
- ライブラリは Maven リポジトリで管理されます
- Jenkins で CI できます
違うところ
- getter/setter のお作法
Java の getter/setter は getFoo/setFoo のようなメソッドです。
Scala はこれらを遜色なく使用できます。
それに加え、 Scala は専用の getter/setter 機能を持っており、 そして、通常はこちらを使用します。
そのため、 Java の getter/setter を要求するライブラリ (Jackson等) を 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 プラグインはとても賢いですよね)
手前味噌ですが、こちらにもちょっと書いています。
長くなってしまったので、続きは後日。。 Scala を取り巻くライブラリやツールについて書こうと思いますー