Tcl

維基百科,自由的百科全書
跳至導覽 跳至搜尋
Tcl
File:Tcl-powered.svg
編程範型多泛型面向對象函數式過程式事件驅動指令式
設計者John Ousterhout英語John Ousterhout
實作者John Ousterhout、Tcl核心團隊
面市時間1988年
當前版本
    Module:EditAtWikidata第29行Lua錯誤:attempt to index field 'wikibase' (a nil value)
    型態系統動態類型、萬物皆可視作字符串
    文件擴展名.tcl
    網站www.tcl.tk
    主要實作產品
    ActiveTcl
    受影響於
    AWKLisp
    影響語言
    PowerShell[1]Tea英語Tea (programming language)

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

    特性[編輯]

    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[2] 將 Tcl 腳本打包為單個可執行二進制文件。
      • BSD licenses,自由可再發行的源代碼。

    舊版 Tcl 沒有內置面向對象功能,因此許多 OO 庫以擴展形式湧現出來,如 incr TclXOTcl,甚至存在純腳本編寫的 OO 包,如 SnitSTOOOP(simple Tcl-only object-oriented programming),8.6 版本在內核中提供了 OO 功能[3]

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

    擴展包[編輯]

    Tcl 支持擴展包,這些擴展包提供了附加功能(像是GUI,終端程序自動化,數據庫訪問等)。常用的擴展包有:

    Tk
    Tk 工具包是最流行的 Tcl 擴展,在多種操作系統上提供圖形用戶界面。每個 GUI 由一個或多個框架(framework)組成,每個框架內含布局管理器。
    Expect
    Expect是另外一種非常流行的 Tcl 擴展。早期,Expect 對 Tcl 在多種領域的流行居功甚偉,如在測試領域中,時至今日 Expect 依然被大量使用於 telnet、ssh 與串口會話的重複任務自動化,即對僅有終端交互接口的程序進行編程。Tcl 是運行 Expect 的唯一方式,因此 Tcl 在此類工業領域中十分流行。
    Tile/Ttk
    Tile/Ttk[6] 是風格和主題化控件集,可替代 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 風格許可發布。[7]
    Itcl/IncrTcl
    Itcl 是 Tcl 諸多對象系統中的一種,通常稱為 [incr Tcl](遞增 Tcl 之意,類似 C++ 之名)。
    Tcllib
    Tcllib 是一套純腳本 Tcl 包,無需編譯。
    TclUDP
    TclUDP[8] 提供簡捷的方式支持 UDP 套接字。
    數據庫
    Tcl 數據庫互聯(Tcl Database Connectivity,TDBC)是 Tcl 8.6 的一部分,為 Tcl 腳本提供常用數據庫的訪問接口,目前驅動器支持 MySQLODBCPostgreSQLSQLite 數據庫。更多數據庫已經有了計劃。同樣,也可使用許許多多數據庫專用的擴展包訪問數據庫。[9]

    範例[編輯]

    下面是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. ^ PowerShell and WPF: WTF. [2022-03-06]. (原始內容存檔於2008-12-25). 
    2. ^ freewrapTCLSH頁面存檔備份,存於網際網路檔案館
    3. ^ 8.6 版本在內核中提供了 OO 功能頁面存檔備份,存於網際網路檔案館
    4. ^ 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). 
    5. ^ 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. 
    6. ^ TK Table Sourceforge Project. ActiveTcl. [August 7, 2012]. (原始內容存檔於2014-07-13). 
    7. ^ Tix License. Sourceforge. [August 7, 2012]. (原始內容存檔於2013-03-22). 
    8. ^ TCL UDP. Tcl'ers Wiki. [August 7, 2012]. (原始內容存檔於2015-01-04). 
    9. ^ TDBC. Tcl'ers Wiki. [August 7, 2012]. (原始內容存檔於2009-05-29). 

    外部連結[編輯]

    Module:Authority_control第183行Lua錯誤:attempt to index field 'wikibase' (a nil value)