« 羽々斬は 4.0 以降用へ | メイン | TJS2バイトコード対応コミット »

2013年02月26日

吉里吉里 その他の開発日誌:: TJS2 バイトコードのバックポート

    

羽々斬 ( 吉里吉里Java ) で実装した TJS2 バイトコードの読み書きを吉里吉里2にバックポートした。
動作確認はしたが、詳細なテストはこれから。
テスト完了後公式リポジトリにコミット予定。

バイトコード対応によって得られる恩恵の一つは高速化だけど、これは11倍超くらいになった。
KAG3 のスクリプト読込みが自身の環境では 100ms 以上速くなり、起動速度の向上が体感できるくらい。

もう一つは難読化。
スクリプトからバイナリの塊になるので読めない。
作った自分でも読めないというか、読みたくない。
デバッグ時にバイナリやダンプを見てどこがおかしいのか調べているだけで発狂しそうになる。

バイトコードファイルフォーマットは羽々斬と同じだけど、細かい部分のIF仕様は少し異なっている。
execStorage で tjb ファイルへの読み替えはなくしている。
compileStorage でデバッグ情報の出力有無を切り換えられるようになっている(羽々斬では常にOFF)。
デバッグ情報は、バイトコードとスクリプト行情報の対応情報。
これがあると、バイトコードのどこかで例外が発生した時、スクリプトのどの行かわかる。
デフォルトでは出力しない。
デバッグ情報出しても、スクリプトのテキスト自体は含まれないので、対応するスクリプトは出ない。
"Bytecode." と言う文字列が出るだけ。
この辺りは例外発生時のダンプや dump メソッドコールすればわかる。
compileStorage の引数は以下の形。

Scripts.compileStorage( scriptfilename, outputfilename, isresultrequest, outputdebuginfo );

Java から C++ へは楽かと思ったが、言語仕様の違いからくる仕様の違いでミスりまくって不具合が出た。
リファレンスカウント方式かどうかとかバイトコード中の TJS2 レジスタアドレスがインデックスかアドレスか、バイトコードのインデックスかアドレスかなど順調にはまった。

開発は使いやすい VC で行ったから、TJS2 コマンドラインコンパイラが副産物として出来た。
こっちはメンテする気がないから有用性は微妙。
羽々斬との仕様の違い部分は、その内羽々斬側を合わせていきたいところ。



投稿者 Takenori : 2013年02月26日 19:36




comments powered by Disqus
Total : Today : Yesterday : なかのひと