コンパイルの流れをざっくり確認する


 10分くらい時間があるので、コンパイルの流れについて学習したことをざっくりとメモしておこう。なんとなくC言語を例に話を進める。
 コンパイルが実行されると、まず、Cの場合はC言語のプリプロセッサが、ヘッダファイルの展開やマクロの置換などを行う。ヘッダファイルの展開というのは、端的に言えばincludeされているファイルの内容をソースにコピペする作業である。マクロの置換は#defineで定義されてコード中で使われているマクロをすべて、元の値に戻す作業である。マクロ自体は、プログラマにこそ意味があるが、コードを実行するコンピュータには何の意味もないので、コンパイルされる前段階で省いてしまうということだ。
 プリプロセスが終わったら、実際にコンパイルされる。字句解析、構文解析、なんかをやって、中間コードを吐き出す。多くの場合、中間コードはアセンブリである。コンパイルの際に、最適化も行われて、この最適化によって元のコードとは異なる処理に置き換えられる可能性もあるらしい。
 コンパイルが終わったら、そのアセンブリファイルをアセンブラでアセンブルして、オブジェクトファイルが出来上がる。
 また、基本的には1つのソースファイルは1つのオブジェクトファイルに対応している、ということに注意したい。だから、あるオブジェクトファイルAがオブジェクトファイルBにある関数やら変数やらを参照しているとき、この段階では正しい参照が設定されていない。
 参照をうまいこと解決するのがリンカーだ。リンカーは出来上がったオブジェクトファイルをまとめて、参照を解決し、そこにスタティックライブラリをくっつけて、今度はスタティックライブラリに対する参照を解決する。共有ライブラリへの参照はここでは解決できないから、実行時にこれを解決するためのコードをハードコードする。linuxではld.so。
 以上をもって、ようやく実行ファイルがお客様の手元に届くということなんですね

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。