UnixやLinuxはCで出来ている。

そしてgccは元々Cをコンパイルするように作られている。
ならばCとバイナリの仕組みさえ理解すれば良いのだ。


例えばC++は本質的にはCへの変換とみなせる。

  • 関数のオーバーロードはそれぞれの関数実体へのエイリアスだ。元の関数名と内部識別子を繋いだ関数をそれぞれ生成し、文脈に応じて呼び変えているにすぎない。
  • classはstructへの構文糖衣だ。メソッドはそれぞれの関数実体へのエイリアスだったり、内部構造の順序が不定になっていたり、virtual関数テーブルが追加されていたりするにすぎない。virtual関数はテーブル引きの分だけ遅くなるので注意。たいした差ではないけど。
  • templateは型や構文を理解するとても賢いマクロだ。特に対応するものがないので手動で展開するしかない。


そしてCはアセンブラへの変換だ。

  • Cの関数呼び出しはアセンブラの関数呼び出しに引数の設定を自動化したものだ。その呼び出し規約が何種類かあるので注意。
  • structはレジスタやメモリへのエイリアスだ。この変換ではパディングが勝手に入るので注意。
  • でも最近のCPUではバイナリをさらに変換して実行するらしい。その詳細も知らなくてはならないのだろうか。


実際、こう書いてみるとC++の方が明らかに優位だよな。

      • -

巨大なローカル変数を取ろうとしてスタックが溢れるとか、アーキテクチャを知らないと判らないエラーというものがあるのでこんなことを思った。