Tcl

Η **Tcl** (αρχικά των αγγλικών λέξεων "Tool Command Language", "Γλώσσα Εντολών Εργαλείων", συνήθως εμφανίζεται ως "Tcl" ή "TCL") είναι μια γλώσσα προγραμματισμού σεναρίων που δημιουργήθηκε από τον John Ousterhout. Σύμφωνα με αυτόν, "δημιουργήθηκε λόγω απογοήτευσης" και, ενώ οι προγραμματιστές δημιουργούσαν τις δικές τους γλώσσες, τις οποίες στη συνέχεια ενσωμάτωναν σε εφαρμογές, η Tcl έγινε αποδεκτή από μόνη της. Συχνά χρησιμοποιείται για γρήγορη ανάπτυξη εφαρμογών (rapid application development/rapid prototyping), εφαρμογές σεναρίων, γραφικές διεπαφές και δοκιμές λογισμικού. Η Tcl χρησιμοποιείται σε πλατφόρμες ενσωματωμένων συστημάτων, τόσο στην πλήρη της έκδοση, όσο και σε διάφορες άλλες εκδόσεις με μικρότερες απαιτήσεις.

Ο συνδυασμός της Tcl με τη γραφική εργαλειοθήκη Tk ονομάζεται **Tcl/Tk**.

## Ιστορία
Η γλώσσα προγραμματισμού Tcl δημιουργήθηκε την άνοιξη του 1988 από τον John Ousterhout, όταν δούλευε στο Πανεπιστήμιο της Καλιφόρνια, στο Μπέρκλεϊ.

Τα συνέδρια της Tcl γίνονται και στις Ηνωμένες Πολιτείες και στην Ευρώπη.

## Χαρακτηριστικά
Τα χαρακτηριστικά της Tcl περιλαμβάνουν τα εξής:

* Όλες οι λειτουργίες είναι εντολές (commands), συμπεριλαμβανομένων των δομών της γλώσσας, και γράφονται σε προθεματική σύνταξη (prefix notation).
* Οι εντολές συνήθως παίρνουν μεταβλητό αριθμό παραμέτρων (variadic).
* Όλα μπορούν να οριστούν πάλι δυναμικά και να γραφεί κώδικας που αντικαθιστά δυναμικά άλλον κώδικα με το ίδιο όνομα.
* Όλοι οι τύποι δεδομένων μπορούν να χρησιμοποιηθούν σαν συμβολοσειρές, συμπεριλαμβανομένου του πηγαίου κώδικα.
* Υπάρχει διεπαφή καθοδηγούμενη από τα γεγονότα (event-driven interface) για sockets και αρχεία. Μπορούν επίσης να χρησιμοποιηθούν χρονικά γεγονότα ή γεγονότα που ορίζονται από τον χρήστη.
* Η προεπιλεγμένη ορατότητα μιας μεταβλητής περιορίζεται σε λεξική (στατική) εμβέλεια, αλλά οι εντολές uplevel και upvar επιτρέπουν την αλληλεπίδραση με εμβέλειες που βρίσκονται σε κάποια εξωτερική περιέχουσα συνάρτηση.
* Όλες οι εντολές που ορίζονται από την ίδια την Tcl εμφανίζουν μηνύματα λάθους αν δεν χρησιμοποιηθούν σωστά.
* Δυνατότητες επέκτασης (extensibility) μέσω C, C++, Java και Tcl.
* Η γλώσσα εκτελείται από έναν διερμηνέα με τη χρήση κώδικα byte (bytecode)
* Πλήρης υποστήριξη του προτύπου Unicode (3.1), από το 1999.
* Εκτελείται σε πολλές πλατφόρμες (cross-platform): Windows, Unix, Linux, Macintosh, κλπ.
* Ισχυρή σύνδεση με την παραθυρική διεπαφή Tk.
* Υπάρχουν αρκετοί μηχανισμοί διανομής:
** Πλήρης έκδοση για προγραμματιστές (όπως η ActiveState Tcl).
** tclkit (βιβλιοθήκη χρόνου εκτέλεσης, ένα αρχείο με μέγεθος μόνο 1 MB).
** starpack (εκτελέσιμο σε ένα αρχείο κάποιου σεναρίου/προγράμματος, με βάση την τεχνολογία του tclkit).
** freewrapTCLSH, μετατρέπει αρχεία Tcl σε δυαδικά εκτελέσιμα προγράμματα ενός αρχείου.
** άδειες BSD, με τη διανομή του πηγαίου κώδικα να είναι ελεύθερη.

Αρχικά η Tcl δεν υποστήριζε αντικειμενοστρεφή σύνταξη πριν την έκδοση 8.6, και η αντικειμενοστρεφής λειτουργικότητα χρειαζόταν εξωτερικά πακέτα, όπως το incr Tcl και το XOTcl. Υπάρχουν επίσης πακέτα αντικειμενοστρεφούς προγραμματισμού που βασίζονται αμιγώς στα σενάρια, όπως το Snit και το STOOOP.

Η Safe-Tcl ("Ασφαλής-Tcl") είναι υποσύνολο της Tcl με περιορισμένα χαρακτηριστικά. Η πρόσβαση στο σύστημα αρχείων είναι περιορισμένη και απαγορεύεται η εκτέλεση κάποιων εντολών του συστήματος. Χρησιμοποιεί ένα διπλό μοντέλο διερμηνείας, με έναν "μη αξιόπιστο διερμηνέα" να εκτελεί τον κώδικα σεναρίων που δεν θεωρούνται αξιόπιστα. Δημιουργοί της ήταν ο Ναθάνιελ Μπόρενσταϊν και ο Μάρσαλ Ρόουζ, που είχαν σκοπό να συμπεριλαμβάνουν ενεργά μηνύματα σε e-mail. Η Safe-Tcl μπορεί να είναι μέρος ενός e-mail όταν υποστηρίζονται οι μηχανισμοί *application/safe-tcl* και *multipart/enabled-mail*. Η λειτουργικότητα της Safe-Tcl αποτελεί πια μέρος της ίδιας της Tcl/Tks.

## Σύνταξη και θεμελιώδης σημασιολογία
Ένα σενάριο Tcl αποτελείται από πολλές κλήσεις εντολών. Μια κλήση εντολής είναι μια λίστα λέξεων που χωρίζονται από κενό και μετά την τελευταία υπάρχει αλλαγή γραμμής ή ελληνικό ερωτηματικό.

 λέξη0 λέξη1 λέξη2 ... λέξηN

Η πρώτη λέξη είναι το όνομα της εντολής, που δεν ανήκει στη γλώσσα αλλά στη βιβλιοθήκη. Οι επόμενες λέξεις είναι τα ορίσματα, άρα η δομή είναι:

 όνομαΕντολής όρισμα1 όρισμα2 ... όρισμαN

Για παράδειγμα, η εντολή *puts* τυπώνει μια συμβολοσειρά και μια αλλαγή γραμμής, από προεπιλογή στην πρότυπη έξοδο (*stdout*):


```tcl
puts "Γεια σου, κόσμε!"
```


Οι μεταβλητές και τα αποτελέσματα άλλων εντολών μπορούν επίσης να αντικαταστήσουν μέρη άλλων συμβολοσειρών, όπως στο παρακάτω παράδειγμα όπου η *set* και η *expr* αποθηκεύουν το αποτέλεσμα ενός υπολογισμού σε μια μεταβλητή και η *puts* το τυπώνει μαζί με ένα επεξηγηματικό κείμενο:


```tcl
set sum [expr 1+2+3+4+5]
puts "The sum of the numbers 1..5 is $sum."
```


Οι λέξεις γράφονται είτε όπως είναι, είτε σε διπλά εισαγωγικά (ώστε να μπορούν να περιέχουν κενούς χαρακτήρες), είτε μέσα σε αγκύλες, οι οποίες απαγορεύουν τις αντικαταστάσεις. Σε απλές λέξεις και σε λέξεις σε διπλά εισαγωγικά, μπορούν να συμβούν τρεις τύποι αντικατάστασης (που γίνονται από τα αριστερά προς τα δεξιά):
* **Αντικατάσταση εντολής** (**command substitution**), η οποία αντικαθιστά ό,τι περιέχεται σε τετράγωνες αγκύλες με το αποτέλεσμα του σεναρίου που βρισκόταν εκεί. Για παράδειγμα, Η "**[expr 1+2+3]**" αντικαθίσταται από το αποτέλεσμα της αποτίμησης της έκφρασης (που είναι 6), γιατί αυτή είναι η λειτουργία της εντολής `expr`.
* **Αντικατάσταση μεταβλητής** (**variable substitution**), η οποία αντικαθιστά ένα σύμβολο δολαρίου που ακολουθείται από το ονομα μιας μεταβλητής με τα περιεχόμενα της μεταβλητής. Για παράδειγμα, η "**$foo**" αντικαθίσταται από τα περιεχόμενα της μεταβλητής με όνομα "foo". Το όνομα της μεταβλητής μπορεί να περικλείεται σε αγκύλες, όταν το όνομα της μεταβλητής μπορεί να ερμηνευτεί με πολλούς τρόπους.
* **Αντικατάσταση καθέτου** (**backslash substitution**), η οποία αντικαθιστά μια κάθετο που ακολουθείται από ένα γράμμα, από έναν άλλο χαρακτήρα. Για παράδειγμα, η "**\n**" αντικαθίσταται με χαρακτήρα αλλαγής γραμμής.

Από την Tcl 8.5, κάθε λέξη μπορεί να αρχίζει με "**{*}**", το οποίο τεμαχίζει τη λέξη στις υπο-λέξεις που την απαρτίζουν, για την κατασκευή μιας εντολής, λειτουργία που μοιάζει με την ακολουθία "**,@**" του χαρακτηριστικού ημι-παράθεσης (quasiquote) της Lisp.

Αποτέλεσμα αυτών των κανόνων είναι κάθε αποτέλεσμα μιας εντολής να μπορεί να χρησιμοποιηθεί σαν όρισμα σε άλλη εντολή. Επίσης δεν υπάρχει τελεστής συνένωσης συμβολοσειρών, η γλώσσα συνενώνει απευθείας με απλή παράθεση των συμβολοσειρών που πρόκειται να συνενωθούν. Σε αντίθεση με το κέλυφος Bourne, η Tcl δεν αναλύει συντακτικά δεύτερη φορά κάποια συμβολοσειρά, εκτός και αν ο χρήστης το δηλώσει ρητά, με αποτέλεσμα η αλληλεπιδραστική χρήση να γίνεται πιο δύσκολη αλλά η χρήση στα σενάρια πιο προβλέψιμη (για παράδειγμα, η χρήση κενών στα ονόματα αρχείων δεν προκαλεί προβλήματα).

Υπάρχει δηλαδή μια βασική δομή, η εντολή, και κάποιοι απλοί κανόνες αντικατάστασης. Το μονό σύμβολο ισότητας (=) για παράδειγμα δεν χρησιμοποιείται καθόλου, και το διπλό σύμβολο ισότητας (==) είναι ο έλεγχος ισότητας, ενώ χρησιμοποιείται μόνο σε περιπτώσεις όπως η εντολή `expr` ή το πρώτο όρισμα της `if`. (Και οι δύο αυτές εντολές είναι απλά μέρος της πρότυπης βιβλιοθήκης: δεν έχουν κάποιο ιδιαίτερο ρόλο αλλά μπορούν να αντικατασταθούν από τον χρήστη.)

Οι περισσότερες εντολές της Tcl, ειδικά στην πρότυπη βιβλιοθήκη, παίρνουν μεταβλητό αριθμό ορισμάτων (είναι *variadic* συναρτήσεις), και η `proc` (ο κατασκευαστής διαδικασιών εντολών σεναρίων) υποστηρίζει τον ορισμό προεπιλεγμένων τιμών για τα ορίσματα και ένα γενικό όρισμα που τα καλύπτει όλα (*catch-all*), ώστε ο κώδικας να μπορεί να επεξεργαστεί οποιονδήποτε αριθμό ορισμάτων.

Η Tcl δεν έχει στατικούς τύπους: κάθε μεταβλητή μπορεί να περιέχει ακεραίους, αριθμούς κινητής υποδιαστολής, συμβολοσειρές, λίστες, ονόματα εντολών, λεξικά (dictionaries), ή οποιαδήποτε άλλη τιμή - οι τιμές διερμηνεύονται πάλι (ανάλογα με τους συντακτικούς περιορισμούς) σαν να ανήκουν σε διαφορετικούς τύπους, ανάλογα με το τι ζητείται κάθε φορά. Παρόλα αυτά, οι τιμές είναι αμετάβλητες (immutable): όταν μια λειτουργία φαίνεται να τις τροποποιεί, στην πραγματικότητα επιστρέφει μια νέα, διαφορετική τιμή.

## Διεπαφές με άλλες γλώσσες
Η Tcl περιλαμβάνει απευθείας διεπαφή για τη γλώσσα C.
Αυτό οφείλεται στο ότι αρχικά η γλώσσα γράφτηκε για να είναι ένα πλαίσιο ανάπτυξης (framework) που να παρέχει ένα συντακτικό εμπρόσθιο τμήμα σε εντολές που είχαν γραφτεί σε C, και όλες οι εντολές της γλώσσας (συμπεριλαμβανομένων και αυτών που σε άλλη περίπτωση θα ήταν λέξεις-κλειδιά (keyword), όπως η **if** ή η **while**) υλοποιούνται με αυτόν τον τρόπο. Κάθε υλοποίηση εντολής είναι μια συνάρτηση που δέχεται έναν πίνακα από τιμές που περιγράφουν τα ορίσματα της εντολής (τα οποία έχουν ήδη αντικατασταθεί) και μπορεί να ερμηνεύσει αυτές τις τιμές με οποιονδήποτε τρόπο είναι επιθυμητός.

Οι προσομοιωτές ψηφιακής λογικής (digital logic simulators) συχνά περιλαμβάνουν μια διεπαφή συγγραφής σεναρίων σε Tcl για την προσομοίωση των γλωσσών υλικού Verilog, VHDL και SystemVerilog.

Υπάρχουν εργαλεία όπως το SWIG και το ffidl που δημιουργούν αυτόματα τον απαραίτητο κώδικα για σύνδεση κάποιων συναρτήσεων σε C με τη βιβλιοθήκη χρόνου εκτέλεσης (runtime) της Tcl, ενώ το Critcl κάνει το αντίστροφο, επιτρέποντας την ενσωμάτωση κώδικα C μέσα σε ένα σενάριο Tcl και στη συνέχεια μεταγλωττίζοντάς το στον χρόνο εκτέλεσης σε DLL.

## Πακέτα επεκτάσεων
Η Tcl πάντα υποστήριζε πακέτα επεκτάσεων, τα οποία προσθέτουν λειτουργικότητα όπως γραφικές διεπαφές χρήστη (GUI), αυτοματοποίηση εφαρμογών σε περιβάλλον τερματικού, πρόσβαση σε βάσεις δεδομένων και άλλες δυνατότητες.

### Tk

Η πιο δημοφιλής επέκταση της Tcl είναι η εργαλειοθήκη Tk, η οποία παρέχει μια βιβλιοθήκη για χειρισμό της γραφικής διεπιφάνειας χρήστη σε διάφορα λειτουργικά συστήματα. Κάθε τέτοια διεπαφή αποτελείται από ένα ή περισσότερα *πλαίσια* (*frames*) και κάθε πλαίσιο έχει έναν διαχειριστή διάταξης (layout manager).

### Expect

Μια από τις δημοφιλέστερες επεκτάσεις της Tcl είναι το Expect. Αρχικά το Expect είχε στενή σχέση με την Tcl, κάτι που έπαιξε σημαντικό ρόλο στην επιτυχία της Tcl σε πεδία όπως οι δομικές στο (testing) στο Unix, όπου το Expect χρησιμοποιήθηκε (και ακόμα χρησιμοποιείται) με επιτυχία στην αυτοματοποίηση συνεδριών telnet, ssh και σειριακής θύρας για την εκτέλεση επαναλαμβανόμενων εργασιών (π.χ. για σενάρια ελέγχου εφαρμογών που δέχονται είσοδο από τον χρήστη). Η Tcl ήταν ο μόνος τρόπος να εκτελεστεί το Expect και η Tcl έγινε πολύ δημοφιλής σε αυτές τις εφαρμογές.

### Tile/Ttk
Η Tile/Ttk είναι μια συλλογή από χρωματικούς συνδυασμούς και στυλ για γραφικά συστατικά, η οποία μπορεί να αντικαταστήσει τα περισσότερα γραφικά συστατικά του Tk με τις αντίστοιχες εκδόσεις κάθε πλατφόρμας, καλώντας το API του λειτουργικού συστήματος. Καλύπτονται τα χρώματα και το στυλ των Windows XP, των κλασικών Windows (Windows Classic), της εργαλειοθήκης Qt (στην οποία βασίζονται οι βιβλιοθήκες του περιβάλλοντος KDE του X11) και του Aqua (Mac OS X). Μπορεί επίσης να χρησιμοποιηθεί για τη δημιουργία κάποιου νέου στυλ, με χρήση ορισμών γραφικών συστατικών σε συνδυασμό με εικόνες (pixmaps). Παραδείγματα αποτελούν τα στυλ Classic Tk, Step, Alt/Revitalized, Plastik και Keramik.

Στην Tcl 8.4, το πακέτο αυτό ονομάζεται Tile, ενώ στην Tcl 8.5 ανήκει στη βασική διανομή του Tk (με το όνομα Ttk).

### Tix

Το Tix, ή Επέκταση Διεπαφής Tk (Tk Interface eXtension), είναι ένα ισχυρό σύνολο από γραφικά συστατικά διεπιφάνειας χρήστη που επεκτείνει τις δυνατότητες των εφαρμογών σε Tcl/Tk και Python. Η χρήση του Tix μαζί με το Tk μπορεί να βελτιώσει σημαντικά την εμφάνιση και τη λειτουργικότητα μιας εφαρμογής.

Το Tix είναι λογισμικό ανοιχτού κώδικα που συντηρείται από τους εθελοντές του Tix Project Group. Ο πηγαίος κώδικας διανέμεται ελεύθερα με την άδεια λογισμικού BSD.

### Itcl/IncrTcl
Το Itcl είναι ένα σύστημα αντικειμένων για την Tcl και συχνά συναντάται και ως [incr Tcl] (αναφορά στον τρόπο με τον οποίο αυξάνεται κατά ένα η τιμή μιας μεταβλητής στην Tcl, ονομασία που μοιάζει με αυτήν της C++).

### Tcllib
Η Tcllib είναι ένα σύνολο από πακέτα σεναρίων για την Tcl που μπορούν να χρησιμοποιηθούν χωρίς μεταγλώττιση.

### TclUDP
Η επέκταση Tcl UDP παρέχει μια απλή βιβλιοθήκη που υποστηρίζει User Datagram Protocol (UDP) sockets στην Tcl.

### Βάσεις δεδομένων
Το Tcl Database Connectivity (TDBC), που αποτελεί μέρος της Tcl 8.6, είναι μια κοινή διεπαφή πρόσβασης σε βάσεις δεδομένων που μπορεί να χρησιμοποιηθεί από σενάρια σε Tcl. Υποστηρίζει οδηγούς για πρόσβαση σε βάσεις δεδομένων MySQL, ODBC, PostgreSQL και SQLite, ενώ περισσότερες αναμένονται στο μέλλον.

Η πρόσβαση σε βάσεις δεδομένων υποστηρίζεται επίσης μέσα από εξειδικευμένες επεκτάσεις για κάθε βάση δεδομένων.

## Παραπομπές


## Αναφορές
* John K. Ousterhout, *Tcl and the Tk Toolkit*, Addison-Wesley, Reading, MA, USA, ISBN 0-201-63337-X, 1994.
* Brent B. Welch, *Practical Programming in Tcl and Tk*, Prentice Hall, Upper Saddle River, NJ, USA, ISBN 0-13-038560-3, 2003.
* J Adrian Zimmer, *Tcl/Tk for Programmers*, IEEE Computer Society, διανομή: John Wiley and Sons, ISBN 0-8186-8515-8, 1998.
* Mark Harrison and Michael McLennan, *Effective Tcl/Tk Programming*, Addison-Wesley, Reading, MA, USA, ISBN 0-201-63474-0, 1998.
* Mark Harrison (ed), *Tcl/Tk Tools*, O'Reilly Media, ISBN 1-56592-218-2, 1997.
* Bert Wheeler, Tcl/Tk 8.5 Programming Cookbook , Packt Publishing.

## Δείτε επίσης
* Κέλυφος Wish
* Expect
* Img
* Tk (γραφική εργαλειοθήκη, επίσημα μέρος της Tcl)

## Εξωτερικοί σύνδεσμοι

* Εισαγωγή στην Tcl/Tk
* Παρουσίαση Tcl/Tk
* Tcl Developer Xchange, ιστοσελίδα για την Tcl και το Tk 
* Tcler's Wiki 
* ActiveState's Διανομή της ActiveTcl 
* MyTcl, Περιβάλλον Ανάπτυξης Tcl/Tk 

Κατηγορία:Γλώσσες προγραμματισμού σεναρίων
Κατηγορία:Γλώσσες με δυναμικούς τύπους