先日Scalaわいわいランド(ScalaのコミュニティDiscordサーバ)で、Scalaを最近勉強しだしたという方から
Scala3を使っていて気づいたんですけど、Scala2で記述されたライブラリを呼んでいる部分があることに気づきました
という話を聞いた。言われてみれば、Scala 3のリファレンスを読んでいるときも、ソースへのリンクを踏むとScala 2.13のソースコードに飛ばされてなんじゃこりゃ、と思っていた。
・・・という話を会社で id:tarao に訊いたところ、普通にScala 3はScala 2の標準ライブラリを使っているとのことだった。
話を詳しく聞くと・・・
- Scala 3はScala 2の標準ライブラリを使っている
- Scala 3独自の機能(Mirrorなど)はScala 3のリポジトリに置いてあり、Scala 3のコンパイラはこれを使っている
lampepfl/dotty
のlibrary/
に収められている- 例: dotty/library/src/scala/deriving/Mirror.scala at 3.3.1 · lampepfl/dotty · GitHub
- 一方、コレクションなどはそのままScala 2のライブラリを流用しており、これらのソースコードはScala 2のリポジトリに置いてある
scala/scala
に収められている
- Scala 3独自の機能(Mirrorなど)はScala 3のリポジトリに置いてあり、Scala 3のコンパイラはこれを使っている
とのことだった。分かってしまえばそんなに難しくない。使う側はあまり気にしなくてよい。
どうしてこういうことができるのか
実は、Scala 2と3は相互運用できます。
- ソースコードレベル
- 文法が改善されているが、大部分はそのまま使える
- クラスパスレベル
- Scala 3コンパイラ(dotty)はScala 2のライブラリを読める
- 逆に、Scala 2コンパイラはScala 3のライブラリを読める(コンパイラオプション
-Ytasty-reader
で対応させる)
Scala 3を学ぶにあたってScala 2も学んだほうがいい?
前述の通り、文法レベルでは一部を除いてはたいした変化がないので(using
とimplicit
の違いが一番大きい差分だと思います)、Scala 3をやりたいからといってScala 2の文法が必須になるとは思っていません。
ただ、Scala 3からScala 2のライブラリを呼び出せることから、ライブラリの動作を詳しく把握しておきたい、という場合は読めたほうが良いと思いますが、 普通にこれからScala 3勉強するよ〜という場合は、気にしなくて良いと思います。気になったら勉強するで十分よいです。