Saturday, 5 May 2007

コンパイラでめんどくさいのは、



ABI 合わせ。Application Binary Interface ですね... 要するに、

 関数の呼び出され方と、
 関数の呼び出し方

の規約だ。だいたい、歴史的な理由で決まる。ということは、

 その時、その時の事情で適当に決めた腐り切った規約

だってこと。まぁ、Cは、引数のアドレスを取れたり、コンパイラが中身を教えてもらえない可変長引数とかがあrので、ある程度汚いのは仕方がないのだが...

レジスタとそのセーブする場所、局所変数と関数呼び出しの呼び出され側(callee)の引数、呼出側(caller)の引数が、重ならないように配置するわけなんだけど、微妙に合わない。調整する部分が3-4箇所あり相互に依存しているので。


合わないと、まったく動かないわけではない。あたりが最低... このあたりを、線形制約で解くみたいな論文があったような気がするが...

C との互換性を捨ててしまえば、このあたりはさっぱり気にしなくて良くて、実際、自分で作った部分は、マシン依存性はほとんどない。その分、プログラマにしわ寄せがいくだけだがね。

No comments: