Javaが並行プログラミングの機能を提供している場合、Clojure(Javaではなく)の主な利点は何ですか?なぜJavaの代わりにClojureを使用するのですか
答えて
Clojureの専門家ではないが、主な利点は、Clojureが並行プログラミングの詳細を隠していることであり、悪魔は細部にあると知っているので、私はそれを良いものと考えている。
Clojureの並行処理でRick Hickey(Clojureの作成者)のthis excellent presentationをチェックしたい場合があります。編集:明らかにJAOOは古いプレゼンテーションを削除しました。私はまだこれのための新しいソースを見つけることができませんでした。
Javaのプログラミング言語の進化は、主に後方互換性に関するサンの懸念から、かなり遅くなっています。
なぜClojureやScalaのようなJVM言語を直接使用したくないのですか?
世界は過去10年で進歩しており、Java言語(!= JVM)は追いつくのが難しいため、 JVMのより現代的な言語は、新しいアイデアと改良された概念に基づいており、多くの退屈な作業をずっと簡単かつ安全にしています。
Clojureのは、それはいくつかの簡単なルールに従うことによって、並行性に安全を達成することを言うことです機能、プログラミングパラダイム、に基づいているので:
- 不変状態
- 機能はありません持っています副作用
こういったプログラムでは、水平スケーラビリティが組み込まれていますが、ロックベースの並行性メカニズム(競合状態、デッドロックなどのバグが発生しやすい。
Lispsは純粋に機能的ではありませんが、並行しているときには、多くの変更可能なデータ構造と副作用を持ち、それらを混乱させることは完全に可能です。しかし、ええ、関数型プログラミングの主張者は、並行処理をはるかに簡単にして、そのような副作用を避けるでしょう。 – delnan
Clojureはconcurrencyのために設計されている。
Clojureは、Javaよりも抽象度の高い並行処理プリミティブを提供します。これらのいくつかは以下のとおりです。
参照の共有と同期との協調の変化に対処するためのAソフトウェアトランザクショナルメモリシステム。いくつかの参照をアトミック操作として変更することができ、プログラム内の他のスレッドが何をしているのか心配する必要はありません。あなたのトランザクション内では、常に世界を一貫して見ることができます。
非同期変更のエージェントシステム。これは、Erlangでのメッセージの受け渡しに似ています。
変数のローカル変更をスレッド化します。これらの変数には、プログラム内のすべてのスレッドによって共有されるルートバインディングがあります。ただし、変数を再バインドすると、そのスレッドでのみ表示されます。
これらの並行処理プリミティブはすべて、Clojure不変データ構造(リスト、マップ、ベクトルなど)の上に構築されます。可変Javaオブジェクトの世界に入ると、すべてのプリミティブが分解され、ロックと条件変数に戻ります(必要に応じてクロージャーでも使用できます)。
不変型を持つことに関する素晴らしい点の1つは、組み込み関数のほとんどがすでにマルチスレッド化されていることです。シンプルな「削減」は、余分な作業をすることなく、複数のコア/プロセッサにまたがります。
Javaでマルチスレッド化できることは確かですが、ロックやその他のものは関係ありません。 Clojureは特別な努力なしにマルチスレッド化されています。
私はあなたが減額をラップすると思います(seque (reduce (pmap #(stuff) input)))
–
はい、Javaは、並行プログラムに必要なすべての機能を提供します。
類推:Cは、多くの文字列処理があっても、メモリセーフなプログラムに必要なすべての機能を提供します。しかし、Cメモリの安全性はプログラマの問題です。
このように、並行性の分析は非常に困難です。すべての可能な並行性の危険を予期するのではなく、本質的に安全なメカニズムを使用する方がよいでしょう。
共有メモリの変更可能なデータ構造の並行プログラムを安全にしようとすると、あなたは綱渡りをしているインターロックを追加します。加えて、それは大体テストすることができません。
Clojureの機能スタイルを使用して並行Javaコードを作成するとよいでしょう。
不変のデータ、vars、refs(とソフトウェアのトランザクショナルメモリ)、アトムとエージェントによる並行性へのClojureのアプローチに加えて、それは学習に値するLispです。リスト、ベクトル、マップ、セットのリテラルに加えて、Lispマクロ、デストラクション、ファーストクラスの関数とクロージャ、REPL、動的な型付けがJavaライブラリとの相互運用性を上回ります(CLRバージョンも開発されています)。 )
それは、スキームやCommon Lispのと全く同じではないのですが、それはあなたを助ける学習あなたは彼のessaysにStructure and Interpretation of Computer Programsを介して動作やポール・グレアムさんが話して何を完全に理解したい場合、あなたはXKCDからthis comicに関連することができます。 ;-)
このvideoプレゼンテーションは、試行として実装された効率的な永続的なデータ構造を中心に非常に強力なケースです。
- 1. なぜClojureインスタントはタイムゾーンを記述するときに "+"の代わりに " - "を使用しますか?
- 2. なぜAssembly.LoadFromの代わりにAssembly.LoadFileを使用しますか?
- 3. RELEASEの代わりにNDEBUGを使用するのはなぜですか?
- 4. WireMockの代わりにMockWebServerを使用するのはなぜですか?
- 5. なぜincqの代わりにlealを使用するのですか?
- 6. WCF/Silverlight:なぜクライアントの代わりにChannelFactoryを使用するのですか?
- 7. Symfonyプロキシの代わりにワニスを使用するのはなぜですか?
- 8. FragmentStatePagerAdapterの代わりにFragmentPagerAdapterを使用するのはなぜですか?
- 9. なぜwindow.locationの代わりにルーティングを使用するのですか?
- 10. なぜjasmine.createSpyの代わりにspyOnを使用するのですか?
- 11. なぜRabbitMQの代わりにCeleryを使用するのですか?
- 12. マルコフモデルの代わりにRNNを使用するのはなぜですか?
- 13. なぜtf.stackの代わりにtf.concatを使用するのですか?
- 14. なぜzImageの代わりにuImageを使用するのですか?
- 15. なぜSQLBRITEで、代わりにSQLiteを使用するのですか?
- 16. Java 8のハッシュマップでリンクリストの代わりにバイナリツリーを使用するのはなぜですか?
- 17. なぜJavaの代わりにSparkを使用して、cassandraのデータを処理するのですか?
- 18. KotlinのJava静的フィールドの代わりに「コンパニオンオブジェクト」を使用するのはなぜですか?
- 19. JavaがUTF-8の代わりに変更されたUTF-8を使用するのはなぜですか?
- 20. JavaにNullReferenceExceptionの代わりにNullPointerExceptionがあるのはなぜですか?
- 21. XTextプロジェクトでXTendの代わりにJavaを使用する
- 22. Java JNAでLPTSTRの代わりに使用するものは?
- 23. C#では、なぜStreamWriterの代わりにTextWriterを使用できますか?
- 24. シングルの代わりにダブルクリックするのはなぜですか?
- 25. なぜVaadinでVerticalLayoutの代わりにFormLayoutを使用しますか?
- 26. なぜ私のスクリプトにPHP7の代わりにPHP5を使用しますか
- 27. なぜ "new"を使用する代わりにCreateメソッドを使用するのですか?
- 28. なぜ使用されるビューの代わりに、SQL文
- 29. if-elseとJavaの代わりにinstanceofを使用する
- 30. Java WebService:既存のクラスを代わりに使用する
リンクが壊れているようです。誰でも働いている人はいますか? – Surya
@ Suurya:彼らは古い会議プレゼンテーションを削除したようです。 –
あなたはこのプレゼンテーションを考えていましたか? http://clojure.blip.tv/file/812787/ – egbokul