Tcl, short for Tool Command Language and pronounced "tickle", was created by John Ousterhout at the University of California, Berkeley, starting in 1988. He wanted one small interpreter that any program could embed instead of inventing its own clumsy command syntax. The key decision, and the answer to why everything is a string in Tcl, follows from that goal: if every value is a string, any C program can pass data to the interpreter and back without negotiating types.

Origins at Berkeley

Ousterhout's group built interactive tools for integrated circuit design, including the Magic VLSI layout editor. Each tool needed a command language, and each one ended up with a weak, half-finished one. Around the winter of 1987–88 he decided to write a reusable interpreter as a C library. Tcl was presented publicly at the USENIX Winter Conference in 1990, and by then it was already spreading across Unix labs.

The companion GUI toolkit, Tk, followed soon after and was publicly available by 1991. Tcl/Tk made it possible to build an X11 window with buttons in a dozen lines, at a time when Motif programming took hundreds. That alone won Tcl a large audience.

Sun Microsystems hired Ousterhout in 1994 to push Tcl further. In 1998 he left to found Scriptics (later Ajuba Solutions), and in 2000 stewardship passed to the community-run Tcl Core Team. Tcl/Tk received the ACM Software System Award in 1997.

Why everything is a string in Tcl

Tcl's grammar fits on a page; the official rules are known as the "Dodekalogue". A script is a sequence of commands, each command is a list of words, and the first word names the command. Square brackets run a nested command and substitute its result, $ substitutes a variable, and braces quote text without substitution. Even if, while and proc are ordinary commands that receive strings, so you can write your own control structures.

Treating all data as strings made embedding trivial and the language extremely regular, but early versions paid for it in speed, re-parsing numbers on every use. Tcl 8.0 (1997) fixed most of that with a bytecode compiler and a dual-representation Tcl_Obj: a value keeps a cached internal form, such as an integer or list, while still behaving as a string whenever you look at it.

A short Tcl example

proc greet {name {greeting "Hello"}} {
    return "$greeting, $name!"
}

set langs 
647 sites · page 11 of 13
WebsiteIP Address
★ Submit Website91.108.119.105
★ Google Search ConsoleNot updated yet
★ ClaudeNot updated yet
TrovitNot updated yet
American Listed3.33.130.190
Racing Junk104.18.34.109
Hoobly172.236.117.51
The Fence PostNot updated yet
Classified AdsNot updated yet
Ad PostNot updated yet
Recycler104.26.0.74
LootNot updated yet
ExpatriatesNot updated yet
Claz69.162.83.22
Elclasificado172.66.169.101
Penny Saver USA172.67.215.97
Global Free Classified Ads104.26.11.146
Ad LandproNot updated yet
LocantoNot updated yet
GeeboNot updated yet
MuamatNot updated yet
Buy Sell CommunityNot updated yet
Tuff ClassifiedNot updated yet
iGlobalNot updated yet
Usnet ADs96.126.124.192
WhofishNot updated yet
KugliNot updated yet
GloboanuncioNot updated yet
Online ClassifiedNot updated yet
Ocala 4 SaleNot updated yet
Free ClassifiedsNot updated yet
Freeads1Not updated yet
Web ClassifiedsNot updated yet
AdsnityNot updated yet
Free Ads Time104.26.10.16
Ask Me Classifieds91.108.119.72
USA Online ClassifiedsNot updated yet
City NewsNot updated yet
Top CLassifieds199.231.189.10
Classifieds For FreeNot updated yet
Post ClassifiedsNot updated yet
10 Day AdsNot updated yet
Highlight StoreNot updated yet
Chaos AdsNot updated yet
Best Farm BuysNot updated yet
Free ADsNot updated yet
USA OnlineNot updated yet
My Ads ClassifiedNot updated yet
Boat ClassifiedsNot updated yet
Apnee Community82.29.157.193
Ad Free PostingNot updated yet
How Web AdsNot updated yet
Post All Ads 4 FreeNot updated yet

✓ Links verified Oct 7, 2026

foreach lang $langs { puts [greet $lang] } puts [string length "everything is a string"]

Note that the list built by list is still a string you could print, split or store in a file, then read back as a list later.

Where Tcl is used today

Tcl is less visible than Python, but it is deeply embedded in some industries:

  • Electronic design automation: tools from Synopsys, Cadence, Siemens EDA and Xilinx/AMD use Tcl as their scripting interface, so chip designers write Tcl daily.
  • Networking: Cisco IOS includes a Tcl shell, and F5's iRules for BIG-IP load balancers are written in a Tcl dialect.
  • Expect, written by Don Libes at NIST around 1990, automates interactive programs such as ssh, ftp and passwd.
  • Tkinter, Python's standard GUI library, is a wrapper around Tcl/Tk, so every Python installation with Tkinter carries a Tcl interpreter.
  • Web servers such as AOLserver and its successor NaviServer, plus testing frameworks like DejaGnu and the SQLite test suite.

Versions timeline

YearReleaseNotable change
1988First versionsEmbeddable interpreter at Berkeley
1997Tcl 8.0Bytecode compiler, Tcl_Obj
1999Tcl 8.1Unicode strings, threads
2007Tcl 8.5Dictionaries, argument expansion, ttk themed widgets
2012Tcl 8.6TclOO, coroutines, non-recursive engine
2024Tcl 9.064-bit sizes, full Unicode range

Influence and legacy

Tcl had a famous critic: Richard Stallman's 1994 Usenet post "Why you should not use Tcl" set off the so-called Tcl War and helped push GNU toward Guile. Ousterhout answered with a broader argument, later published in IEEE Computer in 1998 as "Scripting: Higher Level Programming for the 21st Century", which made the case that scripting languages and system languages serve different jobs. That essay is still cited in discussions of language design.

Tcl's idea of an embeddable, tiny interpreter set the pattern Lua later perfected, and its event loop and fileevent model predated the async style that became popular decades later. If you want to understand why everything is a string in Tcl, think of it as a design for glue: strings are the one format every program already understands.

Frequently asked questions

Does everything being a string make Tcl slow?

Not much since Tcl 8.0. Values keep a cached internal representation, so an integer stays an integer until you treat it as text. Tcl compiles procedures to bytecode, which puts it roughly in the same performance range as other classic interpreted scripting languages.

Why do chip design tools still use Tcl?

EDA vendors adopted Tcl in the 1990s because it was easy to embed in large C and C++ applications. Decades of design flows, scripts and training are now written in it. Switching would break customer workflows, so Tcl remains the standard command interface.

Is Tkinter in Python really Tcl?

Yes. Tkinter loads a real Tcl interpreter and sends it Tk commands behind the scenes. That is why Python distributions bundle Tcl/Tk libraries, and why Tkinter errors sometimes mention Tcl.