Skip to content

필사 모드: 모던 Tcl & Tk 2026 완벽 가이드 - Tcl 9.0 · Tk 9.0 · Wapp · Tcllib · AOLServer · TclKit · ttk · Iwidgets 심층 분석

한국어
0%
정확도 0%
💡 왼쪽 원문을 읽으면서 오른쪽에 따라 써보세요. Tab 키로 힌트를 받을 수 있습니다.
원문 렌더가 준비되기 전까지 텍스트 가이드로 표시합니다.

프롤로그 — "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년에도 매일 수십억...

작성 글자: 0원문 글자: 14,704작성 단락: 0/365