摘要: Tcl/Tk是一种简明,高效,可移植性好的编程语言。在信息产业领域具有广泛的应用。本文描述了TCL/TK成长历史,特点,优势及应用范围,阐述了TCL/TK的总体结构图,比较了TCL/TK与当今流行的C++,Java的性能比较,详细阐述了TCL/TK的语法,并介绍了TK的工具箱.
一.Tcl / Tk简介
.1背景
Tcl/Tk的发明人John Ousterhout教授在八十年代初,是伯克利大学的教授。在其教学过程中,他发现在集成电路CAD设计中,很多时间是花在编程建立测试环境上。并且,环境一旦发生了变化,就要重新修改代码以适应。这种费力而又低效的方法,迫使Ousterhout教授力图寻找一种新的编程语言,它即要有好的代码可重用性,又要简单易学,这样就促成了Tcl (Tool Command Language)语言的产生。
Tcl最初的构想的是希望把编程按照基于组件的方法(component approach),即与其为单个的应用程序编写成百上千行的程序代码,不如寻找一个种方法将程序分割成一个个小的,具备一定“完整”功能的,可重复使用的组件。这些小的组件小到可以基本满足一些独立的应用程序的需求,其它部分可由这些小的组件功能基础上生成。不同的组件有不同的功能,用于不同的目的。并可为其它的应用程序所利用。当然,这种语言还要有良好的扩展性,以便用户为其增添新的功能模块。最后,需要用一种强的,灵活的“胶水”把这些组件“粘”合在一起,使各个组件之间可互相“通信”,协同工作。程序设计有如拼图游戏一样,这种设计思想与后来的Java不谋而合。终于在1988年的春天,这种强大灵活的胶水- Tcl语言被发明出来了。
1.2定义
按照Ousterhout教授的定义,Tcl是一种可嵌入的命令脚本化语言(Command Script Language)。“可嵌入”是指把很多应用有效,无缝地集成在一起。“命令”是指每一条Tcl语句都可以理解成命令加参数的形式:
命令[参数1] [参数2] [参数3] [参数4] ...... [参数N]
脚本化是指Tcl为特殊的,特定的任务所设计。但从现在角度看,可以说Tcl是一种集C语言灵活强大的功能与BASIC语言易学高效的风格于一身的通用程序设计语言。
按照Ousterhout教授的定义,Tcl是一种可嵌入的命令脚本化语言(Command Script Language)。“可嵌入”是指把很多应用有效,无缝地集成在一起。“命令”是指每一条Tcl语句都可以理解成命令加参数的形式:
命令[参数1] [参数2] [参数3] [参数4] ...... [参数N]
脚本化是指Tcl为特殊的,特定的任务所设计。但从现在角度看,可以说Tcl是一种集C语言灵活强大的功能与BASIC语言易学高效的风格于一身的通用程序设计语言。
t c l(读作“t i c k l e”)脚本语言和t k工具箱是为X Wi n d o w系统创建图形用户界面的编程环境。t c l和t k非常容易学习和使用,并且利用它们构造用户界面的速度要比利用传统的X Wi n d o w编程方法快得多。它最初设计用来为交互式工具提供一种可复用的命令语言,但它的实际发展却远非如此,并且在众多的软件产品中被广泛应用。t c l / t k的真正功能在于,利用t c l脚本语言几乎完全可以编写复杂的图形应用程序,因而避开了利用C语言编写界面时所遇到的界面编程的许多复杂性。
t c l / t k的正式We b站点是h t t p : / / w w w. s c r i p t i c s . c o m /。
在这里t c l平台是S c r i t p i c s公司的产品。S c r i t p i c s公司要把t c l脚本语言推广到主流的团体中去。S c r i t p i c s公司提供了开发工具,技术支持和在开发t c l和t k公开代码的软件包是对t c l实行商业支持服务。该站点还具有下载和安装t c l / t k最新版本的连接。目前,可得到的最新t c l / t k的版本是8 .4a。
t c l中的可执行程序t c l,t c l s h,w i s h和t c l h e l p被Red Hat的r p m安装在目录/ u s r / b i n中。可以使用t c l h e l p调出关于t c l和t k的帮助信息。系统中也提供了t c l s h和w i s h的手册页。
二.Tcl / Tk基础
t c l是类似于UNIX shell的一种解释性的语言,这就是说,t c l命令首先被读取,接着就被执行。也是一个用来设置查看的工具箱,它可以利用t c l语法来创建按钮、滚动杆、对话框以及窗口等G U I组件。为了运行t c l。t c l s h和w i s h与s h或c s h这样的标准UNIX shell类似,它们都允许命令被交互地执行或从某个文件中读入。在实际情况中,人们很少交互地使用这些s h e l l,因为它们的交互能力很有限。t c l和w i s h之间的主要差别是:t c l s h只理解t c l命令,而w i s h理解t c l和t k两种命令。
2.1交互方式
本节将简单介绍tcl shell的交互使用方式,从而来说明它的一个问题。要想开始交互使用t c l,只须在UNIX shell的提示符下输入t c l s h(或w i s h),这时将出现如下提示符:
%
在本章中,交互的命令以百分号( % )开始。在这一提示符后,输入如下命令:
% echo“hello world”
在输入这一命令之后,hello world将会显示在新的提示符之后。接下来执行如下命令:
% puts“hello world”
此时,同样的输出结果将显示出来,不过这两个命令之间具有很大的差别。为了显示字符串“hello world”,第一个命令运行的是e c h o二进制文件,而第二个命令使用的是t c l命令puts(put string)。e c h o形式的”hello world”,仅当交互运行t c l s h时才起作用,这正是交互使用t c l s h和w i s h的问题之一。例如,如果把命令:
echo“hello world”
放入文件h e l l o w o r l d . t c l,然后从t c l s h中执行如下s o u r c e命令:
% source helloworld.tcl
那么将会得到如下的错误信息:
invalid command name“echo”
此行代码将在一个UNIX shell中执行这一具有变化的命令。这只是在tcl shell的交互方式中工作方式不同的事例之一。
2.2非交互方式
在通常情况下,t c l s h和w i s h-般是以非交互的方式来使用的,这就是说,它们在U N I X的提示符( $ )下被调用并执行脚本,例如:
$ tclsh myprog.tcl
$ wish myprog.tcl
或者从一个脚本内来调用它们,这个脚本的第一行通常与如下内容类似:
#!/usr/bin/tclsh
在通常情况下,对脚本的每次安装都必须修改第一行,因为w i s h或t c h s h可能位于不同的位置。为了避免在每次安装时都必须对脚本进行编辑,t c l s h的手册页推荐利用如下三行代码作为所有t c l / t k脚本的头三行:
#!/bin/sh
# the next line restarts using tclsh \
exec wish“$0”“$@”
这意味着,用户只须在自己的路径中具有w i s h就可以使用脚本。利用这种方法产生的各自的结果可能会根据系统上s h版本的不同而不同。
t c l非交互使用方式的实际优点是与UNIX shell的非交互使用方式的优点相同。非交互使用方式允许把多个命令组合在一起,并且只要输入脚本的名字就可以执行脚本中的所有命令,同时这种方式可以加速对大型程序的开发和调试。
四.与其它语言的比较
下面就Tcl与经典的的程序设计语言C++,及现在时髦的Java做一些比较:
C++,Tcl/Tk和Java的性能比较表
运行程序速度
快
与C++可比
慢
调试难易程度
复杂
每次修改完代码需重新编译
简单
修改完代码可直接运行
比较简单
修改完代码需重新编译成ByteCode,而且编译速度很慢
程序代码复杂程度以上面的grep为例
复杂
50行程序代码
简明
10行程序代码
比较简单
40行程序代码
系统资源占用情况
200MB HD
32MB Memory
3MB HD
4MB Memory
20MB HD
4MB Memory
代码可维护性
可移植性
好
一般
较好
本节将介绍t c l的语法及其在脚本中的使用方式。下面几小节中的代码既可以交互地运行,也可以从脚本运行。在交互方式下,输出内容之间的间距会略有不同。
TCL命令的基本结构是:
commandname arguments
这里的c o m m a n d n a m e是t c l所要执行的命令,a rg u m e n t s是提供给此命令的可选变元,整个行(c o m m a n d n a m e和a rg u m e n t s)称为一个命令。命令之间通过换行( \ n )或者由分号( ; )来分隔。如果在一行上只有一个命令,那么分号可以省略。作为说明,看下面两个命令:
set foo 0
set bar 1
这两个命令可以写成两行,每行写一个;另外,它们也可以写在同一行上,例如:
set foo 0; set bar 1;
有时需要在表达式中使用另一个表达式的值。使用方括号来实现:
puts [expr 1000/4];
输出将是2 5 0。在需要时方括号也可以嵌套。
除命令外,t c l脚本中另一种类型的代码行是注释。如同在UNIX shell和P e r l中那样,注释行是以#号开头的行,例如:
#this is a comment
但是与s h e l l中不同的是,下面一行内容并不是注释
set foo 0 # initialize foo
而且它将会产生一个错误,这是因为t c l解析器总是认为一条命令应该以换行或分号结束,因此如果想要在命令所在的同一行上包括注释内容,这个命令必须以分号结束,就像下面这样:
set foo 0;#initialize foo
因此,用分号结束所有的命令通常是一种很好的做法,尽管有时分号并不是必需的。