[解決済み] ScalaとGroovyの主な違いは何ですか?[クローズド]
質問
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です。
誰が勝つのでしょうか? 私の水晶玉は他の人と同じように割れています。
関連
-
[解決済み] Scalaでステートメントの間にN秒待つには?
-
[解決済み] Scalaのオブジェクトとクラスの違い
-
[解決済み] self-typesとtrait subclassの違いは何ですか?
-
[解決済み】ScalaのHigher kinded typeとは何ですか?
-
[解決済み】コマンドラインパラメータを解析する最良の方法?[クローズド]
-
[解決済み】ScalaのCaseオブジェクトとEnumerationsの比較
-
[解決済み】Scalaの名前による呼び出しと値による呼び出し、明確化の必要性
-
[解決済み】ScalaのJavaConvertersとJavaConversionsの違いは何ですか?
-
[解決済み] Scalaの識別子 "implicitly "とは?
-
[解決済み] Scalaのパターンマッチングシステムで比較演算子を使う
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】scalacコンパイルで "object apache is not a member of package org "と表示される。
-
[解決済み] expr() での lit() の使用について
-
[解決済み] scala.Float to java.Float k/v変換でScala MapをJava Mapに変換するにはどうしたらいいですか?
-
[解決済み] Traitの代わりに抽象クラスを使用する利点は何ですか?
-
[解決済み] Scalaでファイル全体を読む?
-
[解決済み] Scalaのapply関数とは何ですか?
-
[解決済み】ScalaのCaseオブジェクトとEnumerationsの比較
-
[解決済み】Scalaでケースクラスのインスタンスをクローンして、1つのフィールドだけを変更するにはどうすればよいですか?
-
[解決済み】Scalaで`:_*`(コロン・アンダースコア・スター)は何をするのですか?
-
[解決済み】ScalaでVectorを選択するのはどんなとき?