回答:
どちらも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です。
誰が勝ちますか?私の水晶玉は他の人と同じくらいひび割れています。
静的および動的タイピングで頭の釘を打ちました。どちらも、クロージャー、ラムダ式など、新世代の動的言語の一部です。この2つの間にはわずかな構文の違いもありますが、機能的には、GroovyとScalaの間に大きな違いはありません。
Scalaはリストを少し異なって実装します。Groovyでは、ほとんどすべてがjava.util.Listのインスタンスですが、Scalaはリストとプリミティブ配列の両方を使用します。Groovyの方が(私が思うに)文字列補間が優れています。
Scalaの方が高速のようですが、Groovyの人々は2.0リリースのパフォーマンスを本当に向上させています。1.6は1.5シリーズよりも速度が大幅に向上しました。
2つの異なるクラスの問題を対象としているため、どちらの言語も実際には「勝つ」とは思わない。Scalaは、Javaとまったく同じレベルのボイラープレートを持たない、非常にJavaのような高性能言語です。Groovyは、プロトタイピングと開発を迅速に行うためのものであり、プログラマーがコードを実装するのにかかる時間ほど速度は重要ではありません。
Scalaにはdynamicaコンパイルもあり、私はtwitter eval lib(https://github.com/twitter/util)を使用してそれを実行しました。Scalaコードをフラットファイル(拡張子なし)に保持し、実行時にevalで作成されたscalaクラスを使用しました。scalaはメタプログラミングであり、動的な複雑化の機能があると思います