* ES-VMの基本アーキテクチャ -(by [[K]], 2020.06.27) ** (1) -(基本的な仕様は OSECPU-VM / 第三世代OSASK のときの設計を手本にしている。) -レジスタマシン、レジスタ本数は無制限、ビット幅も無制限。 -整数レジスタ、ポインタレジスタ、浮動小数点演算レジスタがある。 --どのレジスタの使用頻度が高いのかを示唆する命令はある。ES-VM処理系はその命令に基づき、実マシンの命令に変換するときにどのレジスタを優先的に実レジスタに割り当てるのかを決める。 ---もちろんそれを自動判別できればすばらしいのであるが、それをやるとどんどんES-VM処理系がやるべき仕事が増えてしまって、処理系は大きくなるし、コード生成速度も落ちてしまうので、ここは最適化を自動化せずに手動で指定させることにした(もちろん別のツールで解析して、そのツールが示唆命令を出してもいいとは思っている)。 --ES-VM処理系は、結局どのレジスタがどの実レジスタに割り当てられたのか、実レジスタが無理だったものについては、どのメモリに割り当てたのか、みたいな情報を報告する。 --整数レジスタは原則として符号付き整数を扱う。符号なし整数を積極的に扱いたければ、ビット幅を1ビット増やしてほしい(まあ一応符号なし演算プリフィクスもあるにはあるが)。 --整数レジスタや浮動小数点レジスタのビット幅はレジスタごとに別々に指定できる。ポインタレジスタのレジスタ幅は指定できない。 --なお、指定したサイズぴったりのビット幅が割り当てられることは保証しない。それ以上のビット幅であることだけを保証する。にもかかわらず、エラー検出時は指定したビット幅でのオーバーフローが起きているかどうかを検出することは保証する。 -エンディアンは規定しない。たとえば32ビット幅で書きこんだメモリに対して8ビット幅でアクセスするのは禁止行為であり、エラーとして検出される。 --これを許せばエンディアンに依存したプログラムになってしまうからだ。32ビット値の中身を部分的に読みたいのであれば、相応の処理をする関数を使うか、もしくは、32ビットのまま読み込んで右シフトしてANDでマスクすればよいだろう。 --もっと一般化していうと、ES-VMは内部表現に依存したプログラムが書けなくなるようにしている。 -それぞれの命令はオペランド(引数)をとるが、どのフィールドもオペランドとしては、レジスタ、メモリ、即値を指定することができる。つまり単純代入命令で、「メモリ→メモリ」みたいなことも可能である。 --これはx86やx64には該当する命令がないが、それらのCPU向けにコード生成するときは、適当なレジスタを経由する形でコード生成されることになる。 ** (2) 実装方針 -基本的に、最適化を頑張りすぎない。シンプルかつ愚直に行く。私が欲しいのは、高性能でブラックボックスな大規模システムではなく、何をしたら何が起こるのか容易に想像できるような素直でコンパクトなシステムだからだ。 * こめんと欄 #comment