Tcl
Ошибка скрипта: Модуля «hatnote» не существует.{{#if: | }} Шаблон:Карточка языка программирования
Tcl (от англ. Шаблон:Lang-en2 — «командный язык инструментов», читается «тикль», «ти-си-эль» или «тэ-ка-эл») — скриптовый язык высокого уровня.
Tcl часто применяется совместно с графической библиотекой Tk (Tool Kit). Связку Tcl/Tk по-русски иногда называют «тикль-так» (английский вариант — «тикль-ток»).
Области применения языка — быстрое прототипирование, создание графических интерфейсов для консольных программ (пакетов программ), встраивание в прикладные программы, тестирование. Также Tcl применяется в веб-разработке.
Особенности
В Tcl данными всех типов, включая код программы, можно манипулировать как строками. Это делает его языком с естественной поддержкой метапрограммирования. Эта парадигма программирования учитывалась в ходе разработки и эволюции языка.
Программа на Tcl состоит из команд, разделённых символами новой строки или точками с запятой. Каждая команда состоит из набора полей, разделённых пробелами. Первое поле должно быть именем команды, а необязательные остальные поля — передаваемые этой команде аргументы. Команда возвращает значение, иногда пустое. То есть, как и в Лиспе, в Tcl используется префиксная нотация.
Ключевых слов как таковых нет — понятие команды в Tcl аналогично понятию процедуры или функции распространённых языков программирования. Это относится и к управляющим конструкциям языка. В сочетании с элементарным синтаксисом это обеспечивает хорошую расширяемость языка, в том числе и библиотеками, написанными на других языках, таких как C/C++ или Java.
В Tcl также качественно реализована модель управления программой на основе событий. События могут генерироваться таймером, при появлении данных в канале, изменении значения переменной, при завершении какой-либо внешней программы или просто при работе пользователя с интерфейсом Tk. Можно задавать свои события и управлять ими.
Как и большинство современных скриптовых языков, Tcl содержит развитые средства работы с регулярными выражениями, работает с ассоциативными массивами и другими динамическими структурами данных.
В базовом Tcl поддержка ООП отсутствовала до версии 8.6, однако, благодаря простоте расширения синтаксиса языка, существует множество расширений Tcl объектно-ориентированными механизмами, реализованных в виде подключаемых библиотек на Си или на самом Tcl. До версии 8.5 самыми распространёнными из них были: incr Tcl, XOTcl и SnitШаблон:Sfn. Ещё одна реализация механизмов ООП средствами самого Tcl, включённая в стандартную библиотеку Tcl<ref>Шаблон:Cite web</ref>, — библиотека STOOOP<ref>Шаблон:Книга</ref>. Начиная с версии 8.5 появляется новая реализация ООП для Tcl, TclOO, включённая, начиная с версии 8.6, в ядро языкаШаблон:Sfn<ref group="примечание">. Если ни одна из реализаций объектной модели вас не устраивает либо вы интересуетесь, как это работает, можете ознакомиться со статьёй Creating Object Commands Шаблон:WaybackШаблон:Ref от создателей SNIT</ref>:
| расширение | реализовано на | особенности используемой модели |
|---|---|---|
| XOTcl | C | мощная объектная система с динамическим определением классов и методов, близкая к CLOS |
| incr Tcl | C | ООП в стиле, близком к C++, расширенном введением конфигураторов |
| Snit | Tcl | реализация объектной модели на основе делегирования, а не наследования |
| STOOOP | Tcl | ООП в стиле, максимально близком к C++, также введён механизм переключения классов |
| TclOO<ref>TclOO Шаблон:Wayback в TclWiki</ref> | C | Компактная, но мощная объектно-ориентированная система, которую можно использовать как непосредственно, так и как фреймвок для построения расширенных моделей ООП. |
Пространства имён поддерживаются на уровне ядра языка. При реализации механизмов ООП на Tcl используется поддержка иерархии вложенности пространств имён в этом языке<ref>Шаблон:Книга</ref>.
На Tcl легко программировать в функциональном стиле: он обеспечивает такие механизмы, как функции высшего порядка и абстракции функций<ref>см. также Steps towards functional programming Шаблон:Wayback</ref>, хотя Tcl редко используют таким образом. Вот пример того, как можно осуществить композицию двух функций:
<source lang=tcl>proc o {f g x} {$f [$g $x]}</source>
В версии 8.5 в Tcl также введена команда apply, значительно облегчающая программирование в этом стиле.
Вот пример её использования из официальной документации:
<source lang="tcl">proc map {lambda list} {
set result {}
foreach item $list {
lappend result [apply $lambda $item]
}
return $result
}
map {x {return [string length $x]:$x}} {a bb ccc dddd} </source>
результатом работы этого примера будет
1:a 2:bb 3:ccc 4:dddd
История
Язык разработан Джоном Аустерхаутом в то время, когда он работал в университете Калифорнии в Беркли. Первоначальной целью было создание универсального языка для встраивания в консольные приложения. Вслед за этим Аустерхаут расширил свой язык средствами создания графических интерфейсов — так появился Tcl/Tk.<ref>См.History of Tcl Шаблон:Wayback</ref>
За 4 года развития в университетских стенах tcl-сообщество выросло до нескольких сотен тысяч программистов. В 1993 году было разработано первое объектно-ориентированное расширение — incr Tcl.
В 1994 году Аустерхаут стал ведущим инженером проекта SunScript. В течение следующих 4 лет, став одним из проектов корпорации Sun, Tcl не только остался свободно распространяемой системой, но и значительно усовершенствовался, стал кроссплатформенным.
Заметный удар по популярности языка нанёс Ричард Столлман, опубликовав в сентябре 1994 году в ряде новостных групп рекомендацию «Почему вы не должны использовать Tcl»<ref>Шаблон:Cite web</ref>. В ней он на основании утверждений, что «Tcl разработан не как серьёзный язык программирования» и «Tcl имеет особый синтаксис, притягательный для хакеров из-за своей простоты. Но синтаксис Tcl кажется странным для большинства пользователей.», а также в связи с продвижением Emacs Lisp, вынес вердикт: «проект GNU не собирается использовать Tcl в программном обеспечении GNU». Помимо субъективных претензий к дизайну языка, Столлман указал на объективный на тот момент недостаток — низкое быстродействие.
Тем не менее, рост количества разработчиков, активно использующих Tcl, составил за этот период 600 %.
В 1998 году в связи с Java-бумом и связанной с ним острой конкурентной борьбой корпорация уже не могла уделять Tcl прежнего внимания. Джон Аустерхаут покинул Sun и создал (при поддержке Sun) компанию Scriptics, продолжая развитие технологии Tcl/Tk<ref>Шаблон:Статья</ref><ref>Шаблон:Статья</ref>. Это была одна из первых коммерческих программных фирм, чья деятельность строилась вокруг бесплатного свободного ПО.
В марте 1998 года Аустерхаут опубликовал ставшую классической статью «Сценарии: высокоуровневое программирование для XXI века»<ref>John K. Ousterhout Scripting: Higher Level Programming for the 21st Century Шаблон:WaybackШаблон:Ref.
Перевод этой статьи Шаблон:WaybackШаблон:Ref в журнале «Открытые системы», № 3, 1998</ref>, в которой назвал скриптовые языки языками системной интеграции, потому что они ориентированы прежде всего на работу с объектами операционной среды, а не с элементарными данными. Это позволяет без написания тысяч строк кода двумя-тремя командами «склеивать» такие объекты в одно целое.
В том же году он выиграл за разработку языка Tcl две крупных награды. Первая — это ACM Software System Award, вручаемая за «наиболее значимое программное обеспечение». Этой наградой до этого были отмечены такие основополагающие системы, как стек протоколов TCP/IP, первая электронная таблица, первая реляционная база данных, World Wide Web, Unix, PostScript и Smalltalk. Вторая — это ежегодная USENIX Software Tools User Group (STUG) Award в знак признания выдающегося программного обеспечения.
В 1999 году вышел Tcl 8.0 — в этой реализация впервые появилась компиляция в байткод, что позволило в 6 раз поднять быстродействие<ref name="bench">см. Tcl Benchmarks Шаблон:Wayback</ref>. В следующую модификацию Tcl 8.1 введена полноценная поддержка Юникода, в ней впервые реализована многопоточность. В связи c этим релизом Аустерхаут заявил:
В 2000 году фирма Scriptics была переименована в Ajuba Solutions, а затем — куплена фирмой Interwoven, не заинтересованной в работе со свободным ПО. В связи с этим разработка Tcl была передана сообществу программистов. Так была сформирована Tcl Core Team.
На 9-й конференции по Tcl/Tk, проходившей в Ванкувере, была представлена виртуальная файловая система StarKit, обеспечившая новый, удобный для обычного пользователя способ распространения Tcl-программ.
Синтаксис Tcl
- Скрипт
- — команды, разделённые переводом строки или точкой с запятой (;).
- Команда
- — слова, разделённые пробелами.
<source lang=tcl> commandName argument1 argument2 … argumentN</source>
Первое слово — имя команды, остальные — её аргументы. Любой аргумент может быть заменён другой командой, помещённой в квадратные скобки. Любые аргументы в фигурных скобках передаются команде «как есть», в виде единого аргумента.
Символы, имеющие особое значение
- $ — вызывает подстановку значения переменной.
- [] — вызывает подстановку результата выполнения команды внутри скобок.
- "" — группирует аргументы в один с подстановкой значений переменных.
- {} — группирует аргументы в один без подстановки значений переменных.
- \ — экранирует следующий символ или вызывает подстановку управляющего символа.
- # — начало однострочного комментария, должен быть после неэкранированного символа перевода строки или «;» (точки с запятой).
Замечания о процессе разбора скрипта
- Разбивка на слова, подстановка значений переменных и результатов выполнения команд производятся за один проход по команде.
- Все символы, находящееся внутри скобок {} и кавычек "", рассматривается как одно слово.
- Первое слово команды рассматривается как встроенная или определённая процедура.
Примеры команд
- Присваивание обозначается словом set, а не знаком равенства.
Синтаксис: <source lang=tcl>set переменная значение</source> Пример: <source lang=tcl>set a 2</source> <source lang=tcl>set b 3</source>
- Комментарий обозначается символом #
Синтаксис: <source lang=tcl># текст комментария</source> Пример: <source lang=tcl># это комментарий</source>
- Вывод (печать) реализуется командой puts
Синтаксис: <source lang=tcl>puts выражение</source> Пример: <source lang=tcl> puts "Привет! Это я." puts 123 puts $a puts "b = $b" </source>
- Цикл пока реализуется командой while, имеющей два аргумента. Первый — Tcl-выражение (выражения фактически пишутся на миниатюрном языке, состоящем из математических операций и операций сравнения в стиле языка C). Второй аргумент — это скрипт, выполняемый при каждой итерации. Его, как правило, помещают в фигурные скобки, чтобы избежать немедленного выполнения.
Синтаксис: <source lang=tcl> while { Выражение_Tcl_С_Логическим_Значением } {
TclКоманда другаяTclКоманда … …
} </source>
Пример: <source lang=tcl> while { $x < 10 } {
puts $x incr x
} </source>
- Условная команда
Синтаксис: <source lang=tcl> if { Выражение_Tcl_С_Логическим_Значением } {
КомандаTcl
} </source>
Пример: <source lang=tcl> if {$x < 0} {
set x 0
} </source>
- Команда ветвления
Пример: <source lang="tcl"> switch -glob -- $var {
{see} -
{saw} -
{seen} { puts "Все это значит одно и то же!"}
} </source>
- Команда может не иметь аргументов, например
<source lang=tcl>pwd</source> просто возвращает текущий рабочий каталог. А командой <source lang=tcl>set wdir [pwd]</source> вы сохраните имя текущего каталога в переменной wdir.
- Команда может возвращать список, например
<source lang=tcl>glob Образец</source> возвратит список имён файлов в текущем каталоге, удовлетворяющих шаблону Образец.
Процедуры
Процедуры определяются следующим образом <source lang=tcl> proc имяПроцедуры { списокАргументов } {
… …
} </source>
Ассоциативные массивы
Следующий фрагмент кода создаст и инициализирует ассоциативный массив (называемый в других языках также карта, словарь или хеш). <source lang=tcl> set capital(France) Paris set capital(Italy) Rome set capital(Germany) Berlin set capital(Poland) Warsaw set capital(Russia) Moscow set capital(Spain) Madrid </source>
Для запроса и вывода одного из значений ассоциативного массива используется <source lang=tcl>puts $capital(Italy)</source>
Список всех стран (ключей массива) можно получить командой <source lang=tcl>array names capital</source>
Результат не будет отсортирован, потому что массивы Tcl базируются на хеш-таблицах. <source lang=tcl>Poland Spain Russia Germany Italy France</source>
Сортировку можно выполнить командой <source lang=tcl>lsort [array names capital]</source>
Чтобы сослаться на массив (передать его как ссылку), используется имя содержащей его переменной: <source lang=tcl> proc demo arrName {
upvar 1 $arrName arr ;# tie the reference to a local name #do something with arr
} </source>
Для доступа к массиву по значению используется array get или array set. Например, чтобы скопировать один массив в другой: <source lang=tcl>array set Newarr [array get Oldarr]</source>
В Tcl 8.5 введены массивы, передаваемые по значению — словари (dict).
Для преобразования скалярной переменной в массив и наоборот следует удалить существующую переменную при помощи команды unset.
Область видимости переменных
По умолчанию внутри процедуры видны только определённые в ней переменные. За пределами определения процедуры её переменные недоступны иначе, чем через механизм передачи параметров. Можно иметь переменные в процедуре с таким же именем, как и в основной программе, при этом значения этих переменных будут различаться, по сути это будут разные переменные. Чтобы изменить это поведение, используются команды global или upvar.
Примеры
Здравствуй, мир!
Программа Hello, world выглядит так <source lang=tcl>puts "Здравствуй, мир!"</source> или так <source lang=tcl>puts {Здравствуй, мир!}</source>
Массивы
Обращение к элементам массива
Вывод значения элемента массива OldArray(precision), имя которого (массива) задаётся новой переменной NewArray <source lang=tcl> set NewArray OldArray puts [set ${NewArray}(precision)] </source>
Сложение чисел массива
Метод (A) — Сложение с использованием цикла 'foreach' <source lang=tcl> set numbers {1 2 3 4 5 6 7 8 9 10} set result 0 foreach number $numbers {
set result [expr {$result + $number}]
} puts $result </source>
Метод (B) — Гораздо более элегантный способ с использованием команды 'join' <source lang=tcl> set numbers {1 2 3 4 5 6 7 8 9 10} puts [expr [join $numbers +]] </source>
Список содержимого массива
В массиве tcl_platform содержится информация о свойствах платформы, на которой запущен Tcl. Список имён свойств может быть получен с помощью
<source lang=tcl>array names tcl_platform </source>
Следующий фрагмент выводит их вместе со значениями: <source lang=tcl> foreach i [array names tcl_platform] {
puts "$i = $tcl_platform($i)"
} </source>
Если свойства должны быть отсортированы <source lang=tcl> foreach i [lsort [array names tcl_platform] ] {
puts "$i = $tcl_platform($i)"
} </source>
Здесь демонстрируется вложенность команд. Они могут быть вложены на любую глубину. Подобного же результата можно достичь с помощью команды parray<ref>Шаблон:Cite web</ref>, появившейся в Tcl 8.5.
Пересечение множеств
Процедура filter возвращает те элементы списка, для которых script принимает значение TRUE: <source lang=tcl> proc filter {list script} {
set res {}
foreach e $list {if {[uplevel 1 $script $e]} {lappend res $e}}
return $res
} </source> Команда uplevel 1 позволяет вычислить выражение в контексте, в котором вызывается слово filter.
Процедура in — это сокращённая запись для включения множеств: <source lang=tcl> proc in {list e} {
expr {[lsearch -exact $list $e]>=0}
} </source>
Проверка: <source lang=tcl> % filter {a b c} {in {b c d}} b c </source>
Факториал
<source lang=tcl>proc ! x {expr {$x<2? 1: $x*[! [incr x -1]]}}</source> Здесь демонстрируется, что именем команды могут быть любые строки, а также известный по другим языкам оператор ?:.
Реализация, дистрибутивы, инструменты
Tcl — интерпретируемый язык, то есть программы на Tcl готовы к выполнению без компиляции и компоновки.
Интерпретатор Tcl портирован на большинство распространённых платформ<ref>Шаблон:Cite web</ref>. Он распространяется под свободной некопилефтной лицензией, позволяющей использовать его без ограничения в разработке проприетарных приложений, а также создавать проприетарные производные системы. Разработчики относят её к BSD-подобным, хотя, по сравнению с лицензией BSD, лицензия Tcl накладывает меньшее количество запретов.
Реализация
В настоящее время работа над ядром языка Tcl ведётся группой разработчиков<ref>Шаблон:Cite web</ref>, именуемой Tcl Core Team<ref>Шаблон:Cite web</ref>. Самые свежие версии Tcl-транслятора и основных библиотек доступны в репозитории на SourceForge.net, см. список sourceforge-проектов, включаемых в основную поставку Tcl/Tk<ref>Шаблон:Cite web</ref>.
Транслятор Tcl компилирует программу в промежуточное представление — байткод, а затем интерпретирует её. В отличие от, например, Python, это промежуточное представление не сохраняется на диск, программа может храниться только в исходных текстах, возможно, упакованных в StarKit-модуль или с помощью какого-нибудь обёртывающего средства. В зависимости от параметров компиляции интерпретатор Tcl может поддерживать или не поддерживать многопоточность.
Хотя в большинстве учебников по Tcl для начинающих говорится что-то вроде «в Tcl есть всего один тип переменных — строка», на самом деле трансляторы Tcl уже давно как устроены по-другому. Внутри Tcl использует систему динамических типов с автоматическим прозрачным преобразованием к строковому виду.
Tcl входит практически во все дистрибутивы Linux. Для Microsoft Windows требуется отдельный установочный пакет.
Версия Tcl 8.4 отличается от предыдущей новыми функциями (оптимизация 64-битного кода, VFS, дополнения в плане интроспекции) и некоторым повышением быстродействия за счёт оптимизации работы с байткодом.
Новые возможности, добавленные в версии 8.1 (в частности, поддержка многопоточного выполнения, средства интернационализации и работа с символами Unicode), замедлили работу Tcl примерно на 19 % по сравнению с давшей скачок скорости восьмой версией. Разработчики 8.4 приложили все усилия для того, чтобы максимально повысить скорость выполнения программ, добиться, чтобы они работали не только не медленнее, но даже быстрее, чем это было при появлении версии 8.0. Эта цель была достигнута практически для всех средств Tcl и Tk — версия 8.4 в среднем в 8 раз быстрее, чем версия 7.6<ref name="bench" />.
Текущая версия TCL — 8.6.
Альтернативные реализации и диалекты
Существуют альтернативные реализации Tcl для популярных виртуальных машин общего назначения. Это написанный на Java интерпретатор — Jacl<ref>Шаблон:Cite web</ref> (последняя версия от 2008 года), и проект Eagle<ref>Шаблон:Cite web</ref>, реализующий большинство команд Tcl 8.4 для CLR (доступны сборки для .NET 4.0 и 2.0). Ведутся эксперименты по трансляции Tcl-программ в код виртуальной машины Parrot, разрабатываемой для шестой версии Perl<ref>partcl. Implementation of tcl targeting the parrot VM Шаблон:Wayback (блог проекта Шаблон:Wayback)Шаблон:Ref</ref>.
Для программирования встраиваемых систем и встраивания в приложения разработан специальный диалект Tcl — Jim<ref>Шаблон:Статья</ref><ref>The Jim Interpreter. A small footprint implementation of the Tcl programming language</ref>. Это интерпретатор, реализующий большое подмножество Tcl, расширенное дополнительными механизмами объектно-ориентированного и функционального программирования и занимающий в скомпилированном виде менее 100 килобайт.
Ещё один диалект Tcl — скриптовый язык мобильных устройств Hecl<ref>hecl.org Шаблон:Wayback: Hecl — The Mobile Scripting Language</ref>, разработанный Дэвидом Велтоном и реализованный на Java (J2ME)<ref>Шаблон:Статья</ref><ref>Implementation of the Hecl Programming Language Шаблон:WaybackШаблон:Ref</ref>. Что же касается платформы Android, поддержку Tcl на ней (наряду с другими скриптовыми языками) обеспечивает: скриптовая прослойка SL4A<ref>Шаблон:Cite web</ref>; существует также нативная реализация Tcl для этой ОС, называемая AndroWish<ref name=androwish/>.
Дистрибутивы
Все нижеперечисленные дистрибутивы распространяются свободно и собраны из компонентов, имеющих ту или иную свободную лицензию. Большинство из них — кроссплатформенно (кроме WinTclTk и Tcl/Tk Aqua), хотя в Unix-системах Tcl/Tk обычно является частью дистрибутива ОС.
- ActiveTcl<ref>Шаблон:Cite web</ref>
- Самый распространённый дистрибутив Tcl. Подобно другим продуктам компании ActiveState включает в себя большой набор библиотек и расширений. В Windows-версиях включает в себя средства интеграции с WSH. Какие-либо инструментальные средства, облегчающие жизнь программиста, отсутствуют. Фирма продаёт пакет TclDevKit, содержащий средства отладки и создания автономных программ (последнее — на базе технологии StarKit) и Komodo — универсальную IDE для скриптовых языков, включающее средства визуального программирования Tk-форм.
- WinTclTk<ref>Шаблон:Cite web</ref>
- Более компактный, чем ActiveTcl, дистрибутив, ориентированный на работу с XOTcl — объектно-ориентированным расширением Tcl. Список включённых в него библиотек несколько уже, чем в ActiveTcl, но базовый набор здесь присутствует. В этот дистрибутив входят Tloona IDE<ref>Шаблон:Cite web</ref> — среда разработки традиционного типа и XOTclIde<ref>Шаблон:Cite web</ref> — среда объектно-ориентированного программирования в стиле Smalltalk, обе — с отладчиками. Также на сайте разработчиков свободно доступен пакет для создания единого запускаемого файла TkWrapper, основанный на FreeWrap<ref>Шаблон:Cite web</ref> — технологии, альтернативной StarKit, основанной на простом ZIP-сжатии. Последняя на сегодняшний день версия — 8.5.6 (3 декабря 2009, Tcl 8.5.6).
- TclKit<ref>Шаблон:Cite web</ref>
- Это Tcl/Tk c базовым набором библиотек в одном компактном выполняемом файле. Дистрибутив создан с использованием технологии StarKit. Содержит библиотеку MetaKit, позволяющую управлять содержанием этого файла. Ещё один популярный дистрибутив Tcl в одном файле — это eTcl<ref>Шаблон:Cite web</ref>. На аналогичных принципах построен дистрибутив dqkit<ref>Шаблон:Cite web</ref> — альтернативная сборка, известная как «TclKit на стероидах», имеется несколько вариантов, отличающихся составом библиотек, поддержкой многопоточности и т. д.
- MyTcl<ref>Шаблон:Cite web</ref>
- Полноценная интегрированная среда разработки (IDE) на Tcl, включающая в себя дистрибутив языковой среды. Имеет возможность генерации автономных приложений в StarKit-формате. Текущая версия — 1.0 Build 8 (18 июня 2012) для Win32 и Win64 с интегрированным в систему Tcl 8.5.11. В настоящее время не является открытым ПО.
- AndroWish<ref name=androwish>Шаблон:Cite web</ref>
- Среда для запуска Tcl/Tk-скриптов и компоновки tcl/tk-приложения в apk-файл для исполнения под Android
Применение
Tcl, наряду с Perl и Python, стал одним из трёх классических скриптовых языков общего назначения. Эта троица фигурирует не только в качестве списка свободных дистрибутивов, собираемых в ActiveState, но и, например, как языки, на которых (помимо диалекта PL/pgSQL) можно писать триггеры и хранимые процедуры популярного сервера БД PostgreSQL.
Tcl как встраиваемый язык нашёл применение и в сфере САПР (CAD|CAM|CAE)<ref>CAD software history Шаблон:Wayback в TclWiki Шаблон:Wayback</ref><ref>Современные компьютерные технологии на службе Nike, Inc. Шаблон:Wayback в журнале САПР и графика Шаблон:Wayback, № 10’2000</ref>. Он, к примеру, используется как средство настройки баз данных, в постпроцессоре Unigraphics. Кроме того, он де-факто является языком автоматизации и интеграции во всех ведущих программных пакетах разработки микросхем (ПЛИС и ASIC).
Использование в веб-разработке
В web-программировании Tcl обычно используется вместе с веб-сервером AOLServer или одним из «облегчённых» веб-серверов, вроде lighttpd, ориентированных на FastCGI. Для интеграции Tcl с Apache существует модуль Rivet<ref>Шаблон:Cite web</ref>.
Под управлением AOLServer работает, в частности, OpenACS<ref>OpenACS. The Toolkit for Online Communities Шаблон:WaybackШаблон:Ref</ref> — система управления содержимым веб-сайтов с богатыми возможностями расширения на языке Tcl, расширенном XOtcl или project-open<ref>project-open. Open-Source Enterprise Project Management Шаблон:WaybackШаблон:Ref</ref> — система групповой работы c веб-интерфейсом.
Существуют также такие проекты, как TclHttpd<ref>Шаблон:Cite web</ref> и его преемник — Wub<ref>Шаблон:Cite web</ref>, являющиеся полноценными Web-фреймворками. На базе нового объектного расширения языка TclOO разрабатывается веб-фреймвок Woof (Web Oriented Object Framework)<ref>Шаблон:Cite web</ref>. Примером CMS для TclHttpd является Ucome<ref>Ucome. Your Content Management in Tcl Шаблон:WaybackШаблон:Ref</ref>.
Помимо использования в качестве языка реализации веб-приложений, Tcl может использоваться как скриптовый язык для расширения существующих приложений. К примеру, на нём пишут модули для IRC-бота Eggdrop<ref>Шаблон:Cite web</ref><ref>Шаблон:Cite web</ref>.
Достоинства и недостатки
Недостатком ранних версий Tcl/Tk, несомненно, было низкое быстродействие. Версии ниже 8-й использовали прямую интерпретацию исходного текста, однако использование байткода разрешило эту проблему. Сейчас по быстродействию Tcl не сильно отличается от PHP, хотя заметно уступает таким скриптовым языкам как, например, Python или Lua. Сложные или критические по времени выполнения участки кода рекомендуется выполнять в виде внешних модулей на C/C++.
Tcl/Tk отличает непривычность синтаксиса для программистов на «традиционных» языках. Он ближе к стандартному синтаксису оболочки Unix. Этот синтаксис может быть произвольно изменён (как и в других «программируемых языках программирования», таких как Forth<ref group="примечание">Интересен симбиозе Forth и Tcl в рамках проекта HolonT Шаблон:Wayback, где Forth транслируется в Tcl код.</ref> или Common Lisp). Это может быть преимуществом для программиста-индивидуала или небольшой группы программистов, но делает Tcl/Tk вряд ли пригодным для использования в качестве языка общего назначения при разработке в промышленном масштабе. Хотя наличие стандартизированных расширений снижает остроту этой проблемы. Tcl может использоваться и в крупных проектах в пределах своей «экологической ниши» (встроенные скрипты, «склеивание» компонент, WEB-программирование).
Хотя Tcl обладает всеми свойствами функционального языка, его интерпретатор до версии 8.6 не производил оптимизации хвостовой рекурсии, что затрудняло использование чисто функционального стиля, уменьшало его эффективность. Впрочем, гибкость языка позволяет обойти эту проблему, реализовав подобие такой оптимизации на высоком уровне<ref>в Tail call optimization Шаблон:Wayback описана эта проблема и обозначены возможные пути её решения.</ref>. Наконец, появившаяся в тестовой версии 8.6 команда tailcall позволяет без особых проблем использовать хвостовую рекурсию.
Наиболее тесная интеграция Tcl с графической библиотекой Tk, которая зачастую используется и в сочетании с другими языками программирования — несомненное преимущество Tcl. Для создания GUI-оболочек к консольным программам или пакетам консольных программ Tcl может оказаться наилучшим выбором.
Влияние
Хотя Tcl и не относится к числу широко используемых языков программирования, он, наряду с такими (более ранними) языками, как Lisp и Smalltalk, оказал заметное влияние на программирование. Он стал первым языком, ориентированным на простоту встраивания в приложения<ref name=":0">Шаблон:Cite web</ref>.
Не было аналогов по простоте использования и у библиотеки графических виджетов Tk, которая, помимо Tcl, стала популярной и в других универсальных скриптовых языках. Tkinter остаётся базовым средством создания GUI-приложений в Python'е. Имеются также библиотеки привязки Tk к Perl'у<ref>Шаблон:Книга</ref> (Tkx) и Ruby<ref name=":0" />.
SQLite — встраиваемая легковесная SQL система управления базами данных — изначально разрабатывалась как расширение Tcl<ref name=":0" />.
Ссылки
- www.tcl.tkШаблон:Ref — Официальный сайт
- TkDocs siteШаблон:Ref
- tmml.sourceforge.net/docШаблон:Ref — Официальная документация по Tcl/Tk и стандартной библиотеке Tcl
- pleac.sourceforge.net/pleac_tclШаблон:Ref — PLEAC-Tcl — Коллекция решённых на Tcl задач (удобна для сравнения с другими языками)
На русском языке
- www.opennet.ru/links/sml/36.shtml — Ссылки на русскую документацию
- www.cs.tut.fi/~yk/ns2ru/tcl.html — Краткое введение в TCL
- www.cs.tut.fi/~yk/ns2ru/otcl.html — Введение в OTCL
- tclstudy.narod.ru/index.html — Уроки для самостоятельного освоения tcl и tk
- Статьи и обзоры
- Сценарии: высокоуровневое программирование для XXI века — статья Джона Остераута (создателя Tcl) о сценарных языках.
- Шаблон:Cite web
- Древняя, новая, будущая, цикл статей Андрея Зубинского в «Компьютерном Обозрении».
- Доступ к PostgreSQL из программ на языке Tcl — статья на CitForum
- Вильям Б. Циммерли. Технология Tcl — Используйте Tcl/Tk для организации рабочего стола и автоматизации вашей работы
Книги
На русском языке
- оригинал: Brent Welch, Ken Jones, Jeffrey Hobbs «Practical Programming in Tcl and Tk (4th Edition)», ISBN 0-13-038560-3, 2003 (электронная версия<ref>полностью доступно первое издание, выборочно, более новые</ref>)
- Москвин П. В. «Азбука TCL», ISBN 5-93517-130-9
- Алексей Петровский, Командный язык программирования TCL (Tool Command Language), ISBN 5-901321-16-2
На английском языке
- 2-е издание: «Tcl/Tk, Second Edition : A Developer’s Guide», ISBN 1-55860-802-8, 2003
- 1-е издание: «Tcl/Tk for Real Programmers», ISBN 0-12-261205-1
- John K. Ousterhout, Ken Jones «Tcl and the ДTk Toolkit (2nd Edition)», ISBN 0-321-33633-X, 2009
- Bert Wheeler «Tcl/Tk 8.5 Programming Cookbook», ISBN 1-84951-298-1, 2011
- Шаблон:Книга
- Mark Harrison, Michael McLennan, «Effective Tcl/Tk Programming. Writing Better Programs in Tcl and Tk», ISBN 0-201-63474-0
- J. Adrian Zimmer «Tcl/Tk For Programmers», ISBN 0-8186-8515-8
- Salvatore Sanfillipo «Tcl Wise. Guide to the Tcl Programming Language» (первые 9 глав on-line Шаблон:Wayback)
- Paul Raines, Jeff Tranter «Tcl/Tk in a Nutshell: A Desktop Quick Reference», ISBN 1-56592-433-9
- David Maggiano «CGI Programming with Tcl», ISBN 0-201-60629-1
- J. M. Ivler, Kamran Husain, «Cgi Developer’s Resource: Web Programming in Tcl and Perl», ISBN 0-13-727751-2
Примечания
Источники