Tcl

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
Tcl
Tcl.svg
Класс языка:

мультипарадигмальный:
объектно-ориентированный,
функциональный,
процедурный,
событийно-ориентированный,
императивный

Тип исполнения:

интерпретируемый

Автор(ы):

Джон Оустерхаут

Расширение файлов:

.tcl

Выпуск:

8.6.2[1] (27 августа 2014 года)

Система типов:

динамическая

Испытал влияние:

Shell, Lisp

Повлиял на:

Python

Лицензия

BSD-подобная

Сайт:

tcl.tk

Tcl (от англ. Tool Command Language — «командный язык инструментов», читается «тикль» или «ти-си-эль») — скриптовый язык высокого уровня.

Tcl часто применяется совместно с графической библиотекой Tk (Tool Kit). Связку Tcl/Tk по-русски иногда называют «Так-тикль» (английский вариант — «тикль-ток»).

Области применения языка — быстрое прототипирование, создание графических интерфейсов для консольных программ (пакетов программ), встраивание в прикладные программы, тестирование. Также Tcl применяется в веб-разработке.

Особенности[править | править вики-текст]

В Tcl данными всех типов, включая код программы, можно манипулировать как строками. Это делает его языком с естественной поддержкой метапрограммирования. Эта парадигма программирования учитывалась в ходе разработки и эволюции языка.

Программа на Tcl состоит из команд, разделённых символами новой строки или точками с запятой. Каждая команда состоит из набора полей, разделённых пробелами. Первое поле должно быть именем команды, а необязательные остальные поля — передаваемые этой команде аргументы. Команда возвращает значение, иногда пустое. То есть, как и в Лиспе, в Tcl используется префиксная нотация.

Ключевых слов как таковых нет — понятие команды в Tcl аналогично понятию процедуры или функции распространённых языков программирования. Это относится и к управляющим конструкциям языка. В сочетании с элементарным синтаксисом это обеспечивает хорошую расширяемость языка, в том числе и библиотеками, написанными на других языках, таких как C/C++ или Java.

В Tcl также качественно реализована модель управления программой на основе событий. События могут генерироваться таймером, при появлении данных в канале, изменении значения переменной, при завершении какой-либо внешней программы, или просто при работе пользователя с интерфейсом Tk. Можно задавать свои события и управлять ими.

Как и большинство современных скриптовых языков Tcl содержит развитые средства работы с регулярными выражениями, работает с ассоциативными массивами и другими динамическими структурами данных.

В базовом Tcl нет поддержки ООП, однако существует множество расширений Tcl объектно-ориентированными механизмами, реализованных в виде подключаемых библиотек на Си, или самом Tcl. Вот самые распространённые из них[2]:

расширение реализовано на особенности используемой модели
XOTcl C мощная объектная система с динамическим определением классов и методов, близкая к CLOS
incr Tcl C ООП в стиле, близком к C++, расширенном введением конфигураторов
Snit Tcl реализация объектной модели на основе делегирования, а не наследования
STOOOP Tcl ООП в стиле, максимально близком к C++, также введён механизм переключения классов
TclOO[3] C Компактная, но мощная объектно-ориентированная система, которую можно использовать как непосредственно, так и как фреймвок для построения расширенных моделей ООП.

Пространства имён поддерживаются на уровне ядра языка. При реализации механизмов ООП на Tcl используется поддержка иерархии вложенности пространств имён в этом языке[4].

На Tcl легко программировать в функциональном стиле: он обеспечивает такие механизмы, как функции высшего порядка и абстракции функций[5], хотя Tcl редко используют таким образом. Вот пример того, как можно осуществить композицию двух функций:

proc o {f g x} {$f [$g $x]}

В версии 8.5 в Tcl также введена команда apply, значительно облегчающая программирование в этом стиле.

Вот пример её использования из официальной документации:

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}

результатом работы этого примера будет

1:a 2:bb 3:ccc 4:dddd

История[править | править вики-текст]

Язык разработан Джоном Оустерхаутом (John Ousterhout) в то время, когда он работал в университете Калифорнии в Беркли. Первоначальной целью было создание универсального языка для встраивания в консольные приложения. Вслед за этим Оустерхаут расширил свой язык средствами создания графических интерфейсов — так появился Tcl/Tk.[6]

За 4 года развития в университетских стенах Тикль-сообщество выросло до нескольких сотен тысяч программистов. В 1993 году было разработано первое объектно-ориентированное расширение — incr Tcl.

В 1994 г. Оустерхаут становится ведущим инженером проекта SunScript. В течение следующих 4 лет, став одним из проектов корпорации Sun, Тикль не только остался свободно распространяемой системой, но и значительно усовершенствовался, стал кросс-платформенным.

Заметный удар по популярности языка нанёс Ричард Столлман, опубликовав в сентябре 1994 г. в ряде новостных групп рекомендацию «Почему вы не должны использовать Tcl»[7]. В ней он на основании утверждений, что «Tcl разработан не как серьёзный язык программирования» и «Tcl имеет особый синтаксис, притягательный для хакеров из-за своей простоты. Но синтаксис Tcl кажется странным для большинства пользователей.», а также в связи с продвижением Emacs Lisp вынес вердикт: «проект GNU не собирается использовать Tcl в программном обеспечении GNU». Помимо субъективных претензий к дизайну языка, Столлман указал на объективный на тот момент недостаток — низкое быстродействие.

Тем не менее, рост количества разработчиков, активно использующих тикль, составил за этот период 600 %.

В 1998 г. в связи с Java-бумом и связанной с ним острой конкурентной борьбой корпорация уже не могла уделять тиклю прежнего внимания. Джон Оустерхаут покидает Sun и создаёт (при поддержке Sun) компанию Scriptics, продолжая развитие технологии Tcl/Tk[8][9]. Это была одна из первых коммерческих программных фирм, чья деятельность строилась вокруг бесплатного свободного ПО.

Цветовое решение логотипа, принятое в 90-х гг. XX века

В марте 1998 года Оустерхаут пишет ставшую классической статью «Сценарии: высокоуровневое программирование для XXI века»[10], в которой назвал скриптовые языки языками системной интеграции, потому что они ориентированы прежде всего на работу с объектами операционной среды, а не с элементарными данными. Это позволяет без написания тысяч строк кода двумя-тремя командами «склеивать» такие объекты в одно целое.

В том же году он выиграл за разработку языка 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 раз поднять быстродействие[11]. В следующую модификация Tcl 8.1 введена полноценная поддержка юникода, в ней впервые реализована многопоточность. В связи c этим релизом Оустерхаут заявил:

« «В целом 8.1 переводит Tcl в новую категорию, поскольку теперь его можно использовать для серверных приложений. Си, Си++ и Java можно по-прежнему использовать для создания частей приложений, критических с точки зрения производительности, а Tcl — для интеграции и создания интерфейсных компонентов».[12] »

В 2000 году фирма Scriptics была переименована в Ajuba Solutions, а затем куплена фирмой Interwoven, не заинтересованной в работе со свободным ПО. В связи с этим разработка Tcl была передана сообществу программистов. Так была сформирована Tcl Core Team.

На 9-ой конференции по Tcl/Tk, проходившей в Ванкувере, была представлена виртуальная файловая система StarKit, обеспечившая новый, удобный для обычного пользователя способ распространения Tcl программ.

Синтаксис Tcl[править | править вики-текст]

Скрипт 
команды, разделённые переводом строки или точкой с запятой (;).
Команда 
слова, разделённые пробелами.
 commandName argument1 argument2 … argumentN

Первое слово — имя команды, остальные — её аргументы. Любой аргумент может быть заменён другой командой, помещённой в квадратные скобки. Любые аргументы в фигурных скобках передаются команде «как есть», в виде единого аргумента.

Символы, имеющие особое значение[править | править вики-текст]

  • $  — вызывает подстановку значения переменной.
  • [] — вызывает подстановку результата выполнения команды внутри скобок.
  • "" — группирует аргументы в один с подстановкой значений переменных.
  • {} — группирует аргументы в один без подстановки значений переменных.
  • \  — экранирует следующий символ или вызывает подстановку управляющего символа.
  • #  — начало однострочного комментария, должен быть после неэкранированного символа перевода строки или «;» (точки с запятой).

Замечания о процессе разборки скрипта[править | править вики-текст]

  • Разбивка на слова, подстановка значений переменных и результатов выполнения команд производятся за один проход по команде.
  • Все символы, находящееся внутри скобок {} и кавычек "", рассматривается как одно слово.
  • Первое слово команды рассматривается как встроенная или определённая процедура.

Примеры команд[править | править вики-текст]

  • Присваивание обозначается словом set, а не знаком равенства.

Синтаксис:

set переменная значение

Пример:

set a 2
set b 3
  • Комментарий обозначается символом #

Синтаксис:

# текст комментария

Пример:

# это комментарий
  • Вывод (печать) реализуется командой puts

Синтаксис:

puts выражение

Пример:

puts "Привет! Это я."
puts 123
puts $a
puts "b = $b"
  • Цикл пока реализуется командой while, имеющей два аргумента. Первый — Tcl выражение (выражения фактически пишутся на миниатюрном языке, состоящем из математических операций и операций сравнения в стиле языка C). Второй аргумент — это скрипт, выполняемый при каждой итерации. Его, как правило, помещают в фигурные скобки, чтобы избежать немедленного выполнения.

Синтаксис:

while { Выражение_Tcl_С_Логическим_Значением } {
    TclКоманда
    другаяTclКоманда
    … …
}

Пример:

while { $x < 10 } {
    puts $x
    incr x
}
  • Условная команда

Синтаксис:

if { Выражение_Tcl_С_Логическим_Значением } {
    КомандаTcl
}

Пример:

if {$x < 0} {
    set x 0
}
  • Команда ветвления

Пример:

switch -glob$var {
 {see} -
 {saw} -
 {seen} { puts "Все это значит одно и то же!"}
}
  • Команда может не иметь аргументов, например
pwd

просто возвращает текущий рабочий каталог. А командой

set wdir [pwd]

вы сохраните имя текущего каталога в переменной wdir.

  • Команда может возвращать список, например
glob Образец

возвратит список имён файлов текущей директории, удовлетворяющих шаблону Образец.

Процедуры[править | править вики-текст]

Процедуры определяются следующим образом

proc имяПроцедуры { списокАргументов } {
  … …
}

Ассоциативные массивы[править | править вики-текст]

Следующий фрагмент кода создаст и инициализирует ассоциативный массив (называемый в других языках также карта, словарь, или хеш).

set capital(France) Paris
set capital(Italy) Rome
set capital(Germany) Berlin
set capital(Poland) Warsaw
set capital(Russia) Moscow
set capital(Spain) Madrid

Для запроса и вывода одного из значений ассоциативного массива используется

puts $capital(Italy)

Список всех стран (ключей массива) можно получить командой

array names capital

Результат не будет отсортирован, потому что массивы Tcl базируются на хеш-таблицах.

Poland Spain Russia Germany Italy France

Сортировку можно выполнить командой

lsort [array names capital]

Чтобы сослаться на массив (передать его как ссылку) используется имя содержащей его переменной:

proc demo arrName {
    upvar 1 $arrName arr ;# tie the reference to a local name
    #do something with arr
}

Для доступа к массиву по значению, используется array get или array set. Например, чтобы скопировать один массив в другой:

array set Newarr [array get Oldarr]

В Tcl 8.5 введены массивы, передаваемые по значению — словари (dict).

Для преобразования скалярной переменной в массив и наоборот следует удалить существующую переменную при помощи команды unset.

Область видимости переменных[править | править вики-текст]

По умолчанию внутри процедуры видны только определённые в ней переменные. За пределами определения процедуры её переменные недоступны, иначе чем через механизм передачи параметров. Вы можете иметь переменные в процедуре с таким же именем, как и в основной программе, при этом значения этих переменных будут различаться, по сути это будут разные переменные. Чтобы изменить это поведение используются команды global или upvar.

Примеры[править | править вики-текст]

Здравствуй, мир![править | править вики-текст]

Программа Hello, world выглядит так

puts "Здравствуй, мир!"

или так

puts {Здравствуй, мир!}

Массивы[править | править вики-текст]

Обращение к элементам массива[править | править вики-текст]

Вывод значения элемента массива OldArray(precision), имя которого (массива) задается новой переменной NewArray

set NewArray OldArray
puts [set ${NewArray}(precision)]

Сложение чисел массива[править | править вики-текст]

Метод (A) — Сложение с использованием цикла 'foreach'

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

Метод (B) — Гораздо более элегантный способ с использованием команды 'join'

set numbers {1 2 3 4 5 6 7 8 9 10}
puts [expr [join $numbers +]]

Список содержимого массива[править | править вики-текст]

В массиве tcl_platform, содержится информация о свойствах платформы, на которой запущен Tcl. Список имён свойств может быть получен с помощью

array names tcl_platform

Следующий фрагмент выводит их вместе со значениями:

foreach i [array names tcl_platform] {
    puts "$i = $tcl_platform($i)"
}

Если свойства должны быть отсортированы

foreach i [lsort [array names tcl_platform] ] {
    puts "$i = $tcl_platform($i)"
}

Здесь демонстрируется вложенность команд. Они могут быть вложены на любую глубину. Подобного же результата можно достичь с помощью команды parray[13] (появившейся в Tcl 8.5).

Пересечение множеств[править | править вики-текст]

Процедура filter возвращает те элементы списка, для которых script принимает значение TRUE:

proc filter {list script} {
    set res {}
    foreach e $list {if {[uplevel 1 $script $e]} {lappend res $e}}
    return $res
}

Команда uplevel 1 позволяет вычислить выражение в контексте, в котором вызывается слово filter.

Процедура in — это сокращённая запись для включения (инклюзии) множеств:

proc in {list e} {
    expr {[lsearch -exact $list $e]>=0}
}

Проверка:

% filter {a b c} {in {b c d}}
b c

Факториал[править | править вики-текст]

proc ! x {expr {$x<2? 1: $x*[! [incr x -1]]}}

Здесь демонстрируется, что именем команды могут быть любые строки, а также известный по другим языкам оператор ?:.

Реализация, дистрибутивы, инструменты[править | править вики-текст]

Tcl — интерпретируемый язык, то есть программы на Tcl готовы к выполнению без компиляции и компоновки.

Интерпретатор Tcl портирован на большинство распространённых платформ[14]. Он распространяется под свободной некопилефтной лицензией, позволяющей использовать его без ограничения в разработке проприетарных приложений, а также создавать проприетарные производные системы. Разработчики относят её к BSD подобным, хотя по сравнению с лицензией BSD лицензия Tcl накладывает меньшее количество запретов.

Реализация[править | править вики-текст]

В настоящее время работа над ядром языка Tcl ведётся группой разработчиков[15] именуемой Tcl Core Team[16]. Самые свежие версии Tcl-транслятора и основных библиотек доступны в репозитории на SourceForge.net, см. список sourceforge-проектов, включаемых в основную поставку Tcl/Tk[17].

Транслятор 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[11]. Текущая версия TCL — 8.6.

Альтернативные реализации и диалекты[править | править вики-текст]

Существует альтернативные реализации Tcl для популярных виртуальных машин общего назначения. Это написанный на Java интерпретатор — Jacl[18] (последняя версия от 2008 года), и проект Eagle[19], реализующий большинство команд Tcl 8.4 для CLR (Доступны сборки для .NET 4.0 и 2.0). Ведутся эксперименты по трансляции Tcl программ в код виртуальной машины Parrot, разрабатываемой для шестой версии Perl[20].

Для программирования встраиваемых систем и встраивания в приложения разработан специальный диалект Tcl Jim[21]. Это интерпретатор реализующий большое подмножество Tcl, расширенное дополнительными механизмами объектно-ориентированного и функционального программирования и занимающий в скомпилированном виде менее 100 килобайт.

Ещё один диалект Tcl — скриптовый язык мобильных устройств Hecl[22], разработанный Дэвидом Велтоном и реализованный на Java (J2ME)[23][24]. Что же касается платформы Android, поддержку Tcl на ней (наряду с другими скриптовыми языками) обеспечивает: скриптовая прослойка SL4A[25]; AndroWish[26]

Дистрибутивы[править | править вики-текст]

Все нижеперечисленные дистрибутивы распространяются свободно и собраны из компонентов, имеющих ту или иную свободную лицензию. Большинство из них — кроссплатформены (кроме WinTclTk и Tcl/Tk Aqua), хотя в Unix-системах Tcl/Tk обычно является частью дистрибутива ОС.

  • ActiveTcl[27]
    Самый распространённый дистрибутив TCL. Подобно другим продуктам компании ActiveState включает в себя большой набор библиотек и расширений. В windows-версиях включает в себя средства интеграции с WSH. Какие либо инструментальные средства, облегчающие жизнь программиста, отсутствуют. Фирма продаёт пакет TclDevKit содержащий средства отладки и создания автономных программ (последнее на базе технологии StarKit) и Komodo — универсальное IDE для скриптовых языков, включающее средства визуального программирования Tk-форм.
  • WinTclTk[28]
    Более компактный, чем ActiveTcl, дистрибутив ориентированный на работу с XOTcl — объектно-ориентированным расширением Tcl. Список включённых в него библиотек несколько уже, чем в ActiveTcl, но «джентльменский набор» вы здесь найдёте. В этот дистрибутив входят Tloona IDE[29] — среда разработки традиционного типа и XOTclIde[30] — среда объектно-ориентированного программирования в стиле Smalltalk, обе — с отладчиками. Также на сайте разработчиков свободно доступен пакет для создания единого запускаемого файла TkWrapper основанный на FreeWrap[31] — технологии, альтернативной StarKit, основанной на простом ZIP-сжатии. Последняя на сегодняшний день версия — 8.5.6 (3 декабря 2009, Tcl 8.5.6).
  • TclKit[32]
    Это Tcl/Tk c базовым набором библиотек в одном компактном выполняемом файле. Дистрибутив создан с использованием технологии StarKit. Содержит Библиотеку MetaKit позволяющую управлять содержанием этого файла. Ещё один популярный дистрибутив Tcl в одном файле — это eTcl[33]. На аналогичных принципах построен дистрибутив dqkit[34] — альтернативная сборка, известная как «TclKit на стероидах», имеется несколько вариантов, отличающихся составом библиотек, поддержкой многопоточности и т. д.
  • MyTcl[35]
    Полноценная интегрированная среда разработки (IDE) на Tcl, включающая в себя дистрибутив языковой среды. Имеет возможность генерации автономных приложений в StarKit формате. Текущая версия 1.0 Build 8 (18 июня 2012) для Win32 и Win64 с интегрированным в систему Tcl 8.5.11. В настоящее время не является открытым ПО.

Применение[править | править вики-текст]

Tcl, наряду с Perl и Python, стал одним из трёх классических скриптовых языков общего назначения. Эта троица фигурирует не только в качестве списка свободных дистрибутивов, собираемых в ActiveState, но и, например, как языки, на которых (помимо диалекта PL/pgSQL) можно писать триггеры и хранимые процедуры популярного сервера БД PostgreSQL.

Tcl, как встраиваемый язык, нашёл применение и в сфере САПР (CAD|CAM|CAE)[36][37]. Он, к примеру, используется как средство настройки баз данных, в постпроцессоре Unigraphics. Кроме того, он де-факто является языком автоматизации и интеграции во всех ведущих программных пакетах разработки микросхем (ПЛИС и ASIC).

Использование в веб-разработке[править | править вики-текст]

В web-программировании Tcl обычно используется вместе с веб-сервером AOLServer или одним из «облегчённых» веб-серверов, вроде lighttpd, ориентированным на FastCGI. Для интеграции Tcl с Apache существует модуль Rivet[38].

Под управлением AOLServer работает в частности OpenACS[39] — система управления содержимым вебсайтов с богатыми возможностями расширения на языке Tcl, расширенном XOtcl или project-open[40] — система групповой работы c веб-интерфейсом.

Известен также форк AOLServer — NaviServer[41].

Существуют также такие проекты, как TclHttpd[42] и его преемник — Wub[43], являющиеся полноценными Web-фреймворками. На базе нового объектного расширения языка TclOO разрабатывается веб-фреймвок Woof (Web Oriented Object Framework)[44]. Примером CMS для TclHttpd является Ucome[45].

Помимо использования в качестве языка реализации веб-приложений, TCL может использоваться как скриптовый язык для расширения существующих приложений. К примеру на нём пишут модули для IRC бота Eggdrop.

Прочее[править | править вики-текст]

Среди программного обеспечения на Tcl можно также назвать следующие разработки:

  • tkabber, это программа для работы с протоколом XMPP, включающая в себя чат и другие функции.
  • AMSN — программа с открытым исходным кодом для мгновенного обмена сообщениями
  • Html Viewer 3 — минималистичный web-браузер, написанный на Tcl/Tk
  • MacPorts — система для установки программного обеспечения, распространяемого в исходных кодах, для операционной системы Mac OS X.
  • TclMon (англ.)русск.[46] — система мониторинга сетей
  • gitk[47][48][49] — графический интерфейс для визуализации истории Git. Написан на Tcl/Tk, распространяется с самим Git.
  • Password Gorilla - is a password manager type application. It manages your login information (sets of a title, user name, password, and notes), and stores it in an encrypted database. A master password is used to protect the file.

Достоинства и недостатки[править | править вики-текст]

Недостатком ранних версий Tcl/Tk, несомненно, было низкое быстродействие. Версии ниже 8-й использовали прямую интерпретацию исходного текста, однако использование байткода разрешило эту проблему. Сейчас по быстродействию Tcl не сильно отличается от PHP, хотя заметно уступает таким скриптовым языкам как, например, Python или Lua. Сложные или критические по времени выполнения участки кода рекомендуется выполнять в виде внешних модулей на C/C++.

Tcl/Tk отличает непривычность синтаксиса для программистов на «традиционных» языках. Он ближе к стандартному синтаксису оболочки Unix. Этот синтаксис может быть произвольно изменён (как и в других «программируемых языках программирования», таких как Forth[50] или Common Lisp). Это может быть преимуществом для программиста-индивидуала или небольшой группы программистов, но делает Tcl/Tk вряд ли пригодным для использования в качестве языка общего назначения при разработке в промышленном масштабе. Хотя наличие стандартизированных расширений снижает остроту этой проблемы. Tcl может использоваться и в крупных проектах в пределах своей «экологической ниши» (встроенные скрипты, «склеивание» компонент, WEB-программирование).

Хотя Tcl обладает всеми свойствами функционального языка, его интерпретатор до версии 8.6 не производил оптимизацию хвостовой рекурсии, что затрудняло использование чисто функционального стиля, уменьшало его эффективность. Впрочем, гибкость языка позволяет обойти эту проблему, реализовав подобие такой оптимизации на высоком уровне[51]. Наконец, появившаяся в тестовой версии 8.6 команда tailcall позволяет без особых проблем использовать хвостовую рекурсию.

Наиболее тесная интеграция Tcl с графической библиотекой Tk, которая зачастую используется и в сочетании с другими языками программирования — несомненное преимущество Tcl. Для создания GUI оболочек к консольным программам или пакетам консольных программ Tcl может оказаться наилучшим выбором.

См. также[править | править вики-текст]

Ссылки[править | править вики-текст]

На русском языке[править | править вики-текст]

Блоги, посвящённые TCL

Статьи и Обзоры[править | править вики-текст]

Книги[править | править вики-текст]

На русском языке[править | править вики-текст]

  • Брент Б. Уэлш, Кен Джонс, Джеффри Хоббс «Практическое программирование на Tcl и Tk», ISBN 5-8459-0661-X,
оригинал: Brent Welch, Ken Jones, Jeffrey Hobbs «Practical Programming in Tcl and Tk (4th Edition)», ISBN 0-13-038560-3, 2003 (электронная версия[52])
  • Москвин П. В. «Азбука TCL», ISBN 5-93517-130-9
  • Алексей Петровский, Командный язык программирования TCL (Tool Command Language), ISBN 5-901321-16-2

На английском языке[править | править вики-текст]

  • Clif Flynt «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

Примечания[править | править вики-текст]

  1. Latest Release: Tcl/Tk 8.6.2 (Aug 27, 2014)
  2. если ни одна из реализаций объектной модели вас не устраивает, либо вы интересуетесь, как это работает, можете ознакомиться со статьёй Creating Object Commands (англ.) от создателей SNIT
  3. TclOO в TclWiki
  4. Clyf Flynt 8.1.7. Namespace nesting // Tcl/Tk: A Developer's Guide. — 3-rd edition. — Waltham, MA : Morgan Kaufmann, 2012. — P. 215. — 792 p. — ISBN 0-12-384717-6.
  5. см. также Steps towards functional programming
  6. См.History of Tcl
  7. Why you should not use Tcl
  8. Камерон Лэрд, Кэтрин Сорэз, SunWorld, США Создатель Tcl уходит из Sun в новое предприятие // Computerworld. — Открытые системы, 1998. — № 07.
  9. Роберт Макмиллан, SunWorld Tcl: путь к новой жизни // Computerworld. — Открытые системы, 1998. — № 36.
  10. John K. Ousterhout Scripting: Higher Level Programming for the 21st Century (англ.).
    Перевод этой статьи (рус.) в журнале «Открытые системы», № 3, 1998
  11. 1 2 см. Tcl Benchmarks
  12. Тед Смалли Боуэн Tcl: корпоративный вариант // Computerworld. — Открытые системы, 1999. — № 21.
  13. Tcl Documentation | parray
  14. Tcl Wiki | On What Platforms Does Tcl Run
  15. Tcl Core Team — список участников
  16. Tcl Core Team
  17. Tcl at SourceForge
  18. The Tcl/Java Project, Jacl
  19. The Eagle Project, (Extensible Adaptable Generalized Logic Engine)
  20. partcl. Implementation of tcl targeting the parrot VM (блог проекта(англ.)
  21. The Jim Interpreter. A small footprint implementation of the Tcl programming language
  22. hecl.org: Hecl — The Mobile Scripting Language
  23. David Welton Create a simple application with Hecl // Free Software Magazine (англ.)русск.. — Wed, 2007-10-31. — В. 20.
  24. Implementation of the Hecl Programming Language (англ.)
  25. android-scripting. Scripting Layer for Android brings scripting languages to Android.
  26. AndroWish is an Android app with Tcl/Tk 8.6.1 (and Tcl/Tk 8.4.20) (where Tk uses an X11 emulation on top of libsdl.org, good old Motif style ;^ and ttk), sqlite3, tkImg 1.4, and much more
  27. ActiveTcl. The Industry-Standard Tcl Distribution
  28. WinTclTk. Tcl/Tk Distribution for Microsoft Windows
  29. Tloona Tcl/Tk IDE
  30. XOTclIDE. Integrated Development Environment for XOTcl and Tcl
  31. FreeWrap. Builds stand-alone TCL/TK executables. No compiler required!
  32. Tclkit application runtime
  33. ETcl. Evolane’s distribution of Tcl/Tk
  34. dqkit
  35. MyTcl. Powerful Tcl/Tk IDE
  36. CAD software history в TclWiki
  37. Современные компьютерные технологии на службе Nike, Inc. в журнале САПР и графика, № 10’2000
  38. Rivet — Webscripting for Tcl’ers
  39. OpenACS. The Toolkit for Online Communities (англ.)
  40. project-open. Open-Source Enterprise Project Management (англ.)
  41. NaviServer on Tclers Wiki
  42. tclhttpd — Tcl Web Server
  43. Wub pure tcl HTTP1.1 server, client and tool suite
  44. Woof. Web Oriented Object Framework
  45. Ucome. Your Content Management in Tcl (англ.)
  46. TclMon. Open Source Cross-Platform Network Monitoring Solution
  47. gitk on Tclers Wiki
  48. the missing gitk documentation, Sitaram Chamarty. everything I know about git
  49. Scott Chacon 2.3 Основы Git - Просмотр истории коммитов // Pro Git. — 1 edition. — Apress, August 27, 2009. — (Expert's Voice in Software Development). — ISBN 1430218339, ISBN 978-1430218333.
  50. Интересен симбиозе Forth и Tcl в рамках проекта HolonT, где Forth транслируется в Tcl код.
  51. в Tail call optimization описана эта проблема и обозначены возможные пути её решения.
  52. полностью доступно первое издание, выборочно, более новые