Mosh のビルド時間の短縮

Mosh のビルドで compiler.cpp と match.cpp のコンパイルに時間がかかる。
これらの C++ ソースコード

Schemeソースコード
=> Mosh 用にコンパイルされたインストラクション列
=> C++ の長い配列

と変換されたファイルでファイルサイズが数100KB 〜数MBのファイル。


g++ に優しいソースコードを出力するようにしたところ
コンパイル時間:180秒 => 130秒
と大きく改善された。

改善ポイント

改善のポイントはなるべく即値をうめこむこと。

以前は以下のように必ず Object のコンストラクタを挟んでたのを

#define SA(s)  Symbol::add(UC(s))
#define SI(s)  Symbol::intern(UC(s))
#define MI(i)  Object::makeInt(i)
#define MIS(i) Object::makeInstruction(i)
#define MCI(i) Object::makeCompilerInstruction(i)

    static Object array1[] = {
        builtinSymbols[573],
        MIS(14),
        MI(60),
        MI(1),
        Object::True,
        MI(0),
        MI(20),
        list0,
        MIS(27),
        MIS(23),
        MI(9),
        MIS(50),
        builtinSymbols[1025],

以下のように即値で埋め込む。

    static word array1[] = {
        builtinSymbols[573].val /* parameterize */,
        462,
        241,
        5,
        70,
        1,
        81,
        list0.val,
        878,
        750,
        37,
        1614,
        builtinSymbols[1026].val /* top level :$:first */,

即値にすると速くなるのは考えれば当たり前だが、いくつか実験して速くなることを発見したときはうれしかった。
もしかしたら gcc 3.x 系でもビルドできるようになったかも。(試していない)
これで psyntax もプリコンパイルできるようになると良いのだが。