2008年9月14日日曜日

C言語はハードウエアにべったり?

感じたことを書いておこうと思う。

  • C言語はハードウエアべったり(ノイマン型べったり)だから速い、とか言われていた。
  • 自分もそれを鵜呑みにして、そう信じていた。

  • でも、パタヘネでコンピュータアーキテクチャを自分自身で確認しなおして、さらにC言語も自分自身で確認しなおすと、どうもべったりとは思えない。
  • パイプラインだとか、記憶階層だとか、そういうような速度に影響を与える重要要素がアーキテクチャにはたくさんあるのだが、それはC言語の言語仕様には見えていない。
  • というか、ものによっては、命令セット(機械語)にも見えていない。逆に、隠蔽した上で、うまく最適化するのがアーキテクチャの善し悪しになっている。IA32はマイクロアーキテクチャなのでそれが顕著だが、MIPSだってそうだ。
  • なので、C言語はあくまでC言語たるモデルに基づいた高級言語にすぎないと思う。
  • それが速い、というのは、おそらく、それが速いようにアーキテクチャが調整されて、コンパイラが作り込まれて、というある意味優遇されている環境によるのではないか。その意味での、癒着構造としてのべったりならわかる。C言語がアーキテクチャにべったりなんじゃなくて、アーキテクチャがC言語にべったり、ということ。同じようだが、違う。
  • マルチコアとかの新しい状況は、本当にこのままC言語を偏重してアーキテクチャを進化させていくので大丈夫なのか、という時期に来ていると感じさせる。

  • C言語を入門する際に、実はこの誤解が学習障害になっているのではないか、と思った。
  • ハードウエアべったりというようにイメージしても、実際のハードウエアは違うからそこがずれている。
  • 一番大きなずれは、変数名などをどのように管理しているかというシンボル管理の側面を、ハードウエアべったりということを意識して、メモリと箱モデルですましてしまい、シンボル管理を言語モデルというか仕様としてどのようにしているかを説明しないところではないか。自分は、C言語の前にCommon Lispをかじっていたので、そのあたりを適宜補って理解することができた。今でもC言語をたいして理解したとはいえないが、それがなかったら、もっとぐだぐだになってしまったと思う。

  • C言語が速いというのは、上のような長年の優遇措置を除けば、静的型付けであることと、OSがC言語でかかれているのでシステムコールを他言語にくらべてもっともダイレクトにcallできること、というのが理由ではないか。

  • というわけで、昔はハードウエアべったりだったのかもしれませんが、今は違うと思う。

  • あ、小さな組み込み系とかで、アーキテクチャがシンプルなものは、今でもべったりというのはありそうですね。

  • C言語が速い、というのは、ある意味事実だが、それが「言語仕様がノイマン型にべったり」だからというのは理由としても違うし、このべったりというのは単体の言明としても違うと思った。

0 件のコメント: