分割コンパイル
複数のソースコードファイルを別々にコンパイルする
プログラムの断片を読んで対応する断片を出力する
何のためにするか
分割コンパイルを採用しない場合、printfなどの標準関数のことも全てコンパイラが把握している必要がある
つまり、自分の書いた1ソースコードをコンパイルする時に毎度、裏側で標準関数の書かれたプログラムも一緒に入力してコンパイルする必要がある
今回のプログラムで使ってない別の標準関数も全て入力に入れてコンパイルすることになる
当たり前にファイルサイズもコンパイル時間も大きくなってしまう
1行変更しただけでコード全体をコードする必要が出てくる
めちゃでかプロジェクトだと全体で一気にコンパイルすると1日で終わらんとか、メモリ100GiBいるとかになるらしい
関数をコンパイルする
関数を呼び出すコードをコンパイルする時に必要な情報
その識別子が関数のものであるという情報
引数の型、引数の個数、その返り値
つまり、関数の内部がどうなっているかはわかってなくて良い
アセンブリを出力するときもcallってやって、(その先でなにかやって)、戻ってくるだけなので、問題にならない
つまりCのヘッダファイルやNimのforward declarationで書いてるような情報があれば十分である
ちなみにCにもforward declarationはある
これは、メインメモリがとても小さかった時に必要だった機能で、今となっては時代遅れな仕様
code:nim
// forward declaration
proc hoge(piyo: int): string
code:c
// hoge.h
int hoge(const char *s1, const char *s2, size_t n);
// piyo.c
#include <hoge.h> // ←この行がコンパイル時にhoge.hの内容に置き換えられる