« TJS2 バイトコードのバックポート | メイン | TJS2バイトコードの注意点 »

2013年02月27日

吉里吉里 その他の開発日誌:: TJS2バイトコード対応コミット

    

TJS2 バイトコード読み書き機能対応をコミットした。
次回リリースされるバイナリから同機能が使用可能になるはず。

暫定バイナリをここに置いておく。

上記バイナリに含んでいるコンパイル補助スクリプトもコミットしている。
後、TJS2シンタックステストスクリプトもコミットした。
TJS2 のシンタックス周りのテストが必要な修正を入れた時役立つはず。

副産物のTJS2コマンドラインコンパイラも置いておく
ソースコード付き。
メンテしないと思うので、修正が入ったら用済みに。
そもそもこれでコンパイルする必要があるのかどうか……
TJS2 を VC でコンパイルするたたき台にすると言う用途はある。
正規表現クラスは対応していないけど。

単純にバイトコードに置き換えて高速化/難読化するのであれば、コンパイル補助スクリプトを使って、スクリプトD&Dして、出来たバイナリにスクリプトを置き換えれば済む。
ちょっと高度なことをしたい人向けに説明書いておく。
コンパイルは以下のメソッドで出来る。

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

scriptfilename : TJS2スクリプトのファイルパス
outputfilename : 出力されるバイトコードファイルのパス
isresultrequest : 返り値を必要とするスクリプトかどうかを true / false で指定。デフォルト false
outputdebuginfo : デバッグ情報を含めるかどうかを true / false で指定。デフォルト false
isexpression : expression (式) かどうかを true / false で指定。eval する場合は必要。デフォルト false

最初の2つの引数は説明の必要がないだろうけど、後の3つは必要だろうと言うことで書く。

まずデバッグ情報は true にしても、私以外には意味がないと考えた方が良い。
デバッグ情報には バイトコードのインデックスとスクリプトの文字位置の対応情報が含まれ、例外が発生した場合などにその位置を特定するのに使われるが、スクリプトがないと何文字目付近かしかわからず、意味がない。
また、現状スクリプトとバイトコードを突き合わせて位置を示す機能などないので、このデバッグ情報があっても役立たない。
エラーや例外が発生したのなら、スクリプトで実行してその位置を特定して原因を究明することになるので、必要ないことになる。
もし、バイトコード読み書き機能が原因でエラーが発生しているのなら、デバッグに役立つがそのデバッグは私がやる可能性が高い。

返り値を必要とするかどうかは、Scripts.execStorage / Scripts.evalStorage で返り値が必要かどうかによって指定する。
evalStorage であれば、true に設定する可能性が高い。
通常は、false で問題ない。

式かどうかは、Scripts.evalStorage で呼び出すかどうかに依存する。
厳密には、Scripts.evalStorage で呼び出すかどうかは関係ないのだけど、式を eval する時に true にすると考えて問題ない。

後の3つの説明は以上。
何を言っているのかわからないのなら、全部 false か未指定でかまわないと言うか、補助スクリプトでコンパイルしておけばいい。


バイトコードの実行は Scripts.execStorage / Scripts.execStorage でスクリプトファイルを指定した時、そのファイルのヘッダーを見てバイトコードのものであればバイトコードとして扱われる。
TJS2 バイトコードファイルフォーマット は以前書いたものと同じ。



投稿者 Takenori : 2013年02月27日 23:02




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