تی‌سی‌ال

زبان Tcl (مخفف Tool Command Language - زبان کنترل ابزار) حاصل تحقیقات John Ousterhout روی ابزارهای رایانه‌ای طراحی مدارهای الکتریکی در دانشگاه برکلی است. در این تحقیقات، Ousterhout و دانشجویانش مجبور بودند برای هریک از این ابزارها یک زبان کنترل جداگانه طراحی کنند، اما به دلیل توجه بیشتر به خود ابزار (و نه زبان)، ابزارها عموماً دارای زبان‌های کنترل ضعیفی بودند.
در پاییز سال ۱۹۸۷، در آزمایشگاه شرکت DEC، این ایده به ذهن Ousterhout رسید که یک زبان فرمان قابل جاسازی(Emdeddable Command Language) طراحی کند. یک زبان مفسری (Interpreted) خوب که بتواند به عنوان یک بسته کتابخانه‌ای در برنامه‌های گوناگون استفاده شود. هدف این بود که مفسر زبان مجموعه‌ای از امکانات اولیه را (مانند متغیرها و ساختارهای کنترلی) فراهم آورد و هر یک از ابزارهای استفاده‌کننده از آن بتوانند ویژگی‌های مورد نظر خود را به آن اضافه کنند.
Ousterhout در سال ۱۹۸۸ پس از بازگشت از آزمایشگاه DEC، کار بر روی Tcl را شروع کرد و نخستین نسخه آن را در یک متن پرداز (Text Editor) گرافیکی به کار گرفت. در ابتدا این کار فقط جنبه تحقیقاتی داشت و Ousterhout گمان نمی‌کرد دیگران هم به استفاده از آن علاقه‌مند باشند.

## فلسفه زبان
نیاز به امکان جاسازی (Embeddability) قابلیت ویژه زبان Tcl است و به گفته Ousterhout باعث می‌شود که اهداف زیر برای زبان در نظر گرفته شود:

# زبان باید گسترش پذیر(extensible) باشد: افزودن امکانات جدید به زبان توسط سایر افراد باید به آسانی امکان‌پذیر باشد و امکانات اضافه شده باید چنان باشند که انگار جزئی از خود زبان هستند (طبیعی باشند، نه این که با استفاده از اعمال پیچیدهای به مقصود برسند).
# زبان باید ساده و عمومی باشد، تا بتواند به آسانی با برنامه‌های گوناگون کار کند و امکاناتی را که این برنامه‌ها می‌توانند به زبان اضافه کنند محدود نکند.
# زبان باید امکانات خوبی برای ادغام داشته باشد، زیرا امکانات مهم‌تر زبان آنهایی است که توسط برنامه استفاده‌کننده به زبان افزوده شده‌است و کار اصلی زبان ادغام (integration) و پیوند دادن آن‌ها با یکدیگر است.
## نوآوری‌ها
مهمترین نوآوریهای Tcl عبارتند از قابلیت جاسازی و آسانی تولید واسط کاربر گرافیکی.
با ایجاد قابلیت جاسازی، مشکل بسیاری از افرادی که نیاز به یک زبان دارند، اما نمی‌خواهند یک زبان کامل را از ابتدا طراحی کنند حل شده است. به دلیل آسانی جاسازی Tcl در سایر برنامه‌ها، استفاده از آن در اوایل دهه ۹۰ به سرعت رشد کرد.
قابلیت دیگر Tcl، مجموعه ابزار Tk است که به عنوان گسترشی بر Tcl تولید شد و امکان ایجاد واسط کاربر گرافیکی با استفاده از ادغام مؤلفه(component)ها را به وسیله Tcl فراهم آورد. این قابلیت نیز به امکان استفاده از Tcl برای تولید برنامه‌های بزرگتر و با واسط کاربر مناسب افزود و در کسترش استفاده از آن سهم به سزایی داشت.

## کاربردها
برخی از کاربردهای Tcl به شرح زیر است[۱]:
* کاربردهای وب: از آنجا که Tcl یک زبان رشته-محور است برای برنامه‌های وبی مفید است. از نمونه برنامه‌های وبی استفاده‌کننده از Tcl می‌توان به AOLserver و TclHttpd اشاره کرد. به علاوه کتابخانه‌های CGI برای Tcl موجود است که امکان استفاده از آن به عنوان یک زبان برنامه‌نویسی وب را فراهم می‌کند.
* برنامه‌های با واسط کاربر گرافیکی (GUI Desktop Applications): ابزار Tk برای ایجاد برنامه‌های گرافیکی بسیار قدرتمند است. به علاوه این ابزار چند-سکویی (چندسکویی) است و بر روی Windows,Linux و Mac OS X قابل استفاده و اجراست.
* آزمایش و خودکارسازی: Tcl خود دارای یک چارچوب تست به نام tcltest است. به علاوه شرکتهایی مانند Oracle, Sybase و Cisco میلیون‌ها خط کد Tcl برای تست محصولات خود دارند.
* پایگاه‌های داده: Tcl دارای گسترشهایی برای کار با پایگاه‌های داده گوناگون مانند MySQL, Sybase, PostgreSQL, Oracle و Berkeley DB می‌باشد. همچنین بسته‌های wrapper ای وجود دارند که یک واسط واحد برای چند نوع پایگاه داده فراهم می‌کنند.
* توسعه نهفته (Embedded Development): استفاده از Tcl به علت قابلیت ادغام بالای آن، هم در محصولات سختافزاری مانند محصولات Cisco و هم در محصولات نرم‌افزاری مانند نرم‌افزارهای طراحی به کمک رایانه (CAD) و خودکارسازی طراحی الکترونیکی (EDA) رایج است. ابزار شبیه‌سازی Modelsim یکی از ابزارهایی است که با زبان Tcl کار می‌کند.

علاوه بر کابردهای فوق، کاربردهای دیگر تحقیقاتی از Tcl نیز مشاهده شده‌است. به عنوان مثال در سیستم‌های رباتیک از زبان Tcl استفاده شده‌است[۴]. همچنین این زبان در توسعه سریع نرم‌افزار (Rapid Application Development) نیز استفاده شده‌است[۵].

## بررسی زبان شناختی (ساختار و نحو زبان)
برنامه‌های Tcl تشکیل شده‌اند از دستورهایی که با semicolon یا با رفتن به خط جدید (newline) از هم جدا شده‌اند. هر دستور از تعدادی کلمه تشکیل شده‌است که با فاصله از هم جدا شده‌اند.
همهٔ دستورهای Tcl مقدار برمی‌گردانند. اگر برگرداندن مقدار برای دستوری معنا نداشته باشد، یک رشتهٔ تهی برمی‌گرداند.

## متغیرها
در Tcl نیازی به تعریف متغیر نیست. هر متغیری در اولین دفعه استفاده آن، تعریف می‌شود. همچنین متغیرها در Tcl دارای نوع نیستند. هر متغیری می‌تواند هر مقداری بگیرد[۱]. البته می‌توان با استفاده از دستور variable اقدام به تعریف متغیر در یک فضای نام (علوم رایانه) کرد[۳].
با استفاده از دستور set می‌توان مقادیر را در متغیرها ذخیره و از آن‌ها بازیابی نمود.
برای ذخیره :

```tcl
set x ۳۲
```


برای خواندن مقدار :

```tcl
set x
```


برای استفاده از مقادیر یک متغیر از روش «جایگذاری متغیر» به شکل زیر استفاده می‌شود:


```tcl
expr $x+3
```


این دستور مقدار x+۳ را برمی‌گرداند.
هنگامی که یک علامت دلار در عبارت ظاهر می‌شود، Tcl حروف و اعداد پس از آن را به عنوان نام متغیر تعبیر می‌کند و مقدار آن متغیر را به جای نام آن می‌گذارد[۱].

جایگذاری متغیر را می‌توان برای همه کلمه‌های یک دستور Tcl، مستقل از این که آن کلمه یک نام دستور یا یک آرگومان است، به کار برد؛ مثلاً عبارات زیر معادل عبارات قبلی است:


```tcl
set a expr
set x ۳۲
$a $x+3
```


## ساختارهای کنترلی
Tcl مجموعه کاملی از دستورهای کنترلی شامل دستورهای اجرای شرطی، دستورهای حلقه و دستورهای زیربرنامه‌ای را دارد. دستورهای کنترلی Tcl دستورهایی عادی هستند که به عنوان آرگومان، اسکریپتهای Tcl می‌گیرند[۱]. به عنوان مثال دستور proc که برای تعریف زیربرنامه به کار می‌رود، سه آرگومان می‌گیرد: نام زیربرنامه، لیست نام پارامترهای آن، و بدنه زیربرنامه که یک اسکریپت Tcl است:


```tcl
proc power {base p} {
    set result 1
    while {$p> ۰} {
        set result [expr $result * $base]
        set p [expr $p - 1]
    }
    return $result
}
```


مشابها دستور while که در بالا مشاهده می‌شود، یک دستور Tcl است که دو آرگومان می‌گیرد: یک عبارت که همان عبارت شرط است و یک بدنه که یک اسکریپت Tcl است.

از این زیربرنامه می‌توان به شکل زیر استفاده کرد:


```tcl
power 2 6
power 1.15 5
```


## دستورها و عبارت‌ها
همهی امکانات اساسی Tcl به وسیله دستورها نمایش داده می‌شوند. حتی عبارات نیز به وسیله اجرای دستورهای و به عنوان خروجی آن‌ها محاسبه می‌شوند.
قالب معمول دستورهای Tcl به شکل زیر است [۲]:


```tcl
command arg1 arg2 arg۳ …...
```


دستورهای Tcl به سه دسته تقسیم می‌شوند [۱]:

# دستورهای توکار (built-in commands): این دستورهای به وسیله مفسر Tcl فراهم می‌شوند و در همه برنامه‌های Tcl قابل استفاده‌اند. دستورهای proc,while,set و return که در مثال‌های بالا آمده‌اند نمونه‌هایی از این دستورهای هستند.
# دستورهایی که به وسیله امکان گسترش (Extension mechanism) زبانTcl به آن اضافه می‌شوند. می‌توان به وسیله توابعی که کتابخانه Tcl فراهم می‌کند، نام یک دستور و زیربرنامه اجراکنندهٔ آن (به زبان C و ++C) را به مفسر Tcl اطلاع داد. پس از این کار هر کجا که آن نام در اسکریپت Tcl ظاهر شود، مفسر همان تابع معرفی شده (به زبان C) را برای اجرای دستور فراخوانی می‌کند. دستورهای توکار Tcl نیز به همین روش پیاده‌سازی شده‌اند.
# زیربرنامه‌های تعریف شده به وسیله دستور proc: به‌طور کلی از extension برای پیاده‌سازی دستورهای سطح پایین و از proc برای پیادهسازی دستورهای سطح بالا که نوشتن آن‌ها به Tcl آسانتر است استفاده می‌شود.
چنان‌که گفته شد عبارات در Tcl به وسیله اجرای دستور ارزیابی می‌شوند. به عبارت دیگر مفسر Tcl خود عبارات را ارزیابی نمی‌کند، بلکه تنها عمل دسته‌بندی آرگومانها، جایگذاری مقادیر و فراخوانی دستور را انجام می‌دهد. به همین دلیل در Tcl از دستور expr برای ارزیابی عبارات ریاضی استفاده می‌شود[۲].

دستور expr با آرگومانهای خود به شکل عبارت ریاضی برخورد می‌کند[۱]. این دستور با عبارات ریاضی، شامل اعداد صحیح، اعشاری و مقادیر منطقی (boolean) سر و کار دارد. قواعد حاکم بر عبارات expr همان است که بر عبارات در زبانC حاکم است[۲]. به علاوه دستور expr برخی توابع اولیه ریاضی را نیز پشتیبانی می‌کند. به عنوان مثال [۲]:


```tcl
set len [expr [string length foobar] ]
```


که مقدار طول رشته foobar را (که برابر با۶ است) محاسبه می‌کند و:


```tcl
set pi [expr {۲*asin(1.0)}]
```


که مقدار عدد pi را محاسبه می‌کند.

زبان Tcl مقادیر درون علامت نقل قول (” ”) را ارزیابی و به جای عبارات درون آن مقادیر لازم را قرار می‌دهد. به قراردادن یک عبارت در آکولاد ({ }) می‌توان از این کار جلوگیری کرد:


```tcl
set name Ali
”My name is $name”
{“My name is $name”}
```


دستور دوم مقدار My name is Ali را برمی‌گرداند در حالی که دستور سوم مقدار My name is $name را برمی‌گرداند.

## رشته ها[۲]
رشتهها واحد اساسی داده در Tcl هستند و به همین دلیل است که دستورهای زیادی برای کار با آن‌ها وجود دارد.

دستور string مجموعه‌ای است از عملیات قابل انجام بر روی رشته‌ها. نمونه‌ای از این عمل را در مثال بالا در بحث عبارتها مشاهده می‌کنیم. اولین آرگومان این دستور نام عملی است که باید انجام گیرد. برخی از اعمال مجاز عبارتند از:


```tcl
bytelength, compare, equal, first, index, is, last, length, map, match, range, repeat, replace, tolower, totitle, toupper,
 trim, trimleft, trimright, wordend, wordstart
```


Tcl امکاناتی را برای کار با اندیسها در رشته‌ها فراهم می‌کند. کاراکترها در رشته از ۰ شمرده می‌شوند. به عنوان مثال دستور زیر کاراکترهای سوم تا آخر رشته با نام name را برمی‌گرداند؛ مثلاً اگر name حاوی مقدار ahmadi باشد:


```tcl
string range $name 3 end
```


مقدار adi را برمی‌گرداند.

برخی از اندیسهای قابل استفاده در این دستورهای عبارتند از:


```tcl
first, last, wordstart, wordend
```


همچنین دستور string امکاناتی را برای بررسی تطابق یک رشته با یک رشته دیگر و نیز تعلق یک رشته به یک کلاس خاص (مثلاً عدد بودن محتویات یک رشته) فراهم می‌کند.

Tcl همچنین دستورهایی مانند append, scan, format, binary را برای عملیات پیشرفته روی رشته‌ها فراهم می‌کند.

## توضیحات (Comments)
در زبان Tcl از علامت # برای مشخص کردن توضیحات برنامه استفاده می‌شود. هر توضیح یک خط را اشغال می‌کند. برای توضیحات چند خطی می‌توان از قراردادن \ در پایان هر یک از خطوط استفاده کرد[۲]. در زیر مثال‌هایی از توضیحات Tcl مشاهده می‌شود.


```tcl
# This is a simpel line of comment
#This is a line of comment \
and here is the rest of the line above
```


## لیست‌ها
یکی از قابلیتها در زبان Tcl، امکان کار با لیستهاست. برخی از دستورهای کار با لیستها عبارتند از[۲] :

```tcl
list, lindex, llength, lrange, lappend, linsert, lsearch, lreplace, …
```


لیستها در Tcl دارای دو کاربرد عمده هستند [۳]:

# استفاده در دستور کنترلی foreach
# ساخت پویای اجزای یک دستور Tcl برای اجرای آن در آینده به وسیله دستور eval
البته لیستها وسیله مناسبی برای ساخت دادهساختارهای پیچیده در Tcl نیستند و برای چنین کاری استفاده از آرایه‌ها مناسبتر است [۲].
یک نمونه از کاربرد دستورهای لیست در Tcl در زیر آمده‌است[۳]:


```tcl
٪ set c۱ {Bob Carol}
Bob Carol
٪ set c۲ [list Ted Alice]
Ted Alice
٪ set Party1 [list $c۱ $c2]
{Bob Carol} {Ted Alice}
٪ set Party2 [concat $c۱ $c2]
Bob Carol Ted Alice
٪ linsert $Party1 1 Richard
{Bob Carol} Richard {Ted Alice}
٪
```


## آرایه‌ها
آرایه یک متغیر Tcl با اندیسهای رشته‌ای است. می‌توان به اندیس به چشم کلید و به آرایه به دید مجموعه‌ای از عناصر که به وسیله کیلد قابل شناسایی هستند نگریست[۲]. از این نظر، می‌توان گفت آرایه‌های Tcl مانند Hashها در زبان Perl هستند [۳]. قابلیت انعطاف آرایه‌ها آن‌ها را به ابزاری مهم برای برنامه‌نویسی در Tcl تبدیل می‌کند. یکی از استفاده‌های مهم آرایه‌ها در Tcl ایجاد دادهساختارهای پیچیده‌است که در زبان‌هایی مثل C و Pascal به وسیله مفاهیمی مانند struct و record تعریف می‌شوند[۲].

در زیر نمونهای از کاربرد آرایه‌ها در Tcl دیده می‌شود[۳]:


```tcl
٪ set People(friend) Tom
Tom
٪ set People(spouse) Marcia
Marcia
٪ set People(boss) Jack
Jack
٪ array names People
friend boss spouse
٪ set Person $People(friend)
Tom
٪ array get People
friend Tom boss Jack spouse Marcia
٪ set People(friend) \
[concat $People(friend) Bob]
Tom Bob
٪ set Person $People(friend)
Tom Bob
٪
```


## زیربرنامه‌ها و محدوده‌ها
چنان‌که گفته شد زیربرنامه‌ها امکان کپسولهسازی (encapsulation) دستورهای در قالب یک دستور را فراهم می‌کنند. زیربرنامه‌ها همچنین یک محدوده(scope) محلی برای متغیرها ایجاد می‌کنند[۲].

در آغاز، Tcl دارای یک محدوده سراسری (global) برای متغیرها، محدوده‌های محلی درون زیربرنامه‌ها و یک محدوده سراسری برای زیربرنامه‌ها بود. از Tcl ۸٫۰ به بعد محدوده-نام‌ها به Tcl اضافه شد که محدوده جدیدی برای زیربرنامه‌ها و متغیرهای سراسری به وجود می‌آورد. نکته دیگر آنکه زیربرنامه‌ها و متغیرها دارای محدوده-نامهای جدا هستند بنابراین می‌توان بدون ایجاد مشکل، متغیر و زیربرنامه همنام داشت[۲].
متغیرهای تعریف شده در هر زیربرنامه، تنها در همان زیربرنامه قابل دسترسی و استفاده هستند. به علاوه متغیرهای سراسری در حالت عادی در برنامه‌ها قابل استفاده نیستند و برای استفاده از آن‌ها باید به شکل صریح (explicit) و با استفاده از دستور global آن‌ها را به سیستم معرفی کرد. همچنین متغیرهای تعریف شده در بلوکهای بالاتر نیز به حالت عادی در بلوک درونیتر قابل استفاده نیستند و باید به وسیله دستور upvar آن‌ها را به سیستم معرفی کرد[۳].

نمونه‌هایی دیگر از تعریف زیربرنامه‌ها، به همراه شیوه استفاده از دستور upvar در زیر آمده‌است[۲]:


```tcl
proc RandomInit { seed } {
   global randomSeed
   set randomSeed $seed
}
proc Random {} {
   global randomSeed
   set randomSeed [expr ($randomSeed*۹۳۰۱ + ۴۹۲۹۷) ٪ ۲۳۳۲۸۰]
   return [expr $randomSeed/double(233280)]
}
proc RandomRange { range } {
   expr int([Random]*$range)
}
```

که حاصل اجرای آن به این صورت است :

```tcl
RandomInit [pid]
=> ۵۰۴۹
Random
=> ۰٫۵۱۷۶۸۶۸۹۹۸۶۳
Random
=> ۰٫۲۱۷۱۷۶۷۸۳۲۶۵
RandomRange ۱۰۰
=> ۱۷
```

به عنوان نمونهای از استفاده از دستور upvar می‌توان به پیادهسازی پشته با استفاده از لیست اشاره کرد[۲]:

```tcl
proc Push { stack value } {
   upvar $stack list
   lappend list $value
}
proc Pop { stack } {
   upvar $stack list
   set value [lindex $list end]
   set list [lrange $list 0 [expr [llength $list]-2]]
   return $value
}
```

که در آن stack$ حاوی نام متغیر لیست دارای اطلاعات stack است که در بیرون از محدوده زیربرنامه قرار دارد و به عنوان پارامتر به برنامه فرستاده و تبدیل به یک متغیر قابل استفاده در زیربرنامه شده‌است.

## سایر امکانات[۲]
از جمله سایر امکاناتی که زبان Tcl فراهم می‌کند می‌توان به موارد زیر اشاره کرد:
* عبارات منظم (Regular Expressions)
* کتابخانه‌ها و بسته‌های(Packages) اسکریپتی
* انعکاس (Reflection) و اشکالزدایی
* محدوده-نام‌ها (Namespaces)
* ترجمه (Internationalization)
* برنامه سازی رویداد-محور(Event-driven Programming)
* برنامهسازی با سوکت‌ها
* برای اطلاع بیشتر در این موارد می‌توان به [۲] مراجعه کرد.

## نمونه برنامه‌های کامل Tcl
در زیر نمونه‌هایی از برنامه‌های کامل Tcl آورده شده‌است. نمونه اول یک اسکریپت کنترلی برای برنامه شبیهسازی Modelsim است و دستورهای افزوده شده به Tcl توسط برنامه Modelsim در آن به خوبی مشهود است:


```tcl
# Copy Test Bench Files to the appropriate place
# $testAddr is the address of the simulation files
# $benchAddr is the address of the test bench directory
set benchRoot $۱
set testRoot $۲

set testsAddr $۳

set benchName $۴
set testName $۵
# The address in which results should be put
set destAddr $benchRoot
#Copy test bench specified on command line
file delete -force $testRoot/tsource
file copy -force $benchRoot/$benchName $testRoot/tsource
# Run the simulation
vsim -voptargs=+acc work.tbleon
# Add the processor's pinout signals
add wave sim:/tbleon/tb/p0/leon0/resetn
add wave sim:/tbleon/tb/p0/leon0/clk
add wave sim:/tbleon/tb/p0/leon0/pllref
add wave sim:/tbleon/tb/p0/leon0/plllock
add wave sim:/tbleon/tb/p0/leon0/errorn
add wave sim:/tbleon/tb/p0/leon0/address
add wave sim:/tbleon/tb/p0/leon0/data
add wave sim:/tbleon/tb/p0/leon0/ramsn
add wave sim:/tbleon/tb/p0/leon0/ramoen
add wave sim:/tbleon/tb/p0/leon0/rwen
add wave sim:/tbleon/tb/p0/leon0/romsn
add wave sim:/tbleon/tb/p0/leon0/iosn
add wave sim:/tbleon/tb/p0/leon0/oen
add wave sim:/tbleon/tb/p0/leon0/read
add wave sim:/tbleon/tb/p0/leon0/writen
add wave sim:/tbleon/tb/p0/leon0/brdyn
add wave sim:/tbleon/tb/p0/leon0/bexcn
add wave sim:/tbleon/tb/p0/leon0/sdcke
add wave sim:/tbleon/tb/p0/leon0/sdcsn
add wave sim:/tbleon/tb/p0/leon0/sdwen
add wave sim:/tbleon/tb/p0/leon0/sdrasn
add wave sim:/tbleon/tb/p0/leon0/sdcasn
add wave sim:/tbleon/tb/p0/leon0/sddqm
add wave sim:/tbleon/tb/p0/leon0/sdclk
add wave sim:/tbleon/tb/p0/leon0/sa
add wave sim:/tbleon/tb/p0/leon0/sd
add wave sim:/tbleon/tb/p0/leon0/pio
add wave sim:/tbleon/tb/p0/leon0/wdogn
add wave sim:/tbleon/tb/p0/leon0/dsuen
add wave sim:/tbleon/tb/p0/leon0/dsutx
add wave sim:/tbleon/tb/p0/leon0/dsurx
add wave sim:/tbleon/tb/p0/leon0/dsubre
add wave sim:/tbleon/tb/p0/leon0/dsuact
add wave sim:/tbleon/tb/p0/leon0/test
# To continue script execution
onbreak {
resume
}
# First run
run -all
# Set onbreak to its default value
onbreak ""
# Open dataset as gold for comparison
dataset open $benchRoot/$benchName/gold.wlf
echo Golden Version Opened for comparison!
# Starting Compare
compare start gold sim
# Add signals for comparison
compare add gold:/tbleon/tb/p0/leon0/resetn
compare add gold:/tbleon/tb/p0/leon0/clk
compare add gold:/tbleon/tb/p0/leon0/pllref
compare add gold:/tbleon/tb/p0/leon0/plllock
compare add gold:/tbleon/tb/p0/leon0/errorn
compare add gold:/tbleon/tb/p0/leon0/address
compare add gold:/tbleon/tb/p0/leon0/data
compare add gold:/tbleon/tb/p0/leon0/ramsn
compare add gold:/tbleon/tb/p0/leon0/ramoen
compare add gold:/tbleon/tb/p0/leon0/rwen
compare add gold:/tbleon/tb/p0/leon0/romsn
compare add gold:/tbleon/tb/p0/leon0/iosn
compare add gold:/tbleon/tb/p0/leon0/oen
compare add gold:/tbleon/tb/p0/leon0/read
compare add gold:/tbleon/tb/p0/leon0/writen
compare add gold:/tbleon/tb/p0/leon0/brdyn
compare add gold:/tbleon/tb/p0/leon0/bexcn
compare add gold:/tbleon/tb/p0/leon0/sdcke
compare add gold:/tbleon/tb/p0/leon0/sdcsn
compare add gold:/tbleon/tb/p0/leon0/sdwen
compare add gold:/tbleon/tb/p0/leon0/sdrasn
compare add gold:/tbleon/tb/p0/leon0/sdcasn
compare add gold:/tbleon/tb/p0/leon0/sddqm
compare add gold:/tbleon/tb/p0/leon0/sdclk
compare add gold:/tbleon/tb/p0/leon0/sa
compare add gold:/tbleon/tb/p0/leon0/sd
compare add gold:/tbleon/tb/p0/leon0/pio
compare add gold:/tbleon/tb/p0/leon0/wdogn
compare add gold:/tbleon/tb/p0/leon0/dsuen
compare add gold:/tbleon/tb/p0/leon0/dsutx
compare add gold:/tbleon/tb/p0/leon0/dsurx
compare add gold:/tbleon/tb/p0/leon0/dsubre
compare add gold:/tbleon/tb/p0/leon0/dsuact
compare add gold:/tbleon/tb/p0/leon0/test
#compare add -r gold:/*
# Running compare
compare run
# Saving comparison and differences
compare saverules $destAddr/$testName-$benchName-comprules.sav

onerror {
echo Hurray! No Differences Found!!;
resume
}

compare savediffs $destAddr/$testName-$benchName-compdiffs.sav
echo Comparison complete!
#Goodbye!
quit -sim;
dataset close gold
```


نمونه دوم یک برنامه ping ساده است که در محیط لینوکس اجرا می‌شود[۶]:

```tcl
#!/usr/local/bin/wish -f
# Ping example #۱
frame .buttons -borderwidth 10
pack .buttons -side top -fill x

button .buttons.quit -text Quit -command exit
button .buttons.ping -text Ping -command Ping
pack .buttons.quit .buttons.ping -side right

frame .f ; pack .f -side top
label .f.l -text Host:
entry .f.host -width 20 -relief sunken
pack .f.l .f.host -side left

text .log -width 60 -height 10 -bd 2 -relief raised
pack .log -side top

proc Ping {} {
    set hostname [.f.host get]
    catch {exec /usr/sbin/ping $hostname} result
    .log insert end $result
    .log insert end \n
}
```

به عنوان نمونهای دیگر می‌توان برنامه تبدیل فایل‌های Dos به Unix را مشاهده کرد[۱]:

```tcl
#!/usr/local/bin/tclsh
# Dos2Unix
# Convert a file to Unix-style line endings
# If the file is a directory, then recursively
# convert all the files in the directory and below.
## Arguments
# f The name of a file or directory.
## Side Effects:
# Rewrites the file to have LF line-endings

proc Dos2Unix {f} {
    puts $f
    if {[file isdirectory $f]} {
        foreach g [glob [file join $f *]] {
            Dos2Unix $g
        }
    } else {
        set in [open $f]
        set out [open $f.new w]
        fconfigure $out -translation lf
        puts -nonewline $out [read $in]
        close $out
        close $in
        file rename -force $f.new $f
    }
}
# Process each command-line argument

foreach f $argv {
    Dos2Unix $f
}
```


## منابع

* About Tcl, http://www.tcl.tk/about, AT=۷ ژوئن ۲۰۰۹
* Brent Welch, Practical Programming in Tcl and Tk (3rd Edition) , PrenticeHall, ۱۹۹۹
* Brian Bilbrey, Tcl/Tk quick start, IBM developerWorks, http://www.ibm.com/developerworks/edu/l-dw-linuxtcl-i.html، ۲۰۰۱
* A.C.Leite, F.C.Lizarralde, Application of Tcl/Tk for a robotic system, 13th Annual Tcl/Tk conference, اکتبر ۲۰۰۶
* Rapid Application Development Using the Tcl/Tk Language, IEEE, 1996, accelconf.web.cern.ch/AccelConf/p95/ARTICLES
/MPR/MPR02.pdf
* Yifan Tang, Scripts and Utilities (Tcl/Tk lecture, Course: cs300) , University of Tennessee, Department of Computer Science,Fall ۲۰۰۲

رده:اختراع‌های آمریکایی
رده:زبان‌های اسکریپت‌نویسی
رده:زبان‌های برنامه‌نویسی اسکریپتی
رده:زبان‌های برنامه‌نویسی رویه‌ای
رده:زبان‌های برنامه‌نویسی ساخته‌شده در ۱۹۸۸ (میلادی)
رده:زبان‌های برنامه‌نویسی سطح بالا
رده:زبان‌های برنامه‌نویسی شیءگرا
رده:زبان‌های برنامه‌نویسی ماشینی پویا
رده:زبان‌های برنامه‌نویسی متن‌گرا
رده:کامپایلرها و مفسرهای آزاد
رده:نرم‌افزارهای آزاد چندسکویی
رده:نرم‌افزارهای آزاد نوشته‌شده با سی
رده:نرم‌افزارهای چندسکویی