独自言語の検討(その2) [PIC]
ローカル変数処理を実装しました。テストソースと実行結果を末尾に貼っておきます。
前回からの継続でインタープリタで動作確認しています。制御文処理もそうですが変数の扱いはインタープリタとコンパイラでは対応処理がかなり違います(共通点もあるけれど)
コンパイラであればローカル変数用に確保した領域のオフセット情報だけでアクセスできますが(リカーシブコールに対応したいので絶対アドレスにはならない)、現状のインタープリタでは都度変数名情報からアクセスしています(なのでオーバーヘッドが発生)。
インタープリタでも一旦中間コードに変換すればオフセットだけでアクセス可能ですが、メモリが少ないPICではソースへ逆変換できない中間コードをあまり生成したくありません(GAME言語はソース自体が中間コードのようなものなのでソースを直にインタープリットしても速度が速い)
このままインタープリタでの実装を進めていくとコンパイラ化する際に大改造になってしまうのは目に見えていますがまずはこのままインタープリタで進めようかと思っています。
コンパイラ化するためには
の2つの方法が考えられますが前者はディバッグが大変そうなので後者の方が良いのではないかと考えています(どこかにPIC24のエミュレータがあればいいんだけどね)。
ローカル変数テストソース(独自言語)
グローバル変数はソース先頭で宣言可能です。ローカル変数は{ }ブロックの先頭で宣言できます(ローカル変数は{ }内でのみ有効)
上記のテストソースの実行結果は次のとおりです。
テストソース実行結果
[ 前へ ] 連載記事 [ 次へ ]
前回からの継続でインタープリタで動作確認しています。制御文処理もそうですが変数の扱いはインタープリタとコンパイラでは対応処理がかなり違います(共通点もあるけれど)
コンパイラであればローカル変数用に確保した領域のオフセット情報だけでアクセスできますが(リカーシブコールに対応したいので絶対アドレスにはならない)、現状のインタープリタでは都度変数名情報からアクセスしています(なのでオーバーヘッドが発生)。
インタープリタでも一旦中間コードに変換すればオフセットだけでアクセス可能ですが、メモリが少ない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> |
[ 前へ ] 連載記事 [ 次へ ]
コメント 0