[1355] Re:その後のVM
投稿者:山
2009/06/12 20:27:59
>2つ目と3つ目のオペランドは全部0, 0なのですが、関数の方はprintf, sprintf, printの
はい、一つ目は文字列バッファーにある関数名インデックスを示し、二つ目はコン
パイル単位カウンター、三つ目は関数ID=インデックス、四つ目はパラメターの数
です。P2,P3は実行時に埋め込まれます。コンパイルカウンターは、1~最大値ま
でのループカウンターで動的コンパイル実行時かコンパイル単位の消滅処理時に
+1されます。コード上は最初は0そしてカウンターは1なので、値が違うためP1の
関数名から動的リンクをしてP2に1、P3に関数インデックスが埋めこめられ、この
関数インデックスで直接関数が起動されます。以後、P2のコンパイルカウンターが
一緒なら、P3で直接関数起動です。直接起動の前にIF文が一回入る程度です。
このような感じで、スレッドセーフな動的リンクを実現しています。実はこれには
面白い副作用があって、例えば画面に文字を出す関数を動的コンパイル単位にすれば。
メインは一切い変更せず。あるときはゴシックで表示、コンパイル単位の消滅そして、
最コンパイルすると、その時から丸文字表示で文字が出される等が可能です。
関数の内部機能を動的に変えることが出来ます。もちろん総てのスレッドにスレッ
ドセーフで。でも、使い道はそんなに無いかもしれませんけどね。^^;
そうそう、今の所同じ関数名でも違う文字列IDですが、暇が出来たら同一IDにする
予定。
VMを作り始めてから何度もも構文処理からの修正が必要になり。なかなか前に進み
ません。書きあがって動いても、スレッドセーフの問題点が見つかり、書き直しも
ごそごそと。言語としては最終的なつめなので、すぐには終わりそうにないです。
でも、思った通りに作れるのはいい感じです。