필사 모드: 모던 Tcl & Tk 2026 완벽 가이드 - Tcl 9.0 · Tk 9.0 · Wapp · Tcllib · AOLServer · TclKit · ttk · Iwidgets 심층 분석
한국어프롤로그 — "Tcl은 죽었다"는 신화
기술 트위터에서 가장 자주 보는 오해 중 하나: "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 웹 프레임워크·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을 선택한 이유다. 자기 도구 안에 인터프리터 하나를 박아두기에 Tcl만큼 가벼운 언어가 없었다.
2장 · Tcl 9.0 — 17년 만의 메이저 업데이트
2023년 11월 23일, Tcl 9.0이 정식 출시됐다. 그 사이 Tcl 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의 `0755`(앞 0이 8진수) 함정이 사라졌다.
- **모던 패키지 메커니즘** — `package require` 시멘틱이 정리됐다.
- **Zip 파일시스템** — `mount` 가상 파일시스템으로 zip 파일을 디렉터리처럼 다룬다.
호환성을 위해 `Tcl_MajorVersion`이 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
여섯 줄로 윈도우·라벨·버튼이 뜬다. 이 코드는 1991년부터 거의 그대로 돈다. **그 호환성이 Tk의 진짜 무기**다.
4장 · ttk — 모던한 외관의 Themed Tk
Tk의 외관이 "1990년대 같다"는 비판은 오래된 농담이었다. 2007년의 `ttk`(Themed Tk)가 그 농담을 끝냈다.
ttk는 위젯의 외관을 **테마**로 분리한다. Windows 11에서는 윈도우 네이티브, 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 "확인" -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** — 트리/테이블 통합 위젯. 실무에서 가장 많이 쓰이는 제3자 위젯.
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 — 멀티스레드 웹 서버
1995년 AOL이 자기 포털을 떠받치려고 만든 **AOLServer**는, 당시 NCSA·Apache가 프로세스 모델일 때 멀티스레드를 선택한 거의 유일한 웹 서버였다. 그 위에서 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 같은 대형 웹 앱이 NaviServer 위에서 도는데, 그중 가장 유명한 사용자가 **arsdigita.com → openacs.org**다. 1990년대 말~2000년대 초의 첫 대규모 Tcl 웹 프레임워크가 여기서 나왔다.
10장 · OpenACS — Tcl로 만든 엔터프라이즈 웹 프레임워크
**OpenACS**(Open Architecture Community System)는 1997년 MIT의 ArsDigita 프로젝트에서 시작됐다. Tcl + AOLServer + PostgreSQL/Oracle 스택의 대표 사례.
규모를 짚자면: 갈리시아 자치주의 공식 학습 플랫폼, 하이델베르크 대학 LMS, UNICAMP 브라질 대학 등 수백 개 기관이 dotLRN(OpenACS 기반 LMS)으로 운영된다.
지금 시각에서 보면 "옛 기술" 같지만, 2026년에도 살아 움직이고 있다. **유럽·라틴아메리카의 공공·교육 부문에서 특히 강하다.** Rails·Django·Phoenix가 풀지 못한 "30년을 가는 웹 앱"이라는 문제를, OpenACS는 이미 풀었다.
11장 · Wapp — 마이크로 웹 프레임워크
OpenACS가 "큰 웹"이라면 **Wapp**은 "작은 웹"이다. SQLite의 D. Richard Hipp(닥터 힙)이 만든 미니멀 Tcl 웹 프레임워크.
스크립트 한 파일로 웹앱을 띄운다.
package require wapp
proc wapp-default {} {
wapp-trim {
}
}
proc wapp-page-about {} {
wapp-trim {
}
}
wapp-start $argv
`wapp-start`가 내장 HTTP 서버를 띄우거나, CGI/SCGI/SCGI/Mod_Wapp 모드로 외부 서버에 붙는다. **약 1500줄의 Tcl 한 파일**로 끝나는 게 핵심 매력. SQLite처럼 "단순함이 곧 미덕"이라는 Hipp의 디자인 철학이 또 한 번 드러난다.
12장 · TDBC — 데이터베이스 표준 인터페이스
**TDBC**(Tcl Database Connectivity)는 자바의 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 (Prepared statement)
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. 의존성 없음.
배포 모델은 두 단계.
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 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
이 일곱 줄이 FPGA 비트스트림 하나를 만든다. **칩 설계가 Tcl 위에 있다**는 게 과장이 아니다.
18장 · NS-2 / NS-3 — 네트워크 시뮬레이션의 표준
학계에서 Tcl이 끈질기게 남은 또 한 곳이 **네트워크 시뮬레이션**이다.
- **NS-2**(1995) — UC Berkeley/USC에서 만든 패킷 수준 시뮬레이터. 토폴로지·트래픽 정의를 전부 Tcl/OTcl로 작성.
- **NS-3**(2008) — NS-2의 후속. 코어가 C++로 바뀌었지만, 파이썬과 함께 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 흐름이 다섯 줄로 들어간다. **선언적 단순함**이 30년을 가게 했다.
19장 · 한국·일본에서의 Tcl 사용
EDA 의존도가 높은 두 나라 모두 Tcl 사용량이 만만치 않다.
**한국**
- **삼성 파운드리·SK 하이닉스** — 칩 설계 자동화 스크립트의 대부분이 Tcl. 합성·DRC·테이프아웃 플로우.
- **LG 이노텍·LX 세미콘** — 자체 ASIC 디자인 플로우.
- **국방 R&D** — ADD 등 일부 시뮬레이션 인프라가 NS-2/NS-3 기반.
**일본**
- **르네사스(Renesas)·도시바·소니 세미컨덕터** — 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. 한 화면 안 들어가는 명령은 `proc`으로 추출했는가?
10. 에러 처리는 `try/finally`(8.6+) 또는 `catch`인가?
11. 윈도우 자동화는 TWAPI를 표준으로 잡았는가?
12. 인터랙티브 자동화는 Expect로 옮겼는가?
13. 큰 Tk 앱은 Snit 컴포지션을 검토했는가?
14. 작은 웹은 Wapp, 큰 웹은 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 합성 스크립트를 동기 mode만으로 작성 — 인크리멘털 합성을 안 씀.
다음 글 예고
다음 글 후보: **NaviServer + OpenACS로 만드는 30년 가는 웹 앱**, **TclKit으로 Cross-Platform 도구 배포하기**, **Expect로 자동화하는 네트워크 장비 운영**.
> "Tcl은 죽지 않았다. 단지 가장 비싼 작업장 — 칩 설계의 EBA 도구 안 — 에서 조용히 일하고 있을 뿐이다. 그리고 그 일을 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 마이크로 웹 프레임워크](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)
기술 트위터에서 가장 자주 보는 오해 중 하나: "Tcl은 죽었다." 1988년 John Ousterhout가 UC Berkeley에서 만든 이 언어는, 2026년에도 매일 수십억...