generated at
分割コンパイル

複数のソースコードファイルを別々にコンパイルする
プログラムの断片を読んで対応する断片を出力する
最後にオブジェクトファイルを結合して一つのファイルを作る
この作業をするのがリンカ
何のためにするか
分割コンパイルを採用しない場合、printfなどの標準関数のことも全てコンパイラが把握している必要がある
つまり、自分の書いた1ソースコードをコンパイルする時に毎度、裏側で標準関数の書かれたプログラムも一緒に入力してコンパイルする必要がある
今回のプログラムで使ってない別の標準関数も全て入力に入れてコンパイルすることになる
当たり前にファイルサイズもコンパイル時間も大きくなってしまう
1行変更しただけでコード全体をコードする必要が出てくる
めちゃでかプロジェクトだと全体で一気にコンパイルすると1日で終わらんとか、メモリ100GiBいるとかになるらしい


関数をコンパイルする
関数を呼び出すコードをコンパイルする時に必要な情報
その識別子が関数のものであるという情報
引数の型、引数の個数、その返り値
つまり、関数の内部がどうなっているかはわかってなくて良い
アセンブリを出力するときもcallってやって、(その先でなにかやって)、戻ってくるだけなので、問題にならない
つまりCのヘッダファイルやNimのforward declarationで書いてるような情報があれば十分である
ちなみにCにもforward declarationはある
これは、メインメモリがとても小さかった時に必要だった機能で、今となっては時代遅れな仕様
nim
// forward declaration proc hoge(piyo: int): string
c
// hoge.h int hoge(const char *s1, const char *s2, size_t n); // piyo.c #include <hoge.h> // ←この行がコンパイル時にhoge.hの内容に置き換えられる