khabaのメモ
(1)
- GBA(GameBoyAdvance)で動くOSASKを作りたい。でもそしたらx86用OSASKとバイナリ互換はできない(当たり前)。ソース互換ならできるかもしれない。
- しかし仮にソース互換にするにしても、エンディアンの問題とかで、完全互換はできないかもしれない(ARM7だけならx86との間にエンディアンの問題は起きないかもしれないが、いずれは他のCPUのことだって考えたい)。それに人によってはソースを公開するのはいやかもしれない。
- それなら中間コード(いわゆるVMのバイトコード)みたいなものを考えて、それを実行時に各CPUのネイティブコードに変換すればいいのではないか。これならエンディアンとかの問題はない。CPUのビット数が違って機種によってint幅が異なる、という問題も起こらずに済ませられる。
- これをkhabaとする。
(2)
- khabaでは最適化に執着しない。プログラムの2割の部分が実行時間の8割を占めるといわれるが(人によっては1-9ともいうが)、khabaが目指しているのはこのコードのうちの残りの8割の部分の移植の手間をなくすことである。速度が求められる2割の部分については、それぞれのCPU向けのコンパイラ(やアセンブラ)で最適なコードを生成すればよい。もちろんプログラム全体をkhabaだけで書くことはできるが、その場合、実行速度には不満が残るかもしれない。しかしそれは問題ではないと考える。
- khabaは、ネイティブコードと簡単に(=少ないロスで)交信できる。関数とかも気軽に呼べる。これが担保できないと、上記理想が実現できない。
(3)
- khabaはスタックマシンではなく、レジスタマシンである。総レジスタ数は128か、もしくはそれより多くする(上限を設けないかもしれない)。レジスタのビット数も規定されない。レジスタを使い始める前に、そのレジスタを何ビットレジスタとして使いたいのかを宣言する。宣言は1bitでも2bitでも27bitでもよい。この宣言には、最低ビット数と最大ビット数がある。たとえば最低ビット数8、最大ビット数指定なし、の場合、8bit以上のレジスタ(もしくはメモリ)が割り当てられると仮定してよい。 for (i = 0; i < 100; i++) { hoge...; } のiのために割り当てるレジスタであれば、まさにこのような指定でいいわけである。
- レジスタマシンにしたのは、khabaをネイティブコードに変換するプログラムに楽をさせ、しかもネイティブコードとの交信をやりやすくするため。たとえばIA-32の場合、レジスタ番号0は、EAXに割り当てられる。レジスタ番号1はECX(本当にEAXやECXにするかどうかは未定。翻訳をやりやすくするため、EAXとかをリザーブにする可能性もあるから・・・MUL/DIV命令やIN/OUT命令を考えると、EAXでしかできないことが結構あり、もしEAXがレジスタ0として利用可能だとすると、DIVをPUSH(EAX);、POP(EAX);ではさまないといけない。リザーブしておけば、EAXは常に破壊可能と想定していいことになるから、このようなPUSH/POPはいらなくなる)。
- レジスタ番号8番以降はIA-32には割り当てるべきレジスタが存在しない。これはメモリに割り当てられる。リザーブレジスタがあれば、8番よりももっと若い番号でもメモリに割り当てられることになりそうだ。何番からメモリ行きになるかは、動的に決まるわけではない。khaba/IA-32仕様に記載され、確定する。レジスタ番号nがどのレジスタになるのかについても、仕様で決める。
こめんと欄
- このページは誰かに意見を求めるためではなく、自分の記憶の整理のためにあるので、こめんと欄はありません。