最近はずっとasparserのコードばかり進めている。あまり楽しくない成果になりそうだけど、一応パーサからASTを生成して、ASTからC#のコードを生成するようなところまでは書いた。まだ問題だらけなので実用品にはなっていないのだけど、少しずつ直していこうと思っている。
tsukimiを作っていた頃と、やっていることはそんなに変わらないのだけど、今回は真面目にコードを取り込んだり読解できるようになったりしたいので、もう少し回りくどいことをしなければならなくなるかもしれない。具体的には、AS3のASTからC#のコードを生成する前に、ASTを分析して、C#の構造に合わせられるようにC#向けの別のASTが必要になるかもしれない。
たとえば、C#ではif文やwhile文の条件式の結果はboolでなければならない。AS3では(Cなどと同様)これは自動的に計算される。問題なく変換を行うためには、ASTのツリーで型を判断できるようにしなければならない。型を判断するためには、式オブジェクトの全てに評価型が必要になり、変数などの参照解決が必要になる。これではもう実行コードを直接生成できるコンパイラを作っているのとあまり変わりないわけだ。まあ、if文の評価式は "bool EvaluateAsBoolean(object obj)" みたいな関数を呼び出すようにすれば、問題は回避できるのだけど、boxing/unboxingが入るとパフォーマンスは下がるだろう。
ジェネリック型などは.NETともそれなりに扱いが異なりそうだけど、その辺はまだ調べていないので、まだ構文上の違いくらいしかわからない。
プロパティの構文など、C#とAS3でシンボルの解釈が違う場合もあって(C#のvalueに相当するものが、AS3ではプロパティ名と同じ識別子になる。つまり、それ自身を再帰的に参照することはできない)、注意がいろいろ必要そうだ。
ライブラリという観点では、dogfoodingというか最終的に使おうと思っているオリジナルコードはサウンド系のものなので、あまり標準ライブラリに依存しているということはないだろうと思っているのだけど、まあまだよく分からない。ProcessingCliみたいなものは、大規模なものを作るつもりは無い。そこまで深入りはしたくないところだ。
Leave a comment