TCL 测试语言入门

合集下载

Tcl语言基础(

Tcl语言基础(

Tcl语言基础(TCL语言Tcl tick 的构成在下面的清单中,将会发现第一个很常见的示例程序,它是用Tcl 实现的。

这是一个完整的脚本:第一行命令调用 tclsh 环境,第二行命令执行实际工作。

用您所选择的文本编辑器创建该脚本,输入chmod +x hello.tcl 使之成为可执行文件,然后执行它以测试您这件“作品”。

~/tcltk$ cat hello.tcl#!/usr/bin/tclshputs stdout {Hello, World!}~/tcltk$ ./hello.tclHello, World!Tcl 和 Tk 是解释型的、可扩展脚本语言。

与 BSD 许可证十分相似,该许可证允许在任何情况下自由使用该软件,只要在所有副本中保留该版权并且在任何分发中一字不差地传递通告。

这个许可证条款使Tcl/Tk 成为自由软件。

Tcl/Tk 是一种解释型环境。

可以通过添加预编译的C 函数来扩展Tcl 解释器,可从 Tcl 环境内部调用 Tcl 解释器。

可以为特定目的或一般的以及广泛使用的而定制这些扩展。

我们将在教程的后面看一些扩展并着重看一下第一个扩展—非常流行的 Expect。

在接下来的几屏中,将回顾 T cl 语言的一些主要特性,从元字符和全局变量到运算符、数学函数以及核心命令。

毕竟,这些命令使Tcl/Tk 成为有特色的,逐步发展的语言。

请记住,在本教程中没有篇幅涉及每条命令。

这里只突出一部分,以后您可以更进一步了解Tcl/Tk。

#!/usr/bin/tclsh# filename hello2.tcl# This program code shows# metacharacter usageputs stdout "Hello, World! \a"puts stdout {Hello, World! \a}set Pints 6set Days 7puts stdout "The answer to the universe is [ $Pints * $Days]!\n"***~/tcltk$ ./hello2.tclHello, World!Hello, World! \aThe answer to everything is 42!Tcl 元字符元字符是在Tcl/Tk 环境的上下文中有特殊含意的字符或字符对,它们包括分组语句、封装字符串、终止语句以及其它,如下表所示。

Tcl语言基础教程

Tcl语言基础教程
变量置换由一个$符号标记,变量置换会导致变量的值而非变量(标识符)本身被插入到字符串中。
set x 10
set y 100 + $x
这时,y的值还不是我们想要的值110,而是10+100,因为Tcl解释器把10+100看成是一个字符串而不是表达式;y要想得到值
110,还必须用命令置换,使得Tcl会把10+100看成一个表达式并求值。
string tolower string [first] [last]
string replace string first last [newstring]
string equal [-nocase] [-length int] string1 string2
string match [-nocase] pattern string如果pattern匹配string,那么返回1,否则返回0.
Tcl变量根据其结构的复杂程度分为“简单变量”和“数组变量”两类。
(1)简单变量
一个Tcl的简单变量包含两个部分:名字和值,其中名字和值都可以是任意字符串。不过为了更好的使用变量置换功能,变量名
最好按C\C++语言中标识符的命名规则命名。这是因为Tcl解释器在分析一个变量置换时,只把从$符号往后直到第一个不是字母、数
个新字符串,并返回。例如:
set msg [format "%s is %d years old" $name $age]
【scab】
语法:scan string formatsting varName varName ...
scan命令可以认为是format命令的逆,其功能类似于ANSI C中的sscanf函数。它按formatsting提供的格式分析string字

语言基础TCL学习.pptx

语言基础TCL学习.pptx
第12页/共14页
第13页/共14页
感谢您的观看!
第14页/共14页
第11页/共14页
作业
• 事务的定义是什么,它有哪些特征? • 创建一个teacher表,字段有:teacher_id,name,gender,age 等字段,其中
teacher_id是主键,name不能为空,gender默认值为”男”;使用DML语法书 写 出 往 tea c h e r 表 中插 入 数 据 的 三条 i n s e r t 语 句 , 前 两 条 i n s e r t 语 句 之 后使 用 TC L 定 义 一 个保存 点 , 保 存 点 分 别 为 s p1 和 s p2 ; 在 最 后 一条 i n s e r t 语 句之 后 使 用 TC L 语法回滚到sp2保存点并使用TCL语法提交之,查看最后保存到teacher表中的数 据是哪些数据,并分析原因。
事务与会话: 一个会话等同于对数据库的一次连接,如果有多个用户连接到数据
库则会产生多个会话;各个会话之间的事务是相互隔离的,即会话之 间数据互不共享,一个事务在没有被提交之前其数据被放在当前会 话所标识的内存中,这个时候其它任何会话都对当前会话发起的事 务操作不可见,一旦事务被提交之后其数据将被持久化到磁盘数据 文件中去,此时其它会话将可以看到当前会话所做的更改
commit;提交回滚到保存点 mark1
第10页/共14页


• 事务的定义是指单个逻辑工作单元执行的一系列操作 • 事务的四大特征是” 一原永隔”;即:一致性、原子性、永久性、隔
离性 • 熟悉TCL语法:
A、savepoint spName:定义一个spName的保存点 B、rollback to savepoint spName:回滚到指定的保存点 spName C、rollback:全部回滚当前事务 D、commit:提交当前事务 会话发起的事务如果没有被会话提交则其它会话对当前会话的修改 将不可见,一旦会话提交事务则事务所做的数据修改将被更新到磁 盘数据文件,此时其它用户发起的会话将可以看到当前会话发起事

ns2实验2 tcl语言简介

ns2实验2 tcl语言简介

實驗二TCL語言簡介實驗目的學習TCL語言的基本語法。

背景知識TCL (Tool Command Language)在NS2中主要是用來描述腳本,簡單的說就是用來描述要模擬的網路環境和參數設定等。

實驗步驟[安裝文書編輯軟體PSPad [1]]在開始學習撰寫腳本之前,選擇一個好用的文字編輯器是非常重要。

在此推薦一個免費的文字編輯器(PsPad,/en/download.php)給大家,好讓未來撰寫腳本時有個好工具可用。

1.請切換目錄到ns-allinone-2.29/ns-2.29/book/lab2的目錄下,執行PSPad的安裝檔pspad432inst_en.exe。

2.請按”Next”,則如下圖所示。

3.請選擇”I accept the agreement”。

4.請按”Next”,則如下圖所示。

此圖為PSPad的安裝路徑,可以選擇喜歡安裝的位置,不過我們在這裡使用內定的路徑即可。

5.請按”Next”,則如下圖所示。

6.請按”Next”,則如下圖所示。

7.請按”Install”,開始進行安裝。

8.安裝完成後,則如下圖所示。

9.請按”Finish”,完成安裝,並且開始執行PSPad editor。

[TCL語法練習]這部份的資料主要是參考[2],因此有興趣的讀者可以到此網站找尋更詳細的資料。

1. 變數(variable)和變數替換(variable substituion)正如其他的程式語言一樣,變數(variables)可以被想成是用來儲存各種類型資料的盒子(boxes)。

這些盒子(或者說是變數),都有各自的名稱,而這些名稱在我們需要取用或者是變更變數的值(value)時將會被用到。

在C語言在使用變數時,需要事先的宣告,而TCL則不需要事先宣告,TCL 變數是在第一次使用set的指令來指派變數的值時所產生的。

當我們不再需要某個變數時,可以使用unset來取消這個變數。

但一般而言,可以不用去做這個動作。

新-tcl语法讲解

新-tcl语法讲解

TCL脚本语言语法基础讲解1.Tcl基础知识1.1什么是tclTcl全称是Tool command Language。

它是一个基于字符串的命令语言,基础结构和语法非常简单,易于学习和掌握。

Tcl语言是一个解释性语言,所谓解释性是指不象其他高级语言需要通过编译和联结,它象其他shell语言一样,直接对每条语句顺次解释执行。

Tcl数据类型简单。

对Tcl来说,它要处理的数据只有一种——字符串。

Tcl将变量值以字符串的形式进行存储,不关心它的实际使用类型。

1.2Tcl命令格式一条Tcl基本语法为:command arg1arg2 .... (命令参数1 参数2...)其中command为Tcl内建命令或者Tcl过程。

各条命令可以单独一行,也可以在同一行,在同一行时,需要用“;”来分隔。

即:command1 arg1 ... ; command2 arg2如以下的输出命令会在输出终端输出一段字符串:例 1-1 输出一段字符串的例子%puts "The next line contains an error"=> The next line contains an error注意:字符串中如果有空格的话,一定要用””或者{}括起来。

因为Tcl语句中各命令参数是以空格来分隔的,如果不用""或{}括起来,字符串中的单词会被误认为多余的参数而出错。

1.3脚本、命令和单词符号一个TCL脚本可以包含一个或多个命令。

命令之间必须用换行符或分号隔开set a 1;set b 2TCL的每一个命令包含一个或几个单词,第一个单词代表命令名,另外的单词则是这个命令的参数,单词之间必须用空格或TAB键隔开。

1.4Tcl脚本文件和source 命令除了通过交互式执行Tcl命令外,还可以将Tcl命令保存到一个后缀为.tcl的文件内,然后用Tcl的命令source 来执行:source fileNamesource命令从文件中读取Tcl命令并计算1.5置换(substitution)(注:在下面的所有章节的例子中,'%'为TCL的命令提示符,输入命令回车后,TCL会在接着的一行输出命令执行结果。

TCL基础教程——(1)入门

TCL基础教程——(1)入门

TCL学习记录最近学习了tcl,有一些体会,写出来供大家一起交流和切磋!p.s.:由于鄙人只是用tcl进行常规流程控制和仿真验证平台的搭建,因此涉及到较为高级的用法以及tk界面的东东就没有涉猎,如果有哪位仁兄对高级用法很有心得,可以与我联系哦。

Note:鄙人此处挑拣了tcl中较为基本,也是十分实用的几个方面做粗略描述,后面还提出了一个较小的工程设计。

虽然不是很完整,但个人认为麻雀虽小,五脏也是聚全了^_^。

细节性的东西还劳烦大家参考active state的tcl manual。

一.Tcl是一种基于字符串的、解释性命令的语言,语法规则简单、易学。

Variable substitution: $, nestableCommand substitution: [], 其实,有了command substitution实际上就表示命令可以嵌套,即:一个命令的结果可以作为别的命令的参数。

Backslash substitution: \, 与c语言类似,反斜杠主要用于在字符中插入诸如换行符、空格、[、$等被tcl解释器当作特殊符号对待的字符。

双引号和花括号除反斜杠歪,tcl提供另外两种方法来使得解释器把分隔符和置换符等特殊字符当作普通字符。

Tcl 解释器对双引号中的各种分隔符将不做处理,但是对换行符以及$、[]两种置换符还会做特殊处理。

而在花括号中,所有特殊字符都将成为普通字符,失去其特殊意义。

二、数组数组是一些元素的集合。

Tcl的数组和普通的计算机语言中的数组有很大的区别。

在tcl中,不能单独申明一个数组,数组只能和数组元素一起申明。

(感觉更像是c语言中的结构体)tcl不支持复杂的数据类型,这一点是tcl受指责最多的方面。

e.g.:set day(Monday) 1set day(Tuesday) 2数组的置换和简单的变量置换类似:e.g.:set a Mondayset day(Monday) 1set b $day(Monday) //b的值为1,即day(Monday)set c $day($a) //c的值为1,即day(Monday)三、listList这个概念在tcl中是用来表示集合的。

TCL培训教程(全)

TCL培训教程(全)

01
```
02
如果一切顺利,您将在终端中看 到输出`Hello, World!`。
变量、数据类型和运算符
• 变量:TCL中的变量不需要事先声明,可以直接赋值。变量名 可以以字母或下划线开头,后面可以跟字母、数字或下划线。 例如
变量、数据类型和运算符
```tcl
set myVar "Hello"
变量、数据类型和运算符
通过本项目,我们成功构建了一个简易的Web服务器 ,实现了HTTP协议的基础功能,并集成了CGI支持动 态网页生成。 展望与改进
在性能和安全性方面也可以进行进一步优化和提升。
THANKS FOR WATCHING
感谢您的观看
02
讲解使用TCL进行网络数据发送和接收的方法,包括数据的编码
、解码以及错误处理。
Socket事件处理
03
阐述如何处理Socket连接、断开、数据接收等事件,实现实时
网络通信。
图形界面开发(Tk)
Tk基础组件
介绍Tk中常用的基础组件,如标 签、按钮、文本框等,以及它们
的属性和方法。
布局管理
讲解如何使用Tk的布局管理器,如 pack、grid、place等,对界面进 行布局。
实现HTTP协议基础功能
生成HTTP响应 根据请求内容生成相应的HTTP响应。 构造响应行、响应头和响应体,并发送给客户端。
集成CGI支持动态网页生成
CGI概述
CGI(Common Gateway Interface)是一种服务器与外 部程序交互的规范。 通过CGI,服务器可以调用外部程序生成动态内容。
SQL语句执行
阐述如何在TCL中执行SQL语句 ,包括查询、插入、更新和删 除等操作。

TCL语言基础

TCL语言基础

TCL语言基础变量置换:它是由一个$符号标记,变量置换会导致变量的值插入一个单词符号中。

set x 10例如:set y $x+100 //y的值是10 + 100如果主要想得到值110,还必须用命令置换。

命令置换:命令置换是由[]括起来的TCL命令及其参数,命令置换会导致一个命令的所有或部分单词符号被另一个命令的结果所代替例如:set y [expr $x + 100] //y的值是110set y [expr $x + 100 ; set b 300 ] //y的值为300,因为了的值为300反斜杠置换:类似于C中反斜杠的用法,主要用于在单词符号中插入诸如换行符、空格、[、$等被TCL解析器当作特殊符号对待的字符。

例如:set msg multiple\space //这里最后两个单词间的空格不是分隔符,msg的值为:multiple spaceset msg money \ \$3333\ \nArray\ a\[2] //这个命令的执行结果为:money $3333 Array a[2] 将一个变量赋值给一个变量时,需用$符号如:set EndUser000 …8613000000000‟set EndUser $ EndUser000相关命令unser这个命从解析器中删除变理,后面可以有任意个参数,每个参数是一个变量名,删除数组的例子:%put $day(Monday)%put $day(Tuesday) 2%unset day%put $day(Tuesday)append命令把文本加到一个变量的后面例如:%set txt hellohello%append txt …! How are you‟hello ! How are you.Incr命令把一个变量值加上一个整数。

Incr要求变量原来的值和新加的值都必须是整数%set b a a%incr b expected integer but got “a”%set b 2 2%incr b 3 5List命令集List命令语法:list? Value value…?这个命令生成一个list,list的元素就是所有的value.例:%list 1 2 {3 4} 12{34}Concat命令语法:concat list ? list…?这个命令把多个list合成一个list,每个list变成新list的一个元素Lindex命令语法:lindex list index返回list的第index个(0-based)元素。

TCL姙言

TCL姙言

今天,在无意间看到了“TCL语言”,以前没有听过,也没有看过,上网搜了一下,对它简单的了解学习了一下。

需要详细了解请打开下面网址了解,学习。

/TCL(Tool Command Language)是一种解释执行的脚本语言(scrīpting Language)。

它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。

由于TCL的解释器是用一个C\\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作一个C库,这个库中有丰富的用于扩展TCL命令的C\\C++过程和函数,可以很容易就在C\\C++应用程序中嵌入TCL,而且每个应用程序都可以根据自己的需要对TCL语言进行扩展。

我们可以针对某一特定应用领域对TCL语言的核心命令集进行扩展,加入适合于自己的应用领域的扩展命令,如果需要,甚至可以加入新的控制结构,TCL解释器将把扩展命令和扩展控制结构与固有命令和固有控制结构同等看待。

扩展后的TCL 语言将可以继承TCL 核心部分的所有功能,包括核心命令、控制结构、数据类型、对过程的支持等。

根据需要,我们甚至可以屏蔽掉TCL的某些固有命令和固有控制结构。

通过对TCL的扩展、继承或屏蔽,用户用不着象平时定义一种计算机语言那样对词法、语法、语义、语用等各方面加以定义,就可以方便的为自己的应用领域提供一种功能完备的脚本语言。

TCL良好的可扩展性使得它能很好地适应产品测试的需要,测试任务常常会由于设计和需求的改变而迅速改变,往往让测试人员疲于应付。

利用TCL的可扩展性,测试人员就可以迅速继承多种新技术,并针对产品新特点迅速推出扩展TCL命令集,以用于产品的测试中,可以较容易跟上设计需求的变化。

另外,因为TCL是一种比C\\C++ 语言有着更高抽象层次的语言,使用TCL可以在一种更高的层次上编写程序,它屏蔽掉了编写C\\C++程序时必须涉及到的一些较为烦琐的细节,可以大大地提高开发测试例的速度。

TCL语言学习入门

TCL语言学习入门
TCL脚本语言学习
语言简介
Tcl是一种很通用的脚本语言,它几乎在所有的平台上都可以解释运行,功能强大。是tool command language的缩写,发音为"tickle”。实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。它有一个简单的语法和很强可扩充性,Tcl可以创建新的过程以增强其内建命令的能力。其次,Tcl是一个库包,可以被嵌入应用程序,Tcl的库包含了一个分析器、用于执行内建命令的例程和可以使你扩充(定义新的过程)的库函数。应用程序可以产生Tcl命令并执行,命令可以由用户产生,也可以从用户接口的一个输入中读取(按钮或菜单等)。但Tcl库收到命令后将它分解并执行内建的命令,经常会产生递归的调用。
1
2
set a 20; set b 4;
set c [expr $a/$b];#此时的c的值为5
除此之外,expr还能够识别一些函数及其返回值如下:
abs(x) x的绝对值
round(x) x舍入后得到的整数值
sin(x) x的正弦
…………………………………..
举个例子:
1
set a [expr sin(0.3)];#计算0.3的正弦
switch $element{
# 判断element的值
}
}
for是最常用的循环。其基本结构为:
for {initialization} {condition} {increment} {body}
例如:
1
for{set i 0} {$i< 10} {incr i} {puts $i;} #将打印出0到9
1
2

TCLl语言学习资料

TCLl语言学习资料

Tcl/Tk 漫谈〖摘要〗Tcl/Tk 是一种简明,高效,可移植性好的编程语言。

在信息产业领域具有广泛的应用。

本文介绍其成长历史,特点,优势及应用范围。

〖关键词〗Tcl/Tk, 组件,可移植性Tcl/Tk 的发明人 John Ousterhout 教授在八十年代初,是伯克利大学的教授。

在其教学过程中,他发现在集成电路 CAD 设计中,很多时间是花在编程建立测试环境上。

并且,环境一旦发生了变化,就要重新修改代码以适应。

这种费力而又低效的方法,迫使 Ousterhout 教授力图寻找一种新的编程语言,它即要有好的代码可重用性,又要简单易学,这样就促成了 Tcl (Tool Command Language) 语言的产生。

Tcl 最初的构想的是希望把编程按照基于组件的方法 (component approach),即与其为单个的应用程序编写成百上千行的程序代码,不如寻找一个种方法将程序分割成一个个小的, 具备一定“完整”功能的,可重复使用的组件。

这些小的组件小到可以基本满足一些独立的应用程序的需求,其它部分可由这些小的组件功能基础上生成。

不同的组件有不同的功能,用于不同的目的。

并可为其它的应用程序所利用。

当然, 这种语言还要有良好的扩展性, 以便用户为其增添新的功能模块。

最后,需要用一种强的,灵活的“胶水”把这些组件“粘”合在一起, 使各个组件之间可互相“通信”,协同工作。

程序设计有如拼图游戏一样,这种设计思想与后来的 Java 不谋而合。

终于在 1988 年的春天, 这种强大灵活的胶水 - Tcl 语言被发明出来了。

按照 Ousterhout 教授的定义, Tcl 是一种可嵌入的命令脚本化语言 (Command Script Language)。

“可嵌入”是指把很多应用有效,无缝地集成在一起。

“命令”是指每一条 Tcl 语句都可以理解成命令加参数的形式:命令 [参数 1] [参数 2] [参数 3] [参数 4] ...... [参数 N]脚本化是指 Tcl 为特殊的,特定的任务所设计。

Tcl语言基础教程

Tcl语言基础教程
注意路径的描述应该和UNIX相同,使用'/'而不是'\'。
2、置换(Substitution)
set x 10
set y 100 + x
上面命令执行后,y的值是“100 + x”而不是我们期望的110。这是因为Tcl解释器在分析命令时,把所有的命令参数都当作
字符串看待,所以x 被看作了字符串“100 + x”的一部分。如果我们想使用x的值'10' ,就必须告诉Tcl解释器:我们在这里期望的
如果regexp命令后面有参数matchVar和subMatchVar,则所有的参数被当作变量名,如果变量不存在,就会被生成。
regexp把匹配整个正规表达式的子字符串赋给第一个变量,匹配正规表达式的最左边的子表达式的子字符串赋给第二个变
量,依次类推,例如:
regexp { ([0-9]+) *([a-z]+)} " there is 100 apples" total num word 1
都将成为普通字符,失去其特殊意义,Tcl解释器不会对其作特殊处理。
二、Tcl变量数据类型
Tcl只支持一种数据类型:字符串(string)。所有的命令,命令的所有的参数,命令的结果,所有的变量都是字符串。请牢记
这一点,所有的东西都是字符串。(然而字符串的实际解释是依赖于其所处上下文。它有三种形式:命令, 表达式和表)。
符串,然后把结果存到变量varName中,注意除了空格和TAB键之外,string 和formatsting中的字符和'%'必须匹配。例如:
scan "some 26 34" "some %d %d" a b

五分钟学Tcl

五分钟学Tcl

五分钟学TclConcept 1: 程序是由命令(command)组成的Tcl语言最基本的概念是:命令。

程序是由一条接一条的命令构成的。

举例来说,设置变量’a’为5,并且打印它的值,你写两条命令:set a 5puts $a命令是以空格分隔的单词组成的。

一条命令以换行符或分号(‘;’)结尾。

在Tcl 中,万事皆命令 – 正如你看到的那样,Tcl中并没有赋值符。

要给一个变量赋值,需要用set命令,它将第一个参数所指定的变量,赋值为第二个参数所指定的值。

几乎所有的Tcl命令都会返回一个值,比如set命令返回的值就是其所赋的值。

如果set命令仅指定一个参数(变量名),那么其返回值就是该变量的当前值Concept 2: 命令替换(Command subsitution)其次的概念是:命令替换。

在一个命令中,某些参数可能出现在[ ]中。

这种情况下,参数被替换成[ ]中代码的返回值。

例如:set a 5puts [set a]第二条命令的第一个参数,[set a],会被替换成“set a”的返回值(即 5)。

在替换之后,这条命令就从puts [set a]转换成puts 5然后,它被正常执行。

Concept 3: 变量替换(Variable subsitution)如上例,总是用set命令来引用变量值显得太冗长了些,因此Tcl早期版本就已经引入了新的变量替换的概念。

如果一个变量名前面加上 $ 字符,那么它被替换成该变量的值。

所以,就没有必要用puts [set a]而可以使用puts $aConcept 4: 组(Grouping)如果命令由空格分隔的单词构成,那么如何处理包含空格的参数呢?比如:puts Hello World是一条不正确的语句,因为Hello和World是两个独立参数。

解决方式是分组(grouping)。

包含在""中的文本被认为是单个参数,所以正确的语句是:puts "Hello World"命令替换和变量替换在这种分组中也是有效的,比如我可以写:set a 5set b foobarputs "Hello $a World [string length $b]"结果是"Hello 5 World 6". 另外,转义字符如\t, \n 仍然有效.还有另一种Grouping方式,这种方式下所有的特殊字符都只有其字面含义,而不会发生变量替换。

TCL语言基础资料

TCL语言基础资料

本文由sunny_test贡献 doc1。

TCL 语言基础资料 一 脚本语言详细介绍 21 世纪的高级编程语言 摘要: 摘要 Perl 和 Tcl 等脚本语言代表一种与 c 或 JavaTM 为代表的系统程序设计语言完全不同的 编程形式. 脚本语言为"胶着"应用程序而设计, 它使用无类型方法来实现高级编程和比系统 程序设计语言更快的发展应用. 计算机速度的增长和混合应用的改变使脚本语言在今后的应 用中越来越重要. 关键字: 关键字 组件框架,面向对象编程,脚本,强类型,系统编程 1.简介 1.简介 在过去的十五年里,人们编写计算机程序的方法发生了根本的转变.这种转变是从 c 或 c++等系统程序设计语言到 Perl 或 Tcl 等脚本语言的过渡.虽然很多人参与了转变,却 很少有人意识到它的发生, 更不用说知道为什么会发生. 这篇文章是我关于为什么在下个世 纪脚本语言可以比系统程序设计语言更好的处理许多编程工作的一点看法. 与系统程序设计语言相比,不同的脚本语言为不同的工作而设计, 这导致了语言间的根本 不同.系统程序设计语言起源于像内存字等最初期的计算机元素,它为建立数据结构和算法 而创建.相反的,脚本语言为胶着而设计:他们假设已经存在一套强大的组件,而它主要是 把组件连在一起. 系统程序设计语言使用强类型定义来帮助处理复杂事务, 而脚本语言使用 无类型定义来简化组件间的联系,并提供快速应用开发. 脚本语言和系统程序设计语言互为补充, 并且二十世纪六十年代以来的大多数主要的计 算机平台都同时提供这两种类型的语言. 这些语言在组件框架中有着典型的应用: 组件由系 统程序设计语言创建, 并由脚本语言组合在一起. 然而, 速度更快的机器, 更好的脚本语言, 图形用户界面和组件构造重要性的不断提高, 因特网的发展等发展趋势大大提高了脚本语言 的应用.在今后的十年中,这种趋势将继续,而且越来越多的完全使用脚本语言和系统程序 设计语言书写的应用程序将主要用来创建组件. 2.系统程序设计语言 2.系统程序设计语言 为了理解脚本语言和系统程序设计语言的不同,最好先了解一下系统程序设计语言是如 何发展的.系统程序设计语言是作为除汇编语言外的另一种选择而引入的.在汇编语言里,实 际上机器的每一个细节都被反映在程序里.每个状态代表一个简单的机器指令,而程序员必 须处理像寄存器分配和程序调用顺序等低层细节.因此,用汇编语言编写和维持大型程序是 很困难的. 二十世纪五十年代后期像 Lisp,Fortran 和 Algol 等高层语言开始出现.这些语言里的状 态和机器指令不再完全一致,编译程序把过程程序中的每个状态翻译成一系列二进制指令. 经过一段时间,一系列系统程序设计语言包括 PL/1,Pascal,C,C++和 Java 由 Algol 发展而来. 系统程序设计语言没有汇编语言的效率高,但他们使应用程序更快的发展起来,因此,系统程 序设计语言在大型应用项目的发展中几乎完全取代了汇编语言. 系统程序设计语言与汇编语言在两个方面有所不同:它是高层语言并且是强类型."高层 "意味着很多细节被自动处理以便编程人员可以写更少的代码而做同样的工作.例如: ★编译程序处理寄存器分配,所以编程人员不需要写代码来在寄存器和内存间转移数据 ★自动设计程序调用顺序:编程人员不需要担心调用栈之间的参数转移 ★编程人员可以使用像 while 和 if 等简单的关键字来控制结构,编译器执行所有的指令细节 来完成控制结构 平均每行系统程序设计语言代码翻译成大约五条机器指令,与此相比,每行汇编语言代 码翻译成一条机器指令(由 5 个不同的人写的 8 个 c 文件的非正式分析中,我发现这个比率为 每行 3 到 7 条指令;Capers Jones 从大量语言的研究中发现对于一个给定的工作,汇编语言 需要的代码长度大约是系统程序设计语言代码长度的 3-6 倍)不管是什么语言,编程人员每 年可以写大体上相同数量的代码行,因此,系统程序设计语言允许用比汇编语言快得多的语 言写应用程序. 汇编语言和系统程序设计语言的第二个不同是类型设置.我使用"类型"来说明信息的意 义在它被使用前就被特殊化.在强类型语言中编程人员声明如何使用每条信息,并避免此信 息被用于其他方式.在弱类型语言中信息应用是没有优先权限制:信息的意思完全由它的使 用方法确定,而不是任何初始约定. 现代计算机基本上是无类型的:内存中的任何字对任何类型的值比如整型,浮点数,指针 或结构体都是有效的.值的意思由它的使用方法确定:如果指向一个内存字,那么他就被认为 是结构体;如果一个字涉及一个整型加结构体,那么他就被认为是整型,如此等等.相同的字 在不同的时间可用于不同的方法. 与此相反,现在的系统程序设计语言是强类型定义的.例如: ★系统程序设计语言中的每个变量都必须被声明为整型或指针或字符串等特殊类型,并且必 须用于适合这种类型变量的方法 ★数据与代码完全分离:创建新的代码很困难或根本不可能. ★变量可以集中在结构体中或者定义好的子结构体和过程或方法的对象中以便于使用;一种 类型的对象不能用于期待其他类型对象处. 确定类型由几个好处.第一,声明变量如何使用使大型程序更易于管理并区分那些必须 被分别对待的变量.第二,编译器可以利用类型信息来侦测某些类型的错误,比如,试图把一 个浮点值作为一个指针.第三,定义类型能使编译器更好的执行特殊代码.例如,如果编译器 知道一个变量总是对整型值有效,那么他就可以产生一个整型指令来操纵这个变量;如果编 译器不知道变量的类型,那么他就必须产生额外的指令在运行时检查变量类型. 总之,系统程序设计语言被设计来处理与汇编语言相同的工作,即随机地产生请求.系统 程序设计语言比汇编语言层次更高,类型更强.这就使请求产生更迅速并且处理更容易,除了 在运行时有一点损失,图示 1 是汇编语言和其他几种系统程序设计语言的比较. 3.脚本语言 3.脚本语言 脚本语言,像 Perl,Python,Rexx,Tcl,Visual Basic 和 Unix shells 代表了与系统程序 设计语言完全不同的编程.脚本语言假设已经存在了一系列由其他语言写成的有用的组件. 脚本语言不希望随机地产生请求,他希望主要是把组件接在一起.例如,Tcl 和 Visual Basic 可以被用于在屏幕上安排一系列用户图形控制,而 Unix shells scripts 被用于把过滤程序 集合入管道.脚本语言常用于扩展组件特性,但他们很少用于复杂的算法和数据结构;这些东 西常由组件提供.脚本语言有时涉及胶着语言或系统整体语言. 为了简化连接组件的工作,脚本语言被设计为无类型的:所有的东西无论是看起来还是 使用起来都是完全一样的,因此他们可以互换.例如,在 Tcl 或 Visual Basic 中一个变量可以 一会儿处理字符串,一会儿又处理整型.代码和数据也常可互换,因此,可以用一个程序写另 一个程序,然后高速执行,脚本语言一般是面向字符的,因为它为许多不同的事物提供了一致 的描述. 无类型语言使组件更容易连在一起.在使用时没有优先级限制,并且所有的组件及其值 都用统一的方式描述.除此之外,任何组件和值都可以在任何情况下使用;为某一目的而设计 的组件可以被用于设计者完全没有预见过的完全不同的目的.例如,在 Unix shells 中,所有 的过滤程序从输入读入字节流,并把字节组成的字符串写入输出;任何两个程序都可以通过 把一个的输出连到另一个的输入而把两者联系起来. 下面的 shell 命令把三个过滤堆在一起来计算选中区域中包含单词"scripting" 的行 数: select | grep scripting | wc select 程序读入当前显示选中的文本并把它输出;grep 程序读取输入并把包含 "scripting"的行输出;wc 程序对输入的行数求和.其中的每个 程序都可以用于许多其他情 况来做不同的工作. 系统程序设计语言的强类型本质上阻止重用.类型鼓励编程人员创建包含不相容接口 的类型("接口很好,接口越多越好").每个接口需要特别类型的对象,而编译器不允许接口使 用任何其他类型的对象,即使那样有用.为了使用一个已经存在的接口的新的对象,就必须写 转换代码以便在对象的类型和接口期望的类型间进行翻译.这反过来又需要重编译部分或全 部分布式二进制形式的应用程序,在普通情况下这是不可能的. 为了能看出无类型语言的优点,考虑下面的 Tcl 命令: button .b -text Hello! -font {Times 16} -command {puts hello} 这个命令创建了一个新的按钮来显示 16 点 Times 字体,当用户敲击控制键时显示一段 小的信息.它把六种不同的类型混合成一个单一的状态:一个命令名(button),一个按钮控制 (.b),所有权名字(-text, -font, 和-command),简单字符串(Hello! 和 hello),包含铅字名 (Times)及字点大小(16)的字体名(Times 16)和 Tcl 脚本(puts hello).Tcl 代表所有这些非 正式字符串.在这个例子中可以在任何一个命令中为属性赋值,而未赋值的属性使用给定的 缺省值.在这个例子中 20 个以上的属性是不特别赋值的. 同样的例子在 Java 中用两种方法执行时需要 7 行代码.使用 C++和微软基本类(MFC) 需要三个过程 25 行代码,在微软基本类中仅仅设置字体就需要几行代码: CFont *fontPtr = new CFont(); fontPtr->CreateFont(16, 0, 0,0,700, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_DONTCARE, "Times New Roman"); buttonPtr->SetFont(fontPtr); 大部分代码是由强类型造成的.为了设置按钮字体,必须运用 SetFont 方法,但这个方法 必须通过指针传给 CFont 对象,这反过来需要声明和初始化一个新的对象.为了初始化 CFont 对象必须唤醒它的 CreateFont 方法,但 CreateFont 有一个需要 14 个特殊化引数的固定接 口.在 Tcl 中字体(Times 铅字,16 点)的基本特征不用声明或转换就可以立即使用.另外,Tcl 允许在创建按钮的命令中直接包含按钮行为,而 C++和 Java 中需要把它放在单独声明的方法 中. (实际上可以用隐藏基本语言的复杂性的图形开发环境处理一个像这样的不重要的例子: 用户在表中输入合适的值,而开发环境输出代码.然而,在更多复杂情况像按计划产生合适值 或接口的条件任务中开发人员必须在基本语言下编写代码) 这可能看起来脚本语言的无类型特性不能发现错误,但实际上脚本语言和系统程序设计语言 一样安全.例如在上面的按钮例子中如果字体大小被置成非整型字符串,就像 xyz,那么就会 出现错误.不同的是当一个值被使用时脚本语言在最后一刻进行错误检查,而强类型在编译 时发现错误这就避免了运行时的检查.然而提高效率的代价是限制信息如何使用:这导致了 更多的代码和更不易改变的程序. 脚本语言和系统程序设计语言的另一个重要不同是脚本语言是被解释而系统程序设计 语言是被编译.被解释的语言由于没有编译时间而提供快速的转换.通过允许用户运行时编 写应用程序,解释器使.应用程序更加灵活,例如,许多整体线路的综合分析工具,包括 Tcl 解 释器;程序用户编写 Tcl 脚本来使他们的设计具体化并控制工具操作.通过快速设计代码解 释器可以实现强大的功能.例如,一个基于 Tcl 的网页浏览器可以通过把网页中的 HTML 转换 为使用一些常规表达替代物的 Tcl 脚本,从而从语法上分析网页然后执行脚本把页面翻译显 示在屏幕上. 脚本语言不如系统程序设计语言效率高,部分是因为他们使用解释器而不是编译器,而且 因为他们基本组件的选择标准是功能强大和易于使用而不是有效地对应基本硬件.例如,脚 本语言经常使用长度可变的字符串,而同样的情况下系统程序设计语言使用对应一个机器字 的二进制值;脚本语言经常使用哈希表,而系统程序设计语言使用变址阵列. 幸运的是,脚本语言的性能不经常是一个主要的问题.脚本语言应用程序通常比系统程 序设计语言的应用程序要小,并且脚本应用程序的执行受组件执行的支配,而这些组件是系 统程序设计语言提供的典型工具. 脚本语言比系统程序设计语言更高级,平均一个指令可以做更多的工作.一个典型的脚 本语言指令执行成百上千条机器指令,而一个典型的系统程序设计语言指令执行大约五条机 器指令(参图一).部分不同是因为脚本语言使用翻译器,这不如系统程序设计语言中被编译 的代码.但是主要的不同是因为脚本语言的初期操作有更强大的功能.例如,Perl 中唤醒一 个常规表达替代和唤醒一个整型加法一样简单.在 Tcl 中,变量会有与它相联系的图标,因此, 设置变量会导致侧面影响.例如,一个图标可能会被用于保持变量的值在屏幕上持续更新. 表 1.表的每行描述了被执行了两遍的应用程序,一遍使用系统程序设计语言,像 C 或 Java, 一遍使用脚本语言,像 Tcl.代码率列给出了两个应用程序的代码行率(>1 意味着系统编程语 言需要更多的代码),作用率列给出了开发率.在大多数情况下两个版本由不同的开发者执行. 表中的信息由 comp.lang.tcl 新闻组中对文章进行答复的不同人提供.. 由于上面描述的特性,脚本语言允许基于胶着的应用程序的快速发展.表 1 提供了有趣 的支持.它描述了几个在系统程序设计语言下执行后又在脚本语言中重新执行的应用程序, 或反过来也是一样的. 在每种情况下脚本版本都比系统编程版本需要更少的代码和更短的开发时间,不同点的 变化从 2 到 60.脚本语言第一次执行时好处不显著,这使人联想到任何在第一次执行经验上 的重执行都会更好,而脚本和系统编程的真正不同相差 5 到 10 倍,而不是表中的极端点.脚本 的好处同样依赖于应用程序.在表中的最后一个例子中,应用程序的图形用户界面部分是基 于胶着的,而模拟装置部分却不是;这可能解释为什么脚本应用程序不如其他应用程序获益 多. 总之,脚本语言被设计成胶着应用程序,他们提供比汇编或系统程序设计语言更高层的 编程,比系统程序设计语言更弱的类型,和解译后的开发环境.脚本语言牺牲执行速度来提高 开发速度. 4.不同的任务, 4.不同的任务,不同的工具 不同的任务 脚本语言不是系统程序设计语言的替代品,反过来也一样.他们各自适合不同类型的工 作.把胶着和系统合为一体,应用程序可以比脚本语言快 5-10 倍;系统程序设计语言将需要 大量复本和转换代码来连接各块.而这直接使用脚本语言.对于复杂的算法和数据结构,系统 程序设计语言的强类型使程序更易于管理.执行速度是关键.系统程序设计语言可以比脚本 语言运行快 10-20 倍,因为它产生更少的运行时检查. 在决定是否使用脚本语言或系统程序设计语言处理一项特殊任务时考虑以下问题: ★应用程序的主要工作是否是把已经存在的组件联系起来 ★应用程序是否要操纵不同种类类型的事物 ★应用程序是否包含图形用户界面 ★应用程序是否做大量字符串操作 ★应用程序函数是否能快速解决问题 ★应用程序是否需要可扩展 如果这些问题回答"是"就表明这个应用程序使用脚本语言会更好.另一方面,如果对下 面的问题回答"是"就表明系统程序设计语言更适合这个应用程序: ★应用程序是否执行复杂的算法或数据结构 ★应用程序是否操纵大量数据集(像图像中的所有像素)因而执行速度很重要 ★应用程序的函数是否已经定义好,并且很少改动 在过去的 30 年中,大多数主要的计算机平台同时提供系统编程和脚本语言. 例如, 第一 个脚本语言虽然粗糙, 却是一个 JCL(作业控制语言),它被用于在 OS/360 中把工作等级按顺 序排好.个别工作等级由 PL1,Fortran 或汇编语言书写,那时是系统程序设计语言.在二十 世纪八十年代时 Unix 机器上,c 被用于系统编程而 sh,csh 等壳编程被用于脚本.在二十世 纪九十年代的 PC 时代里,c 和 c++被用于系统编程 e 而 Visual Basic 用于脚本.在现在已 基本成形的网络时代中,Java 被用于系统编程而像 JavaScript , Perl 和 Tcl 等语言被用 于脚本. 脚本和系统编程是共生的,共同使用,他们能产生格外强大的编程环境:系统程序设计 语言用于产生令人兴奋的组件,然后用脚本语言把他们组装起来.例如,Visual Basic 的 主要吸引力是系统编程者可以用 c 编写 ActiveX 组件,而不太老练的编程者可以在 Visual Basic 应用中使用这些组件. Unix 下编写用于唤醒用 c 编写的应用程序的壳脚本很容易. 在 Tcl 普及的一个原因是可以编写执行新命令的 c 代码来扩展该语言的能力. 5.脚本呈上升趋势 脚本语言已经存在了很长时间,但最近几年几个因素的综合结果使它的重要性提高了. 最重要的因素是应用程序综合向胶着应用程序发展的变换. 这种变换的三个实例是图形用户 界面,因特网和组件框架. 图形用户界面出现于二十世纪八十年代早期, 并在二十世纪八十年代晚期得以普及. 在 许多编程项目中图形用户界面占了一半甚至更多的比重. 图形用户界面基于胶着应用: 他的 目标不是创建新的功能, 而是把图形控制集合和应用程序内部函数联系起来. 我不担心任何 快速发展的环境因为图形用户界面基于系统程序设计语言, 不论是 Windows 环境,Macintosh Toolbox 或 Unix Mctif,图形用户界面基于 c 或 c++等已被证明难以掌握,使用不灵活,生 成结果不灵活的语言.一些这样的系统有很好的图形工具来设计屏幕输出并隐藏基本语言, 而一旦设计者不得不编写代码时一切变得困难起来, 像为接口元素提供行为. 所有好的快速 开发图形用户界面环境都基于脚本语言:Visual Basic,Hyperlard 和 Tcl/tk,随着图形用 户界面的普及,脚本语言也越来越流行. 因特网的增长也使脚本语言变得大众化. 因特网只是一种胶着工具, 它不创建任何新的 计算结果或数据; 它只是简单的把大量已经存在的事物联系起来. 因特网编程工作的完美工 作之一是让所有连接的组件在一起工作,像脚本语言.例如:Perl 因编写 CGI 脚本而流行, JavaScript 因编写网页而流行. 基于脚本的第三个例子是组件框架,像 ActiveX,OpenDoc 和 JavaBeans.虽然系统程序 设计语言可以很好的创建组件, 但脚本更适合组装组件到应用程序中. 没有一个好的脚本语 言来操纵组件, 组件框架的大部分功能就都没有了. 这可以部分解释为什么组件框架在个人 电脑上(Visual Basic 提供了方便的脚本工具)比在像 Unix/CORBA 等组件框架中不包含脚 本的平台上更成功. 脚本语言继续普及的另一个原因是脚本技术的提高.现代脚本语言像 Tcl 和 Perl 离早 期脚本语言像 JCL 的公开宣布已经很远.例如,JCL 不提供基本反复而早期 Unix 外壳不提 供过程,即使在今天,脚本技术仍然相对不成熟.例如,Visual Basic 不是真正的脚本语 言:它最初执行像一个简单的系统程序设计语言,然后修改使之更适合脚本.以后的脚本语 言将比现在使用的更好. 脚本技术得益于计算机硬件的加速发展. 过去常常用系统程序设计语言在复杂的应用程 序中获得可接受的执行. 某些情况下甚至系统程序设计语言也不够有效, 因此不得不用汇编 编写应用程序.然而,今天的机器比 1980 年的快 100-500 倍,并且仍在继续以每 18 个月翻 一番的速度增长.今天,许多应用程序可以用解释后的程序执行,并且仍然有出色的执行. 例如,Tcl 脚本可以操纵几千个对象同时提供好的相互响应.由于计算机速度的不断提高, 脚本将对越来越大的应用程序产生吸引力. 脚本语言应用的不断增长最终导致编程群体的改变.二十年前大多数编程者是大型项目 的熟练的编程人员.那个时代的编程人员需要花几个月的时间掌握一门语言和它的编程环境, 系统程序设计语言就是为这些人设计的.然而,自从个人电脑出现以后,越来越多的非专业编 程者加入到编程者的行列.对这些人来说,编程不是他们的主要工作,而只是他们偶尔用来帮 助他们工作的工具.偶然编程的例子是简单的数据库查询或者是巨大的扩展片.偶然编程者 不希望花几个月的时间学习系统程序设计语言但他们可以花几个小时的时间学到足够的脚 本语言知识来写出有用的代码.由于脚本语言由简单的句法并且省略了对象线程等复杂的特 性,因而它比系统程序设计语言要容易学.例如,比较 Visual Basic 和 Visual C++,很少有偶 尔编程者会选择 Visual C++,而大部分会用 Visual Basic 建立有用的应用程序. 即使在今天,用脚本语言编写的应用程序的数目也远多于用系统程序设计语言编写的应 用程序的数目.在 Unix 系统中有比 C 程序更多的外部脚本,而在 Windows 下 Visual Basic 的编程者和应用程序都比 C 或 C++的要多.当然,多数大型和广泛使用的应用程序都是用系统 程序设计语言写成的,所以,如果比较代码总行数或是建立的副本数,则系统程序设计语言略 胜一筹.不管怎么样,脚本语言已经是应用程序开发的主动力,并且今后它的市场份额会继续 提高. 6.对象的作用 6.对象的作用 脚本语言在编程语言和软件工程中通常被专家忽视.取而代之,他们更注重像 C++和 Java 等面向对象系统程序设计语言.面向对象编程被认为是代表下一步编程语言发展的主流.像 强类型和继承等面向对象 特征 据说可以减少开发时间,提高软件重用率,并解决包括脚本 语言技巧等其他问题. 面向对象编程实际能提供多少好处?不幸的是,我还没有看到足够的数据可以确切地回答 这个问题.在我看来,对象只能提供一定的好处:或许能提高 20-30%的创作力,但决不会有两 倍,更不用说是十倍.现在抱怨 C++的和喜欢它的一样多,并且一些语言专家开始公开反对面 向对象编程.这一段剩下的部分用于解释为什么对象不能像脚本一样显著地提高创作力,并 讨论脚本语言中可以获得的面向对象编程的好处. 面向对象编程不能显著提高创作力的原因是他没有提高编程层次或鼓励重用.像 C++等面 向对象语言中编程者仍然使用需要用大量细节来描述和操纵的基本的小单元工作.理论上可 以开发强大的函数库包,并且如果这些函数库被广泛使用就将提高编程层次.然而,这样的函 数库却很少.大多数面向对象语言的强类型使包的定义受限制从而难以重用.每个包都需要 特殊类型的对象,如果两个包在一起工作,就必须写转换代码在两个包需要的类型间进行翻 译.面向对象语言的另一个问题是他们强调继承.当一个类借用为另一个类写的代码时执行 继承并不是一个好主意,它使软件难以管理和重用.它把类的执行绑在一起,因而没有另外一 个类任何一个其它类都不可理解:不知道其继承的方法在父类中如何执行,则无法理解子类; 而不知道其方法如何被子类继承,则无法理解父类.在一个复杂的类继承中,不理解它所继承 的所有其他的类就无法理解任何一个类.更糟的是,一个类无法从它继承的类中被分离以用 于重用.多重继承使这个问题变得更麻烦.执行继承导致和 goto 语句被重复执行时所看到的 一样的交错和不可靠.因此,面向对象系统经常不能处理复杂问题并缺少重用. 另一方面,脚本语言实际引起了有效的软件重用.在有趣的组件由系统程序设计语言建立 使他们使用了模块,随后用脚本语言把他们胶着在应用程序中.这种劳动的分割提供了为重 用的自然的框架结构.组件被设计为可重用的组件和脚本间有定义好的接口以利于组件的使 用.例如,在 Tcl 中组件是 C 中执行的常规命令.他们看起来更象是内在的命令,因而更容易在 Tcl 脚本中使用.在 Visual Basic 中组件是 ActiveX 的扩展,可用于从工具面板直接拖到窗 体中. 不管怎么样,面向对象编程至少提供了两个有用的特性.第一个是封装:对象用某种隐藏执行 细节的方法把数据和代码联系起来.这使管理大型系统更加容易.另一个有用的特性是接口 继承,这涉及提供同样方法的类和 APIs,即使他们有不同的执行,这时类之间可以相互转化, 从而鼓励重用. 幸运的是,对象的这些好处在脚本语言中可以像在系统程序设计语言中一样实现,并且所 有的脚本语言都提供面向对象编程.例如,Python 是面向对象脚本语言,Python 第五版包括 提供对象,Object Rexx 是 Rexx 的面向对象版本,而 Incr Tcl 是 Tcl 的面向对象版本.有一 点不同是,脚本语言中的对象事物类型的,而系统程序设计语言中的对象是强类型的. 7.其他语言 7.其他语言 这篇文章不是所有编程语言的全部特性记述.除了类型长度和编程层次以外还有许多编 程语言的其他特性,并且还有许多不能被明确定义为系统程序设计语言或脚本语言的其他有 趣的语言.例如,Lisp 系统的语言就处于脚本语言和系统程序设计语言之间,两方的特性它 都。

TCL Scripting Fundamentals(TCL 快速入门上手指导)

TCL Scripting Fundamentals(TCL 快速入门上手指导)

Contents1. WWWH About TCL .............................................................................................................. - 2 -1.1 . What is TCL ................................................................................................................. - 2 -1.2 . Why TCL ..................................................................................................................... - 2 -1.3 . When shall we use TCL ............................................................................................... - 3 -1.4 . How to program using TCL ......................................................................................... - 3 -2. TCL Basics .............................................................................................................................. - 4 -2.1 . Variables and Substitution ............................................................................................ - 4 -2.1.1 Command set and unset ...................................................................................... - 4 -2.1.2 Command append................................................................................................ - 4 -2.1.3 Command incr ..................................................................................................... - 5 -2.2 . Math Expressions ......................................................................................................... - 5 -2.2.1 General Math Expressions .................................................................................. - 5 -2.2.2 Math Functions ................................................................................................... - 6 -2.3 . String Manipulation ..................................................................................................... - 7 -2.3.1 Command string .................................................................................................. - 7 -2.3.2 Command format .............................................................................................. - 12 -2.3.3 Regular Expression ........................................................................................... - 14 -2.4 . List Manipulation ....................................................................................................... - 18 -2.4.1 Basic TCL List Commands ............................................................................... - 18 -2.4.2 Advanced TCL List Commands ........................................................................ - 20 -2.5 . File Operations ........................................................................................................... - 23 -2.5.1 Command open ................................................................................................. - 23 -2.5.2 Command file .................................................................................................... - 26 -2.6 . Control Flow .............................................................................................................. - 29 -2.6.1 The if command ................................................................................................ - 29 -2.6.2 Looping and Loop Control commands .............................................................. - 30 -3. TCL extensions ..................................................................................................................... - 32 -3.1 . TCL Package Expect .................................................................................................. - 32 -3.2 . TCL Package Tnm ...................................................................................................... - 33 -4. Appendix ............................................................................................................................... - 36 -4.1 . Appendix A, String Commands .................................................................................. - 36 -4.2 . Appendix B, List Commands ..................................................................................... - 37 -4.3 . Appendix C, Flow Control Commands ...................................................................... - 38 -4.4 . Appendix D, Math Functions ..................................................................................... - 38 -4.5 . Appendix E, References ............................................................................................. - 39 -1. WWWH About TCL本文是针对那些对TCL没有或者有一些基础认识的测试工程师,这个标题中的WWWH 并不是一个英文单词,而是一个缩写,这个缩写所提出的问题也基本上是本文所要提出并解决的问题;他们分别是What—什么是TCL、Why—为什么要使用TCL、When—什么时候我们该使用TCL、How—如何使用TCL。

Tcl脚本语言教程

Tcl脚本语言教程

T c l脚本语言教程(总37页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--Tcl教程TCL语法■脚本、命令和单词符号 (2)■置换(substitution) (2)■注释 (5)变量■简单变量 (5)■数组 (6)■相关命令 (6)表达式■操作数 (7)■运算符和优先级 (7)■数学函数 (8)List■list命令 (10)■concat命令 (10)■lindex命令 (11)■llength命令 (11)■linsert命令 (11)■lreplace命令 (11)■lrange 命令 (11)■lappend命令 (12)■lsearch 命令 (12)■lsort命令 (13)■split命令 (13)■join命令 (13)控制流■if命令 (13)■循环命令:while 、for、 foreach (14)■eval命令 (15)■source命令 (16)过程(procedure)■过程定义和返回值 (16)■局部变量和全局变量 (17)■缺省参数和可变个数参数 (17)■引用:upvar (18)字符串操作■format命令 (19)■scan命令 (20)■regexp命令■regsub命令■string命令文件访问■文件名■基本文件输入输出命令■随机文件访问■当前工作目录■文件操作和获取文件信息错误和异常■错误■从TCL脚本中产生错误■使用catch捕获错误■其他异常深入TCL■查询数组中的元素■info命令TCL语法 > 脚本、命令和单词符号一个TCL脚本可以包含一个或多个命令。

命令之间必须用换行符或分号隔开,下面的两个脚本都是合法的:set a 1 set b 2或set a 1;set b 2TCL的每一个命令包含一个或几个单词,第一个单词代表命令名,另外的单词则是这个命令的参数,单词之间必须用空格或TAB键隔开。

系统学习TCL脚本入门教程解析

系统学习TCL脚本入门教程解析

系统学习TCL脚本入门教程版本:1. 0作者:次目录1TCL语法 (4)1.1 简介 (4)1.2 运行环境 (4)1.3 本文约定 (4)1.4 参考资料 (4)2引言 (5)2.1 第1课:简单文本输出 (5)2.2 第2课:给变量赋值 (5)2.3 第3课:命令的赋值与置换一 (6)2.4 第4课:命令的赋值与置换二 (7)2.5 第5课:命令的赋值与置换三 (7)2.6 第6课:算数运算 (8)2.7 第7课:文本比较-SWITCH应用 (9)2.8 第8课:数值比较-IF应用 (10)2.9 第9课:WHILE循环 (11)2.10 第10课:FOR循环和INCR (11)2.11 第11课:过程PROC (12)2.12 第12课:过程PROC的参数定义 (13)2.13 第13课:变量的作用域 (13)2.14 第14课:LIST结构 (14)2.15 第15课:LIST项的增删改 (15)2.16 第16课:更多LIST相关 (16)2.17 第17课:字符串函数 (17)2.18 第18课:更多字符串函数 (17)2.19 第19课:修改字符串函数 (20)2.20 第20课:正则表达式 (21)2.21 第21课:更多正则表达式 (22)2.22 第22课:数组 (24)2.23 第23课:更多数组相关 (25)2.24 第24课:文件存取 (28)2.25 第25课:文件信息 (30)2.26 第26课:TCL中的子进程调用-OPEN & EXEC (33)2.27 第27课:命令或者变量是否存在-INFO (34)2.28 第28课:解释器状态-INFO (35)2.29 第29课:过程信息-INFO (36)2.30 第30课:模块化-SOURCE (37)2.31 第31课:建库-UNKNOWN & INFO LIBRARY (38)2.32 第32课:创建命令-EV AL (40)2.33 第33课:在EV AL中应用FORMAT & LIST (40)2.34 第34课:不使用EV AL替换-FORMAT & SUBST (42)2.35 第35课:改变工作目录-CD & PWD (43)2.36 第36课:调试和错误-ERRORINFO & ERROR C ODE & CATCH (44)2.37 第37课:调试-TRACE (45)2.38 第38课:命令行参数和环境串 (46)2.39 第39课:TIME & UNSET (47)2.40 第40课:SOCKET & FILEEVENT & VWAIT (49)2.41 第41课:日期时间-CLOCK (51)2.42 第42课:I/O通道-FBLOCKED & FCONFIG (53)2.43 第43课:子解释器 (56)2.44 第44课:数据库操作 (57)2.45 第45课:函数或过程数组的输入和输出方法 (59)2.46 第46课:INFO的用法 (60)2.47 第47课:多线程 (61)3跋 (75)1TCL语法1.1简介作为脚本语言,tcl语法简单而功能强大。

tcl脚本测试入门

tcl脚本测试入门

tcl脚本测试入门Tcl简介Tcl是一种非常简单的编程语言,如果你以前曾经学过编程,那么你只要学习几个小时就可以编写出一些有趣的Tcl程序。

本文将对Tcl的功能做一个大概的介绍。

一般来说,读完本文之后,你就可以开始独立的编写一些简单的Tcl脚本了;不过,要想获得更全面的认识,我们建议你还是去参考几本目前已经出版的Tcl书籍。

基本语法Tcl脚本由一些被换行符或是分号分开的命令所组成。

命令都有相同的基本格式,如下面的例子所示:expr 20 + 10 该命令计算20加10的和,并返回结果30。

你可以把这个例子以及本文中的所有其它的例子键入到tclsh这样的Tcl应用程序中来验证它们;在一个命令结束后,tclsh将打印出它的结果。

每个Tcl命令都含有一个或多个被空格分开的单词,在这个例子中有4个单词:expr,20,+,和10。

第一个单词是一个命令名,其余的单词是这个命令的参数。

所有的Tcl命令都含有一些单词,但不同的命令对他们的参数有不同的处理方式。

expr命令把它的所有参数看作是一个算术表达式,计算表达式的结果,并以字符串的形式返回结果。

在expr命令中,单词之间的分隔不是很重要:同样的命令你可以写成这种形式:expr 20+10 不过,对大部分的命令来说,单词的结构是很重要的。

每个单词都会用于不同的目的。

所有的Tcl命令都返回结果。

如果一个命令产生了没有意义的结果,那么它将返回一个空字符串作为它的结果。

变量Tcl允许你在变量中保存数值,并且可以在后续的命令中使用这些数值。

set命令用于对变量进行读写操作。

比如,下面的命令对变量x赋值为32。

set x 32 这个命令返回变量的新值。

你可以让set只带一个参数来读出变量的数值:set x 你不需要在Tcl中声明变量:变量在第一次set的时候被自动创建。

Tcl变量没有类型:任何值可以赋给任何变量。

要想在一个命令中使用变量的值,可以采用变量替代,如下例所示:e xpr $x*3 当一个字符$出现在一个命令中的时候,Tcl把跟在它后面的字母和数字看作是一个变量名并且将其替换成变量的值。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

相关命令
列表操作 concat - 将多个列表合并成一个列表 join - 把列表元素合并成一个字符串 lappend - 将元素添加到列表末尾 lassign - 将列表元素赋值给变量 lindex - 从列表中获得一个元素 linsert - 向列表插入一个元素 list - 创建一个列表 llength - 计算列表的元素个数 lrange - 返回列表中的一个或者多个临近的元素 lrepeat - 使用重复的元素构造一个列表 lreplace - 在一个列表中使用新的元素替代其它元素 lreverse - 反转列表元素的顺序 lsearch - 在列表中寻找特定元素 lset - 修改列表中的一个元素 lsort - 给列表中的元素排序 split - 将字符串分解成Tcl列表
注释:#
• • • '#'必须出现在TCL解释器期望命令的第一个字符出现的地方,才被当作注释。 %set a 100 # Not a comment %set b 101 ; # this is a comment
变量
• TCL支持两种类型的变量:简单变量和数组
• •
简单变量: TCL解释器在分析一个变量置换时,只把从$符号往后直到第一个不是字母、 数字或下划线的字符之间的单词符号作为要被置换的变量的名字。
相关命令
• 变量和过程 • • • • • • • • • • • • apply - 申请一个匿名函数 array - 处理数组变量 global - 存取全局变量 incr - 增加变量的值 namespace - 创建和操作命令和变量的上下文 proc - 创建一个Tcl过程 rename - 重新命名或者删除一个命令 set - 读写变量 trace - 监视变量存取、命令用法和执行 unset - 删除变量 upvar - 在不同的堆栈层中创建一个变量的链接 variable - 创建和初始化一个名字空间变量
相关命令
• • • • • • • • • • • • • • • • 软件包和源文件 load - 装载机器代码和初始化新命令 loadTk - 装载TK到一个安全解释器 package - 装载包和包的版本控制 pkg::create - 为给出包描述构造是个适当的'package ifneeded'命令 pkg_mkIndex - 为自动装载的包创建一个索引 source - 将一个文件或者资源作为Tcl脚本运行 tm - 方便的查找和装载Tcl模块 unload - 卸载机器代码 解释器 bgerror - 调用命令处理后台错误 history - 操作历史命令列表 info - 返回Tcl解释器的状态信息 interp - 创建并操作Tcl解释器 memory - 控制Tcl内存调试能力 unknown - 处理未知命令
练习册 puts
• puts ?-nonewline? ?channelId? string • • • • puts hello TCL中是以空格或者 TAB为分隔符 puts "hello" puts -nonewline hello hello puts -nonewline "hello hello"
相关命令
字符串操作 append - 在变量后添加变量 binary - 从二进制字符串中插入或释放数值 format - 使用sprintf的风格格式化一个字符串 re_syntax - Tcl正则表达式语法 regexp - 对正则表达式匹配器直接存取字符串 regsub - 基于正则表达式的模式匹配完成替换 scan - 使用指定的sscanf风格转换解析字符串 string - 操作字符串 subst - 完成反斜线、命令和变量替换
相关命令
• • • • • • • • • • • • • • • • • • 输入和输出 chan - 读写和操作I/O通道 close - 关闭一个打开的I/O通道 eof - 检查文件是否结束 fblocked - 测试I/O通道是否将数据准备好 fconfigure - 设置另外一个I/O通道 file - 操作文件名和属性 fileevent - 在I/O通道准备好处理读写事件时执行一个脚本 flush - 清空缓存输出I/O通道数据 gets - 从I/O通道中读取一行 open - 打开一个文件或命令管道 puts - 向I/O通道写入数据 read - 从I/O通道读出数据 refchan - 反射I/O通道的命令句柄API,版本1 seek - 设置I/O通道的存取偏移量 socket - 打开一条TCP网络连接 tell - 返回I/O通道的当前存取偏移量
相关命令
• • • • • • 数学 expr - 求一个数学表达式的值 mathfunc - Tcl数学表达式的数学函数 mathop - Tcl命令的数学操作符 字典操作 dict - 操作字典
相关命令
• • • • • • • • • • • • • • • • 控制结构 after - 设置将来执行的命令 break - 中断循环 catch - 返回异常错误 continue - 进入下一个循环 error - 产生一个错误 eval - 调用一个Tcl脚本 for - 'For' 循环 foreach - 反复循环操作一个或多个列表的每个元素 if - 执行一个条件脚本 return - 从进程中返回或者返回一个值 switch - 根据一个特定的值,指定几个脚本中的一个 update - 处理挂起的时间和空闲回调 uplevel - 在不同的堆栈层中执行一个脚本 vwait - 一直等待直到一个变量被修改为止 while - 重复的执行脚本直到条件不匹配
相关命令
• • • • • • • • • • • • • • • 库程序 encoding - 编码处理 http - 客户端执行的HTTP/1.0协议 msgcat - Tcl消息目录 platform. - 系统支持的编码和相关应用程序 platform.:shell - 系统支持的编码和相关应用程序 系统相关 cd - 改变工作目录 clock - 获取和操作日期与时间 exec - 调用子过程 exit - 退出应用程序 glob - 返回模式匹配的文件名 pid - 获得进程ID pwd - 返回当前工作目录的绝对路径 time - 计算一个脚本的执行时间
• •
• • • •
数组 在TCL中,不能单独声明一个数组,数组只能和数组元素一起声明。数组中, 数组元素的名字包含两部分:数组名和数组中元素的名字,TCL中数组元素的 名字(下标〕可以为任何字符串。 set a monday set day(monday) 1 set b $day(monday) //b的值为1,即day(monday)的值。 set c $day($a) //c的值为1,即day(monday)的值。
置换
(1)变量置换由一个$符号标记,变量置换会导致变量的值插入一个单词中。 (2)命令置换是由[]括起来的TCL命令及其参数,命令置换会导致某一个命令的所有或部 分单词被另一个命令的结果所代替。 (3)反斜杠置换:主要用于在单词符号中插入诸如换行符、空格、[、$等被TCL解释器当 作特殊符号对待的字符。 (4)双引号和花括号:TCL解释器对双引号中的各种分隔符将不作处理,但是对换行符 及 $和[]两种置换符会照常处理。 而在花括号中,所有特殊字符都将成为普通字符,失去其特殊意义,TCL解释器不会对其作 特殊处理。
• • • •
置换
反斜杠置换(backslash substitution) TCL语言中的反斜杠置换类似于C语言中反斜杠的用法,主要用于在单词符号中插入诸如换 行符、空格、[、$等被TCL解释器当作特殊符号对待的字符。 TCL支持以下的反斜杠置换: Backslash Sequence Replaced By \a Audible alert (0x7) \b Backspace (0x8) \f Form feed (0xc) \n Newline (0xa) \r Carriage return (0xd) \t Tab (0x9) \v Vertical tab (0xb) \ddd Octal value given by ddd (one, two, or three d's) \xhh Hex value given by hh (any number of h's) \ A single space character.
TCL 测试语言入门
什么是TCL
TCL(Tool Command Language)是一种解释执行的脚本语言(Scripting Language)。 它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固 有的核心命令集。 TCL的解释器是用一个C\C++语言的过程库实现的.TCL语言的语法实际上是一些TCL解释 器怎样对TCL命令进行分析的规则的集合。 TCL解释器对一个命令的求值过程分为两部分:分析和执行。在分析阶段,TCL 解释器 运用规则把命令分成一个个独立的单词,同时进行必要的置换(substitution); 在执行阶 段,TCL 解释器会把第一个单词当作命令名,并查看这个命令是否有定义,如果有定义就 激活这个命令对应的C/C++过程,并把所有的单词作为参数传递给该命令过程,让命令过程 进行处理。TCL解释器只把命令行中的第一个单词作为看作命令,其他的单词都作为普通字 符串处理,看作是命令的参数。
练习册 注释符号
• • • • $ set set set foo dollar x oo; foo; $$dollar;
“$”符实现引用替换,用以引 用参数值。Tcl对替换只进行 一遍解释,对嵌套的”$”不于 理睬。
[]
• set a 5*10; • set a [expr 5*10];
相关文档
最新文档