TclCompilerって?†
TclProに含まれているバイトコードコンパイラです。
- 機械語にコンパイル*しません*
- 速度が速く*なりません*
TclCompilerの目的はソースを隠すことにあります。TclはJITでソースをバイトコードにコンパイルしているわけですが、このコンパイルのオーバーヘッドを軽減することにも*なりません*(tbcloadで読み込むと逆に遅いこともある)。TclProは紆余曲折の末、今は機能を追加してTclDevKitと名前を変え、ActiveStateが売っています。また、TclProはTcl8.3で止まったままですが、ソースコードとバイナリは全てSourceForgeに置かれていて自由に使うことができます。TclDevKitは8.4対応なので最新の開発環境が使いたくてソースを隠したい人はこっち買ってね♥みたいな。~
実際のところ使ってみたいのはTclCompilerだけなので、こいつだけTcl8.4対応にしてパッケージにしてみました。8.4から追加されたeqとか使えます。インストールは普通のパッケージのインストールと同じで、解凍してライブラリのパスに置いてください。
使い方†
test.tcl
set str "たのしいTclプログラム $tcl_version"
puts $str
このようなファイルを用意します。
tclshをおもむろに起動して次のコマンドを入力します。
package require compiler
compiler::compile test.tcl
exit
これでtest.tbcというバイトコードにコンパイルされたファイルができます。実行するにはtbcloadが必要ですが、ActiveTclにはデフォでインストールされているので、そのまま
tclsh test.tbc
で実行することができます。Freewrap、Starpackなどで使いたいときはtbcloadを適当にくっつけてやれば動くと思います。拡張子はtbcにしていますが、tclにしても動きます。FreewrapやStarkitなどでのバイナリの配布時にはActiveTcl付属のtbcloadをコピーすればいいんじゃないかと思いますが、ActiveStateのライセンスに縛られたくない人はtbcloadもダウンロードしてください。
コメントをどーぞ†
- 早速まねして利用しました。が、使っているシステムがtcl/tk8.2版だった為か、8.4版が必要とのメッセージが出て中断してしまいました。最新の8.4版を導入して再トライしてtbc型ファイルに変換できました。更に欲をかいてtbcファイルをfreewrapでexe型に変換を試みましたがTclPro ByteCode Loader が利用できないとかで変換できませんでした。かなり期待したのですが今一歩で断念です。 -- お父さん
- freewrapだと1つのラッピング実行ファイルの中から直接tbcloadを呼び出すのは無理です。tbcloadを外に出してauto_pathへパスを通すか、一度ディスク上に書き出す処理を自分で書いてください。Starkitだと、tbcloadも1つの実行ファイル中に含められるんですけどね。 -- reddog
- 確かにできて参考になりました。ファイルの大きさは、元の"@@.tcl"は"@@.tbc"で2倍以上の大きさでした。"@@.tcl"に直しても動きました. -- sakura
- お世話になります。tclcompiler 1.5をpackage requireすると、1.4と表示しますね。。 -- ごろ
- そうなんですよね。でもソースのままなんですよね・・・。旧版はそれが気になって1.4に俺が直していたんですけど、FCのRPM見たら1.5の表記なので、そっちに統一した方がいいのかなと・・・。内部的には対応するtbcloadのバージョンと同じ1.4になるんですが、configure.inでパッケージのバージョンを1.5にしてる矛盾といいますか何といいますか。気になるならファイル名とかpkgIndex.tclを書き換えて1.4にしても問題ないと思いますけど。 -- reddog
- ではDLL名とpkgIndex.tclを1.4に直して使います。 迅速な回答に感謝します。BLTも助かります。 -- ごろ
- .tcl型から.tbc型に変換できました。更に、アドバイスに従ってこのページにあるtbcloadをstarkitに組込むと、.exe型にまで変換できました。感激です。ところで、変換できた.exeは自由に頒布しても構わないのでしょうか? -- お父さん
- 何に使えるか分からん。nextJavaといいはるとかか。 -- test
- 現在のバージョンへの対応のご予定はありますでしょうか -- Juno
CategoryTclTk