SSブログ
English Version

独自言語の検討(その2) [PIC]

 ローカル変数処理を実装しました。テストソースと実行結果を末尾に貼っておきます。

 前回からの継続でインタープリタで動作確認しています。制御文処理もそうですが変数の扱いはインタープリタとコンパイラでは対応処理がかなり違います(共通点もあるけれど)
 コンパイラであればローカル変数用に確保した領域のオフセット情報だけでアクセスできますが(リカーシブコールに対応したいので絶対アドレスにはならない)、現状のインタープリタでは都度変数名情報からアクセスしています(なのでオーバーヘッドが発生)。
 インタープリタでも一旦中間コードに変換すればオフセットだけでアクセス可能ですが、メモリが少ないPICではソースへ逆変換できない中間コードをあまり生成したくありません(GAME言語はソース自体が中間コードのようなものなのでソースを直にインタープリットしても速度が速い)

 このままインタープリタでの実装を進めていくとコンパイラ化する際に大改造になってしまうのは目に見えていますがまずはこのままインタープリタで進めようかと思っています。

 コンパイラ化するためには
  • インタープリタでの処理を参考にしながら一足飛びにPICのマシン語を出力するコンパイラを作成する。
  • 仮想的なCPU(VM)のマシン語(簡易バイトコード)のインタープリタを作成し、VM用のマシン語を生成するコンパイラを作成する。その後バイトコード出力部をPICのマシン語出力に変更する。

の2つの方法が考えられますが前者はディバッグが大変そうなので後者の方が良いのではないかと考えています(どこかにPIC24のエミュレータがあればいいんだけどね)。


ローカル変数テストソース(独自言語)
#
# local variable and proc call test
#

var abc;    # global variable

proc proc2( data, str ) {
    var abc;    # local variable

    PrnStr_( str );
    PrnStr_( "\nproc2's argument = " );
    PrnDec_( data );
    abc = 10;
    PrnStr_( "\nproc2's abc = " );
    PrnDec_( abc );
}

proc proc1( arg1, str ) {
    var abc;    # local variable

    PrnStr_( str );
    abc = arg1;
    proc2( abc, "\nproc2() called by proc1()" );
    PrnStr_( "\nproc1's abc = " );
    PrnDec_( abc );
}

proc main() {
    PrnStr_( "\nstart test" );
    abc = 100;  # set global variable
    proc1( 123, "\nproc1() called by main()" );
    PrnStr_( "\nglobal abc = " );
    PrnDec_( abc );
    PrnStr_( "\nbye !!" );
}


 グローバル変数はソース先頭で宣言可能です。ローカル変数は{ }ブロックの先頭で宣言できます(ローカル変数は{ }内でのみ有効)
 上記のテストソースの実行結果は次のとおりです。

テストソース実行結果
C:\src\vc\2010Express\tscl\tscl\Debug>tscl test.pid

start test
proc1() called by main()
proc2() called by proc1()
proc2's argument = 123
proc2's abc = 10
proc1's abc = 123
global abc = 100
bye !!
C:\src\vc\2010Express\tscl\tscl\Debug>


[ 前へ ] 連載記事 [ 次へ ]
nice!(0)  コメント(0)  トラックバック(3) 
共通テーマ:趣味・カルチャー

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 3