1. ホーム
  2. scala

[解決済み] ScalaとGroovyの主な違いは何ですか?[クローズド]

2022-06-27 08:30:49

質問

Scalaが静的型付け、Groovyが動的型付けであることを除けば、表面上はGroovyとScalaはかなり似ています。

  • その他の主な違いや、それぞれが持つ利点は何でしょうか?
  • 実際のところ、両者はどの程度似ているのでしょうか?
  • この2つの間に競争はあるのでしょうか?
    • もしそうなら、長い目で見てどちらが勝つと思いますか?

どのように解決するのですか?

どちらもJVM用のオブジェクト指向言語で、ラムダとクロージャを持ち、Javaと相互運用が可能です。 それ以外は全く違うものです。

Groovyは動的型付けだけでなく、動的メタプログラミングをサポートするという意味で、quot;dynamic"言語である。

Scala は静的型付け言語であり、Java でできる厄介なこと以上の動的なメタプログラミングを事実上持っていない、という意味で "static" です。 Scalaの静的型付けシステムは、Javaの型付けシステムよりもはるかに均一で洗練されていることに注意してください。

Groovyは構文的にはJavaの影響を受けていますが、意味的にはRubyのような言語の影響をより強く受けています。

Scalaは構文的にはRubyとJavaの両方から影響を受けています。 意味的にはJava、SML、Haskell、そしてgBetaと呼ばれる非常に無名のOO言語からより多くの影響を受けています。

Groovyは、Javaのオーバーロードを処理する方法によって、quot;accidental" multiple dispatchを持っています。

Scalaは単一ディスパッチのみですが、多重ディスパッチが扱うことを意図しているのと同じ種類の問題のいくつかに対処するために、SMLに触発されたパターンマッチングを持っています。 しかし、マルチプルディスパッチが実行時の型にしかディスパッチできないのに対し、Scalaのパターンマッチは実行時の型、値、またはその両方にディスパッチすることが可能です。 また,パターンマッチには,構文的に快適な変数バインディングも含まれています. この機能だけで、Scalaでのプログラミングがどれだけ快適なものになるか、言い尽くすことができないほどです。

ScalaとGroovyはどちらもmixinによる多重継承をサポートしています(Scalaはtraitと呼んでいます)。

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

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

ScalaもGroovyもデフォルトではeagerly評価です。 しかし、Scalaはcall-by-nameパラメータをサポートしています。Groovyはそうではありません。call-by-nameはクロージャでエミュレートする必要があります。

Scalaには、他の言語で見られるリスト内包を一般化した"for comprehensionsがあります(厳密にはモナド内包に少し手を加えたもので、HaskellのdoとC#のLINQの間のようなものです)。

Scala にはフィールド、内部クラス、メソッドなどの静的な概念がありません。 Groovyはstaticの概念を使っています。

Scalaは、Groovyのように算術演算子を選択することができません。

Scalaでは、非常に柔軟にメソッド名を付けることができます。

Groovyには、nullを扱うためのelvis演算子があります。 Scalaのプログラマはnullを使うよりOption型を使いたがりますが、Scalaでelvis演算子を書こうと思えば簡単に書けるのです。

最後に、嘘もあれば、とんでもない嘘もあり、そしてベンチマークもあります。 コンピュータ言語のベンチマークゲームでは、ScalaはGroovyよりもかなり速く(2倍から93倍まで)、ソースサイズはほぼ同じという評価でした。 ベンチマーク .

私がカバーしていない多くの相違点があることは確かです。 しかし、これで概要がつかめれば幸いです。

両者の間に競争はあるのでしょうか? もちろんそうですが、あなたが思うほどではありません。Groovyの本当の競争相手はJRubyとJythonです。

誰が勝つのでしょうか? 私の水晶玉は他の人と同じように割れています。