C言語とTclのリンク

 いまやGUI全盛の時代です。 DOSプロンプトやUNIXシェルのコマンドラインからコマンドをタイプする文字ベースのプログラムは特に初心者には嫌がられるようになってしまいました。 GUIの浸透は1998年以降一気に知名度が上がったLinuxなどUNIX環境でも同様で、 雑誌の紹介では必ずGIMPとかNavigatorなどのハデハデしい画面を出して 「Windowsと変わらない操作性!」と言っていますよね。 それは確かに間違いではないのですが、 そのためか昨今ではこのようなウィンドウアプリケーションが標準になってしまい、 世の中のプログラマはすべからくこうしたビジュアルなインターフェースを備えたプログラムを書けなくてはいけないように感じているのではないでしょうか。 ちょうどそのようなプレッシャーがめったやたらに感じられまくりやがる世の中で、 このページをご覧の方の中には商用のソフト開発を担当されている方よりもむしろ、 非商用のツール、 つまり社内の初心者ユーザーに使ってもらえるツールを作りたいとか、 学術研究プログラムにかっこいい入力画面をつけたいのうと考えている学生の皆さんも決して少なくないと思います。 そのソリューション(おお、なんてかっこいい言葉にゃ〜)の一環として、 Tcl/Tkを使うと簡単に GUI(ウィンドウ)アプリケーションが作成できることはお姑さんもかくやといわんばかりに当サイトでこうるさく紹介してきましたが、 つまるところその恩恵を自分のC言語のアプリケーションでも受けてみたいと思うことはありませんか? というのが「CとTcl/Tkを混ぜて使う」ことに対する主たる需要だと思います。 例えば、 速度や機能の面でどうしてもC言語で書かないといけない複雑な計算やシミュレーションなどのプログラムに Tcl/TkのGUIをつけてみて、ユーザーが何か入力するなり選ぶなりして 「OK」を押したらそれに応じて本筋の処理が行われる、といったことです。 これは「本筋の処理」とGUIを完全に分けて開発できるほか、 そもそもGUIにそんなに本腰を入れる時間の余裕があるなら本筋の処理をもっとやれ、 というつらい立場のプログラムにはとてもありがたいやり方です。 実際にはこのようなプログラムにはいくつもの作り方があります。 ここではそうした開発方法よりも とにかくたくさんのTcl APIの名前を出してあげよう、 ということで、多少乱雑ですがこのような形にしてみました。 中にはあやふやなものや勘違いも多々あると思いますので、 もし「それちゃうやん」とか 「こうゆうふうにはでけへんか」という方がおられましたら、 ぜひ教えていただけると嬉しいです。


C言語とTcl/Tkの混合アプリケーションの一例(クリックすると95KB)。 スクロールする描画面の上に別の描画面を載せるなどの処理は Tcl/Tkなら一瞬で書けます。時間のかかるアルゴリズミックな処理は C言語で書けばよいす。ちなみに全然関係ないですがこの地形の絵は浦野が アイコンエディタでドット打ちで描いたものです。 変なところばっかりこるんだからー


Tcl/Tkのバージョンと互換性

 Tcl APIは当然ながらTcl言語のコマンドを作るために使われているので、 Tcl言語の仕様の拡張にともなってAPI自身の仕様も変更・拡張され、 従来の仕様が「旧式扱い」にスライドしていきました。 現在のTcl APIプログラマはバージョン7.6〜8.4 のどれかに照準を合わせているはずですが、 ここでは8.1から8.4を中心にまとめています。 8.0と互換性がなくなった部分についてはできる限り注釈していますので、 8.0でも大体において使えるはずですが、細かい相違について 「8.0では」「8.1では」「8.2では」「8.3では」 と言い出すと混乱の元になりがちなので、 今後は次第に8.1以降のみ対応に移していく予定です。 なお、8.2〜8.4はC言語レベルでは、8.1とよく似ており、 7.6から8.0、8.0から8.1のときのような激しいギャップはありません。 ただ、8.1以降の各版の併用ということで 「スタブ」機構の使用が本格化してくると思われるので、 スタブについては別途どこかで触れることにしようと思います。


用語について

  1. 「Tclライブラリ関数」と「Tcl API関数」と「Tcl API」は同じものを指します。 本文では「Tcl API」で統一しています。
  2. C言語の関数の引数を説明する際、最初の引数を第1引数と呼び、以下第2、 第3…と呼んでいます。第零から数える習慣の方は適宜読み替えてください。
  3. マニュアルの「デプリケイテッド」(deprecated)という言葉を本文では 「旧式扱い」と訳しています。これは使えるけど、 古い方法なので将来は削られるかもよ?今のうちに新しい方法に書き換えてチョ、 という感じの意味です。
  4. 本文で「共有ライブラリ」といったときには、特に注釈しない限り、 UNIXの共有ライブラリとMS-Windowsのダイナミックリンクライブラリ(DLL) の両方を指します。


2つのスタイル

 C言語からTclのライブラリを使う動機は大きく2つに分かれます。 1つめは 「元のTcl/Tk処理系に自分独自のTclコマンドを追加するなどの拡張を加え、 機能強化したtclshやwishを作る」ことです。 これは特に、Tcl言語では遅すぎて使えない処理、 Tcl言語ではサポートされていない機能をC言語で書き、 その処理をTclから呼び出すときに使います。 この方法は「拡張(extension)」と呼ばれ、 やり方としてはさらに2つに分かれます。 1つめは元のtclshやwishのソースコードの main関数をいじって「スーパーtclsh」や「スーパーwish」 を作る方法、2つめは自分独自のTclコマンドを書いたCプログラムを共有ライブラリ (WindowsではDLL、以降は「共有ライブラリ」に統一します) にコンパイルし、標準tclshや標準wishのloadコマンド、 またはpackage requireコマンドでロードして使えるようにする方法です。 この分室の説明では、 2つめの共有ライブラリを作る方法の方が便利なのでこちらに偏った説明をしています。 サンプルプログラムの先頭に 「main関数をもたない共有ライブラリ」 と書いてあるものは、 共有ライブラリとしてコンパイルして使えるソースコードです。

 2つめの動機は「自分が既に作っているCプログラムに Tclコマンドを解釈実行する機能をつける」 ことです。これは特に、 自分のCプログラムに、 Tcl/TkのTkコマンドを使ったGUI画面をつける目的で使われることが大半です。 サンプルプログラムの先頭に 「main関数をもつ実行可能プログラム」 と書いてあるものは、こちらの分類に属する組み合わせ技の例です。

なもなも top
(first uploaded 1999/07/21 last updated 2002/08/18, EK - Urano398)