16

Java が並行プログラミングの機能を提供している場合、(Java の代わりに) Clojure を使用する主な利点は何ですか?

4

9 に答える 9

18

Clojureは並行性のために設計されています。

Clojureは、Javaよりも高いレベルの抽象化で並行性プリミティブを提供します。これらのいくつかは次のとおりです。

  • 共有参照への同期的かつ調整された変更を処理するためのソフトウェアトランザクショナルメモリシステム。いくつかの参照をアトミック操作として変更でき、プログラム内の他のスレッドが何をしているかを心配する必要はありません。あなたの取引の中で、あなたは常に世界の一貫した見方をするでしょう。

  • 非同期変更のためのエージェントシステム。これはErlangでのメッセージパッシングに似ています。

  • ローカル変更を変数にスレッド化します。これらの変数には、プログラム内のすべてのスレッドで共有されるルートバインディングがあります。ただし、変数を再バインドすると、そのスレッドでのみ表示されます。

これらの同時実行プリミティブはすべて、Clojuresの不変データ構造(つまり、リスト、マップ、ベクトルなど)の上に構築されています。可変Javaオブジェクトの世界に入ると、すべてのプリミティブが壊れて、ロックと条件変数に戻ります(必要に応じて、clojureでも使用できます)。

于 2009-10-15T10:05:35.793 に答える
7

Clojure の専門家でなくても、主な利点は、Clojure が並行プログラミングの多くの詳細を隠していることであり、悪魔が詳細に潜んでいることは誰もが知っていることです。それは良いことだと思います。

Clojure の並行性に関する Rick Hickey (Clojure の作成者) によるこの優れたプレゼンテーションを確認することをお勧めします。編集: どうやら JAOO は古いプレゼンテーションを削除したようです。これについては、まだ新しい情報源を見つけることができませんでした。

于 2009-10-15T07:32:27.517 に答える
6

Clojure は関数型プログラミング パラダイムに基づいているため、つまり、いくつかの単純なルールに従うことで並行処理の安全性を実現します。

  • 不変状態
  • 関数には副作用がない

このように書かれたプログラムには水平方向のスケーラビリティが組み込まれていますが、ロックベースの同時実行メカニズム (Java など) は、競合状態やデッドロックなどを含むバグが発生しやすい傾向があります。

于 2009-10-15T08:29:59.600 に答える
5

世界は過去10年間で進歩し、Java言語(!= JVM)は追いつくのが難しいと感じているからです。JVMの最新の言語は、多くの面倒なタスクをはるかに単純で安全にする新しいアイデアと改善された概念に基づいています。

于 2009-10-15T07:58:47.603 に答える
5

不変型を持つことの優れた点の 1 つは、ほとんどの組み込み関数が既にマルチスレッド化されていることです。単純な「削減」は、余分な作業をしなくても、複数のコア/プロセッサにまたがります。

したがって、Java でマルチスレッド化できることは確かですが、それにはロックなどが含まれます。Clojure は、余計な手間をかけずにマルチスレッド化できます。

于 2009-10-15T12:28:52.333 に答える
2

不変データ、var、ref (およびソフトウェア トランザクショナル メモリ)、atom、およびエージェントを介した Clojure の同時実行性へのアプローチに加えて、これは学ぶ価値のある Lisp です。Java ライブラリとの相互運用性に加えて、Lisp マクロ、デストラクチャリング、ファースト クラス関数とクロージャ、REPL、動的型付け、さらにリスト、ベクトル、マップ、およびセットのリテラルを取得できます (開発中の CLR バージョンもあります。 )

これは、Scheme や Common Lisp とまったく同じではありませんが、コンピュータ プログラムの構造と解釈につ​​いて学習したい場合や、Paul Graham がエッセイで話していることを理解したい場合には、これを学ぶことが役に立ちます。 XKCD。;-)

于 2009-10-18T05:56:47.810 に答える
2

はい、Java は並行プログラムに必要なすべての機能を提供します。

類推: C は、多くの文字列処理を行う場合でも、メモリーセーフなプログラムに必要なすべての機能を提供します。しかし、C ではメモリの安全性はプログラマの問題です。

たまたま、並行性の分析は非常に困難です。考えられるすべての同時実行の危険を予測しようとするよりも、本質的に安全なメカニズムを使用する方が適切です。

インターロックを追加して、共有メモリの可変データ構造の並行プログラムを安全にしようとすると、綱渡りをしていることになります。さらに、それはほとんどテストできません。

1 つの良い妥協点として、Clojure の関数型スタイルを使用して並行 Java コードを作成することが考えられます。

于 2009-10-17T09:23:23.737 に答える
1

このビデオプレゼンテーションは、試行として実装された効率的な永続データ構造を中心に、非常に強力なケースになります。

于 2009-10-19T12:00:07.783 に答える
-5

Java プログラミング言語の進化は、主に下位互換性に関する Sun の懸念により、非常にゆっくりと進んでいます。

Clojure や Scala などの JVM 言語を直接使用したくないのはなぜですか?

于 2009-10-15T07:47:19.167 に答える