グローバル編集:ごめんなさい、みんな元気になって、多くのナンセンスを書いてしまいました。ただの古いギーザが怒鳴っています。
Cは免れたと思っていましたが、C11以降、C ++に匹敵します。どうやら、コンパイラーが式の副作用で何をするかを知るには、「同期点の前にある」に基づくコードシーケンスの部分的な順序付けを含む小さな数学の謎を解く必要があります。
私はたまたまK&R時代にいくつかの重要なリアルタイム組み込みシステムを設計および実装しました(エンジンがチェックされない場合に人々を最も近い壁に衝突させる可能性がある電気自動車のコントローラー、10トンの産業用など)適切に命令されない場合、人々をパルプに押しつぶすことができるロボット、そして無害ではあるが、数十のプロセッサが1%未満のシステムオーバーヘッドでデータバスを乾燥させるシステムレイヤー)。
未定義と未指定の違いを理解するには、私は老朽化しているか愚かすぎるかもしれませんが、同時実行とデータアクセスの意味についてはかなりよく理解していると思います。私の議論の余地のある意見では、C ++へのこだわりと、今やペットの言語が同期の問題を引き継ぐCの執着は、コストのかかるパイプの夢です。同時実行が何であるかを知っていて、これらのギズモが必要ない場合、または必要ない場合、それを台無しにしようとせずに、世界全体で好意を示します。
この目を見張るようなメモリバリア抽象化のトラックロードはすべて、マルチCPUキャッシュシステムの一時的な一連の制限によるものです。これらはすべて、たとえばミューテックスや条件変数C ++などの一般的なOS同期オブジェクトに安全にカプセル化できます。オファー。
このカプセル化のコストはわずかですが、特定の細かいCPU命令を使用することで達成できるものと比較して、パフォーマンスがわずかに低下する場合があります。キーワード(またはA
volatile
#pragma dont-mess-with-that-variable
すべての私にとって、システムプログラマとしての注意)は、コンパイラにメモリアクセスの並べ替えを停止するように指示するには十分だったでしょう。直接的なasmディレクティブを使用して最適なコードを簡単に生成し、低レベルのドライバーとOSコードにアドホックCPU固有の命令を振りかけることができます。基盤となるハードウェア(キャッシュシステムまたはバスインターフェイス)がどのように機能するかについての深い知識がなければ、とにかく役に立たない、非効率的な、または欠陥のあるコードを書くことになります。
volatile
キーワードとボブの微調整は、誰もが最もハードボイルドされた低レベルのプログラマーのおじでした。その代わりに、C ++の数学のフリークの通常のギャングは、実在しない問題を探すソリューションを設計し、コンパイラーの仕様とプログラミング言語の定義を誤解するという典型的な傾向に屈し、さらに別の不可解な抽象化を設計しました。
これらの「バリア」は、低レベルのCコードでも適切に機能するように生成する必要があったため、今回の変更だけでCの基本的な側面を改ざんする必要がありました。それは、とりわけ、表現の定義に大きな混乱をもたらし、説明や正当化はまったくありません。
結論として、コンパイラがこのばかげたCの部分から一貫したマシンコードを生成できるという事実は、C ++の連中が2000年代後半のキャッシュシステムの潜在的な不整合に対処した方法の遠い結果にすぎません。
これはC(式定義)の1つの基本的な側面をひどく混乱させたので、Cプログラマーの大多数-キャッシュシステムについて気にしなくて、正しくそうである-を説明するために教祖に頼らざるを得なくなった。違いa = b() + c()
とa = b + c
。
この不幸な配列がどうなるかを推測しようとすると、とにかく時間と労力の純損失になります。コンパイラがそれをどうするかに関わらず、このコードは病理学的に間違っています。それを行う唯一の責任があることは、それを箱に送ることです。
概念的には、別のステートメントで評価の前または後に変更を明示的に発生させる簡単な努力で、副作用を常に式から取り除くことができます。
コンパイラーが何かを最適化することを期待できなかったときに、この種のくだらないコードは80年代に正当化されたかもしれません。しかし、今やコンパイラーはほとんどのプログラマーよりもずっと賢くなっているので、残っているのはひどいコードの断片だけです。
私はまた、この未定義/不特定の議論の重要性を理解することができません。コンパイラに依存して、一貫した動作のコードを生成することも、そうしないこともできます。あなたがそれを未定義と呼ぶか特定しないと呼ぶかは論争のように思えます。
私の議論の余地のある意見では、CはそのK&R状態ではすでに十分危険です。有用な進化は、常識的な安全対策を追加することです。たとえば、この高度なコード分析ツールを使用すると、仕様によりコンパイラーは、極端に信頼できない可能性のあるコードを静かに生成するのではなく、少なくともbonkersコードに関する警告を生成するように実装するように強制します。
しかし代わりに、たとえばC ++ 17で固定評価順序を定義することを決定しました。現在、あらゆるソフトウェアは、新しいコンパイラーが難読化を決定論的な方法で熱心に処理するという確信に基づいて、意図的に自分のコードに副作用を配置するよう積極的に扇動されています。
K&Rは、コンピューティング業界の真の驚異の1つでした。20ドルで、言語の包括的な仕様(この本だけを使用して完全なコンパイラーを書いている個人を見たことがあります)、優れたリファレンスマニュアル(目次は通常、あなたの回答の数ページ以内を示しています)質問)、そして賢明な方法で言語を使用することを教える教科書。言語を乱用して非常に非常に愚かなことをすることができる多くの方法についての理論的根拠、例、および賢明な警告の言葉を記入してください。
わずかな利益でその遺産を破壊することは、私にとって残酷な無駄のように思えます。しかし、繰り返しになりますが、私はそのポイントを完全に理解することはできません。たぶん、ある種の魂が、これらの副作用を大幅に利用する新しいCコードの例の方向に私を向けるかもしれません。