Shammer's Philosophy

My private adversaria

コンパイルの実行

Javaの場合、自分の書いたソースコード

javac mysource.java 

としてやればJavaVMが解釈可能な中間コードができる。
これを java mysource という感じにして実行する。
こうするとJava仮想マシン上で mysource が実行される。

だが、C言語の場合はこれよりいくらか複雑だ。
cc や gccコンパイルすれば実行ファイルができあがるが、
この時に

という大事なプログラムが動いている。
プリプロセッサソースコードの置換?
リンカの仕事は、イメージとしてはjavaでいうところのimportしているクラスを読み込む処理だろうか。(ClassLoderの仕事?)
javaではそれほど意識しなくてもいい部分だが、Cの場合はこれを意識していないといけないような気がする。(まだその根拠はないが)
リンカはJavaの場合はインタプリタの仕事かも・・・


Cでのコンパイルから実行までは、

  1. ソースコードを編集し保存する
  2. プリプロセッサソースコードを処理
  3. コンパイラがオブジェクトコードを生成
  4. リンカがオブジェクトコードとライブラリを結びつけ実行ファイル作成
  5. ローダによって実行ファイルがメモリにロードされる
  6. メモリにロードされた実行ファイルがCPUに読み込まれ実行される

という流れだ。Javaの場合は仮想マシンがこの大半の処理を隠蔽しているが、Cの場合はこれを意識していないといけなそうだ。
インタプリタの処理としてあまり意識しなくてもよかった部分もCの場合はきっちり押さえておかないと後で訳がわからなくなるかも・・・
ある程度VMの動きも知っていないといけないなぁ。