回答:
いくつかの例外(Haskell)を除いて、コンパイラーがループをアンラップできる方法がないためです。問題は、ループの各反復がグローバル状態を変更できることです。そのため、異なる順序で実行すると、問題が発生する可能性があります。haskellでは、関数が純粋であることを期待できます。つまり、グローバル状態を読み取ったり変更したりしないため、任意の順序で実行できます。
本当の問題は、いくつかの例外を除いて、並行性をどのようにうまく行うかが依然として未解決の問題であるということです。ErlangコミュニティとHaskellコミュニティはかなり順調に進んでいるように見えますが、大規模なN向けにNコアシステムをプログラミングする方法を本当に理解するまでにはまだ長い道のりがあります。
現在使用しているプログラミング言語のほとんどは、多くのアプリケーション(スタンドアロンデスクトップアプリケーションなど)でシングルスレッドプログラミングとシングルユーザーインタラクションが最も使用されている時期に登場しました。Webアプリケーション、クラウドコンピューティング、マルチユーザーアプリケーションの登場により、より多くのマルチスレッドアプリケーションが必要になりました。
レガシープログラミング言語は、言語自体からマルチスレッド機能をゆっくりとサポートしようとしています(javaがjava.util.concurrentを追加したように)。
将来登場する新しい言語では、スレッド化と並行処理のサポートが強化されます。
他の回答(操作が独立していることを証明するのは困難であり、プログラマーが連続して考えること)で言及されている点とは別に、考慮すべき3番目の要素があります:並列化のコストです。
真実は、スレッドの並列処理には非常に大きなコストが伴うということです。
スレッドの作成は非常に高価です。カーネルにとって、スレッドの開始はプロセスの開始とほぼ同じです。正確なコストについてはわかりませんが、10マイクロ秒のオーダーだと思います。
ミューテックスを介したスレッド通信は高価です。通常、これには各側でシステムコールが必要であり、スレッドをスリープ状態にして再度起動する必要があります。平均して、ミューテックスの取得と解放には約1マイクロ秒かかります。
ここまでは順調ですね。なぜこれが暗黙的な並列処理の問題なのですか?暗黙的な並列処理は、小規模で証明するのが最も簡単だからです。単純なループの2つの反復が互いに独立していることを証明することは1つです。stdout
データベースへの印刷とクエリの送信が互いに独立しており、並列に実行できることを証明することはまったく異なります(データベースプロセスはパイプの反対側にある可能性があります!)。
つまり、並列化のコストは並列処理の利点よりも大きいため、コンピュータプログラムが証明できる暗黙の並列性は利用できない可能性があります。一方、アプリケーションを実際に高速化できる大規模な並列性は、コンパイラーにとって証明不可能です。CPUが1マイクロ秒以内に実行できる作業量を考えてください。現在、並列化がシリアルプログラムよりも高速であると想定される場合、並列プログラムは、2つのmutex呼び出し間ですべてのCPUを数マイクロ秒間ビジー状態に保つ必要があります。それには、非常に粗い並列処理が必要ですが、自動的に証明することはほとんど不可能です。
最後に、例外のないルールはありません。暗黙的な並列処理の活用は、スレッドが関与しない場合に機能します。これは、コードのベクトル化の場合です(AVX、AltivecなどのSIMD命令セットを使用)。これは、比較的簡単に証明できる小規模な並列処理に最適です。
プログラマーは連続して考え、現在の言語はそのモデルをサポートするために構築されています。Haskell Erlangなどのフリンジ言語を除き、言語(形容詞「モダン」の使用は控えます)は、基本的に、コンピューターに何をすべきか、いつ、どのように行うかを指示する高レベルのアセンブリです。希望する結果が利用できるかどうかをコンピューターに伝えるエコーシステムができるまで、プログラマーとして、マルチスレッド機能をフルに活用する精神的な能力がありません。
すなわち、それは自然ではありません......
don't have the patience
は、より正確な評価だと思いdon't have the mental capacity
ます。私のキャリアでは、愚かなプログラマーよりも多くの怠け者のプログラマーを見てきました。幸運なことに、大学での最初の1年で、手続き型プログラミングとオブジェクト指向に沿って関数型プログラミングときめ細かい並列プログラミングを教えられました。多くのプログラマーはそれほど幸運ではなかったと思うので、彼らの思考プロセスは結果としてまっすぐになりました。