ScalaとGroovyの主な違いは何ですか?[閉まっている]


128

表面的には、GroovyとScalaはかなり似ていますが、Scalaが静的に型付けされている点と、Groovyが動的に型付けされている点は別です。

  • 他の主な違いは何ですか?それぞれに他の利点がありますか?
  • 彼らは本当にどれくらい似ていますか?
  • 2つの間に競争はありますか?
    • もしそうなら、あなたは長期的に誰が勝つと思いますか?

Groovy 2.0には静的型付けも含まれています:infoq.com/articles/new-groovy-20
HDave

回答:


230

どちらもJVMのオブジェクト指向言語であり、ラムダとクロージャーがあり、Javaと相互運用できます。それ以外は、非常に異なります。

Groovyは、動的に型付けされるという意味だけでなく、動的メタプログラミングをサポートするという意味でも「動的」言語です。

Scalaは「静的」言語であり、静的に型付けされており、Javaで実行できる厄介なものを超える動的メタプログラミングは事実上ありません。Scalaの静的型システムは、Javaのものよりも実質的に均一で洗練されています。

Groovyは構文的にはJavaの影響を受けますが、意味的にはRubyなどの言語の影響を受けます。

Scalaは構文的にRubyとJavaの両方に影響を受けます。意味的には、Java、SML、Haskell、およびgBetaと呼ばれる非常にあいまいなOO言語の影響をより強く受けます。

Javaオーバーロードの処理方法が原因で、Groovyに「偶発的」な複数のディスパッチが発生します。

Scalaは単一のディスパッチのみですが、SMLに触発されたパターンマッチングにより、複数のディスパッチが処理することを意図した同じ種類の問題のいくつかを処理します。ただし、複数のディスパッチがランタイムタイプでのみディスパッチできる場合、Scalaのパターンマッチングはランタイムタイプ、値、またはその両方でディスパッチできます。パターンマッチングには、構文的に快適な変数バインディングも含まれます。この単一の機能だけでScalaでのプログラミングがどれほど快適になるかを強調するのは難しいことです。

ScalaとGroovyはどちらも、ミックスインによる多重継承の形式をサポートしています(ただし、Scalaはそれらをトレイトと呼びます)。

Scalaは部分的な関数の適用と言語レベルでのカリー化の両方をサポートします。Groovyは部分的な関数の適用を行うための厄介な「カレー」メソッドを持っています。

Scalaは直接テール再帰の最適化を行います。Groovyがそうだとは思わない。これは関数型プログラミングでは重要ですが、命令型プログラミングではそれほど重要ではありません。

ScalaとGroovyはどちらもデフォルトで熱心に評価されます。ただし、Scalaは名前による呼び出しパラメーターをサポートしています。Groovyではサポートされていません。名前による呼び出しは、クロージャーでエミュレートする必要があります。

Scalaには、他の言語で見られるリスト内包表記の一般化である「内包表記」があります(技術的には、モナド内包表記に少し加えて、HaskellのdoとC#のLINQの間のどこかです)。

Scalaには「静的」フィールド、内部クラス、メソッドなどの概念はありません。代わりにシングルトンオブジェクトを使用します。Groovyは静的な概念を使用しています。

Scalaには、Groovyのように組み込みの算術演算子がありません。Scalaでは、メソッドに非常に柔軟に名前を付けることができます。

Groovyには、nullを処理するためのelvis演算子があります。Scalaプログラマーは、nullを使用するよりもOption型を使用することを好みますが、必要に応じてScalaでelvis演算子を記述するのは簡単です。

最後に、嘘があり、いまいましい嘘があり、それからベンチマークがあります。コンピューター言語のベンチマークゲームでは、ScalaはGroovyよりもかなり高速(2倍から93倍の範囲)であり、ソースサイズはほぼ同じです。ベンチマーク

私がカバーしていない多くの、多くの違いがあると私は確信しています。しかしうまくいけば、これはあなたに要点を与えます。

それらの間に競争はありますか?はい、もちろんですが、あなたが思うほどではありません。Groovyの本当の競争は、JRubyとJythonです。

誰が勝ちますか?私の水晶玉は他の人と同じくらいひび割れています。


21
大学にjavaだけでなくこれらの言語を教えるようにさせることができれば、どちらにとっても有利になります=)
Chii

13
不変性はScalaの重要な特徴ではありませんか?並行性とアクターについてはどうですか?もっと教えてください...
レオネル

4
競争がある場合は、Clojureを使用しますが、Clojureは競争に興味がありません。
レイン、

2
Scalaはjava(ホットスポットは簡単にインライン化できる)と同じ静的型付きメソッドディスパッチを使用し、groovyは動的メソッドディスパッチを実行するため、GroovyがScalaのパフォーマンスに近づくのは非常に困難です。特に、Javaのオートボクシングを最適化するために@specializedを使用すると、ScalaはJavaよりも高速になる場合があります。ただし、Groovyの使用例は、Ruby / Pythonの使用に似ています。これは、パフォーマンスが通常それほど問題にならない、使いやすい動的に型付けされたスクリプト言語の場合です。たとえば、多くのGroovyフレームワークには、(Grailsのような)パフォーマンスのための大量のJavaコードが含まれています
James Strachan 2010

4
この回答は非常に多くの票を持っているので、修正したい部分があります。Groovyの継承ベースのマルチメソッドが偶然に始まったのは正しいですが、Jamesを含むGroovy Developers Conferenceで、Groovy 1.0よりもずっと前にそれを維持することにしました。これを変更することは難しくなかったでしょう。また、ジェームズが書いたものに追加するには... invokedynamicは、彼が話しているその障壁を
取り除きました

12

scalaはoo / functionハイブリッド言語であることを意図しており、非常によく計画および設計されています。groovyは、多くの人がJavaで使用したい拡張機能のセットに似ています。私は両方を詳しく調べたので、私は言うことができます:)

それらのどちらも、他よりも良くも悪くもありません。groovyはメタプログラミングが非常に得意で、scalaはメタプログラミングを必要としないものすべてが非常に得意なので、両方を使用する傾向があります。


11

Scalaにはアクターがあり、同時実行をはるかに簡単に実装できます。真のタイプセーフな多重継承を提供する特性。


9
将来の参考のために、GParsまたはAkkaを介したGroovyも同様です。
Xorlev

4
将来の参考のために、Groovyも特性を介してそうです
vicsz


7

静的および動的タイピングで頭の釘を打ちました。どちらも、クロージャー、ラムダ式など、新世代の動的言語の一部です。この2つの間にはわずかな構文の違いもありますが、機能的には、GroovyとScalaの間に大きな違いはありません。

Scalaはリストを少し異なって実装します。Groovyでは、ほとんどすべてがjava.util.Listのインスタンスですが、Scalaはリストとプリミティブ配列の両方を使用します。Groovyの方が(私が思うに)文字列補間が優れています。

Scalaの方が高速のようですが、Groovyの人々は2.0リリースのパフォーマンスを本当に向上させています。1.6は1.5シリーズよりも速度が大幅に向上しました。

2つの異なるクラスの問題を対象としているため、どちらの言語も実際には「勝つ」とは思わない。Scalaは、Javaとまったく同じレベルのボイラープレートを持たない、非常にJavaのような高性能言語です。Groovyは、プロトタイピングと開発を迅速に行うためのものであり、プログラマーがコードを実装するのにかかる時間ほど速度は重要ではありません。


3
「Groovyはラピッドプロトタイピングと開発用です」-これは、Groovyが私が反対する本番環境での使用には適していないことを示唆しています。たとえば、Grailsのサイトはプロダクションでかなり多く使用されています
–Dónal

10
Scalaは動的言語ではありません。
John Oxley、2011年

2
「Groovyは(私が思うに)文字列補間が優れています。」-Scala-2.10.0では、これは真実ではありません(Scalaはクールな文字列補間を取得しました)。
VasiliNovikov 2013

5

ScalaはGroovyよりも学習曲線が急です。Scalaは、パターンマッチングとテールベースの再帰により、関数型プログラミングをはるかにサポートしています。つまり、純粋なFP向けのツールが増えています。


0

Scalaにはdynamicaコンパイルもあり、私はtwitter eval lib(https://github.com/twitter/util)を使用してそれを実行しました。Scalaコードをフラットファイル(拡張子なし)に保持し、実行時にevalで作成されたscalaクラスを使用しました。scalaはメタプログラミングであり、動的な複雑化の機能があると思います

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.