필사 모드: モダン Tcl & Tk 2026 完全ガイド - Tcl 9.0・Tk 9.0・Wapp・Tcllib・AOLServer・TclKit・ttk・Iwidgets 徹底解説
日本語プロローグ — 「Tcl は死んだ」という神話
技術系 Twitter で最もよく見る誤解の一つ:「Tcl は死んだ」。1988年に John Ousterhout が UC Berkeley で生み出したこの言語は、2026年になっても毎日数百億ドル規模の半導体設計作業を支え続けている。
Synopsys Design Compiler、Cadence Innovus、Xilinx Vivado、Mentor Calibre — 現代のチップを生み出すほぼすべてのツールのスクリプトインターフェイスは Tcl だ。EDA 市場だけで年間130億ドルを超え、その上で動く自動化スクリプトはすべて Tcl で書かれている。
そして2023年11月、**Tcl 9.0** がリリースされた。17年ぶりのメジャーリリース。64ビット整数とインデックス、フル UTF-8、モダンなパッケージ機構。2025年には Tcl 9.1 が続いた。死んだはずの言語が、ふたたび動き始めたのだ。
本稿では2026年の Tcl スタックを最初から最後まで — 言語コア・Tk GUI・Wapp Web フレームワーク・Tcllib 標準ライブラリ・EDA 産業利用・組み込みバリアントまで — 一息に整理する。
第1章 · Tcl とは何か、なぜ生き残ったか
Tcl(Tool Command Language)の設計哲学を一行で要約すると、こうだ:**「すべては文字列であり、すべてはコマンドである」**。
最小の Tcl スクリプト。
変数宣言と出力
set greeting "Hello, Tcl 9.0"
puts $greeting
リストとループ
set fruits [list apple banana cherry]
foreach fruit $fruits {
puts "I like $fruit"
}
プロシージャ(関数)の定義
proc greet {name} {
return "Hello, $name!"
}
puts [greet "World"]
ここで三つを押さえる。
1. **`set var value`** — すべての変数は `set` で作る。型宣言はない。
2. **`$var`** — 変数置換はドル記号。文字列中でも即座に展開される。
3. **`[command args]`** — 角括弧内のコマンドは即時実行され、結果に置換される。
この三つだけで Tcl の文法の90%を網羅する。**シンプルさは即ち組み込み適性**であり、それこそ EDA ツールが Tcl を選んだ理由だ。自分のツールの中にインタプリタを一つ埋め込むのに、これほど軽い言語は他にない。
第2章 · Tcl 9.0 — 17年ぶりのメジャーアップデート
2023年11月23日、Tcl 9.0 が正式リリースされた。8.5(2007)・8.6(2012)の間で言語は漸進的に改善されてきたが、9.0 は一部の互換性を捨てて大きな変化をもたらした。
主要な変更点。
- **64ビット優先** — 文字列・リスト・インデックスのすべてが2GB の上限を超えた。本当に大きなデータを Tcl で扱えるようになった。
- **フル UTF-8** — Tcl の内部表現が modified UTF-8(MUTF-8)から通常の UTF-8 に移行。外部ツールとの相互運用がきれいになった。
- **0o755・0b1010 リテラル** — 8進数と2進数表記がモダンに。8.x の「先頭ゼロが8進数」(`0755`)という罠が消えた。
- **モダンなパッケージ機構** — `package require` のセマンティクスが整理された。
- **Zip ファイルシステム** — `mount` で zip ファイルを仮想ディレクトリのように扱える。
C ABI のメジャーバージョンが9に上がったため、8.x の拡張は再ビルドが必要になった。だから Tcl 9.0 と 8.6 はしばらく共存した。2025年の Tcl 9.1 は9.0 の安定化リリースで、9.2 は現在開発中だ。
第3章 · Tk 9.0 — 30年選手 GUI ツールキットの第二の春
Tk は1991年に Ousterhout が作った GUI ツールキットだ。**Python の tkinter がそのままラップしているのがこの Tk** である。Ruby/Tk、Perl/Tk、Tcl/Tk — ほぼすべてのスクリプト言語にバインディングがある。
2024年の Tk 9.0 はふたたび大きな飛躍だった。
- **SVG ネイティブ対応** — ようやく。ベクターアイコンを一行で表示できる。
- **HiDPI / Retina** — Windows・macOS・Linux すべてで 4K ディスプレイがくっきり描画される。
- **macOS ダークモード** — Aqua テーマがシステム外観に追従。
- **タッチ・ジェスチャー** — Windows 11 のペン入力認識。
最小の Tk ウィンドウ。
package require Tk
wm title . "Hello Tk 9.0"
wm geometry . 320x120
label .greeting -text "Hello, Tk!" -font {Helvetica 20}
pack .greeting -padx 20 -pady 20
button .quit -text "Quit" -command exit
pack .quit -pady 10
6行でウィンドウ・ラベル・ボタンが立ち上がる。このコードは1991年からほぼ変わらず動く。**この互換性こそ Tk の真の武器**だ。
第4章 · ttk — モダンな外観の Themed Tk
「Tk の外観が1990年代風」という批判は古くからあった。2007年の `ttk`(Themed Tk)がその冗談に終止符を打った。
ttk はウィジェットの外観を**テーマ**として分離する。Windows 11 では Windows ネイティブ、macOS では Aqua、Linux GTK ではシステムテーマを追従する。
package require Tk
ttk ウィジェットは t 始まりではなく ttk:: 名前空間
ttk::frame .container -padding "12 12 12 12"
grid .container -column 0 -row 0 -sticky nwes
ttk::label .container.lbl -text "名前:"
ttk::entry .container.name -width 30
ttk::button .container.ok -text "OK" -command {puts $name}
grid .container.lbl -column 0 -row 0 -sticky e
grid .container.name -column 1 -row 0
grid .container.ok -column 1 -row 1 -sticky e
ここで `ttk::button` と `button` は見た目が違う。ttk のほうがシステムネイティブに近い。**2026年のすべての新規 Tk コードは ttk をデフォルト**として書く、と考えてよい。
Sun Valley テーマ — Windows 11 スタイル
ttk テーマは外部パッケージとしても配布される。最も人気なのが **Sun Valley テーマ** — Windows 11 の Fluent Design を模したもの。Python tkinter でもそのまま使えるため、Python GUI 開発者にも人気だ。
第5章 · ウィジェット拡張 — Iwidgets・BWidget・Tablelist
基本 Tk と ttk だけでも十分だが、複雑なウィジェットが必要なときは二つのライブラリを見る。
- **Iwidgets** — Itcl(オブジェクト指向 Tcl)ベースのメガウィジェットライブラリ。Combobox、Notebook、Hierarchy、Scrolledlistbox など。
- **BWidget** — Pure-Tcl メガウィジェット。ProgressBar、Tree、ButtonBox など。Iwidgets と違って Itcl を要求しないので軽量。
- **Tablelist** — ツリー/テーブル統合ウィジェット。実務で最もよく使われるサードパーティウィジェット。
package require Tablelist
tablelist::tablelist .tbl \
-columns {0 "名前" left 0 "役職" left 0 "給与" right} \
-stretch all \
-background white
.tbl insert end {田中 シニア 8500}
.tbl insert end {鈴木 ジュニア 4500}
pack .tbl -fill both -expand 1
基本 Tk の `treeview` も似たことをするが、ソート・マルチ選択・セル編集を幅広くサポートするのは Tablelist だ。
第6章 · Tcllib — 100以上のモジュールの標準ライブラリ
Python に PyPI があるなら、Tcl には **Tcllib** がある。100を超えるモジュールが一つのパッケージにまとまって配布される。
よく使うモジュール。
- **`json`** — JSON のパースと生成
- **`http`** — HTTP クライアント
- **`uri`** — URL のパース
- **`csv`** — CSV 処理
- **`md5` / `sha256`** — ハッシュ
- **`base64`** — エンコーディング
- **`fileutil`** — ファイル検索・ディレクトリウォーキング
- **`textutil`** — テキストユーティリティ
- **`math::statistics`** — 統計関数
JSON 一行例。
package require json
package require json::write
JSON のパース
set data [json::json2dict {{"name": "Tcl", "version": 9.0}}]
puts [dict get $data name]
JSON の生成
set out [json::write object \
name [json::write string "Tcl"] \
version 9.0]
puts $out
**Tklib** は Tcllib の GUI 姉妹パッケージで、追加 Tk ウィジェット・プロッタ・カレンダーなどを収める。
第7章 · TclOO — モダンなオブジェクト指向
OO(Object-Oriented)はいつも Tcl の弱点とされてきた。Itcl(1993)は C++ 風、Snit(1999)はウィジェットアダプタ、XOTcl(2000)はメタプログラミングの遊び場 — 三つが分立した状態が続いた後、8.6(2012)で **TclOO** がコアに正式導入された。
package require TclOO
oo::class create Animal {
variable name sound
constructor {n s} {
set name $n
set sound $s
}
method greet {} {
return "$name says $sound"
}
}
oo::class create Dog {
superclass Animal
constructor {n} {
next $n "Woof"
}
}
set rex [Dog new "Rex"]
puts [$rex greet] ;# Rex says Woof
TclOO はクラス・メソッド・継承・ミックスインをすべてサポートする。**Itcl と Snit も今なお生きている**が、新規コードであれば TclOO から始めるのが標準だ。
第8章 · Expect — インタラクティブ自動化の標準
1990年に Don Libes が NIST で作った **Expect** は Tcl 拡張だが、そのまま一つのツールとしてのほうが有名だ。名前のとおり「期待して応答する」プログラムである。
最も有名なユースケース — SSH 自動ログイン。
#!/usr/bin/expect -f
set timeout 20
set host [lindex $argv 0]
set password [lindex $argv 1]
spawn ssh user@$host
expect "password:"
send "$password\r"
expect "$ "
send "uptime\r"
expect "$ "
send "exit\r"
expect eof
`spawn` が子プロセスを立ち上げ、`expect` が出力パターンを待ち、`send` が入力する。**30年間ほぼ変わらず**システム管理者の道具箱に入っている。
ネットワーク機器(Cisco IOS、Juniper Junos)の自動化は今でも Expect で行う。Ansible の `expect` モジュールも内部では結局これを呼び出している。
第9章 · AOLServer・NaviServer — マルチスレッド Web サーバ
1995年、AOL が自社ポータルを支えるために作った **AOLServer** は、当時の NCSA・Apache がプロセスモデルだった時代に、ほぼ唯一マルチスレッドを採用した Web サーバだった。その上でスレッドごとに Tcl インタプリタを動かしていた。
AOL が2005年に手を引き、コミュニティがフォークしたのが **NaviServer** だ。2026年になっても活発に開発が続き、モダンな TLS 1.3・HTTP/2・WebSocket もすべてサポートする。
NaviServer ハンドラ例
ns_register_proc GET /hello {
ns_return 200 text/html "<h1>Hello from NaviServer</h1>"
}
ns_register_proc GET /time {
ns_return 200 text/plain [clock format [clock seconds]]
}
OpenACS(次章)・dotLRN といった大型 Web アプリが NaviServer 上で動く。最も有名なユーザは **arsdigita.com から openacs.org への系譜** — 1990年代末から2000年代初頭にかけての最初の大規模 Tcl Web フレームワークがここから生まれた。
第10章 · OpenACS — Tcl で作るエンタープライズ Web フレームワーク
**OpenACS**(Open Architecture Community System)は、1997年に MIT の ArsDigita プロジェクトから始まった。Tcl + AOLServer + PostgreSQL/Oracle スタックの代表例。
規模を挙げよう:ガリシア自治州の公式学習プラットフォーム、ハイデルベルク大学 LMS、ブラジル UNICAMP 大学など、数百の機関が dotLRN(OpenACS ベースの LMS)で運用されている。
現代の目から見れば「古い技術」のようだが、2026年でも生き続けている。**ヨーロッパとラテンアメリカの公共・教育部門で特に強い。** Rails・Django・Phoenix が解けていない「30年もつ Web アプリ」という問題を、OpenACS はすでに解いている。
第11章 · Wapp — マイクロ Web フレームワーク
OpenACS が「大きな Web」なら、**Wapp** は「小さな Web」だ。SQLite の D. Richard Hipp(ヒップ博士)が作ったミニマル Tcl Web フレームワーク。
スクリプト1ファイルで Web アプリを立ち上げる。
package require wapp
proc wapp-default {} {
wapp-trim {
}
}
proc wapp-page-about {} {
wapp-trim {
}
}
wapp-start $argv
`wapp-start` が組み込み HTTP サーバを立ち上げるか、CGI/SCGI/Mod_Wapp モードで外部サーバに接続する。**約1500行の Tcl 1ファイル**で完結するのが核心的な魅力。SQLite と同じく、「シンプルさは美徳」という Hipp の設計哲学がここでも前面に出ている。
第12章 · TDBC — データベース標準インターフェイス
**TDBC**(Tcl Database Connectivity)は Java の JDBC を意識した統合 DB API だ。Tcl 8.6 からコアに含まれる。
package require tdbc::sqlite3
tdbc::sqlite3::connection create db "./mydata.db"
テーブル生成
db allrows {CREATE TABLE IF NOT EXISTS users (id INTEGER, name TEXT)}
INSERT
db allrows {INSERT INTO users VALUES (1, '田中')}
SELECT(プリペアドステートメント)
set stmt [db prepare {SELECT * FROM users WHERE id = :id}]
$stmt foreach -as dicts row {
puts "[dict get $row id]: [dict get $row name]"
} {id 1}
$stmt close
db close
ドライバ:`tdbc::sqlite3`・`tdbc::postgres`・`tdbc::mysql`・`tdbc::odbc`。**2026年時点で最も無難な選択は PostgreSQL + tdbc::postgres** の組み合わせだ。
第13章 · TclKit・Starkit・Starpack — シングルファイル配布
Tcl の「決め技」がここにある。**TclKit** は Tcl インタプリタ + Tk + Tcllib の一部を**ひとつの実行ファイル**にまとめたものだ。約4〜10MB。依存なし。
配布モデルは2段階。
1. **Starkit**(`.kit`) — Tcl/Tk スクリプトとリソースを一つの仮想ファイルシステムバンドルに。Tclkit があればそのまま実行できる。
2. **Starpack** — Starkit と Tclkit を一つに統合し、単一の `.exe` / 単一の macOS アプリ / 単一の Linux ELF にする。
starkit を作る
sdx wrap myapp.kit -files myapp.tcl
starpack(Windows シングル exe)
sdx wrap myapp.exe -runtime tclkit-win-x64.exe -files myapp.tcl
結果はダブルクリックだけで動く単一ファイル。Python/PyInstaller が真似できない **2〜3MB という軽さ** が Tcl だけの武器だ。
第14章 · TWAPI・TclTLS・trofs — システム・ネットワーク拡張
- **TWAPI**(Tcl Windows API) — Win32 API のほぼ全部を Tcl に公開。レジストリ・サービス・COM・WMI・イベントログ・ネットワークアダプタまで。Windows 自動化スクリプトの事実上の標準。
- **TclTLS** — OpenSSL 1.1.1 / 3.x バインディング。TLS 1.3、SNI、ALPN をすべてサポート。`tdbc::postgres`・`http` パッケージが内部で依存。
- **trofs / cookfs** — 読み取り専用/読み書き仮想ファイルシステム。
- **Tcllib `picoirc`** — 標準ライブラリに IRC クライアントがある(驚き)。
package require tls
package require http
::http::register https 443 [list ::tls::socket -autoservername true -require 1]
set token [::http::geturl https://api.github.com/users/octocat]
puts [::http::data $token]
`::tls::socket` を登録するだけで、標準の `http` パッケージがそのまま HTTPS を処理する。モダンな TLS ハンドシェイクがほぼ一行で完了する。
第15章 · Itcl・Snit・TclOO — 三つの OO の共存
三つの OO システムが共存しているのが Tcl の特異点だ。いつ何を使うか。
- **Itcl** (1993, Michael McLennan) — C++ スタイルのクラス/継承。**レガシーコードの大半が Itcl**。Iwidgets は Itcl ベース。
- **Snit** (1999, Will Duquette) — コンポジション中心。**Tk メガウィジェットに最も適合**。クラスではなく「型」の概念。
- **TclOO** (2012, 8.6 core) — コア統合のモダン OO。**新規コードの既定の選択**。
Snit ウィジェットアダプタの例。
package require snit
snit::widget MyCounter {
variable count 0
component button
constructor {args} {
install button using ttk::button $win.b -text "Count: 0" \
-command [mymethod increment]
pack $button
$self configurelist $args
}
method increment {} {
incr count
$button configure -text "Count: $count"
}
}
MyCounter .c
pack .c
Snit の `component` + `install` が Tk ウィジェットを包んで新しいウィジェットを作る。**GUI コンポジションでは今でも Snit が最も手に馴染む。**
第16章 · Critcl・Jim Tcl・Picol — コンパイル・組み込み・ミニマル
Tcl ファミリーの親戚たち。
- **Critcl** — Tcl の中に C コードをインラインで書き、その場でコンパイル・ロードする。ホットスポットを C に落とすときに使う。`package require critcl` 一行で導入できる。
- **Jim Tcl** — 約150KB の組み込み用 Tcl クローン。OpenWRT、U-Boot、OpenIPMI のような組み込みシステムが採用。フル Tcl 9.0 は 4MB だが Jim はマイクロコントローラにも入る。
- **Picol** — Salvatore Sanfilippo(Redis 作者)が500行の C で書いたミニマル Tcl。教育用。「Tcl インタプリタの本質とは何か」を見せる例。
- **Eagle** — .NET / C# 用の Tcl 互換インタプリタ。PowerShell が届かない場所で .NET 自動化に使われる。
このファミリーツリーが **Tcl の組み込み強み** の実体だ。4MB が重ければ Jim、500行の学習用なら Picol、.NET なら Eagle。
第17章 · EDA 産業 — Tcl が本当に動いている場所
ここが Tcl の本拠地だ。チップ設計産業。
- **Synopsys Design Compiler / PrimeTime / VCS** — 合成・STA・シミュレーション。すべて Tcl スクリプトで制御。
- **Cadence Innovus / Genus / Virtuoso** — 配置配線・合成・アナログデザイン。Cadence は Tcl の中に SKILL(Lisp 派生)をさらに乗せて使う。
- **Xilinx Vivado / AMD Vitis** — FPGA 開発全体が Tcl ベース。
- **Mentor(Siemens EDA)Calibre / ModelSim** — DRC/LVS・HDL シミュレーション。
EDA ツールの GUI には必ずコマンドコンソールがあり、そこに入力すると Tcl インタプリタが受け取る。チップ設計者が夜間に自動化スクリプトを書くとき — Tcl 一行で数万ゲートを動かす。
Vivado 例 — IP 合成の自動化
create_project myproj ./build -part xc7a35tcpg236-1
add_files ./src/top.v
synth_design -top top -part xc7a35tcpg236-1
opt_design
place_design
route_design
write_bitstream -force ./build/top.bit
この7行が一つの FPGA ビットストリームを作る。**チップ設計は Tcl の上にある** — これは誇張ではない。
第18章 · NS-2 / NS-3 — ネットワークシミュレーションの標準
学界で Tcl がしぶとく残っているもう一つの場所が **ネットワークシミュレーション** だ。
- **NS-2**(1995) — UC Berkeley/USC で生まれたパケットレベルシミュレータ。トポロジ・トラフィック定義をすべて Tcl/OTcl で書く。
- **NS-3**(2008) — NS-2 の後継。コアが C++ に置き換わったが、Python と並んで OTcl スクリプト互換も維持。
数十年分の学術論文が NS-2 Tcl スクリプトを補助資料として添付しているため、ネットワーク研究者は Tcl を見ずに過ごすのが難しい。
NS-2 の最小トポロジ
set ns [new Simulator]
set n0 [$ns node]
set n1 [$ns node]
$ns duplex-link $n0 $n1 1Mb 10ms DropTail
set tcp [new Agent/TCP]
$ns attach-agent $n0 $tcp
set sink [new Agent/TCPSink]
$ns attach-agent $n1 $sink
$ns connect $tcp $sink
$ns at 0.5 "$tcp start"
$ns at 5.0 "exit 0"
$ns run
ネットワークトポロジ・2ノード・1Mb・10ms リンク・TCP フローが5行に収まる。**宣言的な簡潔さ**が30年を持たせた。
第19章 · 韓国・日本での Tcl 利用
EDA 依存度が高い両国はいずれも Tcl の利用量が侮れない。
**韓国**
- **サムスンファウンドリ・SK ハイニックス** — チップ設計自動化スクリプトの大半が Tcl。合成・DRC・テープアウトフロー。
- **LG イノテック・LX セミコン** — 自社 ASIC デザインフロー。
- **防衛 R&D** — ADD などの一部シミュレーションインフラが NS-2/NS-3 ベース。
**日本**
- **ルネサス・東芝・ソニーセミコンダクタ** — EDA スクリプティング。
- **NEC・富士通** — ネットワークシミュレーションと通信機器自動化。
- **ソニー** — 一部ゲームエンジンのビルドシステムに Tcl が残存。
両国とも「メイン言語」ではないが、**半導体産業があるかぎり Tcl 人材の需要は消えない。** 求人サイトで「Tcl scripting」が記載された求人は、ほぼ EDA 企業またはその協力会社と見て間違いない。
第20章 · ビットコイン初期の Tcl の痕跡
これはあまり知られていない事実だ:2009年のサトシ・ナカモトの初期ビットコイン 0.1 コードには **Tcl バインディングの痕跡** があった。サトシは Wx ウィジェット + JSON-RPC インターフェイスを構築する過程で、Tcl も検討していた痕跡が見える。
今は全部整理されているが、**2009年のビットコインクライアントは wxWidgets GUI を使い、Tcl 風のコマンドラインインタプリタの痕跡** が RPC コマンド体系に残っている。`bitcoin-cli getbalance` のようなコマンドスタイルが Tcl 影響だと見るのは、無理筋ではない。
第21章 · 学習リソース — 2026年版
初めて Tcl を学ぶなら。
1. **Tcl Tutor**(オンラインインタラクティブ) — `tcltutor.tcl.tk`。ブラウザでインタプリタが動く。
2. **「Practical Programming in Tcl and Tk」** — Brent Welch の定本。第4版は 8.4 ベースだが 9.0 でも95%はそのまま通じる。
3. **「Tcl/Tk: A Developer's Guide」** — Clif Flynt。8.6/9.0 をカバー。
4. **Tcl Wiki**(`wiki.tcl-lang.org`) — 25年分のコミュニティ知識。Wikit の上で動く。
5. **Tcl Conference (Tcl/Tk Conference)** — 毎年米国で開催。発表動画が YouTube に上がる。
最速の道は **Wiki + REPL** だ。`tclsh`(Tcl シェル)と `wish`(Tcl + Tk シェル)を開いて、ひたすら手で打つこと。
第22章 · Python・Lua・JS との比較 — いつ Tcl か
| 基準 | Tcl | Python | Lua | JS |
|------|-----|--------|-----|----|
| 組み込み容易性 | 非常に容易 | 普通 | 最も容易 | 普通 |
| デフォルト GUI | Tk 同梱 | tkinter(=Tk) | なし | DOM |
| 標準ライブラリ | Tcllib | 非常に大きい | 小さい | 大きい |
| 学習曲線 | 低い | 低い | 最も低い | 中程度 |
| EDA ツール統合 | 事実上の標準 | 一部 | ほぼなし | ほぼなし |
| 単一ファイル配布 | Starpack(容易) | PyInstaller | 容易 | pkg |
要約はこうだ。
- **新規の汎用スクリプティング**なら Python のほうが豊富。
- **ゲーム組み込みスクリプティング**なら Lua のほうが軽い。
- **EDA・テスト自動化・組み込みツールスクリプティング**なら Tcl が事実上唯一の答え。
- **一つの実行ファイルで GUI ツール配布**なら TclKit + Starpack が勝つ。
Tcl の競合は他の汎用言語ではなく、**「EDA ツールの中で動く他の言語」** だ。そしてそこで Tcl は30年間1位を保っている。
第23章 · Tcl で直接作る道具 — 小さな GUI
最後に一息。ttk・TclOO・TDBC・Wapp なしで、純粋な Tk だけで小さなメモ帳を作ってみる。
#!/usr/bin/env wish
package require Tk
set filename ""
proc do_open {} {
global filename
set f [tk_getOpenFile]
if {$f eq ""} return
set filename $f
set fh [open $f r]
.t delete 1.0 end
.t insert 1.0 [read $fh]
close $fh
wm title . "Memo - $f"
}
proc do_save {} {
global filename
if {$filename eq ""} {
set filename [tk_getSaveFile]
if {$filename eq ""} return
}
set fh [open $filename w]
puts -nonewline $fh [.t get 1.0 end-1c]
close $fh
wm title . "Memo - $filename"
}
menu .m
menu .m.file -tearoff 0
.m add cascade -label "File" -menu .m.file
.m.file add command -label "Open" -command do_open
.m.file add command -label "Save" -command do_save
.m.file add separator
.m.file add command -label "Quit" -command exit
. configure -menu .m
text .t -wrap word -undo true
pack .t -fill both -expand 1
wm title . "Memo"
wm geometry . 700x500
約40行。**メニュー・ファイル開閉・テキストウィジェット・アンドゥ**がすべて入っている。Python tkinter で同じことをするには少なくとも80〜100行必要だ。Tcl/Tk の本質はやはり **この圧縮率** にある。
第24章 · 実戦チェックリスト
新規 Tcl プロジェクトを始めるときの点検項目。
1. Tcl 9.0 以上を使っているか?(8.x は新規プロジェクトでは避ける)
2. パッケージはすべて `package require name version` の形で明示したか?
3. すべての新規 GUI コードは ttk ウィジェットをデフォルトで使っているか?
4. エンコーディングは明示的に UTF-8 に設定したか?(`encoding system utf-8`)
5. OO が必要なら TclOO から検討したか?
6. データベースは TDBC インターフェイスで抽象化したか?
7. 外部 HTTP は `http` + `tls` の組み合わせか?
8. 配布は Starkit/Starpack を検討したか?
9. 1画面に収まらないコマンドは `proc` に切り出したか?
10. エラー処理は `try/finally`(8.6+)または `catch` を使っているか?
11. Windows 自動化は TWAPI を標準としたか?
12. インタラクティブ自動化は Expect に移したか?
13. 大きな Tk アプリは Snit コンポジションを検討したか?
14. 小さな Web は Wapp、大きな Web は NaviServer + OpenACS か?
15. EDA スクリプトならツールベンダーの Tcl ガイド(Synopsys/Cadence/Xilinx)を併読したか?
アンチパターン10選
1. `expr` の中で変数を引用符で囲んで、数値比較が文字列比較に化ける。
2. `eval` でユーザ入力を直接実行してコマンドインジェクション。
3. `set var` ではなく `var = value` という Python の癖で書く。
4. 新規 GUI コードを ttk なしで古い `button` だけで書く。
5. `package require` を抜かしてパッケージの関数を呼ぶ。
6. UTF-8 を明示せずに韓国語・日本語処理後に文字化け。
7. Itcl・Snit・TclOO を混在させて、一つのプロジェクトに三つの OO パターンが共存。
8. 8進数の罠 — Tcl 9 以前は `0755` が8進数、9 では 0o755 を使う。
9. 単一ファイル配布が可能なのに Python・node 依存で配布する。
10. EDA 合成スクリプトを同期モードのみで書く — インクリメンタル合成を使わない。
次の記事予告
次の記事候補:**NaviServer + OpenACS で30年もつ Web アプリを作る**、**TclKit でクロスプラットフォームツール配布**、**Expect で自動化するネットワーク機器運用**。
> 「Tcl は死んでいない。ただ最も高価な作業場 — チップ設計の EDA ツールの中 — で静かに働いているだけだ。そしてその仕事を30年間きちんとこなしてきた。」
— モダン Tcl & Tk 2026、了。
参考 / References
- [Tcl 公式サイト](https://www.tcl-lang.org/)
- [Tcl 9.0 リリースノート](https://www.tcl-lang.org/software/tcltk/9.0.html)
- [Tk 公式マニュアル](https://www.tcl-lang.org/man/tcl9.0/TkCmd/contents.htm)
- [Tcllib パッケージインデックス](https://core.tcl-lang.org/tcllib/doc/trunk/embedded/index.md)
- [Tklib パッケージインデックス](https://core.tcl-lang.org/tklib/doc/trunk/embedded/index.md)
- [Tcl Wiki コミュニティ](https://wiki.tcl-lang.org/)
- [NaviServer 公式](https://naviserver.sourceforge.io/)
- [OpenACS 公式](https://openacs.org/)
- [Wapp マイクロ Web フレームワーク](https://wapp.tcl.tk/)
- [Expect マニュアル](https://core.tcl-lang.org/expect/index)
- [TclKit / Starkit / Starpack](https://wiki.tcl-lang.org/page/Starkit)
- [Jim Tcl 組み込み](http://jim.tcl-lang.org/)
- [Eagle .NET Tcl](https://eagle.to/)
- [TWAPI Windows API](https://twapi.magicsplat.com/)
- [TDBC データベースインターフェイス](https://www.tcl-lang.org/man/tcl9.0/TdbcCmd/contents.htm)
- [Synopsys Design Compiler Tcl ガイド](https://www.synopsys.com/implementation-and-signoff.html)
- [Xilinx Vivado Tcl マニュアル](https://docs.amd.com/r/en-US/ug835-vivado-tcl-commands)
- [NS-3 ネットワークシミュレータ](https://www.nsnam.org/)
- [Brent Welch — Practical Programming in Tcl and Tk](https://www.beedub.com/book/)
- [Tcl Tutor インタラクティブ](https://www.tcl-lang.org/community/tcl2024/)
- [Picol — Tcl in 500 lines (Salvatore Sanfilippo)](http://oldblog.antirez.com/page/picol.html)
- [Itcl オブジェクト指向拡張](https://www.tcl-lang.org/man/itcl4.2/index.html)
- [TclOO コア OO](https://www.tcl-lang.org/man/tcl9.0/TclCmd/class.htm)
- [Sun Valley ttk テーマ](https://github.com/rdbende/Sun-Valley-ttk-theme)
- [Tablelist ウィジェット](https://www.nemethi.de/tablelist/)
현재 단락 (1/365)
技術系 Twitter で最もよく見る誤解の一つ:「Tcl は死んだ」。1988年に John Ousterhout が UC Berkeley で生み出したこの言語は、2026年になっても毎日数百億...