2009-10-15 19 views

答えて

7

Clojureの専門家ではないが、主な利点は、Clojureが並行プログラミングの詳細を隠していることであり、悪魔は細部にあると知っているので、私はそれを良いものと考えている。

Clojureの並行処理でRick Hickey(Clojureの作成者)のthis excellent presentationをチェックしたい場合があります。編集:明らかにJAOOは古いプレゼンテーションを削除しました。私はまだこれのための新しいソースを見つけることができませんでした。

+0

リンクが壊れているようです。誰でも働いている人はいますか? – Surya

+0

@ Suurya:彼らは古い会議プレゼンテーションを削除したようです。 –

+0

あなたはこのプレゼンテーションを考えていましたか? http://clojure.blip.tv/file/812787/ – egbokul

-5

Javaのプログラミング言語の進化は、主に後方互換性に関するサンの懸念から、かなり遅くなっています。

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

6

世界は過去10年で進歩しており、Java言語(!= JVM)は追いつくのが難しいため、 JVMのより現代的な言語は、新しいアイデアと改良された概念に基づいており、多くの退屈な作業をずっと簡単かつ安全にしています。

6

Clojureのは、それはいくつかの簡単なルールに従うことによって、並行性に安全を達成することを言うことです機能、プログラミングパラダイム、に基づいているので:

  • 不変状態
  • 機能はありません持っています副作用

こういったプログラムでは、水平スケーラビリティが組み込まれていますが、ロックベースの並行性メカニズム(競合状態、デッドロックなどのバグが発生しやすい。

+0

Lispsは純粋に機能的ではありませんが、並行しているときには、多くの変更可能なデータ構造と副作用を持ち、それらを混乱させることは完全に可能です。しかし、ええ、関数型プログラミングの主張者は、並行処理をはるかに簡単にして、そのような副作用を避けるでしょう。 – delnan

19

Clojureはconcurrencyのために設計されている。

Clojureは、Javaよりも抽象度の高い並行処理プリミティブを提供します。これらのいくつかは以下のとおりです。

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

  • 非同期変更のエージェントシステム。これは、Erlangでのメッセージの受け渡しに似ています。

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

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

5

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

Javaでマルチスレッド化できることは確かですが、ロックやその他のものは関係ありません。 Clojureは特別な努力なしにマルチスレッド化されています。

+0

私はあなたが減額をラップすると思います(seque (reduce (pmap #(stuff) input)))

2

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

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

このように、並行性の分析は非常に困難です。すべての可能な並行性の危険を予期するのではなく、本質的に安全なメカニズムを使用する方がよいでしょう。

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

Clojureの機能スタイルを使用して並行Javaコードを作成するとよいでしょう。

2

不変のデータ、vars、refs(とソフトウェアのトランザクショナルメモリ)、アトムとエージェントによる並行性へのClojureのアプローチに加えて、それは学習に値するLispです。リスト、ベクトル、マップ、セットのリテラルに加えて、Lispマクロ、デストラクション、ファーストクラスの関数とクロージャ、REPL、動的な型付けがJavaライブラリとの相互運用性を上回ります(CLRバージョンも開発されています)。 )

それは、スキームやCommon Lispのと全く同じではないのですが、それはあなたを助ける学習あなたは彼のessaysStructure and Interpretation of Computer Programsを介して動作やポール・グレアムさんが話して何を完全に理解したい場合、あなたはXKCDからthis comicに関連することができます。 ;-)

1

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

関連する問題