|
SourceForgeには、 Tcl/Java というプロジェクトがあり、 TclとJavaを統合するためのパッケージが開発されています。 そのサイトで現在公開されているパッケージの2つが、 Jacl (Java Command Language)とTcl Blendです。 このページ以降では、これらについてサンプルを交えながらご紹介したいと思います。
Jacl (Java Command Language)とは、Java言語で書かれた、 Tcl言語のインタープリタ(解釈実行系)です。 Javaプログラム内でTclコマンドやTclスクリプトを解釈実行させることができ、 パラメータファイルを解析するなどの、本来Javaで書くには面倒なテキスト処理を、 プラットフォームに依存しない形で簡単に実装できます。 ただし、JaclはあくまでJavaで書かれたインタープリタなので、 Tclコミュニティで公開されている膨大な数の(C言語の) 拡張ライブラリを使うことはできません。 端的な例がTkです。Javaで書かれたTkというものはないので、 JaclではTkのGUIを出すことができません(※1)。 C言語の世界のTclとは完全に切り離された世界だということは意識しておく必要がありますね。 ただし、最近のサーバーサイドJava技術の台頭に合わせて、 サーブレットなどのJavaコードに埋め込む簡易言語として、 文法がシンプルなTclはPython、JavaScript(Rhino)などと並んで注目すべき存在です。 特に、これらの言語処理系の中で最も「軽い」という点と、 日本語の扱いが簡単という点が利点と言えましょう。 (※1) Javaで書かれたTk、というコンセプトのソフトウェアとして、 Swankが開発途上にあります。 しかしTkとSwankは全く別物ですから、やはり上記の事柄は言えます。
ごくごく簡単には、次のような感じです。 C言語によるTclのライブラリ関数(Tcl API)をご存知であれば、 メソッド名=API名やそれらの使い方が、なんとな〜く良く似ているのが確認できると思います。
この他にも、Tclスクリプト全体を評価することもできますし、 コマンドラインからtclshと同様に実行できるシェルクラス(tcl.lang.Shell)もあります。 また、それらのTclスクリプトの中ではjava::なにがしというTclコマンドが追加されていて、 実行しているJava VM上でJavaクラスをロードして、 メソッドをコールしたり、フィールドを参照したりすることができます。 つまり、Tclスクリプトを書くだけで、Javaクラスの動作テスト・コードを組むことができるわけです。
1つの例は直前に述べた通り、Javaコードの動作テストに使うことです。 またJaclの活躍の場として最近注目すべきなのが、 サーブレットや Webサービス等のサーバーサイドのJavaアプリケーションが、 起動時にパラメータ初期化ファイルを読むようにさせたい、というときです。 初期化ファイルの文字列をTclで解析してパラメータにしてJava世界で使うとか、 あるいは初期化スクリプト自体をTclで書くようにして、 これをJava VM上で解釈してパラメータを取得する、といった処理が考えられます。 ただし、Jaclを積極的に使いたい、 という場合にあらかじめその存在を知っておいた方が望ましいところのソフトウェアがあります。 それはJythonと呼ばれる、 Java言語で書かれたPython言語のインタープリタです。 このJythonは、JavaクラスをPython言語でサブクラス化するなどの、 Jaclよりも高い水準で統合が図られている恐るべきライブラリです。 つまりJaclよりも、Jythonの方がいろんなことができる可能性があるのです。
Tcl言語はシンプルで本体そのものは他のスクリプト言語に比べて貧弱ですが、 拡張性の高い言語です。その利点を生かして、 Tcl/Tk本体に組みこんでいろいろな機能を使えるようにする拡張ライブラリが世界中で開発されています。 Tcl Blendも、そうした拡張ライブラリのひとつです。 では、どんな機能を追加するライブラリかというと、 JavaクラスをTcl/Tk処理系からロードして使えるようにするものです。 はい? いや、ですから、 JavaのクラスをロードするTclコマンドというものがあってですね、 なんだって? 本当なのです。 Tcl/TkがJavaと同じサン・マイクロシステムズ社で開発されていた頃、 Tcl/Javaの構想も立ち上がりました。そんな経緯というか良縁(は?)もあり、 またTclの持ち前の拡張性と、 Javaのネイティブメソッドインターフェースをうまく取り入れて、 「言語結合」とでもいうべきとんでもないライブラリが生まれた、というわけです。
Javaであるクラスのオブジェクトを新しく作るには、 例えばjava.util.StringTokenizerクラスの例でいくと、
StringTokenizer st = new StringTokenizer("aaa bbb ccc");
のようにしますが、これを Tcl Blend では
set st [java::new java.util.StringTokenizer "aaa bbb ccc"]こんなふうに書きます。もうちょっとだけ比べると、こんな風に対比できます。
Sample1 a = new Sample1("aaa", 1);
a.x = 10; a.y = 20;
a.calculate("Hello! Tcl Blend!");
イコール:
set a [java::new Sample "aaa" 1] java::field $a x 10; java::field $a y 20 $a calculate "Hello! Tcl Blend!"こんな調子で、他にもJavaクラスが投げる例外もTcl Blendで (Tclのcatch文で) 捕獲できますし、AWT/Swingのイベントリスナーを Tclで簡単に書く方法も用意されています。 Tcl Blendはtclshやwishに対する拡張ですから、 wishの(Tkの)画面を出しつつ、Java AWT/Swingの画面を出すこともできますし、 Javaクラスのコードの中からTkのウィンドウを操作するコマンドを発行することも可能です。 これほど強烈な拡張ライブラリもまたないでしょう。
Javaのプログラムを開発するときには、クラス設計をして、 クラスの単位で開発を進めるのが普通です。その中で、 JavaBeansやイベントリスナーのようなクラスは、単体で動作しなくて、 そのクラスのオブジェクトを作って動かす側のクラスが必要です。 そのため開発中やテスト段階では、これらのクラスを動かすダミーのクラス (開発方法論ではしばしばドライバと呼ばれます)も作る必要があります。 しかし、 Javaのようなきっちりした文法の言語でドライバをわざわざ作るのは開発者にとっても苦痛な面が多く、 時間的にも無駄が多いものです。 そこで、このようなドライバをTclで書けたら、 スクリプト言語なので書いては試し、試しては書き直し、といったことが簡単にできます。 まずは開発現場のツールとしてお勧めできるといえるでしょう。 もう一点は、通常はTcl/Tkを拡張するにはC言語を使いますが、 Cの代わりにJavaを使ってTcl/Tkを拡張できるようになることです。 具体的には、Javaでtcl.lang.Commandインターフェースを実装したクラスを作ることで、 Tclコマンドとして呼び出せるJavaコードを書くことができます。 Javaは標準化傾向の強い言語であるために、JDBCを使った各種RDBMSの操作機能、 LDAPなどのディレクトリアクセス機能、SSLなどのセキュリティ関連などなど、 エンタープライズユースに特化した複雑な機能が、 サンと主力ベンダや周辺コミュニティによって協議されたうえで標準仕様としてAPI化され、 Java VMに搭載されています。 かたやTclはというと、例えばデータベースアクセスにしても、 各RDBMSごとに異なるインターフェースが異なる形で開発されています(JavaにおけるJDBCのようなものがない)し、 LDAPやSSLはオープンソースであるために、たくさんのライブラリをいろいろなところから集め、 ゴルゴ13全巻なみのドキュメントを読破しなければ使いこなせません。(ないないない) このようなTclの現状をショートカットして、 Javaの力を借りてしまおう、という考え方もあるのではないかと思います。
|