Scala vs. Groovy vs. Clojure [終了]


676

Scala、Groovy、Clojureの主な違いについて誰かが説明してくれませんか。JVMで実行するためにこれらの各コンパイルを知っていますが、それらを単純に比較したいと思います。

回答:


873

Groovyは動的に型付けされた言語であり、その構文はJavaに非常に近く、多くの構文を改善することでコードの軽量化とボイラープレートの削減を実現しています。インタプリタを介して実行することも、コンパイルすることもできるため、新しい構文(Javaを知っていることが前提)を習得することなく、高速プロトタイピング、スクリプト、動的言語の学習に適しています。Groovy 2.0以降、静的コンパイルのサポートも増加しています。Groovyはクロージャーをサポートし、多少関数型のプログラミングをサポートしていますが、関数型プログラミングの従来の定義とはかなりかけ離れています。

Clojureは、ソフトウェアトランザクションメモリなどのいくつかの高度な機能を備えたLispの方言です。Lispが好きで、JVMでLispのようなものを使用したい場合は、Clojureが最適です。それはおそらくJVM上で実行されている最も機能的な言語であり、確かに最も有名な言語です。また、他のLisp方言よりも不変性に重点が置かれているため、関数型言語の愛好家の心に近づきます。

ScalaはJavaよりも完全にオブジェクト指向の言語であり、非研究言語で利用できる最も高度な型システムの 1つであり、JVMで確かに最も高度な型システムです。また、オブジェクト指向を損なうことなく、関数型言語の多くの概念と機能を組み合わせていますが、関数型言語の特性に対する妥協は、後者の一部の愛好家を先延ばしにしています。

Groovyは、Grailsで広く受け入れられ、人気のあるWebフレームワークを持っています。また、Mavenに代わる人気の高いGradleビルドシステムにも対応しています。個人的には、JythonとJRubyが他のものと比較してJVMランドに浸透し始めているので、それは実用性が限られている言語だと思います。

Clojureは、いくつかの非常に興味深い機能を割り引いても、JVMのLisp方言であるというだけの強い魅力を持っています。それはその人気を制限するかもしれません、当然ですが、私はそれがその周りに長い間忠実なコミュニティを持つことを期待しています。

ScalaはJavaと直接競合することができ、ほとんどすべての面でお金を稼ぐことができます。もちろん、現時点で人気を競うことはできません。強力な企業支援の欠如は、企業環境での受け入れを妨げる可能性があります。また、言語の進化という意味では、Javaよりもはるかに動的な言語です。言語の観点からは、それは良いことです。何千行ものコードを記述することを計画しているユーザーの観点から、そうではありません。

最後の開示として、私はScalaに非常に精通しており、他の2つだけを知っています。


1
良いですね。ScalaにはLightbendの企業支援があり、LinkedIn、Twitter、Sparkなどの大手企業や多くの銀行で使用されています。私が作業している場所にはScalaの11百万行のコードベースがありますが、これは良いアイデアではありませんが、機能します。
ジョーン

219

Scala

ScalaはFunnelと呼ばれる純粋な関数型言語から発展し、ほとんどすべてのJavaの構文のクリーンルーム実装を表しており、明確な改善が可能な場所や言語の機能的な性質が損なわれる場所のみが異なります。このような違いには、静的メソッドの代わりにシングルトンオブジェクトや型推論が含まれます。

これの多くは、Martin Oderskyが以前にPizza言語を使用して行った作業に基づいています。OO / FP統合は単なる閉鎖をはるかに超えており、言語はポストファンクショナルとして記述されています。

それにもかかわらず、多くの点でJavaに最も近い。これは主に、OOサポートと静的型付けの組み合わせによるものですが、Javaと非常に緊密に統合する必要があるという言語設計の明確な目標も原因です。

グルーヴィー

Groovyは、Javaの最大の批判の2つに明示的に取り組んでいます。

  • 動的に型付けされるため、多くのボイラープレートが削除され、
  • 言語にクロージャーを追加する。

おそらく構文的にはJavaに最も近く、ClojureとScalaが提供する豊富な機能構成の一部は提供していませんが、特にスクリプトスタイルのプログラムを記述するために、明確な進化的改善を提供しています。

Groovyは、主にスプリングソースを介して、3つの言語の最も強力な商業的裏付けを持っています。

Clojure

ClojureはLISPファミリーの関数型言語であり、動的に型付けされます。

STMサポートなどの機能は、すぐに使用できる並行処理サポートを提供しますが、Scalaはこれを複製するためにAkkaなどのサードパーティライブラリを必要とします。

構文的には、典型的なJavaコードから3つの言語の中で最も遠いものでもあります。

また、私はScalaに精通していることも開示する必要があります。


11
これまでこのファネル言語について聞いたことがありません。歴史的記録の小さなギャップを埋めてくれてありがとう。
Randall Schulz

8
Clojureを純粋な関数型言語と呼ぶことはできません。命令型コードを書くことは確かに可能です。
dbyrne

2
Scalaには、アクターベースの並行処理用のAkkaライブラリが組み込まれています。これは、サードパーティの依存関係ではなくなりました。
scott m gardner 2014年

2
@Orubelバイトコードでは、Scalaクラスは同等のJavaクラスと同じです(型など)。適例として、Akka Java API全体がScalaで作成されています。「統合できない」という意味をここで説明してください。私にはFUDのように表示されます。
Kevin Wright

3
そのドキュメントを要約すると、「Javaに存在しないScala機能をJavaで直接使用することはできません」。ただし...抽象型メンバーとより種類の高い型はかなり高度な機能であり、必ずしも使用する必要はありません。また、JavaはGroovyのパラメーター、ビルダー、または拡張モジュールなしでメソッドを使用できないため、独自の定義ではGroovyを「緊密に統合」できません。
Kevin Wright

68

clojureで遊ぶ時間がなかった。しかし、Scala対Groovyの場合、これはJames Strachanの言葉です-Groovyクリエイター

「しかし、javacの長期的な置き換えとしての私のヒントはScalaです。私はそれに非常に感銘を受けました。2003年に、Martin Odersky、Lex Spoon&Bill Vennersによる 『Programming in Scala』の本を誰かが見せてくれたなら、正直に言うことができます。おそらくGroovyを作成したことはないでしょう。」

あなたはここですべての物語を読むことができます


72
このステートメントは、ScalaがGroovyよりも優れていると言っているのではないことに注意してください。ジェームズはまた、言語を作成することがどれほど厄介であるかを知っていれば、言語を作成したことはなかったと言っていることでも知られています。この文脈で見ると、なぜ彼がGroovyを開発しなかったのかは明らかです。そして、私はあえて彼が多くの良いアイデアを提供したと言っても、彼は現在のGroovyの作成者ではありません。彼は2007年の1.0よりずっと前にプロジェクトを去り、それ以来参加していません。少なくとも彼と一緒にいたのと同じくらい、プロジェクトには彼がいません。
ブラックドラッグ

31
James StrachanがKotlin言語に積極的に取り組んでいることを考えると、Scalaは明らかに彼にとって十分な印象を与えません。
bdkosher 2013年

6
@bdkosher彼は、Scalaがほとんどのプログラマーにとって印象的すぎるため、そして(さらに重要なことに)複雑すぎる場所もあるので、彼はそれに取り組んでいます
表示名

30

それらはどこから来ているのか、または彼らが主に対象としている開発者によって区別することができます。

Groovyは、Javaのスクリプトバージョンに少し似ています。長い間Javaプログラマーは、大きなアーキテクチャーに支えられたアジャイルアプリケーションを構築するとき、くつろいでいます。Grails上のGroovyは、その名前がRailsフレームワークに似ていることを示唆しているとおりです。常にJavaの冗長性を気にしたくない人のために。

Scalaはオブジェクト指向で関数型のプログラミング言語であり、RubyまたはPythonのプログラマーはこの言語に近いと感じるかもしれません。これは、これらのプログラミング言語に見られる一般的な優れたアイデアを数多く採用しています。

ClojureはLispプログラミング言語の方言なので、Lisp、Scheme、またはHaskellの開発者は、この言語で開発しているときに居心地よく感じることができます。


24
Scalaは実際には関数型プログラミング言語ではありません。それは、最初にオブジェクト指向プログラミング言語であり、機能的な機能を備えています。
ダニエルC.ソブラル

16
私は言わなければならない、この答えは暗闇の中でのショットによく似ています。PythonがScalaよりGroovyに近いことと、Rubyが(私の意見では)上記のいずれにも近すぎず、おそらくGroovyに最も近いことは、良いケースになると思います。Haskellは(一般的な)LispやSchemeにあまり似ていません(したがって、Clojureにはあまり似ていません)。私には、この答えは(よくても!)「私にもわかりません、ウィキペディアで教えてください」のように感じます。
ジョンY

21
Scalaは、いくつかの機能を備えた命令型言語です。関数型の世界のイディオムを採用した直後に人々が言語を関数型と呼び続ければ、その用語は単なる別のマーケティング用語になります。C ++の機能とHaskell命令を呼び出すこともできます。
ジョンハンソン、2009

9
@alanlcode Oderskyは彼が望んでいることを言うかもしれません。Scalaには副作用を分離するためのシステムがなく、デフォルトではレイジーではなく、コードをデータとして扱いません- 関数呼び出しをデータとして扱いますが、これは異なります。あなたが完全に機能したい場合、これらは大きな問題です。一方、Scalaは、オブジェクトモデルに欠陥がないことを確実にするために、あらゆる方法をとっています。私はScalaが大好きですが、明らかに2番目に機能的です。
ダニエルC.ソブラル

7
一方、言語のMLファミリは関数型として認識されていますが、厳格であり、副作用/命令型コードを許可しています。
GClaramunt、2009年

8

スコットデイヴィスによるPragmatic Programmersの本「Groovy Recipes:Greasing the wheel of Java」を読んでいます。著作権2008で、同年4月に印刷されました。

それは少し時代遅れですが、本はGroovyが文字通りJavaの拡張であることを明らかにします。Javaとまったく同じように機能するJavaコードを記述して、ファイル名を* .groovyに変更すると、問題なく動作します。この本によると、必要なライブラリーを含めれば、逆のことが言えます。これまでのところ、実験はこれを裏付けているようです。


これはGroovyを学ぶのに最適な本です。
topr

すべてのコードがまったく同じように動作するとは限らないことに注意することがおそらく重要です。これらの違いのいくつかには、Groovyが一重引用符と二重引用符を理解する方法と、拡大よりもボクシングを優先することが含まれます。ただし、ほとんどのコードは同じように機能します。
オントネーター2015

4

明らかに、構文は完全に異なります(GroovyはJavaに最も近いものです)が、それはあなたが求めているものではないと思います。

それらを使用してJavaアプリケーションをスクリプト化することに関心がある場合、Java から評価する簡単な方法ないため、Scalaはおそらく良い選択ではありませんが、Groovyはその目的に特に適しています。


Scalaを使用してJavaをスクリプト化することについてのあなたのポイントは理解できません。もちろん、Javaコードを駆動するScalaスクリプトを書くこともできます。eval必要ありません。
ダニエルヤンコウスキー

2
@Daniel、リンクしたスクリプティングにScalaを使用することに関する質問をご覧ください。受け入れられた答えは、「eval」機能とjavax.scriptingサポートがないため、Scalaを使用してJavaアプリケーションのスクリプトを作成するのが難しく、たとえばGroovyを使用することです。
ティロ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.