[BAS のアーキテクチャ]

データ処理の分担は図1 のようになっています。


図1 データフロー

ターゲットは、PCの場合もあればマイコンの場合もあります。
(といっても、高度な言語でないのでPC用はあくまで動作確認用です)
このように細かく分割されているのは、他のターゲットへ対応する場合に、
作成すべきツールの規模を小さくするためです。
最も複雑なツールは BASCOM ですが、これは全てのターゲットにおいて共通
に利用できます。
一方で、BASGENxxx, BASSIMxxx はターゲット毎に制作する必要がありますが、
それぞれ非常に規模が小さく、かつ既存ターゲットのコードを少し修正すれば
新しいターゲットへ対応できます。

仮想CPUのブロックは図2 のようになっています。


図2 仮想CPUブロック図

レジスタとしては、プログラムカウンタ・スタックポインタ・結果レジスタ
の3つしかありません。演算は常にスタックを対象とします。
スタックといっても、実際のCPU上でそれがCPUのスタックに割り当て
られている必要はありません。スタックのような挙動をする配列でもいいわ
けです。
ターゲット毎に大幅に異なるものとして、各種I/O が挙げられますが、この
仮想CPUでは、それらをひとくくりに「SystemCall」という命令に集約してあ
ります。
BASSIM では SystemCall関数に処理が渡り、実コード版では SystemCallを処理
するネイティブコードで作成されたサブルーチンへを呼び出します。あとは、
引数に応じて適切な処理をするように SystemCall部分を実装しておけば、BAS
プログラムが正常に動作するようになります。
BASプログラム上では、この SystemCall が関数のように見えます。
たとえば、次のサンプル。

dim i;
while( i < 3 );
    print( "TEST " );
endloop;
end;

これは、print が SystemCall になっています。

[▲上へ]