- The Scala Programming Language
- 開発元はLightbend 社 と EPFL(Odersky先生がいるスイスの大学)
- 2019/05 現在、最新バージョンは 2.12
- Dottyと呼ばれる新しいScalaコンパイラが開発されている
- Scala3
- 2019/05 現在0.15.0-RC1
- 2系との互換性はなく、移行ツールが用意される
- いつ出るのかもまだよくわからないため、おそらくこちらがメインストリームになるのはまだ数年先であると言われているが・・・?
- 特徴
- JVM言語
- オブジェクト指向と関数型言語両方の特性を併せ持つ
- 個人的にScalaの好きなところ
- 環境構築が簡単
- JDKとsbt(ビルドツール)さえあればいい
- Scalaのコンパイラもsbtがインストールしてくれます
- Scalaのバージョン管理もsbtが行ってくれる
- Scalaのコンパイラもsbtがインストールしてくれます
- JDKとsbt(ビルドツール)さえあればいい
- sbtによる差分コンパイル機能
- よくScalaは「コンパイルが遅い」と言われますが、sbtには差分コンパイル機能があります。
- sbt を常駐させて、
~compile
コマンドを実行することにより、ソースを変更すると差分コンパイルが実行される
- sbt を常駐させて、
- フルコンパイルは確かに時間がかかりますが、差分コンパイルは早いので、感覚的にはコードを書きながらリアルタイムでコンパイルエラーがわかる。みたいな感じ。
- よくScalaは「コンパイルが遅い」と言われますが、sbtには差分コンパイル機能があります。
- 可読性が高い、すっきりしたコードを書きやすい
- ここは後ほどまた
- 環境構築が簡単
- 一般的には、並行・分散プログラミングに強く、大量処理を捌く必要があるシステムに向いていると言われている
- 副作用を局所化したプログラムを書きやすい
- 非同期処理を書くことに対して構えなくなる。
- 自然と非同期処理を書いている。みたいな。
- 非同期ライブラリの存在
- Future (標準)
- Akka
- Monix Task
- 最近は他言語でも非同期ライブラリが充実してきているし、以前ほどの優位性はないような印象がある(※個人的見解です)
- 副作用を局所化したプログラムを書きやすい
- Kotlinとは
- Scalaより後発のJVM言語
- よくScalaと比較される
- ScalaとKotlinの違い
- (この表現が妥当かどうかはわからないけれども) Kotlinは「ほぼJava」
- better Java
- Javaを書ければなんとなく読める
- Scalaも「Javaっぽく」書くことはできるが、いわゆる「Scalaらしいコード」は、Java(や、一般的なオブジェクト指向言語のプログラマ)にとっては「なんだこれ全く読めん・・・」となる
- 私も最初なりました
- 中置記法、シンタックスシュガー、implicitによる暗黙的なパラメータ渡しなどなど
- この辺が「Scala難しい・・・」と言われてしまう要因
- 後述しますが、この「Scalaらしいコード」を読むためにおさえておくべきポイント自体は少ないので、本当に「難しい」かどうかは意見がわかれるところ
- ビルドツール
- KotlinはJava同様Gradleが標準
- Scalaはsbt
- Gradleを使えないわけではないですが、事例はとても少ないと思います
- KotlinはAndroidの開発標準言語
- 今JavaでメジャーなWebフレームワークのSpringBootがKotlin対応している
- (この表現が妥当かどうかはわからないけれども) Kotlinは「ほぼJava」
- がくぞさんのツイート: "1根本思想が違う。Scalaはsimple、Kotlinはeasy to use 得意分野はScalaはDDDや非同期関連FW充実さ、KotlinはAndroidやSpringとのITなど 2必要に迫られた、もしくは興味がある方 3実行系であるJVMの知識、標準ライブラリの知識は要る。Java言語仕様やFWについては知らなくても何とかなる… https://t.co/O8znF3Cx2J"
- 運用のことも踏まえて、OpenJDKは今何を選択すればいいのか?
❗️注意
JDKリリース・モデル変更の影響により現在情報が錯綜しており、判断が難しい状況です・・・。下記、ご参考にどうぞ。
-
OpenJDKディストリビューションの選び方 #codetokyo19 #codetokyo19B3 #jjug_ccc #ccc_l5 #OpenJDKソムリエ - Togetter
-
JDK Compatibility | Scala Documentation
- コンパイルはJava8推奨と記載がある
- (5/31: 追記) コメントにて xuwei-k さんから下記ご意見いただいています
コンパイル8推奨 は、個人的には、Scala公式ページの説明がちょっと足りないというか、あれは条件付きというか、11でも8でも動かされる可能性があるライブラリ作者などは(できれば11でもテストしつつ)8でコンパイルしてpublishしたほうがいいが、プロダクションコードを最初から11で動かす予定なら、どちらかというと11でコンパイルして11でローカルでテストしたほうがいいと思う。(8でコンパイル、11でローカルでテスト、なんて分けるのだるいし、8だけでローカルでテストして11でいきなり本番動かす、も危険なので)
- (5/31: 追記) コメントにて xuwei-k さんから下記ご意見いただいています
- コンパイルはJava8推奨と記載がある
- Play Framework - Build Modern & Scalable Web Apps with Java and Scala
- フルスタック Webフレームワーク
- 多分一番有名
- 現在 バージョン2.7
- 2系でマイナーアップデートを繰り返しているけど、2.x <- このx のマイナーアップデートは結構大きい変更が入るので注意が必要
- (5/31 追記) PlayFrameworkはsemantic versioningを採用していないため、Playの定義としては 2.x のxが変わるのはメジャーアップデートなのだそうです。詳細はコメント欄参照。
- 実質メジャーアップデートみたいなものなので、マイグレーションガイドをしっかり読んで移行する必要がある
- リリース周期
- ここのところ、1〜2年に1回?
- 2.3 -> 2.4 の変更が特に大きかった
- 2.5 -> 2.6ではバックエンドのサーバーがNettyからAkka HTTPに変更
- Nettyもまだサポートはしている?
- リリース周期
- 2系でマイナーアップデートを繰り返しているけど、2.x <- このx のマイナーアップデートは結構大きい変更が入るので注意が必要
- ORM、テンプレートエンジンなど、各ライブラリは好きなものを使うこともできる
- が、標準が推してくるライブラリが癖が強いという罠がある・・・
- Slick
- 「Slickが難しい、わからない・・・」と言う悩み相談をうけるたびにScalikeJDBCがおすすめです」と答えてます
- play-json
- Slick
- が、標準が推してくるライブラリが癖が強いという罠がある・・・
- Akka HTTP
- Akka: build concurrent, distributed, and resilient message-driven applications for Java and Scala | Akka
- HTTPサーバ開発のためのツールキット
- フレームワークではない
- ORM、テンプレートエンジン、認証などなど、使いたい機能によって他ライブラリを分で導入し、組み合わせて使うことになる
- 現在、AkkaHTTPに好きなライブラリを組み合わせて使う方法が主流っぽい
- PlayFrameworkもAkkaHTTPがベースとなったのと、結局やりたいことに合わせてライブラリを自分で導入することになるので、「AkkaHTTPでいいじゃん」という意見をよく聞く
- 個人的にはPlay好きで、実はAkkaHTTPそんなにがっつりさわったことないです
- API開発ならたしかにAkkaHTTPでいいなってなるけど、画面もいる場合、Form周りのAPIはPlay便利だと思っている 🤔
- AkkaHTTPとTwirl(テンプレートエンジン)組み合わせて画面も作っているよ!という人のご意見求む
ここ1、2年で初心者向けコンテンツが充実してきたような気がします
- Scalaスケーラブルプログラミング第3版
- 通称「コップ本」
- 言語設計者のMartin Odersky 先生による、Scala使いのバイブル的な本
- めっちゃ分厚い
- 網羅的なので分量に圧倒されるが、決して読みにくい本ではないです
- 実践Scala入門
- 「コンパクトなコップ本」
- コップ本から「実務でScala使うために必要そうな知識」を抽出しました!という感じ
- 分量的にも読みやすく、 おすすめ!!
- 「コンパクトなコップ本」
- Scalaをはじめよう! ─マルチパラダイム言語への招待─ (技術の泉シリーズ(NextPublishing))
- 元・Scala関西スタッフ amaya(@amaya382)さん | Twitter によるScala入門本
- 「とりあえずScalaを触ってみたい」という場合、個人的には一番おススメ
- チュートリアル形式となっており、本に沿って進めていく形でScalaを試すこがきる
- 薄い
- 「式と文」という、Scalaで肝となる部分を、最初に丁寧に説明している
- 私は「
{}
がブロック式」ということを最初の頃理解しておらずつまづていので、私がScalaはじめた頃にこの本があればよかったのに・・・ってっている
- 私は「
- 2019/05 現在、 Kindle Unlimited で読める
- Scala逆引きレシピ
- やりたいことから逆引きでScalaの文法を調べることができる
- 内容が古いため手放しでおススメ!というわけではないが、「これどうするんや・・」となったときに、さっと辞書的に引くことができて便利
- Scala関数型デザイン&プログラミング ―Scalazコントリビューターによる関数型徹底ガイド (impress top gear)
- Scalaによる関数型プログラミング本
- 難しいし、この本の内容を知らなくても実務に影響はないです
- 私はPart2挫折しました
- いわゆる「初心者におススメできない」本ですが、ただ、最初の方は(特に1章)関型ログラミングの考え方を知る上でわかりやすい説明がなされているので、無理のない範囲でむというのはアリだと思います
- Akka実践バイブル アクターモデルによる並行・分散システムの実現
- Akka in Action 和訳本
- 私はまだ未読なので内容について言及できないのですが、Akka本として今一番おすすめされている本
- Documentation | Scala Documentation
- 公式ドキュメント
- なんかいつの間にかとても充実している
- 私がはじめたころはこんなのなかった
- TOUR OF SCALAは、ScalaFiddleによってオンライン上でコードを実行して動をながら読み進めることができる
- Scala研修テキスト
- ドワンゴさんのScala研修テキスト
- Scalaメモ(Hishidama's Scala Memo)
- ひしだまさんによる、Scalaの網羅的なメモ
- Javaメモもある
- Scala関西Summit 過去スライド・動画 へのリンクを掲載しているので、そちらもぜご活用ください
- Scala関西Summit 2018
- Scala関西Summit 2017
- 動画公開は 2017まで
- Scala自体が入っていない場合、Scalaのインストールからはじまる
- ライブラリ依存関係の解決に時間がかかる
- めちゃくちゃかかる
- ライブラリ依存関係の解決に時間がかかる
- 大きいプロジェクトだと、コンパイルに時間が(ry
- でも、初回だけです
- 依存ライブラリはキャッシュされる
- でも、初回だけです
- 大きいプロジェクトだとコンパイルに時間はかかるけど、差分コンパイルで動かしながら開発することになるので、特に気にならない
- わかる。わかるよ。
- でも、おさえるべきポイントは少ない
- よくある初心者つまづきポイント「中置記法」
// 下記は同じ処理
1 + 2
1.+(2)
// 仮に、Intにaddメソッドがあるとする
1 add 2
1.add(2)
- そんなことはないよ!!!!
- ラムダ式がわかるレベルで大丈夫です
- JavaやKotlinと変わらない
- 関数型プログラミングの力により提供される便利ライブラリを、関数型プログラミングの知識がなくても利用できる
- 私自身はJava経験がある状態でScalaをはじめたので、Twitterでいろんな人の意見をきいてみました
- とりあえずはじめる分にはなくてもなんとかなる
- 調べながらJavaのことはふんわり理解しながらで大丈夫
- オブジェクト指向言語の知識はあった方がいいかもしれない
- ひしだまさんのページやIntelliJ IDEAが教えてくれて助かったという声多数
- がっつり実務で書くとなると、JavaのAPI(日付など)の知識が必要になってくる
- 運用でJVMの知識が必要になる
- 調べながらJavaのことはふんわり理解しながらで大丈夫
- 例えばfor式
for {
i1 <- Some(1)
i2 <- Some(2)
i3 <- Some(3)
} yield i1 + i2 + i3
- implicit
- Implicit 再入門 http://gakuzzzz.github.io/slidesimplicit_reintroduction/#33
- 「コードの本筋が埋もれない」
- How(どのようにして動くのか)ではなくWhat(それが何か)を重視したコード
- 「コードの本筋が埋もれない」
- Implicit 再入門 http://gakuzzzz.github.io/slidesimplicit_reintroduction/#33
Lightbend 社
のところは、EPFL(Odersky先生がいるスイスの大学)も書いても良い気はした。昔も今もずっと関わってるし、ソースコードのcopyrightもCopyright EPFL and Lightbend, Inc.
なので2019/05 現在RC1
だと、どのversionのRC1なのか全くわからなく、なんならRCというと "release candidate" なので "もうすぐ完成"というイメージにもなるが(?)あくまで0.15.0-RC1
であって、0.15のあとは0.16も0.17普通に出ると思うし、0.99までいくのか、0.999までいくのか、おそらくあまり詳細に決まってないので、ちゃんと0.15.0-RC1って書いたほうがいいと思う( RC1ならもうすぐ完成
なのかな?と勘違いされないように。まぁすぐ下にいつ出るのかもまだよくわからない
とも書いてあるが)コンパイル8推奨
は、個人的には、Scala公式ページの説明がちょっと足りないというか、あれは条件付きというか、11でも8でも動かされる可能性があるライブラリ作者などは(できれば11でもテストしつつ)8でコンパイルしてpublishしたほうがいいが、プロダクションコードを最初から11で動かす予定なら、どちらかというと11でコンパイルして11でローカルでテストしたほうがいいと思う。(8でコンパイル、11でローカルでテスト、なんて分けるのだるいし、8だけでローカルでテストして11でいきなり本番動かす、も危険なので)2系でマイナーアップデートを繰り返している
は、semantic versioning的にはx.y.zのyが変わるのがマイナーアップデート
だが、そもそもplayframeworkはsemantic versioningを採用していない(中の人が明確にそう言っていたことはある)ので、2.6から2.7などをマイナー
とよぶかメジャー
と呼ぶか?は、用語を説明というか定義してからでないと、勘違いが発生する可能性があり難しい。ここ https://github.com/playframework/playframework/blob/97b988130a46605583d5d71d3f0a915dd296aedb/documentation/manual/releases/Releases.md にはSince Play 2.0.0, Play is versioned as *epoch.major.minor*. Play currently releases a new major version about every year. Major versions can break APIs, but we try to make sure most existing code will compile with deprecation. Each major release has a Migration Guide that explains how to upgrade from the previous release.
と書いてあり、この定義が今も有効なら、どちらかというとplay側の定義としては2.6から2.7は "メジャー" アップデート、である