TCL

TCL
Tcl
Семантика:

императивный, скриптовый

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

интерпретатор

Появился в:

1988 г.

Автор(ы):

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

Последняя версия:

8.5.7 / 15 апреля 2009

Тестовая версия:

8.6b1 / 23 декабря 2008

Типизация данных:

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

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

Shell, Lisp

Повлиял на:

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

Tcl часто применяется совместно с графической библиотекой

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

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

Содержание

Особенности

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

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

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

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

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

расширение реализовано на особенности используемой модели
CLOS
incr Tcl C классическое ООП в стиле, близком к C++, расширенном введением конфигураторов
делегирования, а не наследования
переключения классов

Пространства имён поддерживаются на уровне ядра языка.

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

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

История[3]

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

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

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

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

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

В 1998 г. в связи с [5][6]. Это была одна из первых коммерческих программных фирм, чья деятельность строится вокруг бесплатного свободного ПО.

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

В том же году он выиграл за разработку языка Tcl две крупных награды. Первая — это ACM Software System Award, вручаемая за «наиболее значимое программное обеспечение». Этой наградой до этого были отмечены такие основополагающие системы, как протокол TCP/IP, первая электронная таблица, первая реляционная база данных, World Wide Web, Unix, Smalltalk. Вторая — это ежегодная USENIX Software Tools User Group (STUG) Award, в знак признания выдающегося программного обеспечения.

В 1999 году выходит Tcl 8.0 — в этой реализация впервые появилась компиляция в байткод, что позволило в 6 раз поднять быстродействие[8]. В следующую модификация Tcl 8.1 введена полноценная поддержка юникода, в ней впервые реализована многопоточность. В связи c этим релизом Остераут заявил:

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

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

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

Синтаксис 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.

Примеры

Дополнительные примеры с комментариями на русском вы можете найти на wiki-ресурсе Нижегородской Группы Пользователей Linux в разделе Programming Gems::Tcl/Tk. [10]

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

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

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

или так

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

Сложение чисел массива

Метод (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 [ concat $i = $tcl_platform($i) ]
}

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

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

Здесь демонстрируется вложенность команд. Они могут быть вложены на любую глубину. Подобного же результата можно достичь с помощью команды parray.

Пересечение множеств

Процедура 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 портирован на большинство распространённых платформ. Он распространяется под свободной некопилефтной лицензией, позволяющей использовать его без ограничения в разработке проприетарных приложений, а также создавать проприетарные производные системы. Разработчики относят её к BSD подобным, хотя по сравнению с лицензией BSD лицензия Tcl накладывает меньшее количество запретов.

Реализация

В настоящее время работа над ядром языка Tcl ведётся группой разработчиков именуемой Tcl Core Team. Самые свежие версии Tcl-транслятора и основных библиотек доступны в репозитории на см. список.

Транслятор Tcl компилирует программу в промежуточное представление — байткод, а затем интерпретирует её. В отличие от, например StarKit модуль или с помощью какого-нибудь другого враппера. В зависимости от параметров компиляции интерпретатор Tcl может поддерживать или не поддерживать многопоточность.

Хотя в большинстве учебников по Tcl для начинающих говорится что то вроде «в Tcl есть всего один тип переменных — строка», на самом деле трансляторы Tcl уже давно как устроены по другому. Внутри Tcl использует систему динамических типов с автоматическим, прозрачным преобразованием к строковому виду.

Существует также альтернативная реализация Tcl написанная на Jacl, ведутся эксперименты по трансляции Tcl программ в код виртуальной машины Perl.

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

Другой диалект Tcl — скриптовый язык мобильных устройств Hecl, реализованный на J2ME).

Tcl входит практически во все дистрибутивы GNU/Linux. Для Microsoft Windows требуется отдельный установочный пакет.

В настоящее время текущая стабильная версия Tcl 8.4, её основные отличия от предыдущей — новые функции (оптимизация 64-битного кода, VFS, дополнения в плане интроспекции ) и некоторое повышение быстродействия за счёт оптимизации работы с байткодом.

Новые возможности, добавленные в версии 8.1 (в частности, поддержка многопотокового выполнения, средства интернационализации и работа с символами Unicode), замедлили работу Tcl по сравнению с давшей скачок скорости восьмой версией примерно на 19 %. Разработчики 8.4 приложили все усилия для того, чтобы максимально повысить скорость выполнения программ, добиться, чтобы они работали не только не медленнее, но даже быстрее, чем это было при появлении версии 8.0. Эта цель была достигнута практически для всех средств Tcl и Tk — версия 8.4 в среднем в 8 раз быстрее чем версия 7.6[8]. Текущая версия TCL — 8.5.

Дистрибутивы

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

  • ActiveTcl
    Самый распространённый дистрибутив TCL. Подобно другим продуктам компании WSH. Какие либо инструментальные средства, облегчающие жизнь программиста, отсутствуют. Фирма продаёт пакет TclDevKit содержащий средства отладки и создания автономных программ (последнее на базе технологии IDE для скриптовых языков, включающее средства визуального программирования WinTclTk
    Более компактный, активно развивающийся дистрибутив ориентированный на работу с Tloona IDE — традиционного типа и XOTclIde — среда объектно-ориентированного программирования в стиле FreeWrap — технологии, альтернативной ZIP-сжатии.
  • TclKit
    Это Tcl/Tk c базовым набором библиотек в одном компактном выполняемом файле. Дистрибутив создан с использованием технологии MetaKit позволяющую управлять содержанием этого файла.
  • dqkit
    Альтернативная сборка, известная как «TclKit на стероидах», имеется несколько вариантов отличающихся составом библиотек, поддержкой многопоточности и т. д.
  • Tcl/Tk Aqua
    Дистрибутив для Mac OS. Существует три варианта: TclTkAquaBI - надмножество ActiveTCL, компактный дистрибутив TclTkAqua и минимальный набор TclTkAquaStandalone.

Достоинства и недостатки

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

Tcl/Tk, также как, например Forth отличают необычность синтаксиса в сочетании с ничем не ограниченной расширяемостью. Это может быть преимуществом для программиста-индивидуала или небольшой группы программистов, но делает Tcl/Tk вряд ли пригодным для разработки в промышленном масштабе. Хотя наличие стандартизированных расширений снижает остроту этой проблемы и в пределах своей «экологической ниши» (встроенные скрипты, «склеивание» компонент, WEB-программирование) Tcl может использоваться и в крупных проектах. Интересеный подход применен при симбиозе Forth и Tcl в рамхах HolonT когда в рамках


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

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

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

См. также


Wikimedia Foundation. 2010.

Игры ⚽ Поможем решить контрольную работу

Полезное


Смотреть что такое "TCL" в других словарях:

  • Tcl — Skriptsprache mit Bytecode Interpreter Basisdaten Paradigmen: imperativ, funktional, generativ …   Deutsch Wikipedia

  • Tcl — Tool Command Language Desarrollador(es) Tcl Core Team[1] …   Wikipedia Español

  • TCL — Skriptsprache mit Bytecode Interpreter Basisdaten Paradigmen: imperativ, funktional …   Deutsch Wikipedia

  • Tcl/Tk — Tcl Skriptsprache mit Bytecode Interpreter Basisdaten Paradigmen: imperativ, funktional …   Deutsch Wikipedia

  • TCL — may mean:*Computer languages ** Tcl (Tool Command Language), a computer programming language ** Terminal Control Language , used to program VeriFone devices ** Terminal Control Language , a Pick operating system command language ** Trader… …   Wikipedia

  • Tcl — Cette page d’homonymie répertorie les différents sujets et articles partageant un même nom. {{{image}}}   Sigles d une seule lettre   Sigles de deux lettres > Sigles de trois lettres …   Wikipédia en Français

  • TCL — (pronunciado /tí.quel/, originado del acrónimo en inglés Tool Command Language o lenguaje de herramientas de comando, actualmente se escribe como Tcl en lugar de TCL ), es un lenguaje de script creado por John Ousterhout, que ha sido concebido… …   Enciclopedia Universal

  • TCL — (Tool Command Language) interpreted programming language used to develop prototype applications and CGI scripts (Computers) …   English contemporary dictionary

  • TCL/TK — Tool Command Language Pour les articles homonymes, voir Tcl. Apparu en 1988 …   Wikipédia en Français

  • Tcl/Tk — Tool Command Language Pour les articles homonymes, voir Tcl. Apparu en 1988 …   Wikipédia en Français


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»