KotlinとScalaの違い (部分的な翻訳: Kotlin vs Scala: Which Problems Do They Solve?)
はじめに
KotlinろScalaって何が違うんだろう?って思っていろいろ探してみたところ、英語の記事があってわかりやすかったので、役に立ちそうな部分だけ部分的に翻訳してみました。1語1語訳していくと大変だし、ざっくり知りたい人には必要ないかなと思うので、けっこう省いて日本語にしてます。
時間がない人は、この記事の最後の方の「まとめ」部分だけを読んだら良いと思います。
間違いなどあったらごめんなさい。間違いを指摘してただけると助かります・・・。
そして、ぜひ原文も参考にしてください。
元記事
https://superkotlin.com/kotlin-vs-scala/
KotlinとScalaの違い
近年、ScalaとKotlinがJavaに対抗して人気をあげています。少なくともJVMを使おうとしたときには、ScalaとKotlinを使うことが討されると思います。
ScalaとKotlinは「より良いJavaを提供する」という同じ目的のもと作られていますが、異なるのが目的へのアプローチ方法です。
まず、Scalaは学者たちによって生み出され、Kotlinはソフトウェア会社で作られています。Scalaは関数型言語や異なるプログラミングパラダイムを1つの言語に入れて、何かすごいものを作ってみようという姿勢で作られています。一方、Kotlinは、コンパイル時間を短くしたりツールの充実などを図るなど、ソフトウェア開発の現場で起こる現実的な問題を解決するために作られています。
Scalaのすごいところは、JVM上で動く、新しい静的言語を作れると証明したところにあります。その後、かなりの時間が経ってからKotlinが出現し、その頃にはJVM上で走る新言語を考えることよりも、実用的に使えることを重要視するようになっていました。
以下では、KotlinとScalaを比較していきますが、技術的な機能ではなく、使い方の面で比較をしていきます。まず、2つの言語の機能の概要を見ます。その後、何のために作られた言語なのか、に焦点をあてて見ていきます。
Javaの何が悪い?
KotlinもScalaもJVM上で走るため、Javaとよく比較されます。では、Javaにはなにか悪いところがあるのでしょうか?
Javaは「一度書いたらどこでも使える」という売り文句で、またたく間に世に広がりました。
おそらく、世界で一番使われているプログラミング言語はJavaでしょう。世界中の企業で使われ、大学の授業でも広く使われています。
Cより成長しC++よりきれいな言語であるJavaですが、最近では他の言語に遅れをとっています。C#と比べて劣ると言う人も多くいます。
「もっとJavaが生産性の高い言語だったらいいのに」「もっと楽に楽しく使える言語だったらいいのに」と思う企業やプログラマーは多いことでしょう。また、Javaの言語仕様上の制約があり、その制約のために批判があるのも確かです。しかし、だからと言って、そう簡単にJavaを変えることはできません。すでに世界中で広く使われているために、悪い部分があっても根幹部分を変えることができないのです。(いきなりJavaそのものを変えたら、いままで作ったものが動かなくなってしまいますからね・・・。)
KotlinとScalaの主な違い
オブジェクト指向
Javaはオブジェクト指向の言語ですが、Java内のすべてのものがオブジェクトというわけではありません。例えば、intはプリミティブ型です。ScalaとKotlinではすべてがオブジェクトであり、オブジェクトとして扱えます。
また、ScalaとKotlinは他のプログラミングパラダイムを取り込んでいます。Kotlinは主にオブジェクト思考ですが、普段のプログラミングで便利であろう機能を他のプログラミングパラダイムから取り込んでいます。
関数型プログラミング
Kotlinは関数型プログラミングのすべての機能をサポートしているわけではありませんが、ラムダ式や高階関数などの関数型プログラミングの機能をサポートしています。たとえば、以下の機能をサポートしています。
- ユーティリティークラスを作ってメソッドをまとめなくても、関数だけを作るだけでOK。
- Kotlinはstatementsではなくexpressionsを定義できるので、ifの結果などを変数に格納することができます。
- var ではなく val を使えばイミュータブルなデータを作れます。final などの修飾子は必要ありません。
Scalaは関数型プログラミングパラダイムとオブジェクト指向プログラミングパラダイムの両方をサポートしています。Scalaを作った目的はまさにそれでした。Haskellで見られるカリー化、メモ化、Partial application、type classesなどのほとんどの機能を持っています。このような機能はKotlinやJavaにはありません。
Javaとの相互運用性
KotlinはJavaで動くことを考えられて設計された言語
KotlinはJavaとの相互運用性があるように作られた言語です。さらに言えば、Javaとの相互運用性を高めるための機能も意図的に実装されています。たとえば、JavaからKotlinのコードを簡単に呼び出せる仕組みも備わっています。ですので、レガシーなアプリケーションはJavaで開発し、新規開発はKotlinで行う、ということも可能です。
AndroidでKotlinがこれだけ人気があるのは、KotlinがJava 6(現在のAndroidのJavaバージョン)と相互運用性があるからでしょう。
Javaとの相互運用性が高いのは偶然ではなく、そもそもJetBrains社がKotlinを設計するときに当時のJavaの状況を考慮して設計していたからです。どうしたらKotlinをもっと使いやすくできるかを考えて設計されています。その結果が、バイトコードの構成という点にまとめられます。そして、この点が、CordaがScalaではなくKotlinを選んだ理由の1つになっています。
ScalaはJavaで動かすことは可能
より簡単にデプロイできるように、ScalaはJVMプラットフォームで動くように作られました。しかしながら、相互運用性は一番の目的ではありませんでした。少し、言語の機能に関わる技術的な話になりますが、例えば、Scalaを動かすためにはJava 8が必要です。
これを踏まえると、すでにあるJavaコードベースをScalaから使えるかといえば使うことはできますが、ScalaとJavaを行ったり来たりしながらの開発は難しく、Scalaの想定されたユースケースではありません。
関数型プログラミングとオブジェクト指向プログラミングをサポートするために、Scalaでは互換性も犠牲にされています。もし、Scalaの高度な機能を使おうとすると、JavaからはScalaの高度な機能をうまく使えなくなってしまうでしょう。仮にできたとしても、Javaプログラマーはどのように使っていいのかはわからないでしょう。
哲学の違い
今日、成功を収めている言語の多くは、明確な目的とその言語がどうあるべきか、はっきりとした哲学を持っています。KotlinとScalaも例外ではありません。Kotlinはより良いJavaになることを目指し、ScalaはJavaを超えた言語になろうとしています。
Kotlinはより良いJava
Kotlinについては、当初の目的をすでに達成したと言って良いかもしれません。なんと言っても、Javaの他にAddroidの開発言語として正式サポートされた最初の言語はKotlinですから。それはつまり、JavaコミュニティがKotlinを気に入ったということ、そして、KotlinはJava開発者にとって受け入れやすいということを意味します。
Kotlinは実用性の高い言語であり、Java開発者にとっても親しみやすく、高い生産性を実現できる言語です。基本的には、Javaのような言語にしようとしていますが、その上にC#や、さらにはScalaの機能を取り込んでいます。Java開発者が欲しがるようなラムダ式や関数型プログラミングの基本的な機能、そしてプログラミングを楽にしてくれるsmart castingやnon-nullable typeの機能を追加されています。これらにより、いままで冗長だったコードを簡潔に書くことができます。
Kotlinでは関数型プログラミングがある程度サポートされていますが、それは手続き型/命令型プログラミングをより簡単にするためだけのものしかサポートされていません(例えば、個々の関数は独立して第一級オブジェクトとして扱えます)。Kotlinはガチガチな関数型言語になろうとしているのではなく、シンプルであることを優先しています。
ScalaはJavaを超えようとしている言語
ScalaはKotlinとはまったく別の目的を持っています。Scalaの目的はJavaより強力な言語、Javaではできないことができる言語、を作ることでした。
Scalaでは、オブジェクト指向プログラミングに加えて、高度な関数型プログラミングもサポートされています。そのためにScalaは複雑になり、学んだり使ったりするのが難しいという評判がつくようになりました。もちろんこれは言語自体に問題があるのではなく、単純に多くのことができる言語であるために多くのことを学ぶ必要があるのです。
もちろんのこと、正しく使えばメリットは大きいですが、正しく使わなければメリットは出なくなります。Scalaでは複数のプログラミングスタイルが存在し、どのスタイルがベストなのかは混乱のもとにもなっています。これにより、開発コストは高くなり、Scala開発者の収入も高水準であり、あなたの立場が開発者なのかそれとも開発者を雇う企業なのかによって、これは良い点にも悪い点にもなります。
言語を囲む世界
コミュニティ
Scalaの方が大きいコミュニティを持っています。言語の良し悪しは別にして、Scalaの方が長く存在しているのですから、もしかしたらそれは当然のことなのかもしれません。唯一、これが当てはまらないのはAndroid開発でしょう。Kotlinの人気の高さは、2017 Google I/OでのKotlin発表の様子からも明らかでしょう。
Kotlinのネイティブライブラリーがあまり充実していないことは、Javaとの互換性を取ることでいくらか軽減されているでしょう。しかし、堅牢なKotlinライブラリーはScalaやJavaのようには十分開発はされていません。
ドキュメント、学習しやすさ
どちらの言語もドキュメントは充実しています(古かったScalaウェブサイトも今では最新にアップデートされています)。Scalaを使う際には、まず開発者をトレーニングして、Scalaに慣れさせてから自身の開発スタイルを学習させる必要があります。Java開発者に数日ほどのトレーニングを受けさせれば、Scalaが使えるようになると思ってはいけません。そもそもJava開発者は、関数型プログラミングが何かも知らないかもしれませんから。それくらいScalaはJavaとは違うのです。
Kotlinは学びやすい言語であり、また、さらに実際に動かしてみることはさらに簡単です。オンラインの実行環境もあり、そこにはサンプルもあり、さらにJavaコードをKotlinに変換することもできます。なので、JavaでやっていたことをKotlinでどのように実装したら良いかがすぐにわかります。
ツール
ScalaとKotlinはどちらも静的型付けであり、コンパイル時チェックと静的分析ツールを利用できます。理論上は、どちらも同じポテンシャルを持っていると言えるでしょう。しかし、現状、Kotlinの方がツールは充実しています。名の知れたプログラミングツール開発会社であるJetBrains社がKotlinの開発元であることを考えると、驚くことではないでしょうが。ドキュメントについてはScalaが劣っているというよりは、Kotlinのドキュメントが素晴らしすぎるといったところでしょう。
以前は、Scalaの公式ウェブサイトでEclipseをベースとしたIDEを提供していました。今では、IntelliJのScalaブラグインを使うことが勧められています。
一方、KotlinはすでにIntelliJ IDEAとAndroid Studioに組み込まれており、Eclipseにもプラグインが用意されています。さらに、IntelliJ IDEAには前述の変換ツールとオンラインサンプルがあり、Javaのクラスを簡単に変換してKotlinをインタラクティブに学習することができます。もちろん、スタンドアローンのコンパイラーを使い、自身の開発方法に合わせてKotlinを使うこともできます。
まとめ
Kotlinは開発工程の全体を見据えて作られた言語を言えるでしょう。ある機能が必要かどうか、コンパイラーの速度にどのように影響を与えるか、ツールを作ることが難しくなるだろうか、など、各設計がどのように開発のエクスペリエンスにインパクトを与えるかを考えて作られています。
Scalaは実用性を第一として考えられておらず、それとは別の目的(Javaより強力な言語、Javaでできないことができる言語を作ること)を持っています。ScalaはC++に似ていて、とても豊富な機能が詰め込まれています。しかし、これが万人にとって使いやすい言語かというと、そうとは言えないのではないかと筆者は思います。
Javaよりも良い言語を求める人たち、そして、Javaに満足しきれなかった人たちがScalaを使い始めました。前者のほとんどはScalaに満足していますが、後者はScalaの複雑さに困惑させられることになります。それは当然のことで、ScalaはJavaからは別物なのですから。そのような人たちにはKotlinがより良いチョイスとなるでしょう。