こんにちは、高木です。

今日で三箇日も終わりですが、みなさん、年末年始はいかがお過ごしになられたでしょうか?
本日も、昨日から開始した連載企画「C++でTcl/Tkのラッパーを作る」の記事を投稿したいと思います。

C++で本格的にラッパーライブラリを作る前に、Tkの他言語バインディングについて調べておくことにします。
TkはTclだけのものではなく、さまざまなプログラミング言語から使用できます。

英語版のWikipediaを見るだけでも、Ada、Haskell、Perl、Python、Ruby、Rexx、Common Lispにバインディングされていることがわかります。
実験的なものまで含めれば、これ以外にもまだまだあります。

実験的な言語バインディングのうち、最初に私が注目したのはPHP/Tkです。
PHPはCやC++とシンタックスが類似している部分が多く、C++バインディングを作る上で最も参考になると考えたからです。

次に注目したのが、C++/TclC++/Tkです。
この二つ、とくにC++/Tkは(ジョークもかかわらず)非常によくできています。
本来であれば。既存のC++/Tkを使えばいいのかもしれませんが、以下に挙げる理由から見送ることにしました。

  • Boost C++ Librariesに依存している。
  • もっと薄いラッパーライブラリが欲しい。
  • C++でTcl/Tkに近い記述ができることは必要なく、むしろC++らしいライブラリが欲しい。
  • C++/Tkは10年以上メンテナンスされておらず、最新のTcl/Tkに追従できていない。

最初に挙げた“Boost C++ Librariesに依存している”というのは、許容範囲といえば許容範囲です。
しかし、できれば他の外部ライブラリに依存することなく、Tcl/TkとC++の標準ライブラリだけで実装することで手軽さが増すと考えました。

さらに他の言語バインディングについても調べてみました。
C++/TclやC++/Tkはともかく、それ以外はすべて動的言語のバインディングなので、静的言語のバインディングがあればそれを参考にしたかったのです。

そこで見つけたのがTcl/Java ProjectによるJaclです。
Tcl/Java Projectも長期間更新されていないようですが、直接その成果物を利用しようというのではなく、自作する上での参考にするだけですので問題ありません。

私自身、実はJavaは好きではありません。
好き嫌いはともかく、Javaで書かれたコードはほぼ読めますし、自分でコードを書くこともできます。
自分的にはどうでもいいそれらの経験が、こんなところで役に立つとは意外でした。

Jaclは残念ながらTkのバインディングではなく、Tclの機能を使うAPIしかありません。
ですので、本来目指すべきTkのバインディング部分は自分で100%考えなくてはなりません。
しかし、Tclのバインディング部分が実は一番悩むところですので、ここがクリアできれば大きな一歩となることでしょう。