インタープリターを作る
ぼちぼち作成中。
インタープリターは作ったことがなかったんですが、
コンパイラより難しいですね。
コンパイラはある意味、整形するだけですけど、
インタープリターはメモリ管理とかがたいへん。
x=2; print x+3*(2-x); y="abc"; print y=="abc" if(x==2) print "ok";
みたいな感じで、変数は小文字の一文字だけですが使えるようになりました。
あと文字列をサポートしていて、
文字列と文字列の比較をstr==strでできます。
C言語だとstrcmpを使うわけですが、値と文字列を変数に型を持たせて
文字列==文字列の場合は、ポインターではなくstrcmpで比較するようにしました。
文字列同士の加算もOK。
x="abc"; y="def"; z=x+y;
x+yのstrlenだけmallocして、memcpyでzにコピーしてます
x="abc"; x="def";
みたいな場合は、defを代入するときにabcを持っている領域をfreeしてます。
よく考えたらreallocしてmemcpyでdefを代入した方がメモリが断片化しないかな?
この場合長さが同じからreallocしないでもいいし。
まだ関数がないので変数のスコープという概念はないですが、
スコープが出来た場合は、関数から抜けた場合に、文字列変数を自動的にfreeしてやる必要があります。
ただ、厳密にフリーしていると、ループで関数が呼ばれる場合に
mallocとfreeを繰り返すことになって、効率が悪いので、
JavaとかのGC付き言語は、良く使う変数はスコープから抜けてもfreeせずに
時間差を持たすようです(要するにキャッシュと同じ考え方ですね)