web-dev-qa-db-ja.com

ScalaとGroovyの主な違いは何ですか?

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

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

どちらも、ラムダとクロージャーを持ち、Javaと相互運用するJVMのオブジェクト指向言語です。それ以外は、彼らは非常に異なっています。

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

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

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

Scalaは、RubyとJavaの両方によって構文的に影響を受けます。Java、SML、Haskell、およびgBetaと呼ばれる非常に不明瞭なOO言語によって意味的に影響を受けます。

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

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です。

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

225
James Iry

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

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

12
hamsterofdeath

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

11
jasonnerothin

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

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

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

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

7
Don Werve

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

5
More Than Five

Groovyは広く使用されており、プロトタイピングだけでなく、生産品質のWebアプリケーションの開発に非常に優れていると自信を持って言えます。非常に使いやすく、迅速な開発が可能なため、Groovyから開発者を引き離して、私の経験ではJavaをしばらく使用した後で計画することは困難です。

私はScalaをあまり使用していないので、それについてあまり語ることはできません。

Scalaにはダイナミカのコンパイルもあり、Twitterのeval lib( https://github.com/Twitter/util )を使用して行っています。 scalaコードをフラットファイル(拡張子なし)に保存し、実行時にevalを使用して作成したscalaクラス。scalaはメタプログラミングであり、動的な合併症の機能があります

0