Tcl

脚本语言

Tcl(發音tickle)是一種手稿語言。由John Ousterhout英語John Ousterhout建立。TCL經常被用於快速原型開發 RAD、指令碼編程、GUI編程和測試等方面。

Tcl
編程範型多泛型物件導向函數式程序式事件驅動指令式
設計者John Ousterhout英語John Ousterhout
實作者John Ousterhout、Tcl核心團隊
面市時間1988年
目前版本
  • 9.0.1(2024年12月21日;穩定版本)[1]
編輯維基數據鏈結
型態系統動態型別、萬物皆可視作字串
副檔名.tcl
網站www.tcl.tk
主要實作產品
ActiveTcl
啟發語言
AWKLisp
影響語言
PowerShell[2]Tea英語Tea (programming language)

特性

Tcl 的特性包括:

  • 任何東西都是一條命令,包括語法結構(for、if等),以波蘭表示法書寫。
  • 命令通常可變。
  • 任何事物都可以重新定義和多載。
  • 所有的資料類型都可以看作字串,包括原始碼。
  • 擁有完全動態、類別為基的對象系統 TclOO,支援包括元類、過濾器和mixin在內的進階功能。
  • 提供事件驅動通訊端檔案。基於時間或者使用者定義的事件也可以。
  • 預設的變數作用域是詞法作用域,但 uplevelupvar 允許過程與封閉的函式作用域互動。
  • 所有的內建命令會在誤用時產生錯誤訊息。
  • 很容易用 C、C++ 或者 Java 擴充。
  • 解釋語言,支援位元組碼
  • 完全的 Unicode (3.1)支援,1999 年首次發布。
  • 跨平台。支援 Win32UNIXLinuxMac 等。
  • 和GUI開發套件 Tk 緊密整合。
  • 代碼緊湊,易於維護。
  • 存在多種發行版:
    • Batteries-Included 版本,如 ActiveState ActiveTcl
    • tclkit,一種單檔案執行時環境,僅有 1 兆大小
    • starpack,指令碼/程式的單檔案的可執行檔,衍生自 tclkit 技術
    • freewrapTCLSH[3] 將 Tcl 指令碼打包為單個可執行二進制檔案。
    • BSD licenses,自由可再發行的原始碼。

舊版 Tcl 沒有內建物件導向功能,因此許多 OO 庫以擴充形式湧現出來,如 incr TclXOTcl,甚至存在純指令碼編寫的 OO 包,如 SnitSTOOOP(simple Tcl-only object-oriented programming),8.6 版本在核心中提供了 OO 功能[4]

Safe-Tcl 是功能受限的 Tcl 子集。檔案系統訪問受限,任意系統命令禁止執行。它使用雙直譯器模型,在「不可信直譯器」中執行不可信指令碼中的代碼。由 Nathaniel BorensteinMarshall Rose 設計,藉以在電子郵件中包含活動資訊,當支援 application/safe-tclmultipart-enabled-mail 時,Safe-Tcl 即可包含於電子郵件中。Safe-Tcl 功能已整合在標準 Tcl/Tk 發布中。[5][6]

擴充包

Tcl 支援擴充包,這些擴充包提供了附加功能(像是GUI,終端程式自動化,資料庫訪問等)。常用的擴充包有:

Tk
Tk 工具包是最流行的 Tcl 擴充,在多種作業系統上提供圖形化使用者介面。每個 GUI 由一個或多個框架(framework)組成,每個框架內含布局管理器。
Expect
Expect是另外一種非常流行的 Tcl 擴充。早期,Expect 對 Tcl 在多種領域的流行居功甚偉,如在測試領域中,時至今日 Expect 依然被大量使用於 telnet、ssh 與序列埠對談的重複任務自動化,即對僅有終端互動介面的程式進行編程。Tcl 是執行 Expect 的唯一方式,因此 Tcl 在此類工業領域中十分流行。
Tile/Ttk
Tile/Ttk[7] 是風格和主題化控制項集,可替代 Tk 中大多數控制項,真正呼叫作業系統API 實現原生介面。這種方式提供的主題包括 Windows XP、Windows Classic、QtAqua(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 風格許可發布。[8]
Itcl/IncrTcl
Itcl 是 Tcl 諸多對象系統中的一種,通常稱為 [incr Tcl](遞增 Tcl 之意,類似 C++ 之名)。
Tcllib
Tcllib 是一套純指令碼 Tcl 包,無需編譯。
TclUDP
TclUDP[9] 提供簡捷的方式支援 UDP 通訊端。
資料庫
Tcl 資料庫互聯(Tcl Database Connectivity,TDBC)是 Tcl 8.6 的一部分,為 Tcl 指令碼提供常用資料庫的訪問介面,目前驅動器支援 MySQLODBCPostgreSQLSQLite 資料庫。更多資料庫已經有了計劃。同樣,也可使用許許多多資料庫專用的擴充包訪問資料庫。[10]

範例

下面是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行就顯示了一個時鐘。

 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變數從當前時間中每秒更新一次。

參考資料

  1. ^ [TCLCORE] Tk 9.0.1 RELEASED. 2024年12月21日 [2024年12月22日]. 
  2. ^ PowerShell and WPF: WTF. [2022-03-06]. (原始內容存檔於2008-12-25). 
  3. ^ freewrapTCLSH頁面存檔備份,存於網際網路檔案館
  4. ^ 8.6 版本在核心中提供了 OO 功能頁面存檔備份,存於網際網路檔案館
  5. ^ Brown, Lawrie. Mobile Code Security. Terry Bossomaier, Lucy Chubb (編). Proceedings, 2nd Joint Conference, AUUG '96 and Asia-Pacific WWW '96. Melbourne, Australia: 50. September 18–20, 1996 [2011-03-22]. (原始內容存檔於2011-05-11). 
  6. ^ Welch, Brent B.; Jones, Ken; Hobbs, Jeffrey. Practical programming in Tcl and Tk 1 4th. Prentice Hall PTR. 2003: 291. ISBN 0-13-038560-3. 
  7. ^ TK Table Sourceforge Project. ActiveTcl. [August 7, 2012]. (原始內容存檔於2014-07-13). 
  8. ^ Tix License. Sourceforge. [August 7, 2012]. (原始內容存檔於2013-03-22). 
  9. ^ TCL UDP. Tcl'ers Wiki. [August 7, 2012]. (原始內容存檔於2015-01-04). 
  10. ^ TDBC. Tcl'ers Wiki. [August 7, 2012]. (原始內容存檔於2009-05-29). 

外部連結