簡述TCL語言的應用
出處:jxl99 發(fā)布于:2011-09-01 21:46:05
Tcl (早稱為"工具命令語言""Tool Command Language", 但是目前已經(jīng)不是這個含義,不過我們?nèi)匀环Q呼它為TCL)是一種 腳本語言。 由John Ousterhout創(chuàng)建。 TCL很好學,功能很強大。TCL經(jīng)常被用于 快速原型開發(fā),腳本編程, GUI和測試等方面。它由作為基本命令解釋器嵌入到工具(比如編輯器、調(diào)試器等)中的一個庫包組成。Tcl 提供了(a)用于簡單的文本命令語言的分析器,(b)一組內(nèi)置的實用命令,和(c)一個 C 接口,工具通過它用特定于工具的命令增加內(nèi)置命令。TCL本身不提供面向?qū)ο蟮闹С帧5钦Z言本身很容易擴展到支持面向?qū)ο蟆TS多C語言擴展都提供面向?qū)ο竽芰Γ╔OTcl, Incr Tcl 等。另外SNIT擴展本身就是用TCL寫的。使用廣泛的TCL擴展是TK. TK提供了各種OS平臺下的圖形用戶界面GUI.連強大的Python語言都不單獨提供自己的GUI,而是提供接口適配到TK上。另一個流行的擴展包是Expect. Expect提供了通過終端自動執(zhí)行命令的能力,例如(passwd, ftp, telnet等命令驅(qū)動的外殼)。Tcl 在與窗口組件庫整合的時候特別有吸引力:它通過了提供變量、過程、表達式等機制增進了組件的可編程性;它允許用戶編程組件的外觀和動作二者;并且它在交互式程序之間提供一個簡單但強力的通信機制
作為一種腳本語言,Tcl具有簡單的語法
Tcl語法簡介
作為一種腳本語言,Tcl具有簡單的語法。cmd arg arg arg 一條Tcl命令由空格分割的單詞組成。 其中, 個單詞是命令名稱, 其余的是命令參數(shù) .Tcl/Tk 的發(fā)明人 John Ousterhout 教授在八十年代初,是伯克利大學的教授。在其教學過程中,他發(fā)現(xiàn)在集成電路 CAD 設(shè)計中,很多時間是花在編程建立測試環(huán)境上。并且,環(huán)境一旦發(fā)生了變化,就要重新修改代碼以適應。這種費力而又低效的方法,迫使 Ousterhout 教授力圖尋找一種新的編程語言,它即要有好的代碼可重用性,又要簡單易學,這樣就促成了Tcl語言的產(chǎn)生。
Tcl 初的構(gòu)想的是希望把編程按照基于組件的方法,即與其為單個的應用程序編寫成百上千行的程序代碼,不如尋找一個種方法將程序分割成一個個小的, 具備一定"完整"功能的,可重復使用的組件。這些小的組件小到可以基本滿足一些獨立的應用程序的需求,其它部分可由這些小的組件功能基礎(chǔ)上生成。不同的組件有不同的功能,用于不同的目的。并可為其它的應用程序所利用。
按照 Ousterhout 教授的定義, Tcl 是一種可嵌入的命令腳本化語言 (Command Script Language)。腳本語言是比較多的,一般的腳本語言的執(zhí)行只同具體的解釋執(zhí)行器有關(guān),所以只要系統(tǒng)上有相應語言的解釋程序就可以做到跨平臺。腳本(Script),就是含有bind和alias等命令的集合,你可以把這個集合存為一個獨立的文件然后在需要的時候執(zhí)行,這樣就可以方便你在CS中的使用。腳本可以存為后綴名為。cfg的文件放在cstrike文件夾下,執(zhí)行時在控制臺輸入:exec(腳本文件名)。cfg即可。比如將一個腳本存為 buys.cfg文件,則在控制臺中輸入:execbuys.cfg則可以實現(xiàn)我們所需要的功能。要實現(xiàn)一個命令只要把這一過程定義(alias)好,并且分配一個鍵位給這個命令,以后只要按分配好的鍵位,就可以實現(xiàn)這一過程。所有的腳本都是通過這一方法實現(xiàn)的。 "可嵌入"是指把很多應用有效,無縫地集成在一起。"命令"是指每一條 Tcl 語句都可以理解成命令加參數(shù)的形式:
命令 [參數(shù) 1] [參數(shù) 2] [參數(shù) 3] [參數(shù) 4] …… [參數(shù) N]
腳本化是指 Tcl 為特殊的,特定的任務所設(shè)計。但從現(xiàn)在角度看,可以說 Tcl 是一種集 C 語言靈活強大的功能與 BASIC 語言易學高效的風格于一身的通用程序設(shè)計語言。BASIC(Beginners' All-purpose Symbolic Instruction Code,又譯培基),意思就是"初學者的全方位符式指令代碼",是一種設(shè)計給初學者使用的程序設(shè)計語言。BASIC是一種直譯式的編程語言,在完成編寫后不須經(jīng)由編譯及連結(jié)等手續(xù)即可執(zhí)行,但如果需要單獨執(zhí)行時仍然需要將其建立成執(zhí)行檔。
Tk (Tool Kit) 是基于 Tcl 的圖形程序開發(fā)工具箱, 是 Tcl 的重要擴展部分。Tk 隱含許多 C/C++ 程序員需要了解的程序設(shè)計細節(jié), 可快速地開發(fā)基于圖形界面 Windows 的程序。據(jù)稱, 用 Tcl/Tk 開發(fā)一個簡單的 GUI 應用程序只需幾個小時, 比用 C/C++ 要提高效率十倍。
Tcl 代表了"tool command language - 工具命令語言".它由一個庫包組成,程序可以把它用作自己的命令語言的基礎(chǔ)。Tcl 的開發(fā)由兩項觀察所推動。項觀察是,通用可編程命令語言通過允許用戶用命令語言寫程序來擴展工具的內(nèi)置設(shè)施,從而擴大了工具的能力。在強力的命令語言之中眾所周知的例子是 UNIX shell[5] 和 Emacs 編輯器[8].Emacs是一種強大的文本編輯器,在程序員和其他以技術(shù)工作為主的計算機用戶中廣受歡迎。EMACS,即Editor MACroS(編輯器宏)的縮寫,Emacs不僅僅是一個編輯器,他是一個整合環(huán)境,或可稱它為集成開發(fā)環(huán)境,這些功能如讓使用者置身于全 emacs功能的操作系統(tǒng)中,在基于編輯器的功能基礎(chǔ)上,Emacs自行開發(fā)了一個"bourne-shell-like"的shell: EShell.EmacsEmacs既可以在文本終端也可以在圖形用戶界面(GUI)環(huán)境下運行。在各自情況下,出現(xiàn)的有著不同尋常能力的計算環(huán)境,在很大程度上是因為能獲得可編程的命令語言。
第二個促成它的觀察是交互式應用正在增長。在 1970 年代晚期和 1980 年代早期的分時環(huán)境中,幾乎所有的程序都是面向批處理的。典型的使用交互式的命令 shell 來調(diào)用它們。除了 shell 之外,只有少數(shù)其他的程序是交互式的,比如編輯器和郵件器。正好相反,今天使用的個人工作站,帶有它們自己的光柵顯示器和鼠標,光柵掃描式圖形顯示器簡稱光柵顯示器,是畫點設(shè)備,可看作是一個點陣單元發(fā)生器,并可控制每個點陣單元的亮度。其性能指標有1. 點距和可視面積 2. 分辨率(真實分辨率) 3. 亮度和對比度4. 響應時間及刷新頻率5. 可視角度6. 顯示色彩。場頻、行頻及視頻帶寬,鼓勵了一種不同的系統(tǒng)結(jié)構(gòu),在這里大量的程序是交互式的,并且常見的交互方式是直接用鼠標操縱單獨的應用。此外,今天能獲得的大顯示器使很多交互式的應用立即活躍起來成為可能,而對于在十年前很小的屏幕這是不實際的。
不幸的是,很少的今天的交互式程序擁有 shell 或 Emacs 命令語言的能力。在這里好的命令語言是存在著的,它們趨向與特定的程序捆綁在一起。每個新的交互式程序都要求開發(fā)一個新的命令語言。在多數(shù)情況下,應用程序員沒有時間或愛好去實現(xiàn)一個通用設(shè)施(特別是在應用自身很簡單的時候),所以結(jié)果的命令語言趨向于帶有不充分的功能和笨拙的語法。
Tcl 是一個獨立于應用的命令語言。它作為一個 C 庫包存在,可以用于很多不同的程序中。Tcl 庫提供了用于簡單但完全可編程的命令語言的一個分析器。這個庫還實現(xiàn)了提供了通用的編程構(gòu)造的一組內(nèi)置命令,比如變量、列表、表達式、條件、循環(huán)和過程。單個的應用程序可以用特定于應用的命令來擴展基本的 Tcl 語言。Tcl 庫還提供一組實用工具例程來簡化特定于工具的命令的實現(xiàn)。
我相信 Tcl 在窗口環(huán)境中是特別有用的,它提供了兩項優(yōu)勢。首先,它可以用做編制應用的界面的一個通用機制。如果一個工具基于 Tcl,則應當相對容易的去修改應用的用戶界面,并使用新命令來擴展這個界面。其次和更重要的是,Tcl 為工具之間通信提供一種統(tǒng)一的框架。
Tcl 是不尋常的因為它提供兩種不同的接口: 給用戶發(fā)起 Tcl 命令的一個文本接口,和給它所嵌入的應用的一個過程接口。這些接口的每個都必須是簡單的、強力的和高效的。在語言設(shè)計中有四個主要的因素:
[1] 語言用于命令。幾乎所有 Tcl"程序"都是短小的,很多只有一行長。多數(shù)程序?qū)⑹擎I入的,執(zhí)行或者幾次,接著就丟棄了。這提示了這門語言應當有一個簡單的語法,以便于鍵入命令。多數(shù)現(xiàn)存的編程語言都有復雜的語法;在寫長程序的時候有益,但如果用做命令語言就笨拙了。
[2] 語言必須是可編程的。它應當包含通用編程構(gòu)造,比如變量、過程、條件和循環(huán),這樣用戶可以通過寫 Tcl 過程來擴展內(nèi)置的命令。可擴展性也要求簡單的語法:這使 Tcl 程序生成其他 Tcl 程序變得容易了。
[3] 語言必須允許一個簡單而高效的解釋器。由于 Tcl 庫要包含到許多小程序中,特別是在沒有共享庫的機器上,解釋器必須不占用太多的內(nèi)存。用來解釋 Tcl 命令的機制必須足夠快,可用于每秒發(fā)生上百次的事件,比如鼠標移動。
[4] 語言必須允許對 C 應用的一個簡單接口。它必須易于讓 C 應用調(diào)用這個解釋器,并易于讓它們用特定于應用的命令來擴展內(nèi)置的命令。這個因素是我決定不使用 Lisp 作為命令語言的原因之一:Lisp 的基本數(shù)據(jù)類型和存儲管理機制與 C 實在是不同,很難在它們之間建立清晰而簡單的接口。對 Tcl 我使用了對于 C 自然的數(shù)據(jù)類型(字符串)。
Tcl 的基本語法類似于 UNIX shell:命令由用空格或 TAB 分隔的一個或多個字段組成。個字段是命令的名字,它可以是內(nèi)置命令、特定于應用的命令、或者是由一系列的 Tcl 命令組成的過程。在個后面的字段都作為參數(shù)傳遞給命令。如同在 UNIX shell 中那樣,換行字符用做命令分隔符,分號也可用來分隔在同一行上的命令。不同于 UNIX shell,每個 Tcl 命令返回一個字符串結(jié)果,或者是空串,如果不適宜返回值的話。
在 Tcl 中有四個補充的語法構(gòu)造,它們給予語言一種類似 Lisp 的風格。使用花括號來組合復雜的參數(shù);它們充當可嵌套的引用字符。如果參數(shù)的個字符是左花括號,則這個參數(shù)不以空白終結(jié)。轉(zhuǎn)而,它終結(jié)于相匹配的右花括號。傳遞給這個命令的參數(shù)由在花括號中間的所有東西組成,并剝除圍繞的花括號。例如,命令
set a {dog cat {horse cow mule} bear}
將收到兩個參數(shù):"a"和"dog cat {horse cow mule} bear".這個特定命令將把變量 a 設(shè)置為等于第二個參數(shù)的一個字符串。如果參數(shù)包圍在花括號中,則不對這個參數(shù)做下面描述的其他替換。花括號常見的用途是把一個 Tcl 子程序指定為到 Tcl 命令的參數(shù)。
在 Tcl 中第二個語法構(gòu)造是是方括號,它用于引發(fā)命令替換。如果在參數(shù)中出現(xiàn)了左方括號,則從這個左方括號一直到相匹配的右方括號的所有東西都作為一個命令來對待,并由 Tcl 解釋器遞歸的執(zhí)行。命令的結(jié)果接著替換到這個方括號包圍的字符串所在的位置上。例如,考慮命令
set a [format {Santa Claus is %s years old} 99]
format 命令做類似 printf 的格式化并返回字符串"Santa Claus is 99 years old",接著把它傳遞給 set 并賦值到變量 a.第三個語法構(gòu)造是美元號,它用于變量替換。如果它出現(xiàn)在參數(shù)中,則隨后的字符作為變量的名字對待;變量的內(nèi)容被替換到參數(shù)中這個美元符號和名字所在的位置上。例如,命令
set b 99
set a [format {Santa Claus is %s years old} $b]
導致 a 有同前面段落中的簡單命令相同的終值。變量替換不是嚴格必須的,因為有其他方式來達到相同的效果,但是它減少了鍵入。
一個語法構(gòu)造是反斜杠字符,可以用它把特殊字符插入到參數(shù)中,比如花括號或非打印字符。
在 Tcl 中只有一種數(shù)據(jù)類型:字符串。所有命令、到命令的參數(shù)、命令返回的結(jié)果和變量的值都是 ASCII 字符串。ASCII(American Standard Code for Information Interchange,美國信息互換標準代碼)是基于拉丁字母的一套電腦編碼系統(tǒng)。它主要用于顯示現(xiàn)代英語和其他西歐語言。它是現(xiàn)今通用的單字節(jié)編碼系統(tǒng),并等同于國際標準ISO/IEC 646.ASCII 碼使用指定的 7 位或 8 位二進制數(shù)組合來表示 128 或 256 種可能的字符。標準 ASCII 碼也叫基礎(chǔ)ASCII碼,使用 7 位二進制數(shù)來表示所有的大寫和小寫字母,數(shù)字 0 到 9、標點符號, 以及在美式英語中使用的特殊控制字符。其中:0~31及127(共33個)是控制字符或通信專用字符(其余為可顯示字符),如控制符:LF(換行)、CR(回車)、FF(換頁)、DEL(刪除)、BS(退格)、BEL(振鈴)等;通信專用字符:SOH(文頭)、EOT(文尾)、ACK(確認)等;ASCII值為 8、9、10 和 13 分別轉(zhuǎn)換為退格、制表、換行和回車字符。它們并沒有特定的圖形顯示,但會依不同的應用程序,而對文本顯示有不同的影響。 Tcl 始終使用字符串便于在 Tcl 庫過程和包圍它的應用的 C 代碼之間來回傳遞信息。這使它易于在不同類型的機器之間來回傳遞有關(guān) Tcl 的信息。
盡管在 Tcl 中所有的東西都是字符串,很多命令都希望它們的字符串參數(shù)有特定的格式。這里的字符串有三種特定的通用格式:列表、表達式和命令。列表只是包含用空白分隔的一個或多個字段的字符串,類似于命令。可以使用花括來包圍復雜的列表元素;這些復雜的列表元素自身經(jīng)常也是列表,類似于 Lisp.例如,字符串
dog cat {horse cow mule} bear
是有四個元素的一個列表,其中第三個元素是有三個元素的列表。Tcl 提供一組列表操縱的命令,比如建立列表、提取元素、和計算列表長度。
字符串的第二種常見形式是數(shù)值表達式。Tcl 表達式同 C 中的表達式有著同樣的操作符合優(yōu)先級。Tcl 命令 expr 把字符串作為表達式來求值并返回結(jié)果(當然是作為字符串)。例如,命令
expr {($a < $b) || ($c != 0)}
在變量 a 小于變量 b 或者變量 c 是零的時候返回"1",否則返回"0".一些其他的命令,比如 if 和 for, 期望它們的一個或多個參數(shù)是表達式。
字符串的第三種常見解釋是命令(或命令的序列)。這種形式的參數(shù)用在實現(xiàn)控制結(jié)構(gòu)的 Tcl 命令中。例如,考慮下列命令:
if {$a < $b} {
set tmp $a
set a $b
set b $tmp
}
這里的 if 命令接受兩個參數(shù),每個都是用花括號界定的。If 是內(nèi)置命令,它把它的個參數(shù)作為表達式來求值;如果結(jié)果非零,則 if 把它的第二個參數(shù)作為 Tcl 命令執(zhí)行。這個特定命令在變量 a 小于 b 的時候交換 a 和 b 的值。
Tcl 還允許用戶定義用 Tcl 語言寫的命令過程。我稱謂這些過程為 tclproc,為的是區(qū)別于用 C 寫成的其他過程。使用 proc 內(nèi)置命令來建立 tclproc.例如,下面定義了一個遞歸的階乘過程的 Tcl 命令:
proc fac x {
if {$x == 1} {return 1}
return [expr {$x * [fac [expr $x-1]]}]
}
proc 命令接受三個參數(shù):新 tclproc 的名字、一個變量名字的列表(在這個實例中試只有一個元素 x 的列表),和一個構(gòu)成 tclproc 的過程體的 Tcl 命令。一旦執(zhí)行了這個 proc 命令,fac 就可以同其他 Tcl 命令一樣調(diào)用了。例如
fac 4
將返回字符串"24".
盡管內(nèi)置 Tcl 命令可以令人信服的用作獨立的編程系統(tǒng),Tcl 實際上意圖被嵌入到應用程序中。我已經(jīng)建造了使用 Tcl 的幾個應用程序,其中之一是針對 X 的叫做 mx 的一個基于鼠標的編輯器。在本文的余下部分,我將使用來自 mx 的例子來展示 Tcl 如何與包圍它的應用進行交互。
使用 Tcl 的應用程序用同特定應用有關(guān)的一些額外的命令來擴展內(nèi)置命令。例如,時鐘程序可以提供額外的命令來控制時鐘如何顯示和設(shè)置鬧鐘;mx 編輯器提供額外的命令來從磁盤讀取文件,在窗口中顯示它,選擇和修改一定范圍內(nèi)的字節(jié),和把修改后的文件寫回磁盤。應用程序員只需要寫特定于應用的命令;內(nèi)置命令"的"提供編程能力和擴展能力。對于用戶,特定于應用的命令表現(xiàn)的如同內(nèi)置命令一樣。
Tcl和窗口應用
可嵌入的命令語言如 Tcl 在窗口環(huán)境中提供了特別的好處。部分原因是在窗口環(huán)境中有很多交互式程序,部分的原因是在今天的窗口環(huán)境中可配置性是重要的,并且語言如 Tcl 提供了做重新配置的靈活性。Tcl 在窗口應用中可以用于兩個目的: 配置應用的界面動作,配置應用的界面外觀。在下面的段落中討論這兩個用途。
Tcl的個用法是用于界面動作。理想的,對應用重要的每個事件都應當綁定上Tcl命令。每次擊鍵、每次鼠標移動或鼠標按鈕按下(或釋放)、和每個菜單條目都應當關(guān)聯(lián)上 Tcl 命令。
當事件發(fā)生時,首先把它映射到它的 Tcl 命令上,接著通過把這個命令傳遞到 Tcl_Eval 來執(zhí)行它。應用不應當直接接收任何動作;所有動作都應當首先通過 Tcl來傳遞。進一步,應用應當提供 Tcl 命令允許用戶改變與任何事件相關(guān)聯(lián)的 Tcl 命令。
在交互式的窗口應用中,Tcl 的使用可能對于初級用戶是不可見的: 他們將使用按鈕、菜單和其他界面構(gòu)件來操縱應用。但是,如果使用 Tcl 作為所有界面動作的中間媒介,則會產(chǎn)生兩個好處。首先,使得寫 Tcl 程序來重新配置界面成為可能。例如,用戶將能夠重新綁定擊鍵、改變鼠標按鈕、或把一個現(xiàn)存的操作替代為指定為一組 Tcl 命令或 tclproc 的更加復雜的操作。
版權(quán)與免責聲明
凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔此類作品侵權(quán)行為的直接責任及連帶責任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負版權(quán)等法律責任。
如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
- ARM技術(shù)架構(gòu)與應用開發(fā)實踐指南2026/1/6 10:40:19
- 嵌入式實時操作系統(tǒng)(RTOS)選型與移植技術(shù)指南2025/12/31 10:42:31
- 工業(yè)嵌入式系統(tǒng):通信接口技術(shù)選型與抗干擾設(shè)計實踐2025/12/15 14:36:53
- 深入解析嵌入式 OPENAMP 框架:開啟異核通信新時代2025/7/22 16:27:29
- 一文快速了解OPENWRT基礎(chǔ)知識2025/7/14 16:59:04









