Tcl

Tcl（發音tickle）是一種腳本語言。由John Ousterhout創建。TCL經常被用於快速原型開發 RAD、腳本編程、GUI編程和測試等方面。

## 特性

Tcl 的特性包括：

- 任何東西都是一條命令，包括語法結構（for、if等），以波蘭表示法書寫。
- 命令通常可變。
- 任何事物都可以重新定義和重載。
- 所有的數據類型都可以看作字串，包括原始碼。
- 擁有完全動態、基於類的對象系統 TclOO，支持包括元類、過濾器和mixin在內的高級功能。
- 提供事件驅動給套接字和文件。基於時間或者使用者定義的事件也可以。
- 默認的變量作用域是詞法作用域，但 uplevel 和 upvar 允許過程與封閉的函數作用域交互。
- 所有的內置命令會在誤用時產生錯誤消息。
- 很容易用 C、C++ 或者 Java 擴展。
- 解釋語言，支持字節碼。
- 完全的 Unicode （3.1）支持，1999 年首次發布。
- 跨平台。支持 Win32、UNIX、Linux、Mac 等。
- 和GUI開發套件 Tk 緊密集成。
- 代碼緊湊，易於維護。
- Batteries-Included 版本，如 ActiveState ActiveTcl
- tclkit，一種單文件運行時環境，僅有 1 兆大小
- starpack，腳本/程序的單文件的可執行文件，派生自 tclkit 技術
- freewrapTCLSH 將 Tcl 腳本打包為單個可執行二進位文件。
- BSD licenses，自由可再發行的原始碼。

舊版 Tcl 沒有內置面向對象功能，因此許多 OO 庫以擴展形式湧現出來，如 incr Tcl 和 XOTcl，甚至存在純腳本編寫的 OO 包，如 Snit 和 STOOOP（simple Tcl-only object-oriented programming），8.6 版本在內核中提供了 OO 功能。

Safe-Tcl 是功能受限的 Tcl 子集。文件系統訪問受限，任意系統命令禁止執行。它使用雙解釋器模型，在「不可信解釋器」中運行不可信腳本中的代碼。由 Nathaniel Borenstein 和 Marshall Rose 設計，藉以在電子郵件中包含活動資訊，當支持 application/safe-tcl 與 multipart-enabled-mail 時，Safe-Tcl 即可包含於電子郵件中。Safe-Tcl 功能已整合在標準 Tcl/Tk 發布中。

## 擴展包

Tcl 支持擴展包，這些擴展包提供了附加功能（像是GUI，終端程序自動化，資料庫訪問等）。常用的擴展包有：

Tk: Tk 工具包是最流行的 Tcl 擴展，在多種作業系統上提供圖形使用者界面。每個 GUI 由一個或多個框架(framework)組成，每個框架內含布局管理器。

Expect: Expect是另外一種非常流行的 Tcl 擴展。早期，Expect 對 Tcl 在多種領域的流行居功甚偉，如在測試領域中，時至今日 Expect 依然被大量使用於 telnet、ssh 與串口會話的重複任務自動化，即對僅有終端交互接口的程序進行編程。Tcl 是運行 Expect 的唯一方式，因此 Tcl 在此類工業領域中十分流行。

Tile/Ttk: Tile/Ttk 是風格和主題化控制項集，可替代 Tk 中大多數控制項，真正調用作業系統的 API 實現原生界面。這種方式提供的主題包括 Windows XP、Windows Classic、Qt 和 Aqua（Mac OS X）。主題也可使用圖片 pixmap 加上一定定義構造，避免調用系統 API。以這種方式創建的主題有 Classic Tk、Step、Alt/Revitalized、Plastik 和 Keramik。Tcl 8.4 中，此包稱作 Tile，在 8.5 中以 Ttk 的名字進入 Tk 核心發布。

Tix: Tix（Tk Interface eXtension）是一套開源的、用於擴充 Tcl/Tk 和 Python 應用程式功能的使用者界面組件。由 Tix Project Group 維護，以 BSD 風格許可發布。

Itcl/IncrTcl: Itcl 是 Tcl 諸多對象系統中的一種，通常稱為 incr Tcl（遞增 Tcl 之意，類似 C++ 之名）。

Tcllib: Tcllib 是一套純腳本 Tcl 包，無需編譯。

TclUDP: TclUDP 提供簡捷的方式支持 UDP 套接字。

資料庫: Tcl 資料庫互聯（Tcl Database Connectivity，TDBC）是 Tcl 8.6 的一部分，為 Tcl 腳本提供常用資料庫的訪問接口，目前驅動器支持 MySQL、ODBC、PostgreSQL 和 SQLite 資料庫。更多資料庫已經有了計劃。同樣，也可使用許許多多資料庫專用的擴展包訪問資料庫。

## 範例

下面是TCL程序的例子：

```Tcl
#!/bin/sh
# next line restarts using tclsh in path \
exec tclsh $0 ${1+"$@"}

# echo server that can handle multiple
# simultaneous connections.

proc newConnection { sock addr port } {

     # client connections will be handled in
     # line-buffered, non-blocking mode
     fconfigure $sock -blocking no -buffering line

     # call handleData when socket is readable
     fileevent $sock readable [ list handleData $sock ]
}

proc handleData { sock } {
     puts $sock [ gets $sock ]
     if { [ eof $sock ] } {
        close $sock
     }
}

# handle all connections to port given
# as argument when server was invoked
# by calling newConnection
set port [ lindex $argv 0 ]
socket -server newConnection $port

# enter the event loop by waiting
# on a dummy variable that is otherwise
# unused.
vwait forever
```

另外一個 Tk 的例子（來自 A simple A/D clock）它使用了定時器時間，3行就顯示了一個時鐘。

```Tcl
 proc every {ms body} {eval $body; after $ms [info level 0]}
 pack [label .clock -textvar time]
 every 1000 {set ::time [clock format [clock sec] -format %H:%M:%S]} ;# RS
```

解釋：第一行定義了過程every，每隔ms毫秒，就重新執行body代碼。第二行創建了標籤其內容由time變量決定。第3行中設置定時器，time變量從當前時間中每秒更新一次。

## 外部連結

- Tcl Sources, main Tcl and Tk source code download website
- Tcler's Wiki
- TkDocs

## 基本資料

- 編程范型：多泛型、面向對象、函數式、過程式、事件驅動、指令式
- 發行日期：1988年
- 設計者：John Ousterhout
- 開發者：John Ousterhout、Tcl核心團隊
- 軟體版本週期：8.6.13
- 軟體版本週期：2022年11月21日
- 預覽版本：8.7a5
- 預覽版本：2021年6月14日
- 類型系統：動態類型、萬物皆可視作字串
- 軟體實現：ActiveTcl
- 受影響於：AWK、Lisp
- 施影響於：PowerShell、Tea
- 網站： www.tcl.tk
- 文件擴展名：.tcl