また、PythonまたはJavaでない場合は、より一般的に静的型の言語または動的型の言語を選択しますか?
11 に答える
主に Python でのマルチスレッド化がGlobal Interpreter Lockによって妨げられているため、Python ではなく JVM を選択します。ただし、JVM で実行する場合、Java が最適である可能性は低いです。ClojureまたはScala (アクターを使用) は、どちらもマルチスレッドの問題により適している可能性があります。
Java を選択する場合は、java.util.concurrentライブラリの利用を検討し、 synchronizedなどのマルチスレッド プリミティブを避ける必要があります。
間違いなくスタックレス Python ! 特に並行性のために作られた Python バリアント。
しかし、最終的には、ターゲット プラットフォームと何を達成しようとしているかによって異なります。
並行性のために、Java を使用します。Java を使用するとは、実際にはScalaを意味します。これは、Erlang の並行性構造から多くを借用していますが、(おそらく) これまでどちらも使用したことがない Java 開発者にとってよりアクセスしやすいものです。
Python スレッドは、Global Interpreter Lock を待たなければならないという問題があり、CPU バウンドのプログラムでは (単一プロセス内で) 真の並行性を実現できません。私が理解しているように、Stackless Python は CPython の同時実行性の欠点の一部 (すべてではない) を解決しますが、私はそれを使用したことがないので、実際にアドバイスすることはできません。
議論は言語の選択や静的型付けまたは動的型付けに関するものではないと思います - それは同時実行の 2 つのモデル - 共有メモリとメッセージ パッシングの間です。あなたの状況ではどちらのモデルがより理にかなっていますか? また、選択した言語で選択を行うことができますか? または、あるモデルを他のモデルよりも採用する必要がありますか?
Erlang (動的型付け) とメッセージ パッシング、アクター モデルを見て、 Joe Armstrong が共有メモリを好まない理由を読んでみてください。SO では、ロックとスレッドを使用した Java 同時実行性に関する興味深い議論もあります。
Python については知りませんが、Java には組み込みのロックとスレッド モデルとともに、Kilimというメッセージ パッシング フレームワークがあります。
Java/Python でない場合、副作用を考慮に入れることは並行ソフトウェアを作成する際の複雑さの 1 つであるため、関数型言語を使用します。(あなたの質問に関する限り:これはたまたま静的型付けされていますが、コンパイラはほとんどの場合推測しています)
個人的には F# を選びます。なぜなら、F# を使って並行ソフトウェアを簡単に作成する素晴らしい例をたくさん見てきたためです。
はじめに: この男は刺激的であると同時に楽しく、F# にまったく興味がない場合でも見ておく必要があります。
ない。並行プログラミングは、正しく理解するのが難しいことで有名です。occam-pi のようなプロセス指向のプログラミング言語を使用するオプションがあります。これは、シーケンシャル プロセスとpi 微積分を通信するという考えに基づいています。これにより、並行システム開発中に発生するデッドロックやその他の多くの問題をコンパイル時にチェックできます。occam-pi が気に入らない場合は、CSP のバージョンも実装している Google の新しい言語を試すことができます。
Jython経由でJavaを使用します。Java には強力なスレッド機能があり、Jython を使用して Python 構文を使用して作成できるため、2 つの長所を最大限に活用できます。
Python 自体は同時実行性があまり得意ではなく、とにかく Java よりも遅いです。
しかし、並行性の問題やフリー ハンドがある場合は、Erlang を見てみましょう。なぜなら、Erlang はそのような問題のために設計されているからです。もちろん、Erlang を考慮する必要があるのは、次の場合のみです。
- (非常に)新しい技術を習得する時
- Erland はツールボックスに適合するように調整する必要があるため、生産チェーンの妥当な部分を制御します。
Java 環境 (JVM + ライブラリ) は (C)Python よりも同時実行性に優れていますが、Java 言語は最悪です。おそらく、JVM では別の言語を使用するでしょう。Jython については既に言及されており、Clojure と Scala はどちらも並行処理を優れた方法でサポートしています。
Clojure は特に優れており、高性能の永続データ構造、エージェント、およびソフトウェア トランザクション メモリをサポートしています。これは動的言語ですが、Java と同等のパフォーマンスを得るために型ヒントを与えることができます。
並行性に対する従来のアプローチの問題と、Clojure がそれを処理する方法については、Richard Hickey (Clojure の作成者) による InfoQ のこのビデオをご覧ください。
答えは、場合によるということです。たとえば、1 台のマシンで複数のコアまたは CPU を利用しようとしていますか、それともタスクを複数のマシンに分散させたいですか? 速度と実装の容易さはどの程度重要ですか?
前述のように、Python にはグローバル インタープリター ロックがありますが、マルチプロセッシングモジュールを使用できます。スタックレスは非常に優れていますが、単独では複数のコアを使用しないことに注意してください。通常、Python は Java よりも扱いやすいと考えられています。速度が優先される場合、通常は Java の方が高速です。
Javaのjava.util.concurrent
ライブラリーを使用すると、1 台のマシン上で並行アプリケーションを簡単に作成できますが、それでも共有状態を同期する必要があります。Java は必ずしも並行処理に最適な言語ではありませんが、役立つツール、ライブラリ、ドキュメント、およびベスト プラクティスが数多くあります。
スレッドと共有状態の代わりにメッセージ パッシングと不変性を使用することは、並行アプリケーションをプログラミングするためのより良い方法と考えられています。結果として、可変性と副作用を抑止する関数型言語が好まれることがよくあります。並行アプリケーションを複数のマシンに分散する必要がある場合は、このために設計されたランタイム ( ErlangやScala Actorsなど) を検討する価値があります。
一部のタスクでは、Python は遅すぎます。シングル スレッドの Java プログラムは、マルチコア コンピューター上の Python の同時実行バージョンよりも高速になる可能性があります...
Java または Scala、F# を使用するか、単純に C++ (MPI および OpenMPI) を使用したいと考えています。