2

私は Java プログラミングをいくつか行い、C および PHP プログラミングもほとんど行いませんでした。最近、言語が面白そうだったので Python を学び始めました。

しかし、SO に関するいくつかの投稿は、Python が並行プログラミングに適していないことを示しているようです。また、コンパイラを持つ言語と比較して遅いです。私は静的型付け言語の利点も気に入っていますが、Python は動的型付けです。私の質問は、次の基準を満たす言語があるかどうかです。

1) インタープリターを持っている (開発を高速化するため)

2)コンパイラを持っている(コンパイルされたコードがより速く実行されるため)

3) OO 機能を持っている

4) 静的型付け

上記の基準を満たす OCaml に出会いました。しかし、SO に関する投稿を見て、OCaml は並行プログラミングには適していないと思いました。したがって、5番目の基準は

5) 並行プログラミングに適しています。

PS :- 私はプログラミング言語の専門家ではないので、上記の観察結果のいずれかが間違っている場合はご容赦ください。

4

7 に答える 7

5

OCaml は並行プログラミングに適しています。標準ライブラリは、2 つの同時実行モデルをサポートしています。共有メモリを使用するスレッド (同期のためのミューテックス条件変数を使用) と、 John Reppy の Concurrent MLに基づくイベントです。

OCaml には、対称型マルチプロセッサ並列処理のサポートが含まれていません。ランタイムは単一のプロセッサで実行されます。マルチコア マシンを利用する場合は、プロセッサごとに少なくとも 1 つのランタイムを実行し、ランタイム間でメッセージ パッシングを使用する必要があります。メッセージ パッシングはレイテンシが高くなりますが、共有メモリよりも正しく処理するのがはるかに困難です。おまけとして、起動時にランタイムがお互いを見つける方法以外は何も変更せずに、プログラムをネットワーク上の複数のマシンに分散できます。

JoCamlは OCaml の拡張であり、より優れた同時実行性と分散モデル (結合計算) を備えています。公式の OCaml ディストリビューションほど洗練されたものではありませんが、透過的な通信 (反対側が同じランタイムまたは同じマシン上にあるかどうかを気にせずにチャネルでメッセージを送信する) と、通信するためのほとんど型付けされたフレームワークを提供するという利点があります。複数のプログラム間。

于 2012-04-10T21:55:54.413 に答える
5

はい、OCaml は並行プログラミングに適しています。ThreadJava で行うようにネットワーク アプリケーションをプログラムできるモジュールがあります。

現在、真の並列処理はサポートされていません (OCaml コードを並列に実行する 2 つのスレッドはありません) が、OCaml は他の多くの言語よりもはるかに高速であるため問題ありません (たとえば、QuadCore では、Language Shootout OCaml は、マルチコア機能を備えた Haskell よりも優れていることを示しています)。

于 2012-04-10T19:49:38.327 に答える
3

並行プログラミングに適しているという意味に応じて、OCamlまたはSML(標準ML)をお勧めします。

  1. I / O(ネットワーキング/ファイルシステム/ ..)を待つ必要がないための複数のスレッド。OCamlを取る-そのコンパイラは非常に高速なコードを生成し、多くの優れたライブラリを持っています
  2. 同時実行性とは、同じ共有メモリセグメント内の1台のマシンで複数のコアを使用できるネイティブスレッドを意味する場合。SML(polyml)を取ります-それはまともなコンパイラを持ち、ネイティブスレッドをサポートします

どちらのソリューションでも、型推論を使い始めることに注意してください。慣れれば、どんな言語でもプログラミングしないと泣きます!;)

于 2012-04-12T08:20:24.437 に答える
1

あなたが探しているすべての機能を大いに満たすかもしれない3つの言語を紹介したいと思います

  1. Haskell

    • インタプリタがあります(開発を迅速化するため):GhciとHugsインタプリタ
    • コンパイラがあります(コンパイルされたコードがより高速に実行されるため):GlasgowHaskelコンパイラ
    • オブジェクト指向機能を備えています:ある程度、HaskellvsOOPの記事を読んでください
    • 静的型付け:型宣言を必要とせずにはい
    • 並行プログラミングに適しています。:はい、もちろんです。
  2. Erlang

    • インタプリタがあります(開発を高速化するため):Erlangの動作方法では、REPLがない場合がありますが、必ずしもインタプリタが開発の高速化に役立つとは限りません。しかし、ある程度、あなたはerlその目的のために使うことができます。
    • コンパイラがあります(コンパイルされたコードがより高速に実行されるため):はい
    • OO機能があります:いいえ。ただし、実験的な拡張機能が利用可能です。ただし、Erlangで開発している場合は、関数型プログラミングに固執する必要があります
    • 静的に入力:いいえ
    • 並行プログラミングに適しています:はい、それがErlangで知られています。
  3. Groovy

    • 通訳がいます(開発を迅速化するため):はい
    • コンパイラがあります(コンパイルされたコードがより高速に実行されるため):はい
    • OO機能を備えています:はい、結局のところJavaに基づいています
    • 静的に入力:いいえ
    • 並行プログラミングに適しています:はい、Javaから継承します。

ついに

  • JavaにはBeanShellと呼ばれるものがあり、それがJavaの使用を妨げるものであれば、Javaインタープリターとして機能します。

  • Pythonをひねって、言語に並行性を追加しました

さらに調査したい場合は、次のwikiリンクを使用してください

于 2012-04-10T06:26:25.173 に答える
1

まず第一に、他のリソースについて考えることがより重要です。

1)インタープリターを持っています(開発を高速化するため)-imo un true

2)コンパイラを持っています(コンパイルされたコードはより速く実行されるため)-本当に?dev と server マシンのさまざまなアーキテクチャと展開についてはどうですか?

3) OO 機能があります - なぜですか? 関数型言語は並列プログラミングに適しています

4) 静的型付け - なぜ ? 型システムに「null」値がある場合、これと静的に型指定されていないimoの間に違いはありません。

より良い基準は

  1. 使用できる高品質のライブラリとフレームワークがいくつあるか。
  2. このソリューションを展開する方法
  3. プロジェクトに新しい開発者を呼び込むのはいかに簡単か
  4. コミュニティの質とは:)

    • Ocaml は優れた言語であり、Lwt ライブラリを使用すると、1 つのプロセスを簡単に実行しながら非同期コードを実行できます。Ocamlも爆速!これは良い解決策のように思えますが、本番対応のフレームワークはあまりありません。

    • Erlang にはライブラリがあり、クールで高速であり、ニーズに最適なソリューションのようです。

    • Ruby と Ruby On Rails では、並列コードを簡単に書くことはできませんが、ソリューションをすばやく構築して、それでお金を稼ぎ始めることができます :) つまり、準備ができているブロックがあるため、他の言語よりも 10 倍高速です。また、この場合の展開は最も簡単です。

    • Node.js は非常に高速で、言語 ( javascript ) を簡単に取得できますが、開発の初期段階であるため、本番環境に対応できるものは多くありません。

これが私が解決策にアプローチする方法です:

パフォーマンスに関しては、次の取引があります

  1. メモリ上限
  2. CPU キャップ

    • メモリ上限 ( ram ) は、この言語で記述されたソリューションがより多くの RAM を消費することを意味し、最終的には新しいボックスをすばやく購入する必要があり、スケーリングするボックスは「太る」必要があります:)
    • CPU キャップは、ソリューションが非常に積極的なガベージ コレクターを持ち、頻繁にクリーンアップされる多くの小さなオブジェクトを割り当てることを意味します。

このコンテキストでの Node.js と Rails はメモリに上限があり、Rails は本番環境でワーカーあたり平均 ~250 MB の RAM を消費します。Ocaml / Oscigen 、Erlang / Webmachine は CPU に制限があり、ほとんどの関数型言語はこのルートをたどります。

i5 CPU を搭載した macbook pro で webmachine の小さなテストを行いましたhttps://gist.github.com/1996858 このリソースは、キャッシュなしで redis から毎回プルされる単純な json を提供していました。

100 万リクエスト 合計: 接続 1000 リクエスト 1000000 返信 1000000 テスト期間 463.413 秒

Connection rate: 2.2 conn/s (463.4 ms/conn, <=1 concurrent connections)
Connection time [ms]: min 390.6 avg 463.4 max 3245.7 median 453.5 stddev 101.6
Connection time [ms]: connect 0.1
Connection length [replies/conn]: 1000.000

Request rate: 2157.9 req/s (0.5 ms/req)

一番良かったのは、メモリ使用量を監視することでした。約 19.3 MB の RAM でした。

Rails でアプリケーションのプロトタイプをビルドしてから、json API を抽出し、webmachine を使用して Erlang でビルドします。または、webmachine を使用して Erlang でアプリをビルドし、展開用に capistrano などのいくつかの Ruby ライブラリの優れた機能を使用するだけです :)

于 2012-04-14T19:31:32.370 に答える
1

Python は、静的型付け以外のほとんどのニーズを満たしますが、その設計のために、GIL またはグローバル インタープリター ロックと呼ばれるものがあります。これは、Python スレッドが実際には個別に実行されないことを意味します。これは、python と並行プログラミングに関してあなたが話した批判を説明するかもしれません。ただし、python には、multiprocessingスレッドのようなプロセスを使用するための API を提供するモジュールがあります。また、異なる vm で実行される python の実装には GIL がありません。すでに Java に精通している場合は、JVM で実行される python 実装である Jython を調べる必要があります。

また、明らかではありませんが、Python がバイト コードにコンパイルされることは注目に値します。これは、スクリプトの最初のインポート時に実行されます。つまり、Python ソース ファイルが編集およびインポートされた場合、一度コンパイルされた後、同じモジュールをインポートしようとすると、バイト コンパイルされたバージョンが使用され、スクリプトが再実行されません。この動作は、実行のたびに文字通りソースを再解釈する PHP よりも Java に似ています。

于 2012-04-10T05:56:20.017 に答える
0
  1. Scalaを学ぶ。
  2. 満足できず、MS Visual Studioを使用する意思がある場合は、F#を学習してください。
  3. 満足できず、ポイント(3)を再考できる場合は、Haskellを学びましょう。
  4. 満足できず、ポイント(5)を再考できる場合は、OCamlを学びましょう。

OCamlプログラムはクロージャをマーシャリングすることさえできるので、別々のプロセス間で比較的簡単に動作できることに注意してください。

于 2012-04-10T15:19:04.880 に答える