Skip to content
Published on

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

Authors

프롤로그 — "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::buttonbutton은 외관이 다르다. 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 {
        <h1>Hello Wapp!</h1>
        <p>Tcl로 만든 마이크로 웹앱.</p>
        <p><a href="/about">소개</a></p>
    }
}

proc wapp-page-about {} {
    wapp-trim {
        <h1>About</h1>
        <p>이 페이지는 Wapp으로 작성됐습니다.</p>
    }
}

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인가

기준TclPythonLuaJS
임베드 용이성매우 쉬움보통가장 쉬움보통
기본 GUITk 포함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