Tcl (早称为"工具命令语言""Tool Command Language", 但是目前已经不是这个含义,不过我们仍然称呼它为TCL)是一种 脚本语言。 由John Ousterhout创建。 TCL很好学,功能很强大。TCL经常被用于 快速原型开发,脚本编程, GUI和测试等方面。它由作为基本命令解释器嵌入到工具(比如编辑器、调试器等)中的一个库包组成。Tcl 提供了(a)用于简单的文本命令语言的分析器,(b)一组内置的实用命令,和(c)一个 C 接口,工具通过它用特定于工具的命令增加内置命令。TCL本身不提供面向对象的支持。但是语言本身很容易扩展到支持面向对象。许多C语言扩展都提供面向对象能力,包括XOTcl, Incr Tcl 等。另外SNIT扩展本身就是用TCL写的。使用广泛的TCL扩展是TK. TK提供了各种OS平台下的图形用户界面GUI.连强大的Python语言都不单独提供自己的GUI,而是提供接口适配到TK上。另一个流行的扩展包是Expect. Expect提供了通过终端自动执行命令的能力,例如(passwd, ftp, telnet等命令驱动的外壳)。Tcl 在与窗口组件库整合的时候特别有吸引力:它通过了提供变量、过程、表达式等机制增进了组件的可编程性;它允许用户编程组件的外观和动作二者;并且它在交互式程序之间提供一个简单但强力的通信机制
作为一种脚本语言,Tcl具有简单的语法
Tcl语法简介
作为一种脚本语言,Tcl具有简单的语法。cmd arg arg arg 一条Tcl命令由空格分割的单词组成。 其中, 个单词是命令名称, 其余的是命令参数 .Tcl/Tk 的发明人 John Ousterhout 教授在八十年代初,是伯克利大学的教授。在其教学过程中,他发现在集成电路 CAD 设计中,很多时间是花在编程建立测试环境上。并且,环境一旦发生了变化,就要重新修改代码以适应。这种费力而又低效的方法,迫使 Ousterhout 教授力图寻找一种新的编程语言,它即要有好的代码可重用性,又要简单易学,这样就促成了Tcl语言的产生。
Tcl 初的构想的是希望把编程按照基于组件的方法,即与其为单个的应用程序编写成百上千行的程序代码,不如寻找一个种方法将程序分割成一个个小的, 具备一定"完整"功能的,可重复使用的组件。这些小的组件小到可以基本满足一些独立的应用程序的需求,其它部分可由这些小的组件功能基础上生成。不同的组件有不同的功能,用于不同的目的。并可为其它的应用程序所利用。
按照 Ousterhout 教授的定义, Tcl 是一种可嵌入的命令脚本化语言 (Command Script Language)。脚本语言是比较多的,一般的脚本语言的执行只同具体的解释执行器有关,所以只要系统上有相应语言的解释程序就可以做到跨平台。脚本(Script),就是含有bind和alias等命令的集合,你可以把这个集合存为一个独立的文件然后在需要的时候执行,这样就可以方便你在CS中的使用。脚本可以存为后缀名为。cfg的文件放在cstrike文件夹下,执行时在控制台输入:exec(脚本文件名)。cfg即可。比如将一个脚本存为 buys.cfg文件,则在控制台中输入:execbuys.cfg则可以实现我们所需要的功能。要实现一个命令只要把这一过程定义(alias)好,并且分配一个键位给这个命令,以后只要按分配好的键位,就可以实现这一过程。所有的脚本都是通过这一方法实现的。 "可嵌入"是指把很多应用有效,无缝地集成在一起。"命令"是指每一条 Tcl 语句都可以理解成命令加参数的形式:
命令 [参数 1] [参数 2] [参数 3] [参数 4] …… [参数 N]
脚本化是指 Tcl 为特殊的,特定的任务所设计。但从现在角度看,可以说 Tcl 是一种集 C 语言灵活强大的功能与 BASIC 语言易学高效的风格于一身的通用程序设计语言。BASIC(Beginners' All-purpose Symbolic Instruction Code,又译培基),意思就是"初学者的全方位符式指令代码",是一种设计给初学者使用的程序设计语言。BASIC是一种直译式的编程语言,在完成编写后不须经由编译及连结等手续即可执行,但如果需要单独执行时仍然需要将其建立成执行档。
Tk (Tool Kit) 是基于 Tcl 的图形程序开发工具箱, 是 Tcl 的重要扩展部分。Tk 隐含许多 C/C++ 程序员需要了解的程序设计细节, 可快速地开发基于图形界面 Windows 的程序。据称, 用 Tcl/Tk 开发一个简单的 GUI 应用程序只需几个小时, 比用 C/C++ 要提高效率十倍。
Tcl 代表了"tool command language - 工具命令语言".它由一个库包组成,程序可以把它用作自己的命令语言的基础。Tcl 的开发由两项观察所推动。项观察是,通用可编程命令语言通过允许用户用命令语言写程序来扩展工具的内置设施,从而扩大了工具的能力。在强力的命令语言之中众所周知的例子是 UNIX shell[5] 和 Emacs 编辑器[8].Emacs是一种强大的文本编辑器,在程序员和其他以技术工作为主的计算机用户中广受欢迎。EMACS,即Editor MACroS(编辑器宏)的缩写,Emacs不仅仅是一个编辑器,他是一个整合环境,或可称它为集成开发环境,这些功能如让使用者置身于全 emacs功能的操作系统中,在基于编辑器的功能基础上,Emacs自行开发了一个"bourne-shell-like"的shell: EShell.EmacsEmacs既可以在文本终端也可以在图形用户界面(GUI)环境下运行。在各自情况下,出现的有着不同寻常能力的计算环境,在很大程度上是因为能获得可编程的命令语言。
第二个促成它的观察是交互式应用正在增长。在 1970 年代晚期和 1980 年代早期的分时环境中,几乎所有的程序都是面向批处理的。典型的使用交互式的命令 shell 来调用它们。除了 shell 之外,只有少数其他的程序是交互式的,比如编辑器和邮件器。正好相反,今天使用的个人工作站,带有它们自己的光栅显示器和鼠标,光栅扫描式图形显示器简称光栅显示器,是画点设备,可看作是一个点阵单元发生器,并可控制每个点阵单元的亮度。其性能指标有1. 点距和可视面积 2. 分辨率(真实分辨率) 3. 亮度和对比度4. 响应时间及刷新频率5. 可视角度6. 显示色彩。场频、行频及视频带宽,鼓励了一种不同的系统结构,在这里大量的程序是交互式的,并且常见的交互方式是直接用鼠标操纵单独的应用。此外,今天能获得的大显示器使很多交互式的应用立即活跃起来成为可能,而对于在十年前很小的屏幕这是不实际的。
不幸的是,很少的今天的交互式程序拥有 shell 或 Emacs 命令语言的能力。在这里好的命令语言是存在着的,它们趋向与特定的程序捆绑在一起。每个新的交互式程序都要求开发一个新的命令语言。在多数情况下,应用程序员没有时间或爱好去实现一个通用设施(特别是在应用自身很简单的时候),所以结果的命令语言趋向于带有不充分的功能和笨拙的语法。
Tcl 是一个独立于应用的命令语言。它作为一个 C 库包存在,可以用于很多不同的程序中。Tcl 库提供了用于简单但完全可编程的命令语言的一个分析器。这个库还实现了提供了通用的编程构造的一组内置命令,比如变量、列表、表达式、条件、循环和过程。单个的应用程序可以用特定于应用的命令来扩展基本的 Tcl 语言。Tcl 库还提供一组实用工具例程来简化特定于工具的命令的实现。
我相信 Tcl 在窗口环境中是特别有用的,它提供了两项优势。首先,它可以用做编制应用的界面的一个通用机制。如果一个工具基于 Tcl,则应当相对容易的去修改应用的用户界面,并使用新命令来扩展这个界面。其次和更重要的是,Tcl 为工具之间通信提供一种统一的框架。
Tcl 是不寻常的因为它提供两种不同的接口: 给用户发起 Tcl 命令的一个文本接口,和给它所嵌入的应用的一个过程接口。这些接口的每个都必须是简单的、强力的和高效的。在语言设计中有四个主要的因素:
[1] 语言用于命令。几乎所有 Tcl"程序"都是短小的,很多只有一行长。多数程序将是键入的,执行或者几次,接着就丢弃了。这提示了这门语言应当有一个简单的语法,以便于键入命令。多数现存的编程语言都有复杂的语法;在写长程序的时候有益,但如果用做命令语言就笨拙了。
[2] 语言必须是可编程的。它应当包含通用编程构造,比如变量、过程、条件和循环,这样用户可以通过写 Tcl 过程来扩展内置的命令。可扩展性也要求简单的语法:这使 Tcl 程序生成其他 Tcl 程序变得容易了。
[3] 语言必须允许一个简单而高效的解释器。由于 Tcl 库要包含到许多小程序中,特别是在没有共享库的机器上,解释器必须不占用太多的内存。用来解释 Tcl 命令的机制必须足够快,可用于每秒发生上百次的事件,比如鼠标移动。
[4] 语言必须允许对 C 应用的一个简单接口。它必须易于让 C 应用调用这个解释器,并易于让它们用特定于应用的命令来扩展内置的命令。这个因素是我决定不使用 Lisp 作为命令语言的原因之一:Lisp 的基本数据类型和存储管理机制与 C 实在是不同,很难在它们之间建立清晰而简单的接口。对 Tcl 我使用了对于 C 自然的数据类型(字符串)。
Tcl 的基本语法类似于 UNIX shell:命令由用空格或 TAB 分隔的一个或多个字段组成。个字段是命令的名字,它可以是内置命令、特定于应用的命令、或者是由一系列的 Tcl 命令组成的过程。在个后面的字段都作为参数传递给命令。如同在 UNIX shell 中那样,换行字符用做命令分隔符,分号也可用来分隔在同一行上的命令。不同于 UNIX shell,每个 Tcl 命令返回一个字符串结果,或者是空串,如果不适宜返回值的话。
在 Tcl 中有四个补充的语法构造,它们给予语言一种类似 Lisp 的风格。使用花括号来组合复杂的参数;它们充当可嵌套的引用字符。如果参数的个字符是左花括号,则这个参数不以空白终结。转而,它终结于相匹配的右花括号。传递给这个命令的参数由在花括号中间的所有东西组成,并剥除围绕的花括号。例如,命令
set a {dog cat {horse cow mule} bear}
将收到两个参数:"a"和"dog cat {horse cow mule} bear".这个特定命令将把变量 a 设置为等于第二个参数的一个字符串。如果参数包围在花括号中,则不对这个参数做下面描述的其他替换。花括号常见的用途是把一个 Tcl 子程序指定为到 Tcl 命令的参数。
在 Tcl 中第二个语法构造是是方括号,它用于引发命令替换。如果在参数中出现了左方括号,则从这个左方括号一直到相匹配的右方括号的所有东西都作为一个命令来对待,并由 Tcl 解释器递归的执行。命令的结果接着替换到这个方括号包围的字符串所在的位置上。例如,考虑命令
set a [format {Santa Claus is %s years old} 99]
format 命令做类似 printf 的格式化并返回字符串"Santa Claus is 99 years old",接着把它传递给 set 并赋值到变量 a.第三个语法构造是美元号,它用于变量替换。如果它出现在参数中,则随后的字符作为变量的名字对待;变量的内容被替换到参数中这个美元符号和名字所在的位置上。例如,命令
set b 99
set a [format {Santa Claus is %s years old} $b]
导致 a 有同前面段落中的简单命令相同的终值。变量替换不是严格必须的,因为有其他方式来达到相同的效果,但是它减少了键入。
一个语法构造是反斜杠字符,可以用它把特殊字符插入到参数中,比如花括号或非打印字符。
在 Tcl 中只有一种数据类型:字符串。所有命令、到命令的参数、命令返回的结果和变量的值都是 ASCII 字符串。ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语和其他西欧语言。它是现今通用的单字节编码系统,并等同于国际标准ISO/IEC 646.ASCII 码使用指定的 7 位或 8 位二进制数组合来表示 128 或 256 种可能的字符。标准 ASCII 码也叫基础ASCII码,使用 7 位二进制数来表示所有的大写和小写字母,数字 0 到 9、标点符号, 以及在美式英语中使用的特殊控制字符。其中:0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(振铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为 8、9、10 和 13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。 Tcl 始终使用字符串便于在 Tcl 库过程和包围它的应用的 C 代码之间来回传递信息。这使它易于在不同类型的机器之间来回传递有关 Tcl 的信息。
尽管在 Tcl 中所有的东西都是字符串,很多命令都希望它们的字符串参数有特定的格式。这里的字符串有三种特定的通用格式:列表、表达式和命令。列表只是包含用空白分隔的一个或多个字段的字符串,类似于命令。可以使用花括来包围复杂的列表元素;这些复杂的列表元素自身经常也是列表,类似于 Lisp.例如,字符串
dog cat {horse cow mule} bear
是有四个元素的一个列表,其中第三个元素是有三个元素的列表。Tcl 提供一组列表操纵的命令,比如建立列表、提取元素、和计算列表长度。
字符串的第二种常见形式是数值表达式。Tcl 表达式同 C 中的表达式有着同样的操作符合优先级。Tcl 命令 expr 把字符串作为表达式来求值并返回结果(当然是作为字符串)。例如,命令
expr {($a < $b) || ($c != 0)}
在变量 a 小于变量 b 或者变量 c 是零的时候返回"1",否则返回"0".一些其他的命令,比如 if 和 for, 期望它们的一个或多个参数是表达式。
字符串的第三种常见解释是命令(或命令的序列)。这种形式的参数用在实现控制结构的 Tcl 命令中。例如,考虑下列命令:
if {$a < $b} {
set tmp $a
set a $b
set b $tmp
}
这里的 if 命令接受两个参数,每个都是用花括号界定的。If 是内置命令,它把它的个参数作为表达式来求值;如果结果非零,则 if 把它的第二个参数作为 Tcl 命令执行。这个特定命令在变量 a 小于 b 的时候交换 a 和 b 的值。
Tcl 还允许用户定义用 Tcl 语言写的命令过程。我称谓这些过程为 tclproc,为的是区别于用 C 写成的其他过程。使用 proc 内置命令来建立 tclproc.例如,下面定义了一个递归的阶乘过程的 Tcl 命令:
proc fac x {
if {$x == 1} {return 1}
return [expr {$x * [fac [expr $x-1]]}]
}
proc 命令接受三个参数:新 tclproc 的名字、一个变量名字的列表(在这个实例中试只有一个元素 x 的列表),和一个构成 tclproc 的过程体的 Tcl 命令。一旦执行了这个 proc 命令,fac 就可以同其他 Tcl 命令一样调用了。例如
fac 4
将返回字符串"24".
尽管内置 Tcl 命令可以令人信服的用作独立的编程系统,Tcl 实际上意图被嵌入到应用程序中。我已经建造了使用 Tcl 的几个应用程序,其中之一是针对 X 的叫做 mx 的一个基于鼠标的编辑器。在本文的余下部分,我将使用来自 mx 的例子来展示 Tcl 如何与包围它的应用进行交互。
使用 Tcl 的应用程序用同特定应用有关的一些额外的命令来扩展内置命令。例如,时钟程序可以提供额外的命令来控制时钟如何显示和设置闹钟;mx 编辑器提供额外的命令来从磁盘读取文件,在窗口中显示它,选择和修改一定范围内的字节,和把修改后的文件写回磁盘。应用程序员只需要写特定于应用的命令;内置命令"的"提供编程能力和扩展能力。对于用户,特定于应用的命令表现的如同内置命令一样。
Tcl和窗口应用
可嵌入的命令语言如 Tcl 在窗口环境中提供了特别的好处。部分原因是在窗口环境中有很多交互式程序,部分的原因是在今天的窗口环境中可配置性是重要的,并且语言如 Tcl 提供了做重新配置的灵活性。Tcl 在窗口应用中可以用于两个目的: 配置应用的界面动作,配置应用的界面外观。在下面的段落中讨论这两个用途。
Tcl的个用法是用于界面动作。理想的,对应用重要的每个事件都应当绑定上Tcl命令。每次击键、每次鼠标移动或鼠标按钮按下(或释放)、和每个菜单条目都应当关联上 Tcl 命令。
当事件发生时,首先把它映射到它的 Tcl 命令上,接着通过把这个命令传递到 Tcl_Eval 来执行它。应用不应当直接接收任何动作;所有动作都应当首先通过 Tcl来传递。进一步,应用应当提供 Tcl 命令允许用户改变与任何事件相关联的 Tcl 命令。
在交互式的窗口应用中,Tcl 的使用可能对于初级用户是不可见的: 他们将使用按钮、菜单和其他界面构件来操纵应用。但是,如果使用 Tcl 作为所有界面动作的中间媒介,则会产生两个好处。首先,使得写 Tcl 程序来重新配置界面成为可能。例如,用户将能够重新绑定击键、改变鼠标按钮、或把一个现存的操作替代为指定为一组 Tcl 命令或 tclproc 的更加复杂的操作。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。