Hlavní navigace

Programovací jazyk TCL

19. 7. 2005
Doba čtení: 8 minut

Sdílet

V tomto článku bude stručně popsán interpretovaný programovací jazyk Tcl spolu se svojí nadstavbou ve formě knihovny Tk. Tcl/Tk je velmi jednoduše využitelný nástroj pro tvorbu prototypových aplikací s grafickým uživatelským rozhraním, je však využit i v mnoha rozsáhlých projektech, v nichž se většinou používá jako zabudovaný skriptovací jazyk, kterým je celá aplikace nebo její část řízena. Mezi přednosti Tcl/Tk patří snadnost programování a návrhu GUI, přenositelnost na různé platformy a rozšiřitelnost o další funkce.

Obsah

1. Úvodní informace o jazyku Tcl
2. Vlastnosti jazyka Tcl
3. Přednosti Tcl
4. Zápory Tcl
5. Rozšíření Tcl/Tk
6. Rozšíření v [incr Tcl]
7. Základy programování – syntaxe příkazů
8. Odkazy a dostupná literatura na Internetu
9. Obsah dalšího pokračování tohoto seriálu

1. Úvodní informace o jazyku Tcl

Tcl [1] je, jak již bylo zmíněno v perexu tohoto článku, interpretovaný programovací jazyk, který je specializovaný na snadnou a rychlou tvorbu prototypových aplikací, návrh grafických uživatelských rozhraní (zde se používá jeho nadstavba resp. knihovna nazvaná Tk) a také pro zabudování do dalších aplikací, které tak získávají možnosti jednoduchého a přitom mocného skriptování. Kromě toho lze velmi snadno volat z programu napsaného v Tcl další aplikace či utility napsané v jiných programovacích jazycích, a tak de factoTcl rozšiřovat o další funkce a příkazy.

Tcl sice ideově vychází (podobně jako další programovací jazyk s podobnými vlastnostmi – Logo [2]) z programovacího jazyka Lisp [3], ale zavádí některé pro uživatele zjednodušující syntaktická pravidla, takže zdrojový kód v

Tcl je, na rozdíl od Lispu a Perlu, snáze čitelný a pochopitelný. Vzhledem k tomu, že Tcl je zkratka, měla by se správně psát velkými písmeny, tj. jako TCL, nikdo to však ve skutečnosti nedělá, podobně jako u Perlu. Dobu své největší slávy má Tcl, jak se zdá, za sebou (na úkor Perlu, Pythonu,

Ruby a dalších skriptovacích jazyků), to však v žádném případě neznamená, že by šlo o jazyk špatný či méně použitelný.

2. Vlastnosti jazyka Tcl

Tcl, neboli plným názvem Tool Command Language, je interpretovaný programovací jazyk vyvinutý Johnem Ousterhoutem [4] v osmdesátých letech minulého století [5], který se, podobně jako jeho ideový předchůdceLisp, snaží z faktu, že je interpretovaný, vytěžit maximum. Příkladem může být skutečnost, že samotný jazyk neobsahuje žádné příkazy pro tvorbu smyček, podmínek ani matematických či logických výrazů – tyto elementy, jež nám na první pohled mohou připadat jako neoddělitelná součást jakéhokoli rozumně použitelného programovacího jazyka, jsou v Tcl řešeny pomocí funkcí, které jako své parametry mohou získávat programový kód (ten například tvoří tělo smyčky či výraz představující podmínku). I z tohoto důvodu bude vlastní popis jazyka velmi stručný, protože obsahuje pouze několik poměrně jednoduchých pravidel pro psaní programů (na druhou stranu to však poněkud mate začátečníky, kteří se kvůli neexistenci speciálních syntaktických pravidel pro výrazy a řídicí příkazy špatně orientují v jinak výborné dokumentaci).

Podobně jako u mnoha dalších interpretovaných jazyků [6] se i zde setkáme s velmi jednoduchou syntaxí, která však může být v některých případech nepohodlná, například při zápisu matematických výrazů, vyhodnocování proměnných nebo zakazování či naopak přikazování textových substitucí. Velmi zajímavé je právě pojetí funkcí a proměnných, protože v Tcl je prakticky vše při běhu programu považováno za řetězce. Dokonce i pole jsou řešena jako asociativní pole, tj. místo číselných indexů se používají řetězce, na které se případné číselné hodnoty převádějí (čísla jsou z uživatelského pohledu také ukládána v řetězci). Za řetězce je dokonce považován i vlastní zápis programu, takže program je možné dynamicky, tj. přímo za běhu, měnit – tímto pojetím se Tcl opět přibližuje Lispu. Z toho, že jsou všechny proměnné považovány za řetězce znaků, vyplývá, že se jedná o beztypový jazyk, tj. u proměnných, parametrů ani návratových hodnot funkcí není zapotřebí specifikovat, jakého jsou typu. Současně však z beztypovosti (resp. z automatického převodu řetězců na čísla při některých operacích) vyplývají některé zápory, zejména při zpracovávání matematických výrazů, kdy může v některých případech docházet ke špatným konverzím.

I když se jedná o interpretovaný jazyk, je k dispozici překladač, který však samozřejmě nedokáže (kvůli dynamické změně programů v době jejich běhu) provést překlad přímo do spustitelného tvaru. Ve skutečnosti se nejprve provádí překlad do bytekódu, který je rychleji zpracovatelný než původní zdrojový soubor. Překlad do strojového kódu se provádí až ve chvíli spuštění či změny programu (takzvaný překlad just-in-time).

3. Přednosti Tcl

Mezi velké přednosti jazyka Tcl patří jednoduchost tvorby aplikací, snadné ladění a návaznost na další programovací jazyky, například C, C++ a Javu. Při použitíTcl lze poměrně jednoduchým a efektivním způsobem spojit výhody obou skupin programovacích jazyků: rychlost C-čka a dynamičnost Tcl. Aplikaci lze v principu vytvořit dvěma způsoby:

  1. Řídicí část programu může být napsána v Tcl, přičemž se některé složitější nebo časově náročnější funkce vytvoří v některém jiném (nejčastěji kompilovaném) programovacím jazyce. Tyto funkce se přeloží do spustitelného tvaru tak, aby své parametry získávaly z příkazové řádky. Takové funkce lze z Tcl volat přímo, tj. bez jakýchkoli omezení, protože všechny hodnoty jsou chápány jako řetězce, které lze předávat jako parametry přes příkazovou řádku. Nevýhodou může být pomalejší inicializace těchto funkcí, například při opakovaném volání z programové smyčky.
  2. Řídicí část programu může být napsána v jiném programovacím jazyce, přičemž se Tcl používá pro skriptování a/nebo práci s grafickým uživatelským rozhraním. Tento přístup se více blíží klasickým desktopovým aplikacím, návaznost na Tcl (včetně předávání parametrů) je však nepatrně složitější.

Další velkou předností Tcl i knihovny Tkje portabilita. Jak celé vývojové prostředí (o něm bude řeč dále), tak i jednotlivé knihovny a napsané programy lze velmi jednoduše portovat na různé operační systémy. K dispozici jsou již přeložené binární soubory interpreteru pro různé unixové systémy, samozřejmě pro Linux, Apple Macintosh a v neposlední řadě i pro Microsoft Windows [7]. S portací souvisí i snadná dostupnost interpreteru (je součástí mnoha linuxových distribucí, pro Microsoft Windows je připraven instalační program) a licenční podmínky, které upravují možnosti šíření programů spolu s podpůrnými knihovnami.

Mezi další přednost patří podpora řetězců v kódování Unicode, což umožňuje použít Tcl i jako skriptovací jazyk pro zpracování textových souborů, vytváření dynamických HTML stránek apod. Dřívější verze Tcl (<8.1) podporovaly pouze ASCII řetězce, což situaci zhoršovalo, zejména v evropském regionu plném nabodeníček (čeština na tom však není zdaleka nejhůře, zajímavé z dnešního pohledu je, že na začátku minulého století se některé země češtinou inspirovaly a nabodeníčka také zavedly :-).

4. Zápory Tcl

Mezi největší zápory Tcl patří samozřejmě nižší rychlost provádění skriptů, zejména při porovnání s kompilovanými jazyky. Pokud se však Tcl používá pro tvorbu grafického uživatelského rozhraní či práci s prototypy, nebývá rychlost tím hlavním omezujícím faktorem – v případě problémů je vždy možné kritické části kódu přepsat do C-čka.

Dalším záporem je nepřítomnost plného režimu WISIWYG při návrhu grafického uživatelského rozhraní. Standardně je k dispozici grafický shell Wish, ve kterém lze interaktivně navrhovat jednotlivá okna a dialogy, vše však probíhá „pouze“ na základě textového vstupu.

K dalším záporům patří některá omezení jazyka, zejména zde chybí možnost psaní čistě objektově orientovaných programů. Ve skutečnosti lze OOP používat (a to jak ve formě rozšíření pomocí C-čkových funkcí, tak i rozšíření na bázi Tcl), ale návrh jazyka s OOP primárně nepočítal.

Mnoho lidí při výběru skriptovacího jazyka porovnává TclPerlem. Jedno z porovnání je umístěno na [8], další potom na [9]. Z tohoto porovnání vyplývá, že program napsaný v Tcl je sice čitelnější, obsahuje však menší podporu pro regulární výrazy (zde je Perlpravděpodobně nepřekonatelný) a starší verze jsou při nasazení pomalejší než perlovské skripty. Na druhou stranu se v Tcl obecně píše čitelnější kód a také možnosti zabudování do dalších aplikací má Tcl na mnohem vyšší úrovni, stejně jako podporu Unicode (programovací jazyky jsou však jako auta: neexistuje jeden ideální výrobek, pro každou činnost je zapotřebí zvolit něco odlišného).

5. Rozšíření Tcl/Tk

Spojením Tcl/Tk se označuje skriptovací jazykTcl spolu se svou knihovnou Tk. Tato knihovna, kterou také vytvořil John Ousterhout, slouží pro práci s grafickým uživatelským rozhraním, umožňuje vytvářet okna a dialogy (modální okna) spolu s umísťováním jednotlivých ovládacích i grafických prvků (widgets) do oken nebo do neviditelných kontejnerů, které slouží ke sloučení několika prvků do skupiny. Knihovnou Tk se budu v dalších pokračováních tohoto seriálu zabývat podrobněji, protože se jedná o – podle mého názoru – dodnes nejlepší prostředí pro rychlý návrh grafického uživatelského rozhraní. Samozřejmostí je přenositelnost celé knihovny na různé platformy (grafické uživatelské rozhraní se potom přizpůsobí dané platformě – týká se to například stylů oken, způsobu zaměřování widgetů apod.). Obliba Tk je tak velká, že bylo použito i v dalších interpretovaných programovacích jazycích pro tvorbu grafického uživatelského rozhraní – v ostatních programovacích jazycích však nevynikne snadnost používání této knihovny.

6. Rozšíření v [incr Tcl]

V rozšíření nazvaném [incr Tcl] se nachází několik skupin rozšíření. Pravděpodobně nejvýznamnější je rozšíření, pomocí kterého lze vytvářet objektově orientované programy. K dispozici jsou příkazy jako class, is, local, scope a body, pomocí nichž lze s objekty pracovat: vytvářet je, rušit, měnit, porovnávat apod. Za zmínku stojí fakt, že pro objektové rozšíření není zapotřebí měnit vlastní interpreter (zde opět můžeme spatřit značnou podobnost s Lispem).

7. Základy programování – syntaxe příkazů

Způsobem zápisu programů v Tcl se budu zabývat v dalším pokračování tohoto seriálu, zde si pouze uvedeme syntaxi jednotlivých příkazů. V Tcl jsou příkazy od sebe odděleny buď koncem řádku (CR, CR-LF, LF apod.), nebo středníkem. Slova jsou přitom považována za řetězce, přičemž se nemusí používat uvozovky (ty mají význam pouze při zápisu mezer do řetězce). Pokud je na řádku uveden pouze jeden příkaz, nemusí se za ním středník psát. Příkaz je složen z jednoho nebo více slov, která jsou od sebe oddělena takzvanými bílými znaky (mezery, tabelátory). První slovo je chápáno jako jméno příkazu (funkce, procedury), další slova jsou chápána jako parametry, které se, na rozdíl od Lispu, nevyhodnocují (vyhodnocení se musí vynutit pomocí dalších jazykových konstrukcí, které budou popsány příště). Abychom si dnes uvedli nějaký program v Tcl, naprogramujeme známý „Hello world“, který může vypadat následovně:

puts "Hello world"

Pro spuštění tohoto programu lze použít buď Wish, nebo tclsh.

CS24_early

8. Odkazy a dostupná literatura na Internetu

  1. Stránka na Wikipedii o Tcl (v angličtině)
  2. Stránka na Wikipedii o programovacím jazyku LOGO (v angličtině)
  3. Stránka na Wikipedii o Lispu (v angličtině)
  4. Práce Davida Kolovratníka o Tcl/Tk (1. část, 2. část) (v češtině)
  5. History of Tcl and Tk (v angličtině)
  6. History of Scripting (v angličtině)
  7. ActiveState – Dynamic Tools for Dynamic Languages (v angličtině)
  8. Why Tcl is better than Perl (v angličtině)
  9. Perl Resources and Reviews (Diving for Perl) (v angličtině)
  10. Školička Honzy Hubičky o Tcl (v češtině)
  11. Porovnání Tcl s dalšími skriptovacími jazyky (v angličtině)

9. Obsah dalšího pokračování tohoto seriálu

V dalším pokračování tohoto seriálu bude popsána syntaxe příkazů jazyka Tcl, způsob provádění substitucí příkazů i proměnných a práce s jednoduchými proměnnými i složitějšími datovými typy (asociativními poli a seznamy).

Byl pro vás článek přínosný?

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.