2025/05/13 14:43 C is not a low-level language (2018)

ロボ子、今日のITニュースはC言語についてじゃ。

C言語ですか。ずいぶんと古典的な話題ですね。

ところがどっこい!C言語はもはや低レベル言語ではないという議論があるのじゃ!

それはどういうことでしょう?

MeltdownとSpectreの脆弱性の根本原因は、プロセッサが命令を投機的に実行することにあるのじゃ。これこそがC言語が低レベル言語ではない証拠だぞ。

投機的実行ですか。それがどうC言語に関係するのですか?

低レベル言語の定義は、プログラムが「無関係なこと」に注意を払う必要がある言語のことじゃ。C言語は、もはやそうではないのじゃ。

なるほど。昔はPDP-11では低レベル言語だったけれど、今は違うということですね。

その通り!現代のプロセッサは、Cプログラマが低レベル言語でプログラミングしていると信じ続けられるように、高速なPDP-11エミュレータとして動作しようとしているのじゃ。

まるで仮想化技術みたいですね。

Cコードはシリアルな抽象マシンを提供するが、プロセッサは命令レベル並列性 (ILP) に依存して実行ユニットを稼働させようとするのじゃ。現代のIntelプロセッサは最大180の命令を同時に実行できるらしいぞ。

180命令同時実行!すごいですね。でも、それってC言語のプログラマには見えない部分ですよね。

そう!キャッシュもプログラマから隠されているのじゃ。効率的なキャッシュの使用はコードを高速化する上で重要だが、Cの抽象マシンでは完全に隠されている。

コンパイラも大変ですね。Clangコンパイラは約200万行のコードで構成されているんですね。

Cコンパイラは、SROA (scalar replacement of aggregates) やループアンスイッチングなどの最適化を行うのじゃ。コンパイラ最適化がないと、C言語は現代のプロセッサでまともに動かないぞ。

C言語のセマンティクスは複雑で、プログラマがCプログラムがどのように基礎となるアーキテクチャにマッピングされるかを正確に理解することは困難、と記事にありますね。

その通りじゃ。ポインタの有効な操作は制限されており、コンパイラはポインタの出所を追跡することが許可されているのじゃ。

SpectreとMeltdownの修正はパフォーマンスに大きなペナルティを課すというのも気になります。C言語に最適化されたプロセッサアーキテクチャの限界が見えてきたということでしょうか。

記事では、Erlangスタイルの抽象マシンでは、すべてのオブジェクトはスレッドローカルまたはイミュータブルであることに言及しているのじゃ。並行プログラミングはC言語のような抽象マシンでは難しいからの。

C言語は現代のハードウェアにうまくマッピングされておらず、並行プログラミングはC言語のような抽象マシンでは難しい。この記事の結論ですね。

C言語は、まるでツンデレな恋人のようじゃな。昔は素直だったのに、今は複雑すぎて手に負えないのじゃ!

博士、C言語に恋していたんですか?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。