Домой / Уроки по Windows / Практическое программирование на Tcl и Tk. TCL как он есть Практическое программирование на tcl и tk

Практическое программирование на Tcl и Tk. TCL как он есть Практическое программирование на tcl и tk


Данная статья посвящена быстрому введению в азы языка tcl, который для меня стал первым промышленным языком, изученным самостоятельно по той же схеме (в виде уроков на сайте), которую будут использовать наши читатели. Прежде чем переходить к самому уроку - давайте разберемся, что же это за язык такой.
Язык Tcl
Tcl (от англ. Tool Command Language — «командный язык инструментов», читается «тикль» или «ти-си-эль») — скриптовый язык высокого уровня.
Tcl часто применяется совместно с графической библиотекой Tk (Tool Kit). Связку Tcl/Tk по-русски иногда называют «Так-тикль» (английский вариант — «тикль-ток»).
Области применения языка — быстрое прототипирование, создание графических интерфейсов для консольных программ (пакетов программ), встраивание в прикладные программы, тестирование. Также Tcl применяется в веб-разработке.

Немного истории Язык разработан Джоном Оустерхаутом (John Ousterhout) в то время, когда он работал в университете Калифорнии в Беркли. Первоначальной целью было создание универсального языка для встраивания в консольные приложения. Вслед за этим Оустерхаут расширил свой язык средствами создания графических интерфейсов — так появился Tcl/Tk.
За 4 года развития в университетских стенах Тикль-сообщество выросло до нескольких сотен тысяч программистов. В 1993 году было разработано первое объектно-ориентированное расширение — incr Tcl.
В 1994 г. Оустерхаут становится ведущим инженером проекта SunScript. В течение следующих 4 лет, став одним из проектов корпорации Sun, Тикль не только остался свободно распространяемой системой, но и значительно усовершенствовался, стал кросс-платформенным.
Заметный удар по популярности языка нанёс Ричард Столлман, опубликовав в сентябре 1994 г. в ряде новостных групп рекомендацию «Почему вы не должны использовать Tcl». В ней он на основании утверждений, что «Tcl разработан не как серьёзный язык программирования» и «Tcl имеет особый синтаксис, притягательный для хакеров из-за своей простоты. Но синтаксис Tcl кажется странным для большинства пользователей.», а также в связи с продвижением Emacs Lisp вынес вердикт: «проект GNU не собирается использовать Tcl в программном обеспечении GNU». Помимо субъективных претензий к дизайну языка, Столлман указал на объективный на тот момент недостаток — низкое быстродействие.
Тем не менее, рост количества разработчиков, активно использующих тикль, составил за этот период 600 %.
В 1998 г. в связи с Java-бумом и связанной с ним острой конкурентной борьбой корпорация уже не могла уделять тиклю прежнего внимания. Джон Оустерхаут покидает Sun и создаёт (при поддержке Sun) компанию Scriptics, продолжая развитие технологии Tcl/Tk. Это была одна из первых коммерческих программных фирм, чья деятельность строилась вокруг бесплатного свободного ПО.
Цветовое решение логотипа, принятое в 90-х гг. XX века
В марте 1998 года Оустерхаут пишет ставшую классической статью «Сценарии: высокоуровневое программирование для XXI века», в которой назвал скриптовые языки языками системной интеграции, потому что они ориентированы прежде всего на работу с объектами операционной среды, а не с элементарными данными. Это позволяет без написания тысяч строк кода двумя-тремя командами «склеивать» такие объекты в одно целое.
В том же году он выиграл за разработку языка 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 раз поднять быстродействие. В следующую модификацию Tcl 8.1 введена полноценная поддержка юникода, в ней впервые реализована многопоточность. В связи c этим релизом Оустерхаут заявил: «В целом 8.1 переводит Tcl в новую категорию, поскольку теперь его можно использовать для серверных приложений. Си, Си++ и Java можно по-прежнему использовать для создания частей приложений, критических с точки зрения производительности, а Tcl — для интеграции и создания интерфейсных компонентов».
В 2000 году фирма Scriptics была переименована в Ajuba Solutions, а затем куплена фирмой Interwoven, не заинтересованной в работе со свободным ПО. В связи с этим разработка Tcl была передана сообществу программистов. Так была сформирована Tcl Core Team.
На 9-й конференции по Tcl/Tk, проходившей в Ванкувере, была представлена виртуальная файловая система StarKit, обеспечившая новый, удобный для обычного пользователя способ распространения Tcl программ.
(Данный материал взят со всеми любимой Wikipedia: https://ru.wikipedia.org/wiki/Tcl)

А теперь немного моего личного мнения. Как таковой язык Tcl является прекрасным языком программирования, который имеет массу библиотек (его количество "батареек" сегодня одно из самых больших), выдержан временем (т.е. в нем уже нет детских болезней, как у того же Go), а так же - он по настоящему прост в изучении. Освоить его можно за пару дней! И при этом язык будет полезен как системному администратору (скрипты пишутся очень удобно), так и программисту.

TCL: причины низкой популярности Для начала огорчу тех, кто с пеной у рта кричит о том, что "Tcl не нужен" или "Tcl - мертв". Для опровержения последнего - посмотрите на дату выпуска последней версии интерпретатора Tcl/Tk.
Про первое - не нужный язык не станут использовать AOL, BMW, CPU за его создание не станут давать ACM Software System Award. В настоящий момент разработки на Tcl/Tk ведутся в основном в недрах компаний, которые пишут на данном языке программное обеспечение для внутреннего пользования. Поэтому говоря о непопулярности Tcl/Tk мы прежде всего говорим о его непопулярности среди разработчиков настольных пользовательских приложений.
Следующие аргумент, который выдвигают в качестве непопулярности Tcl/Tk - это то, что стандартный вид набора виджетов не красивый, как пример - приводят jabber-клиент tkabber. По данному заявлению стоит отметить - набор стандартных виджетов имеет по умолчанию значения атрибутов, которые соответствуют бородатому Motiff, внешней вид которого действительно является немного анохроническим.
Но зачем использовать значения по умолчанию? Опытный разработчик на Tcl/Tk способен сделать интерфейс по внешнему виду ничем не уступающий большинству приложений.
Далее - сегодня Тк поддерживает "темы" и внешне может подстраиваться под внешний вид графического окружения операционной системы, что делает программы на Tcl/Tk неотличимымы от их аналогов чисто внешне.
Существенным минусом для многих команд разработчиков коммерческого ПО стало то, что программы на языке до сих пор распространяются в виде исходных кодов, без предварительного перевода в байт-код, т.е. программное обеспечение написанное на Tcl/Tk является ПО с открытым исходным кодом. А большинство разработчиков коммерческого ПО избегают этого.
Среди разработчиков свободного ПО с открытым кодом популярность Tcl стала меньше благодаря FSF и Ричарду Столлману в частности. В сентябре 1994 году RMS надолго "утопил" продуктивные идеи Tcl/Tk своей рекомендацией "Почему вы не должны использовать Tcl" в котором концентрируется внимание на якобы невозможно сложном синтаксисе Tcl (приводя в качестве контраргумента язык с куда более тяжелым синтаксисом, но четкой семантикой, - Lisp) и о "подкупающей хакеров простоте Tcl". Не разобравшись с основными идеями "раширяемости" и "расширения" Тикл, RMS наносит последний удар, утверждая, что Tcl пригоден только для маленьких приложений и выносит вердикт: "Поэтому проект GNU не собирается использовать Tcl в программном обеспечении GNU". Особенно странно это ввиду того, что Lisp и Tcl имеют общие черты и идеи, в частности - та же расширяемость. Несмотря на все старания Столлмана Tcl так и не "потонул", а "лисп" не смог занять ведущую позицию среди языков для разработки настольных приложений.
Как видит пытливый ум - нет не одной объективной причины не изучать и не использовать Tcl. Перед тем как перейти к уроку, давайте еще пройдемся по самым часто задаваемым вопросам по этому языку.

Часто задаваемые вопросы Вопрос (В): Что такое Tcl?
Ответ (О): Tcl - это скриптовый язык программирования высокого уровня. Считается одним из трех классических скриптовых языков. До пришествия РНР использовался вместо последнего. Очень тесно взаимосвязан с тулкитом Tk, что позволяет в короткие сроки писать достаточно функциональные программы с GUI.
В: Зачем учить Tcl, ведь можно использовать любой скриптовый язык с привязкой к Tk?
О: Можно. Но лучше использовать любой тулкит в "родной" для него среде (код выглядит органичнее). Да и программы на чистом Tcl/Tk работают быстрее, чем при помощи мостов для Ruby/Tk, Perl/Tk и пр., так как тащат за собой обе среды исполнения. Так же страдает от этого переносимость программ и скриптов - для запуска файла будет требоваться установленную среду не только скриптового языка, на котором написана программа, но и Tcl/Tk (первый необходим как раз таки в качестве "моста").
В: Но есть же Lisp!
О: Да, он есть. И Tcl с ним некоторые программисты сравнивают. Даже называют "Tcl - Lisp On Drugs". Языки и правда похожи - работа со списками, метапрограммирование. Но есть и серьезные различия. Например, в Tcl все есть строка, а не символ.
В: Могу ли я писать на Tcl функционально?
О: Можете. Tcl позволяет писать в функциональном стиле.
В: Какие парадигмы поддерживает Tcl/Tk?
О: Императивную, функциональную, объектно-ориентированную. Функциональная с версии 8.6 поддерживается очень хорошо, в ней наконец-то была правильно реализована хвостовая рекурсия. Последняя - поддерживается давно, одно из самых известных ООП-расширений XOTcl реализовывает объектно-ориентированное программирование в стиле Smalltalk... Последнее время я прихожу к мнению, что Tcl уже является языком с реализацией (пусть и частичной) всех парадигм сразу.
В: С чего начать?
О: Для начала можно ознакомиться с этой статьей и следить за обновлениями=)
В: Какие есть реализации Tcl/Tk?
О: Как таковой Tcl/Tk один, его разработку сегодня ведет Tcl Core Team, но существуют также расширения для него: стандартная реализация Tcl,XOTcl: экзотикль(расширение для ООП), iTcl (Первое ООП расширение, Inct Tcl, на нем написана iWidgets), SNIT (объектный клей для Tcl, включен в стандартную библиотеку Tcl), STOOOP (ООП-расширение написанное на Tcl, так же сегодня входит в стандартную библиотеку)
В: Какие есть "сборки"?
О: Есть официальные исходные коды, которые любой желающий может скачать с официального сайта и собрать самостоятельно. Также есть дистрибутивы от сторонних команд: ActiveState Tcl (проприетарный, есть платная версия, под все основные ОС), WinTcl (более компактный, ориентирован на работу с ХОTcl, содержит Tloona и XOTcllde, как видно из названия - под Win), TclKit (достаточно компактный дистрибутив, ориентированный на использование iTcl, обладает собран в один пакет и имеет систему управления собственным содержимым, кросс-платформенный), dqkit ("TclKit на стеродидах, есть несколько вариантов сборки, кросс),Tcl/Tk Aqua (дистрибутив заточен исключительно под MacOS). Недавно появилась реализация Tcl для.Net - Eagle.
В: Какую IDE взять?
О: Vim, Emacs - прекрасные кастомизируемые редакторы, которые расширяются в полноценную IDE. Недостаток последнего - плохая поддержка синтаксиса последних версий Tcl. (g)Vim прекрасно поддерживает синтаксис последних версий без дополнительных настроек. Под Windows - ActiveState Komodo. Tloona - IDE для Tcl/Tk написанная на Tcl/Tk. <Требуется подробное описание>. XOTcllde - IDE как ClassBrowser для Smalltalk. Ориентированна на работу с XOTcl. Visual Tcl/Tk (vtcl) - мощная среда разработки на подобии Delphi или QtCreator с возможностью редактирования кода.
В: Какую литературу можно почитать?
О: По Tcl/Tk достаточно много англоязычных туториалов. Русский нашел только один (указал вышел). Из книг могу порекомендовать "Практическое программирование на Tcl и Tk, 4-ое издание" (Б.Б.Уэлш, К.Джонс, Д.Хоббс), на английском - "Tcl and Tk Programming for the Absolute Beginner" (Kurt Wall).

Установка Tcl Для того, чтобы начать программировать на Tcl требуется иметь установленную виртуальную машину, которая будет обрабатывать написаннный вами код. Давайте посмотрим как ее установить:
0) Для Calculate Linux/Gentoo: emerge dev-lang/tcl, emerge dev-lang/tk, emerge dev-tcltk/tcllib
1) Для Fedora: yum install tcl tk
2) Для Ubuntu: sudo apt-get install tcl tk
3) Для Windows и MacOS: проще всего использовать бинарные дистрибутивы. Качаем любой и устанавливаем в два клика.
4) Сборка Tcl/Tk из исходников. Скачайте исходники (лежат отдельно для Tcl и отдельно для Tk) с оф.сайта и выполните следующие команды для каждого архива: 4.1 Распаковка исходных файлов: $ tar zxf имя_файла.tar.gz
4.2 Перейдите в папку командой: $ cd имя_файла && cd unix
4.3. Выполните: $ ./configure --prefix=/opt --enable-gcc
(для Тк: $ ./configure —with-tcl=../../tcl8.5a5/unix —prefix=/opt —enable-gcc)
4.4 Затем: $ make
4.5. Потом: $ make test
4.6. И в завершениии: $ make install
Для запуска интерактивной среды наберите в терминале:
$ tclsh
Должен появиться символ %.

Первая программа
Давайте напишем классическую программу "Привет слова" на Tcl. Наберите следующий код:

puts "Hello, words!"
в качестве ответа вы увидите:

Hello, words!
Поздравляем! Вы написали первую программу на Tcl. Проста, не правда ли? Давайте остановимся на команде puts. Эта команда/функция выводит текст на любое стандартное устройство ввода/вывода (в нашем случае терминал). По умолчанию после вывода текста puts перемещает курсор на начало следующей строки.

Отмечу, что в данном уроке выводятся несколько слов, для этого они заключаются в двойные кавычки ("..."). В простых примерах этого урока кавычки и фигурные скобки работают одинаково. Но на самом деле между ними существует большая разница, но об этом мы поговорим чуть позже.

Команда puts по своей сути является функцией, т.к. неким элементом языка, который не только выполняет какие-либо действия, но и принимает в себя от одного до бесконечного множества аргументов (ближайший аналог - функции в математике). Если строка, которую мы выводим на экран, не была бы заключена в кавычки или фигурные скобки, интерпретатор Tcl посчитал бы каждое слово за отдельный аргумент и стал бы передавать его отдельно команде puts. Функция puts решит, что это несколько аргументов и в большинстве случаев выдаст огибку.

По своей сути командная строка в Tcl это просто список слов. Обрабатываетяс она по следующему принципу:
1. Первое слово - это сама команда (функция), которая должна быть исполнена.
2. Все следующие слова - аргументы или параметры функции.
Отметим, что в отличии от большинства языков, в Tcl командная строка заканчивается концом строки, т.е. символом начала новой строки или точкой с запятой(;). Но последний способ - не сильно хорошо, он будет понижать понятность вашего кода.

Что такое симпол новос троки? Это не видимый для вас символ, который подставляет в исходный текст вашей программы компьютер, когда нажимаете клавишу Enter. В таких языка, как Pure C он обозначается как "\n".

Так как программы бывают достаточно длинные, хорошим тоном и полезной практикой является оставлять в исходном коде комментарии к нему (некие объяснения, что делает тот или иной кусок кода вашей программы).

Puppy - маленький дистрибутив, но он предлагает широкий выбор языков программирования. По умолчанию Live-CD ничего не устанавливает для компиляции программ С или С++, однако, имеется дополнительный файл devx_xxx.sfs (где xxx - это номер версии Puppy, например, 210), который превращает Puppy в среду, полностью поддерживающую компиляцию С/С++ (также плюс компилятор FreeBASIC). Даже и без файла devx_xxx.sfs Live-CD содержит множество языков, включая обработку сценариев Ash/Bash, Tcl/Tk и PuppyBasic. Эта страница посвящена обзору программных возможностей Puppy…

Ash/Bash сценарии

Язык, уже полностью готовый к использованию в Puppy, это сценарий командной оболочки (command-shell scripting). Сценарий оболочек Unix/Linux существует испокон веков и ещё столько же будет существовать. Под «командной оболочкой» я понимаю пользовательский интерфейс, который вы используете при работе с командной строкой. Когда вы работаете под X (графическая оконная оболочка), командная строка находится в окне терминала, когда вы покидаете X, вы снова оказываетесь в командной строке.

Программа, которая запускается и взаимодействует с вами, называется командной оболочкой (command-shell), в Линуксе это обычно оболочка Bash. В Puppy у вас есть выбор между двумя оболочками, Bash и Ash.

Заметьте, что под X в окне терминала запускается Bash. Если вы выходите из X в командную строку, то запускается Ash. Для однозначного определения командной оболочки, с которой необходимо работать, в первой строке сценария следует поместить "#!/bin/bash" или "#!/bin/sh" (или "#!/bin/ash").

Сценарий оболочки (shell script) является настоящей программой, только он хранится в текстовом файле и не требует компиляции. Сценарии могут быть очень сложными, в Puppy их имеется большое количество.

Эта страничка - не учебник по разработке Ash/Bash сценариев - есть множество книг на эту тему, а также ссылок в Интернете. Парочку таких ссылок вы найдёте здесь: "Advanced Bash-Scripting Guide" , "Bash Programming --- Introduction HOWTO" .

Всё, что вам нужно для написания Ash/Bash сценариев, это текстовый редактор, в Puppy есть два консольных редактора, e2 и MP , и два GUI редактора, Geany и Leafpad . Geany и MP интересны тем, что могут подсвечивать синтаксис для Ash/Bash сценариев. (см. также ML ниже в разделе Tcl/Tk)

Получайте удовольствие, разрабатывая сценарии для Puppy!

В Puppy есть масса документации и инструментов, помогающих разрабатывать сценарии:

    gtk-shell - очень гибкая, простая и маленькая GTK альтернатива предыдущим xmessage и Xdialog. Может показывать/редактировать файлы, показывать диалог выбора файла, принимать пользовательский текст, работать с кнопками выбора. Документации нет. Для справки просто наберите (в консоли) # gtk-shell -h .

    gtkdialog3 - ещё одна альтернатива для gtk-shell, xmessage и Xdialog. gtkdialog - это GTK2 приложение, которое читает XML -файл, описывающий формат диалога и взаимодействие с пользователем, с его помощью можно создавать невероятно изощрённый GUI (графический пользовательский интерфейс). Впервые эта программа была представлена в Puppy 0.9.7. Я думаю, что gtkdialog венчает нашу подборку (pick of the branch)!

В настоящий момент в Puppy имеется две версии gtkdialog, это gtkdialog2 и gtkdialog3 - предпочтительней использовать последнюю версию, так как, скорее всего, она одна останется в Puppy - другими словами, всегда запускайте бинарник gtkdialog3 .

Вот некоторые сценарии, использующиеся в Puppy:

/usr/sbin/pmount /usr/sbin/timezone-set

Tcl/Tk

Tcl это интерпретируемый язык сценариев, подобный описанным выше Ash-сценариям, и с той же лёгкостью Tcl-программа может использоваться в качестве сценария командной оболочки. Однако, чем действительно Tcl выделяется, так это библиотекой Tk, которая превращает Tcl в полноценную программную среду с GUI (графическим пользовательским интерфейсом). Существует много дополнительных библиотек для Tcl, в Puppy на настоящий момент имеется

    Tk (стандартная библиотека, обеспечивающая все базовые элементы управления (widgets)),

    Img (Tcl/Tk работают только с gif-файлами, эта библиотека добавляет работу с jpeg, png и др.),

    Combobox (сложный элемент с выпадающим списком),

    BWidget (ещё несколько сложных элементов управления).

Всё это вы найдёте в каталоге /usr/lib .

Много приложений в Puppy (также и в PET-пакетах) написаны на Tcl/Tk, это Slidedraw , TkZip , CDTAR , XS , snamp , tkpppoe , phv , TkDVD и regexpviewer .

Так почему же Tcl? Почему не Perl или Java? Для меня лично имеются три причины: существует огромное количество доступных GUI приложений, Tcl/Tk действительно мал по размеру и это язык, который очень прост для изучения. Последняя причина чрезвычайно важна, так как благодаря этому я могу легко читать код, написанный другими людьми, чего не скажешь о языках, основанных на Си-синтаксисе, имеющих трудный для понимания код (C++, Java).

Практическое программирование на Tcl и Тк ЧЕТВЕРТОЕ ИЗДАНИЕ Practical Programming in Tcl and Tk FOURTH EDITION Brent B. Welch Ken Jones with Jeffrey Hobbs PRENTICE HALL PTR PRENTICE HALL PTR Upper Saddle River, NJ 07458 www.phptr.com Практическое программирование на Tcl и Тк ЧЕТВЕРТОЕ ИЗДАНИЕ Брент Уэлш Кен Джонс при участии Джеффри Хоббса Москва Санкт-Петербург Киев 2004 ББК 32.973.26-018.2.75 У98 УДК 681.3.07 Издательский дом "Вильяме" Зав. редакцией С.Н. Тригуб Перевод с английского и редакция В. В. Вейшмана По общим вопросам обращайтесь в Издательский дом "Вильяме" по адресу: [email protected], http://www.williamspublishing.com Уэлш, Брент Б., Джонс, Кен, Хоббс, Джеффри У98 Практическое программирование на Tcl и Тк, 4-е издание. : Пер. с англ. - М. : Издательский дом "Вильяме", 2004, - 1136 с. : ил. - Парал. тит. англ. ISBN 5-8459-0661-Х (рус.) В этой книге рассматривается широкий спектр вопросов, связанных с применением языка Tcl и расширения Тк. Здесь обсуждаются базовые средства составления Tcl-программ, динамическая генерация команд, использование регулярных выражений, ввод-вывод, управляемый событиями, компоненты Тк, работа с изображениями и цветом, установление соответствия между событиями и Tcl-командами средства конфигурирования и другие важные вопросы. Авторы также уделили внимание программированию Тс1-расширений на языке С. Данная книга будет полезна как опытным разработчикам, так и начинающим программистам. ББК 32.973.26-018.2.75 Все названия программных продуктов являются зарегистрированными торговыми марками соответствующих фирм. Никакая часть настоящего издания ни в каких целях не может быть воспроизведена в какой бы то пи было форме и какими бы то ни было средствами, будь то электронные или механические, включая фотокопирование и запись на магнитный носитель, если на это нет письменного разрешения издательства Prentice Hall PTR. Authorized translation from the English language edition published by Prentice Hall PTR, Copyright © 2003 by Pearson Education, Inc. All rights reserved. No part of this book may be reproduced, stored in retrieval system or transmitted in any form or by any means, electronic, mechanical, photocopying, recording, or otherwise without either the prior written permission о the Publisher. Russian language edition published by Williams Publishing House according to the Agreement with R&I Enterprises International, Copyright © 2004 ISBN 5-8459-0661-Х (рус.) © Издательский дом "Вильяме", 2004 ISBN 0-13-038560-3 (англ.) © Pearson Education, Inc., 2003 Оглавление Часть I. Основы Tcl 55 Глава 1. Общие сведения о языке Tcl 56 Глава 2. Первые шаги 85 Глава 3. Простой CGI-сценарий 93 Глава 4. Обработка строк 114 Глава 5. Списки 133 Глава 6. Управляющие структуры 147 Глава 7. Процедуры и область видимости 163 Глава 8. Массивы Tcl 172 Глава 9. Работа с программами и файлами 186 Часть П. Расширенные средства Tcl 215 Глава 10. Цитирование и использование команды eval 217 Глава 11. Регулярные выражения 234 Глава 12. Библиотеки сценариев и пакеты 274 Глава 13. Сведения об интерпретаторе и средства отладки 291 Глава 14. Пространства имен 320 Глава 15. Интернационализация 337 Глава 16. Программы, управляемые событиями 350 Глава 17. Использование сетевых гнезд 362 Глава 18. Web-сервер TclHttpd 388 Глава 19. Работа с несколькими интерпретаторами и использование Safe-Tcl 432 Глава 20. Safe-Tk и дополнительный модуль браузера 459 Глава 21. Многопотоковые Тс1-сценарии 472 Глава 22. Tclkit и Starkit 508 Часть III. Основы Тк 529 Глава 23. Общие сведения о Тк 530 Глава 24. Тк в примерах 543 Глава 25. Диспетчер компоновки раек 566 Глава 26. Диспетчер компоновки grid 587 Глава 27. Диспетчер компоновки place 599 б Оглавление Глава 28. Компонент panedwindow 608 Глава 29. Связывание команд с событиями 615 Часть IV. Компоненты Тк 637 Глава 30. Кнопки и меню 639 Глава 31. База данных ресурсов 667 Глава 32. Простые компоненты Тк 681 Глава 33. Полосы прокрутки 698 Глава 34. Поля редактирования и инкрементные регуляторы 708 Глава 35. Окна списков 724 Глава 36. Текстовый компонент 738 Глава 37. Компонент canvas 771 Часть V. Особенности работы Тк 813 Глава 38. Выделение данных и буфер обмена 815 Глава 39. Диалоговые окна и фокус ввода 825 Глава 40. Атрибуты компонентов Тк 840 Глава 41. Цвет, изображения и курсоры 850 Глава 42. Шрифты и текстовые атрибуты 869 Глава 43. Команда send 885 Глава 44. Диспетчеры окон 896 Глава 45. Поддержка пользовательских установок 915 Глава 46. Интерфейс для определения связываний 929 Часть VI. Программирование на языке С 937 Глава 47. С-программы и язык Tcl 938 Глава 48. Компиляция Tcl и программных расширений 985 Глава 49. Создание компонентов Тк на языке С 1002 Глава 50. Библиотеки С 1033 Часть VII. Изменения в составе Tcl и Тк 1059 Глава 51. Tcl 7.4/Тк 4.0 1060 Глава 52. Tcl 7.5/Тк 4.1 1069 Глава 53. Tcl 7.6/Тк 4.2 1074 Глава 54. Тс1/Тк 8.0 1077 Глава 55. Тс1/Тк 8.1 1086 Глава 56. Тс1/Тк 8.2 1091 Глава 57. Тс1/Тк 8.3 1094 Глава 58. Тс1/Тк 8.4 1101 Глава 59. Содержимое компакт-диска 1112 Предметный указатель 1115 Содержание Введение 38 Некоторые аргументы в пользу выбора Tcl 39 Версии Tcl и Тк 42 Расширения Tcl и Тк 44 Tcl в World Wide Web 44 Ftp-архивы 45 Группы новостей 45 На кого рассчитана эта книга 45 Как работать с данной книгой 46 Примеры программ 46 Соглашения о представлении материала 46 Пиктограммы 47 Как организована данная книга 47 Особенности четвертого издания книги 49 Благодарности за помощь в подготовке первого издания книги 49 Благодарности за помощь в подготовке второго издания книги 51 Благодарности за помощь в подготовке третьего издания книги 52 Благодарности за помощь в подготовке четвертого издания книги 52 Как связаться с автором книги 53 Ждем ваших отзывов 53 Часть I. Основы Tcl 55 Глава 1. Общие сведения о языке Tcl 56 Команды Tcl 57 Hello, World! 57 Переменные 58 8 Содержа н Подстановка команд 59 Математические выражения 60 Подстановка символов, представленных с помощью обратной косой черты 61 Группировка с помощью фигурных скобок и двойных кавычек 63 Особенности использования квадратных скобок 64 Группировка перед подстановкой 64 Группировка математических выражений с помощью фигурных скобок 65 Примеры подстановки 66 Процедуры 66 Пример вычисления факториала 68 Дополнительные сведения о переменных 70 Особенности применения различных символов в именах переменных 71 Команда unset 72 Проверка наличия переменных 72 Дополнительные сведения о математических выражениях 72 Комментарии 74 Правила подстановки и группировки 75 Особенности группировки и подстановки 77 Справочная информация 79 Последовательности символов, начинающиеся с обратной косой черты 79 Арифметические операции 80 Встроенные математические функции 80 Основные Tcl-команды 81 Глава 2. Первые шаги 85 Кохманда source 86 Tcl-сценарии в системе Unix 86 Главное меню Windows 88 Macintosh OS 8/9 и ResEdit 88 Macintosh OS X 89 Команда console 90 Параметры командной строки 90 Опции кохмандной строки, отображаемые программой wish 91 Предопределенные переменные 92 Содержание 9 Глава 3. Простой CGI-сценарий 93 Общие сведения о языке HTML 94 Стандарт CGI и динамическое создание Web-страниц 96 Сценарий guestbook.cgi 97 Использование библиотечного файла 98 Формирование начала HTML-документа 99 Данные, генерируемые CGI-сценарием 101 Использование массива Tcl в качестве базы данных 103 Создание HTML-форм и обработка данных, введенных пользователем 105 Форма newguest.html 105 Пакеты ncgi и cgi.tcl 107 Сценарий newguest.cgi 107 Сохранение данных с помощью Тс1-сценариев 109 Обработка ошибок в CGI-сценариях ПО Усовершенствование сценария 113 Глава 4. Обработка строк 114 Команда string 114 Индексы 117 Строки в составе выражений 118 Сравнение строк с шаблонами 119 Классы символов 121 Преобразование с помощью карты символов 122 Команда append 123 Команда format 123 Команда scan 127 Команда binary 127 Шаблоны форматирования 128 Примеры 130 Двоичные данные и обмен с файлами 132 Источники дополнительных сведений 132 Глава 5. Списки 133 Списки в языке Tcl 134 Формирование списков 136 Команда list 136 Команда lappend 137 Команда lset 138 Команда concat 138 Извлечение элементов списков: команды llength, lindex и Irange 139 Изменение списков: команды linsert и lreplace 140 10 Содержание Поиск в списке: команда lsearch 141 Сортировка списков: команда lsort 143 Команда split 144 Команда join 146 Источники дополнительных сведений 146 Глава 6. Управляющие структуры 147 Выражение if then else 148 Команда switch 150 Комментарии в составе команды switch 152 Команда while 152 Команда foreach 153 Использование нескольких переменных цикла 155 Работа с несколькими списками 156 Команда for 156 Команды break и continue 157 Команда catch 157 Обработка ситуаций, не являющихся ошибочными 159 Команда error 159 Команда return 161 Глава 7. Процедуры и область видимости 163 Команда ргос 163 Изменение имен команд с помощью команды rename 165 Область видимости 166 Команда global 167 Передача имени с помощью команды upvar 168 Создание псевдонимов с помощью команды upvar 169 Использование команды upvar для поддержки состояния объектов 170 Пространства имен и команда upvar 170 Команды, работающие с именами переменных 171 Глава 8. Массивы Tcl 172 Языковые средства для работы с массивами 172 Индексы 173 Переменные массивов 174 Команда array 175 Преобразование массивов в списки 176 Передача имен массивов 177 Создание структур данных на базе массивов 178 Простые записи 178 Содержание 11 Стек 180 Список массивов 181 Простая база данных 183 Альтернативы использованию массивов 184 Глава 9. Работа с программами и файлами 186 Запуск программ с помощью команды exec 186 Переменная auto_noexec 189 Особенности выполнения команды exec в системе Windows 189 AppleScript в системе Macintosh 189 Команда file 190 Имена файлов на различных платформах 192 Формирование пути: команда file join 193 Выделение компонентов пути: команды split, dirname, tail 195 Действия с файлами и каталогами 196 Копирование файлов 196 Создание каталогов 196 Фиксированные и символьные ссылки 197 Удаление файлов 197 Переименование файлов и каталогов 198 Атрибуты файлов 198 Использование команд ввода-вывода 201 Открытие файлов 202 Создание канала связи с процессом 204 Расширение Expect 205 Чтение и запись данных 205 Команды puts и gets 206 Команда read 206 Окончание строки символов 207 Произвольный доступ к данным 208 Закрытие каналов ввода-вывода 209 Текущий каталог: команды cd и pwd 209 Действия с файлами с использованием команды glob 209 Расширение символа ~ 211 Команды exit и pid 212 Переменные окружения 212 Команда registry 213 Часть II. Расширенные средства Tcl 215 Глава 10. Цитирование и использование команды eval 217 Формирование кода с помощью команды list 218 12 Содержание Команда eval 218 Команды, выполняющие конкатенацию параметров 220 Команды, обеспечивающие обратный вызов 221 Командный префикс 221 Динамическое формирование процедур 222 Выполнение конкатенации в команде eval 224 Использование команды eval в процедуре оболочки 224 Проблемы с цитированием в команде eval 227 Команда uplevel 229 Команда subst 232 Обработка строк с помощью команды subst 233 Глава 11. Регулярные выражения 234 В каких случаях целесообразно использовать регулярные выражения 235 Решение часто возникающих проблем 236 Правила записи регулярных выражений 237 Сравнение символов 237 Наборы символов 237 Итераторы 238 Оператор выбора 239 Использование якорей 240 Использование обратной косой черты 240 Порядок установления соответствия 241 Выделение подшаблонов 242 Расширенные регулярные выражения 242 Совместимость с шаблонами, поддерживаемыми в Tcl 8.0 243 Последовательности, начинающиеся с обратной косой черты 244 Классы символов 244 "Экономное" сопоставление 245 Итераторы с ограниченным числом повторений 246 Обратные ссылки 247 Упреждающее сравнение 247 Коды символов 248 Элементы замены 249 Классы эквивалентности 249 Сравнение, чувствительное к переводу строки 249 Встроенные опции 250 Открытый синтаксис 250 Синтаксис регулярных выражений 251 Команда regexp 255 Содержание 13 Шаблон для разбора URL 257 Проблемы, возникающие при использовании итераторов 260 Примеры регулярных выражений 260 Команда regsub 262 Преобразование данных в программу с помощью regsub 263 Декодирование URL 263 Разбор CGI-параметров 265 Декодирование HTML-примитивов 267 Простая программа разбора HTML-кода 269 Удаление HTML-комментариев 272 Команды, использующие регулярные выражения 272 Глава 12. Библиотеки сценариев и пакеты 274 Доступ к пакетам: переменная auto_path 275 Использование пакетов 276 Автоматическая загрузка пакетов 277 Пакеты, реализованные в виде С-программ 278 Порядок загрузки пакетов 279 Команда package 280 Создание библиотек с помощью файла tcllndex 281 Команда unknown 283 Автозагрузка 283 Запрет использования библиотеки: auto_noload 284 Соглашения, действующие при интерактивной работе 285 Автоматический вызов программ 285 Предыстория вызова команд 285 Сокращения имен команд 285 Среда оболочки Tcl 285 Расположение библиотеки сценариев Tcl 286 Процедура tcl_findLibrary 287 Стиль программирования 288 Префиксы имен процедур 288 Глобальные массивы и представление переменных состояния 289 Официальные руководства 289 Глава 13. Сведения об интерпретаторе и средства отладки 291 Команда clock 292 Команда info 296 Переменные 297 Процедуры 297 Стек вызова 300 Выполнение команд 301 14 Содержание Сценарии и библиотеки 302 Номера версий 303 Среда выполнения 303 Выполнение программ на различных платформах 304 Контроль переменных и команд 305 Контроль выполнения команд 306 Переменные, предназначенные только для чтения 307 Создание элементов массива с помощью команды trace 308 Предыстория вызова команд 309 Вызов команды history 310 Обращение к предыстории в Tcl и С shell 311 Отладка 312 Tcl Dev Kit 313 Отладчик с расширенными возможностями 314 Инструмент Checker 314 Инструмент Compiler 314 Инструмент TclApp 315 Инструмент Service Manager 315 Инструмент Inspector 315 Прочие инструменты 315 Консоль tkcon 316 Critcl 316 Команда bgerror 316 Команда tkerror 316 Контроль производительности программ 317 Информация о времени в файле протокола 317 Tcl-компилятор 318 Глава 14. Пространства имен 320 Использование пространств имен 321 Переменные в пространствах имен 323 Составные имена 324 Поиск команд 325 Вложенные пространства имен 326 Импортирование и экспортирование процедур 327 Пространства имен и обратный вызов 329 Интроспекция 330 Команда namespace 331 Преобразование существующих пакетов для работы с пространствами имен 332 Объектная система 333 Содержание 15 Объектная система xotcl 333 Замечания 334 Имена компонентов, изображений и интерпретаторов 334 Команда variable в глобальной области видимости 334 Автозагрузка и процедура auto_import 334 Пространства имен и команда uplevel 335 Особенности именования пространств имен 335 Дополнительные операции 336 Глава 15. Интернационализация 337 Наборы символов pi кодировки 338 Системная кодировка 339 Кодирование файлов и команда fconfigure 340 Сценарии, представленные в различных кодировках 341 Unicode и UTF-8 341 Двоичная кодировка 342 Преобразование кодировок 343 Команда encoding 343 Каталоги сообщений 344 Определение локального языка 345 Управление файлами каталогов сообщений 346 Каталоги сообщений и пространства имен 347 Пакет msgcat 349 Глава 16. Программы, управляемые событиями 350 Цикл обработки событий Tcl 351 Команда after 351 Команда fileevent 352 Команда vwait 354 Команда fconfigure 356 Неблокирующий режим ввода-вывода 357 Команда fblocked 359 Буферизация 359 Преобразование символа конца строки 359 Обработка символа конца файла 360 Последовательные устройства 360 Кодировки 361 Настройка каналов ввода-вывода 361 16 Содержание Глава 17. Использование сетевых гнезд 362 Сетевые расширения Tcl 363 Scotty 363 Стандартная библиотека Tcl 363 HTTP 364 Гнезда на стороне клиента 364 Опции, используемые при создании клиентских гнезд 365 Серверные гнезда 366 Опции, используемые при создании серверных гнезд 367 Служба echo 367 Получение данных по протоколу HTTP 370 Proxy-серверы 371 Запрос HEAD 373 Запросы GET и POST 375 Команда fcopy 379 Пакет http 380 Команда http::config 381 Команда http::geturl 381 Команда http::formatQuery 385 Команды http::register и http::unregister 385 Команда http::reset 385 Команда http::cleanup 386 Basic Authentication 386 Глава 18. Web-сервер TclHttpd 388 Интеграция TclHttpd с прикладными программами 389 Архитектура TclHttpd 390 Добавление кода к TclHttpd 391 Модификация главной программы 392 Обработчики доменов 392 Состояние соединения и данные запроса 393 Пакеты html и ncgi 394 Передача клиенту результатов обработки запроса 394 Application Direct 394 Обработка данных, содержащихся в запросе 396 Работа с МШЕ-типами 398 Типы документов 398 Шаблоны HTML + Tcl 400 Размещение Tcl-кода 401 Шаблоны и структура Web-узла 402 Содержание 17 Использование переменных для хранения информации о Web-узле 406 Обработчики данных форм 407 Обработчики Application Direct 408 Шаблоны для обработчиков данных форм 411 Формы самопроверки 411 Пакет html 413 Назначение процедур 415 Стандартные модули Application Direct 419 Информация о состоянии сервера 420 Отладка 420 Передача почтовых сообщений 422 Дистрибутивный пакет TclHttpd 424 Запуск сервера 424 Состав дистрибутивного пакета 425 Настройка сервера 426 Опции командной строки 426 Имя сервера и номер порта 427 Идентификатор пользователя и группы 428 Адрес администратора Web-узла 428 Корневой каталог документов 428 Различные установки для работы с документами 429 Шаблоны документов 430 Файлы протоколов 430 Каталоги CGI 431 Глава 19. Работа с несколькими интерпретаторами и использование Safe-Tcl 432 Команда interp 433 Создание интерпретаторов 435 Иерархия интерпретаторов 436 Имя интерпретатора в роли команды 437 Использование команды list в составе interp eval 437 Защищенные интерпретаторы 438 Псевдонимы команд 439 Интроспекция псевдонимов 440 Скрытые команды 441 Подстановка 442 Поддержка ввода-вывода защищенными интерпретаторами 444 Защищенная база 446 Политики безопасности 448 18 Содержание Ограничение доступа к гнездам 448 Ограничения на использование временных файлов 451 Защищенная команда after 456 Глава 20. Safe-Tk и дополнительный модуль браузера 459 Тк в ведомых интерпретаторах 460 Встроенные окна Тк 460 Ограничения Safe-Tk 461 Дополнительный модуль браузера 462 Переменные embed_args и plugin 463 Пример дополнительного модуля 464 Установка дополнительного модуля 464 Политики безопасности и дополнительный модуль 465 Пакет browser 467 Настройка политик безопасности 468 Файл config/plugin.cfg 469 Конфигурационные файлы для политик 470 Наборы возможностей 470 Создание новой политики безопасности 471 Глава 21. Многопотоковые Тс1-сценарии 472 Что такое поток 473 Поддержка потоков в Tcl 474 Подготовка Tcl-интерпретатора с поддержкой потоков 474 Использование расширений с многопотоковыми сценариями 475 Использование расширения Thread 476 Создание потоков 476 Создание соединяемых потоков 478 Передача сообщений потокам 481 Передача синхронных сообщений 481 Передача асинхронных сообщений 483 Сохранение и освобождение потоков 484 Обработка ошибок 485 Разделяемые ресурсы 486 Управление каналами ввода-вывода 487 Доступ к файлам из различных потоков 487 Передача каналов между потоками 488 Разделяемые переменные 493 Мютексы и переменные условий 495 Мютексы 495 Переменные условий 496 Пулы потоков 499 Содержание 19 Команды пакета Thread 501 Пространство имен thread 501 Пространство имен tsv 504 Пространство имен tpool 506 Глава 22. Tclkit и Starkit 508 Использование Tclkit 509 Структура файла Starkit 510 Доставка приложений в виде файлов Starkit 510 Виртуальные файловые системы 511 Обращение к содержимому ZIP-файла с помощью VFS 512 Использование sdx для сборки приложений 513 Создание простого файла Starkit 513 Просмотр содержимого Starkit-файла 514 Стандартная организация пакета 514 Создание файла Starpack 515 Использование виртуальной файловой системы пакета Starkit 515 Создание tclhttpd.kit 517 Создание разделяемых файлов Starkit 519 Metakit 521 Модель данных Metakit 522 Обращение к базе данных Metakit 522 Создание просмотров Metakit 525 Сохранение данных в Starkit-файле 526 Wikit и Wiki 527 Особенности применения Starkit-файлов 527 Наборы документов 527 Самообновляющиеся приложения 528 Простые инсталляторы 528 Часть III. Основы Тк 529 Глава 23. Общие сведения о Тк 530 Тк-программа "Hello, World!" 532 Именование компонентов Тк 534 Настройка компонентов Тк 535 Атрибуты компонентов Тк и база ресурсов 536 Справочная информация Тк 537 Команды Тк 538 Команды для создания компонентов 538 Команды для выполнения действий с компонентами 539 Процедуры поддержки 540 20 Содержание Наборы компонентов 541 BLT 541 Tix 542 и 542 BWidgets 542 TkTable 542 Глава 24. Tk в примерах 543 ExecLog 543 Заголовок окна 546 Фрейм для кнопок 546 Командные кнопки 547 Текстовая метка и элемент ввода 547 Обработка нажатий клавиш и фокус ввода 547 Размеры текста и полоса прокрутки 548 Процедура Run 549 Процедура Log 550 Процедура Stop 550 Работа на различных платформах 551 Браузер 552 Изменение размеров окон 556 Управление состоянием 556 Поиск файлов 556 Каскадное меню 558 Текстовый компонент, предназначенный только для чтения 559 Тс1-оболочка 559 Текстовые маркеры, дескрипторы и связывание 563 Использование нескольких интерпретаторов 563 Внешний вид окон 564 Глава 25. Диспетчер компоновки pack 566 Размещение относительно направления 567 Размеры окон и команда pack propagate 568 Горизонтальное и вертикальное размещение 568 Модель полостей 570 Пространство компоновки и пространство отображения 572 Опция -fill 572 Внутреннее дополнение, задаваемое с помощью опций -ipadx и -ipady 573 Внешнее дополнение, задаваемое с помощью опций -padx и-pady 575 Изменение размеров окон и опция -expand 576 Содержание 21 Фиксация 578 Очередь компоновки 580 Интроспекция 581 Особенности компоновки полос прокрутки 581 Выбор родительского компонента при компоновке 582 Исключение компонента из очереди компоновки 583 Правила компоновки 583 Команда pack 584 Стек окон 586 Глава 26. Диспетчер компоновки grid 587 Размещение компонентов в виде таблицы 587 Опция -sticky 588 Внешнее дополнение, реализуемое с помощью опций -padx и-pady 590 Внутреннее дополнение, реализуемое с помощью опций -ipadx и -ipady 590 Размещение нескольких компонентов в одной ячейке 591 Объединение строк и столбцов 592 Атрибуты строк и столбцов 593 Дополнение строк и столбцов 593 Минимальный размер ячейки 594 Поддержка окон с изменяемыми размерами 594 Опция -uniform 596 Команда grid 597 Глава 27. Диспетчер компоновки place 599 Общие сведения о диспетчере компоновки place 599 Управление панелями 601 Разбор параметров и поддержка состояния 603 Выравнивание фреймов 603 Связывание событий 604 Управление размещением фреймов 605 Команда place 606 Глава 28. Компонент panedwindow 608 Использование panedwindow 608 Управление содержимым панелей 609 Программирование компонента panedwindow 611 Атрибуты panedwindow 613 22 Содержание Глава 29. Связывание команд с событиями 615 Команда bind 616 Команда bindtags 617 Обработка нажатий клавиш и фокус ввода 619 Использование команд break и continue 620 Определение новых дескрипторов связывания 620 Описание событий 621 События клавиатуры 623 События мыши 624 Прочие события 625 Связывания для окон верхнего уровня 626 Модификаторы 626 Последовательности событий 629 Виртуальные события 631 Генерация событий 632 Информация о событиях 633 Синтаксис команды event 633 Ключевые слова событий 634 Часть IV. Компоненты Тк 637 Глава 30. Кнопки и меню 639 Команды, вызываемые посредством кнопок, и области видимости 640 Кнопки, связанные с Тс1-переменными 645 Атрибуты кнопок 647 Операции с кнопками 650 Меню и menubutton 651 Строка меню 653 Системные меню 654 Контекстные меню 654 Меню опций 654 Расположение пунктов меню в несколько столбцов 655 События меню 655 Выбор пунктов меню с помощью клавиатуры 655 Виртуальные события меню 656 Выполнение действий с меню 656 Атрибуты меню 658 Пакет для работы с меню по именам 661 Комбинации клавиш для доступа к меню 665 Содержание 23 Глава 31. База данных ресурсов 667 Общие сведения о ресурсах 667 Шаблоны ресурсов 668 Загрузка файла базы данных 670 Включение записей в базу данных 671 Обращение к базе данных 672 Кнопки, определяемые пользователем 672 Меню, определяемые пользователями 674 Приложение и пользовательские ресурсы 677 Особенности подстановки переменных 679 Глава 32. Простые компоненты Тк 681 Фреймы и окна верхнего уровня 682 Атрибуты компонентов frame, labelframe и toplevel 682 Использование компонента labelframe 684 Включение других приложений 685 Стили окон верхнего уровня 686 Компонент label 687 Атрибуты width и wrapLength 688 Атрибуты компонента label 689 Компонент message 690 Атрибуты компонента message 692 Выравнивание текста, содержащегося в компонентах label и message 693 Компонент scale 693 Связывания для компонента scale 694 Атрибуты компонента scale 695 Программирование линейных регуляторов 696 Команда bell 697 Глава 33. Полосы прокрутки 698 Использование полос прокрутки 698 Протокол взаимодействия с полосами прокрутки 700 Операция set полосы прокрутки 701 Операции xview и yview 702 Компонент scrollbar 703 Связывания для полос прокрутки 704 Атрибуты компонента scrollbar 705 Программирование полос прокрутки 706 24 Содержание Глава 34. Поля редактирования и инкрементные регуляторы 708 Использование полей редактирования 709 Проверка содержимого полей редактирования 710 Советы по использованию полей редактирования 712 Использование компонента spinbox 713 Связывания для компонентов entry и spinbox 716 Атрибуты компонентов entry и spinbox 718 Программирование полей редактирования и инкрементных регуляторов 721 Глава 35. Окна списков 724 Использование окон списков 724 Выполнение действий с содержимым компонента listbox 724 Программирование компонента listbox 725 Компонент listbox 728 Связывания для компонента listbox 731 Режим выделения Browse 731 Режим выделения single 732 Режим выделения extended 732 Режим выделения multiple 734 Связывания для прокрутки 734 Виртуальные события для компонента listbox 735 Атрибуты компонента listbox 735 Режим сетки 737 Глава 36. Текстовый компонент 738 Индексы 739 Вставка и удаление текста 740 Индексные выражения 740 Сравнение индексов 741 Текстовые маркеры 742 Направление маркера 743 Дескрипторы 743 Атрибуты дескрипторов 744 Использование атрибутов нескольких дескрипторов 746 Междустрочный интервал и выравнивание 747 Табуляторы 750 Выделение 750 Связывания для дескрипторов 751 Поиск текста 753 Встроенные компоненты 754 Встроенные изображения 756 Содержание 25 Чтение содержимого текстового компонента 757 Получение информации о дескрипторах 758 Получение сведений о маркерах 759 Дамп содержимого компонента 759 Отмена выполненных действий 760 Связывания и события 762 Связывания для текстового компонента 762 Виртуальные события 764 Операции с текстом 765 Атрибуты текстового компонента 769 Глава 37. Компонент canvas 771 Координаты холста 771 Программа Hello, World! 773 Дескрипторы холста 774 Линейный регулятор для определения минимального и максимального значения 776 Объекты холста 782 Состояние холста и его объектов 783 Штриховые линии 784 Дуги 785 Битовые карты 786 Изображения 787 Линии 788 Овалы 791 Многоугольники 791 Прямоугольники 792 Текстовые объекты 793 Окна 799 Операции над компонентом canvas 802 Генерация Postscript-описаний 805 Атрибуты компонента canvas 808 Советы 810 Экранные координаты и координаты холста 810 Представление координат 810 Масштабирование и вращение 810 Работа с ресурсами 811 Объекты, определяемые посредством большого количества точек 811 Выбор объектов холста 811 26 Содержание Часть V. Особенности работы Тк 813 Глава 38. Выделение данных и буфер обмена 815 Модель выделения 815 Команда selection 818 Команда clipboard 819 Обработчики выделений 820 Обработчик выделения для холста 820 Глава 39. Диалоговые окна и фокус ввода 825 Стандартные диалоговые окна 826 Окна сообщений 826 Диалоговые окна для работы с файлами и каталогами 827 Диалоговые окна для выбора цвета 829 Диалоговые окна, определяемые разработчиком 829 Фокус ввода 830 Команда focus 831 Передача фокуса ввода 831 Захват ввода 832 Команда tkwait 833 Удаление компонентов 834 Совместное использование команд focus, grab и tkwait 834 Диалоговое окно для ввода строки 836 Комбинации клавиш и фокус ввода 838 Анимация и команда update 838 Глава 40. Атрибуты компонентов Тк 840 Установка значения атрибутов 840 Размеры компонента 842 Обрамление и рельеф 845 Подсветка компонентов, обладающих фокусом ввода 846 Дополнение и точки фиксации 847 Глава 41. Цвет, изображения и курсоры 850 Работа с цветом 851 Цветовые палитры 853 Цветовые значения 853 Карты отображения цвета и визуальные классы 856 Битовые карты и изображения 858 Команда image 859 Битовые карты 860 Атрибут bitmap 860 Изображения photo 861 Содержание 27 Текстовый курсор 865 Курсор мыши 866 Глава 42. Шрифты и текстовые атрибуты 869 Именование шрифтов 870 Именованные шрифты 871 Системные шрифты 872 Шрифты Unicode 872 Имена шрифтов X Window 873 Особенности работы со шрифтами в ранних версиях Тк 874 Метрика шрифта 875 Команда font 876 Текстовые атрибуты 877 Размещение 877 Атрибуты, управляющие выделенным текстом 878 Использование сетки и изменение размеров 878 Программа, реализующая выбор шрифтов 879 Глава 43. Команда send 885 Возможности команды send 886 Команда send и авторизация X Window 887 Сценарий, осуществляющий передачу данных 888 Взаимодействие процессов 890 Удаленное выполнение eval с использованием сетевых гнезд 892 Глава 44. Диспетчеры окон 896 Команда win 896 Размеры, расположение и оформление окон верхнего уровня 897 Пиктограммы 900 Состояние сеанса 901 Прочие операции с диспетчером окон 903 Команда winfo 904 Передача команд между приложениями 905 Взаимосвязь между компонентами одного семейства 906 Размер компонента 906 Расположение компонентов 908 Виртуальное корневое окно 909 Работа с атомами и идентификаторами 910 Карты отображения цвета и визуальные классы 911 Команда tk 912 28 Содержание Глава 45. Поддержка пользовательских установок 915 Файлы, используемые приложением по умолчанию 915 Определение пользовательских установок 917 Интерфейс пользовательских установок 920 Управление файлом пользовательских установок 924 Отслеживание изменений в переменных пользовательских установок 926 Доработка пакета 927 Глава 46. Интерфейс для определения связываний 929 Совместная работа окон списков 932 Средства редактирования связываний 934 Сохранение и загрузка связываний 935 Часть VI. Программирование на языке С 937 Глава 47. С-программы и язык Tcl 938 Основные понятия 939 Основные подходы к написанию С-кода для Tcl-приложения 939 Командные процедуры С и объекты данных 940 SWIG 940 Инициализация Tcl 941 Вызов Тс1-сценариев 942 Использование библиотеки Tcl С 942 Создание загружаемых пакетов 944 Команда load 944 Процедура инициализации пакета 945 Использование Tcl_PkgProvide 946 Командная процедура С 947 Строковый командный интерфейс 948 Коды завершения командных процедур 950 Управление результирующими строками 950 Командный интерфейс Tcl_Obj 951 Управление счетчиком ссылок Tcl_Obj 953 Модификация значений Tcl_Obj 955 Проблемы, связанные с использованием разделяемых значений Tcl_Obj 956 Команда blob 958 Создание и удаление хэш-таблиц 958 Тс1_А11ос, ckalloc и malloc 961 Обработка параметров и использование Tcl_GetIndexFromObj 961 Содержание 29 Создание и удаление элементов хэш-таблицы 964 Формирование списка 965 Поддержка ссылок на значения Tcl_Obj 966 Использование Tcl_ Preserve и Tcl_ Release для защиты данных 967 Макрос CONST в Tcl 8.4 API 969 Действия со строками и интернационализация 970 Интерфейс DString 970 Преобразование наборов символов 971 Tcl_Main и Tcl_AppInit 972 Tk_Main 975 Цикл обработки событий 977 Вызов сценариев из С-программ 978 Разновидности Tcl_Eval 979 Отказ от Tcl_Eval 980 Глава 48. Компиляция Tcl и программных расширений 985 Стандартная структура каталогов 986 Дистрибутивный пакет 986 Структура инсталляционного каталога 987 Построение Tcl из исходных кодов 988 Инструменты configure и autoconf 989 Стандартные опции программы configure 991 Инсталляция 993 Использование библиотек-заглушек 993 Использование autoconf 995 Файл tcl.m4 995 Создание шаблонов 996 Пример расширения 996 Файл configure.in 997 Файл Makefile.in 998 Стандартные файлы заголовков 1000 Использование расширения 1000 Глава 49. Создание компонентов Тк на языке С 1002 Инициализация расширения 1003 Структура данных компонента 1004 Команда класса компонента 1005 Команда экземпляра компонента 1010 Установка и изменение значений атрибутов 1014 Определение атрибутов компонента 1019 Отображение часов 1025 30 Содержа н Поддержка оконных событий 1029 Освобождение ресурсов 1031 Глава 50. Библиотеки С 1033 Общие сведения о С-библиотеке Tcl 1034 Инициализация приложения 1034 Создание и удаление интерпретаторов 1034 Создание и удаление команд 1035 Пакеты и динамическая загрузка 1035 Управление результирующими строками 1035 Распределение памяти 1035 Работа со списками 1036 Разбор команд 1036 Конвейерная обработка 1037 Отслеживание действий интерпретатора 1037 Выполнение Тс1-команд 1037 Информация об ошибках 1038 Действия с Тс 1-переменными 1038 Обработка выражений 1039 Преобразование чисел 1039 Объекты Tcl 1039 Основные типы объектов 1039 Строковые объекты 1040 ByteArray для двоичных данных 1041 Динамические строки 1041 Наборы символов 1041 AssocData и структуры данных интерпретатора 1042 Хэш-таблицы 1042 Обработка опций 1043 Регулярные выражения и проверка строк 1043 Реализация цикла обработки событий 1043 Работа с файлами 1044 События таймера 1044 Обратные вызовы времени бездействия 1044 Ввод-вывод 1044 Драйверы каналов ввода-вывода 1045 Обработка имен файлов 1046 Получение информации о файловой системе 1046 Реализация виртуальной файловой системы 1047 Поддержка потоков 1047 Работа с сигналами 1048 Содержание 31 Нормальное завершение программы 1048 Macintosh 1048 Аварийное завершение 1048 Прочие процедуры 1048 Общие сведения о С-библиотеке Тк 1049 Главная программа и параметры командной строки 1049 Создание окон 1049 Имя приложения для команды send 1050 Настройка окон 1050 Опции командной строки 1050 Координаты окон 1050 Стек окон 1051 Информация об окнах 1051 Установка атрибутов компонента 1051 Выделение данных и буфер обмена 1051 Интерфейс цикла обработки событий 1051 Обработка оконных событий 1052 Связывание событий 1052 Захват событий клавиатуры 1052 Обработка ошибок графического протокола 1053 Использование базы данных ресурсов 1053 Управление битовыми картами 1053 Создание новых типов изображений 1053 Использование изображений в составе компонентов 1053 Изображения photo 1054 Поддержка объектов холста 1054 Диспетчеры компоновки 1054 Идентификаторы строк 1055 Карты отображения цвета и визуальные классы 1055 Обрамления с имитацией трехмерных эффектов 1056 Курсоры мыши 1056 Шрифты и отображение текста 1056 Графический контекст 1056 Выделение памяти для карты пикселей 1057 Экранные единицы измерения 1057 Использование рельефа 1057 Позиция фиксации 1057 Стили концов линий 1057 Стили соединения линий 1057 Штриховые линии 1058 Стили выравнивания текста 1058 32 Содержание Атомы 1058 Управление идентификаторами ресурсов 1058 Дескрипторы приложений Windows 1058 Часть VII. Изменения в составе Tcl и Тк 1059 Глава 51. Tcl 7.4/Тк 4.0 1060 Оболочка wish 1060 Средства, поддержка которых была прекращена 1060 Операция cget 1061 Подсветка при наличии фокуса ввода 1061 Связывания 1061 Полосы прокрутки 1062 Команда pack 1062 Поддержка фокуса ввода 1063 Команда send 1063 Внутреннее дополнение 1064 Значения переключателей опций 1064 Поле редактирования 1064 Меню 1065 Окна списков 1065 Атрибут geometry 1066 Текстовый компонент 1066 Атрибуты управления цветом 1067 Работа с цветом и команда tk colormodel 1067 Атрибут scrollincrement 1067 Выделение 1068 Команда bell 1068 Глава 52. Tcl 7.5/Tk 4.1 1069 Выполнение сценариев на нескольких платформах 1069 Обработка имен файлов 1069 Преобразование символа новой строки 1070 Переменная tcl_platform 1070 Команда console 1070 Команда clock 1070 Команда load 1071 Команда package 1071 Использование нескольких переменных цикла 1071 Перенос цикла обработки событий из Тк в Tcl 1072 Сетевые гнезда 1072 Команда info hostname 1072 Содержание 33 Команда fconfigure 1072 Использование нескольких интерпретаторов и Safe-Tcl 1073 Диспетчер компоновки grid 1073 Текстовый компонент 1073 Поле редактирования 1073 Глава 53. Tcl 7.6/Tk 4.2 1074 Дополнительные операции file 1074 Виртуальные события 1074 Стандартные диалоговые окна 1075 Диспетчер компоновки grid 1075 Команда unsupported! в системе Macintosh 1076 Глава 54. Tcl/Tk 8.0 1077 Тс1-компилятор 1078 Выявление ошибок при компиляции 1078 Поддержка двоичных строк 1078 Пространства имен 1079 Safe-Tcl 1079 Новый вариант lsort 1079 Переменная tcl_precision 1080 Соглашения 2000 1080 Пакет http 1080 Обмен через последовательные линии связи 1080 Платформенно-независимые шрифты 1081 Команда tk scaling 1081 Включение приложений 1081 Платформенно-ориентированные меню 1081 Толщина обрамления 1082 Платформенно-ориентированные кнопки и полосы прокрутки 1082 Изображения в составе текстового компонента 1082 Команда destroy 1083 Команда grid 1083 Модификации версии 8.0 1083 Опция -error команды fconfigure 1083 Элемент tcl_platform(debug) 1083 Процедура tcl_findLibrary 1084 Процедура auto_mkindex_old 1084 Символы клавиш Windows для работы с меню 1085 Событие MouseWheel 1085 Атрибут fill для текста на холсте 1085 Процедура safe::loadTk 1085 34 Содержание Глава 55. Tcl/Tk 8.1 1086 Unicode и интернационализация приложений 1086 Опция -encoding команды fconfigure 1086 Команда encoding 1087 Пакет msgcat 1087 С API для работы с UTF-8 и Unicode 1087 Поддержка потоков 1087 Команда testthread 1088 Расширенные регулярные выражения 1089 Работа со строками 1089 Расширение DDE 1089 Дополнительные возможности 1090 Обмен через последовательные линии связи 1090 Элемент tcl_platform(user) 1090 Глава 56. Tcl/Tk 8.2 1091 Модификация Trf 1091 Эффективные операции со строками 1092 Пустые имена массивов 1092 Особенности создания дополнительных модулей для браузера 1092 Управление последовательными портами в системе Windows 1093 Синтаксис расширенных регулярных выражений 1093 Глава 57. Tcl/Tk 8.3 1094 Новые команды и опции для работы с файлами 1094 Новые опции команды glob 1095 Команды для работы с регулярными выражениями 1095 Результаты команды scan 1095 Удаление повторяющихся элементов списка с помощью lsort 1095 Удаление элементов массива 1096 Модификация команды clock 1096 Поддержка отложенной загрузки пакетов 1096 Дополнение Img 1096 Шаблон штриховых линий 1096 Особенности работы с холстом 1096 Скрытый текст 1097 Управление курсором мыши 1098 Проверка содержимого поля редактирования 1098 Прочие средства Тк 1098 Модификация окон списков 1098 Диалоговое окно для выбора каталогов 1098 Содержание 35 Взаимодействие оконного диспетчера с окнами верхнего уровня 1099 Поддержка системных курсоров Windows 1099 Поддержка колесика прокрутки в системе Unix 1099 Новый модификатор Quadruple 1099 X Input Method (XIM) 1099 Модификации версии 8.3 1099 Определение типа проверки 1100 Диалоговое окно выбора файлов в системе Macintosh 1100 Атрибут state для текстовых меток 1100 Поддержка пиктограмм в системе Windows 1100 Новые страницы интерактивной справочной системы 1100 Глава 58. Tcl/Tk 8.4 1101 Поддержка 64-битового кода 1102 64-битовая арифметика 1102 Преобразование 64-битовых значений 1102 Поддержка 64-битовой файловой системы 1103 Размер машинного слова 1103 Дополнительные средства для работы с файловой системой 1103 Виртуальные файловые системы 1103 Команды file и glob 1103 Работа со списками 1104 Поиск в массивах 1104 Расширенные средства поддержки обмена через последовательные линии 1104 Новые операторы сравнения строк 1105 Отслеживание выполнения команд 1105 Интроспекция 1105 Прочие изменения в составе Tcl 1106 Удаление неиспользуемых переменных 1106 Данные, возвращаемые командой regsub 1106 Повышенное разрешение таймера в системе Windows 1106 Модифицированная команда fcopy 1106 Новые компоненты Тк 1106 Отмена действий в текстовом компоненте и другие дополнения 1107 Новые возможности диспетчеров компоновки pack и grid 1107 Несимметричное дополнение 1107 Размеры строк и столбцов в диспетчере компоновки grid 1108 Отображение текста и изображений в составе компонента 1108 Новые атрибуты, определяющие рельеф кнопок 1108 36 Содержание Управление состоянием полей редактирования и окон списков 1108 Работа с оконным диспетчером 1109 Прочие изменения в составе Tk 1109 Автоповтор 1109 Поддержка прозрачных изображений 1110 Выбор нескольких файлов с помощью tk_getOpenFile 1110 Поддержка кнопок фиксированной ширины 1110 Доступ к содержимому буфера обмена 1110 Информация об использовании изображения 1110 Новые события для диспетчеров окон 1110 Управление текстовым курсором 1111 Новая опция команды bell 1111 Генерация Postscript-описаний для встроенных окон 1111 Глава 59. Содержимое компакт-диска 1112 Техническая подаержка 1114 Предметный указатель 1115 Посвящается Джоди, Кристоферу, Дэниэлу и Майклу. Б рент Посвящается Дину за поддержку и терпение. Кен Введение Tcl - это аббревиатура от Tool Command Language. Tcl означает как язык программирования, так и интерпретатор с этого языка. Интерпретатор Tcl можно без труда включать в состав прикладных программ. Tcl и используемый с ним набор инструментов создания графических пользовательских интерфейсов, называемый Тк, были разработаны профессором Джоном Осте- раутом (John Ousterhout) из калифорнийского университета. Tcl и Тк распространяются свободно, и их можно найти на многих узлах Internet и использовать для создания любых, в том числе коммерческих приложений. Интерпретатор Tcl был перенесен из Unix в системы DOS, PalmOS, VMS, Windows, OS/2, NT и Macintosh. Набор инструментов Tk может выполняться лишь в средах X Window, Windows и Macintosh. О Tcl я впервые услышал в 1988 году, когда учился в калифорнийском университете. В то время мы занимались созданием сетевой операционной системы Sprite. Мы, студенты, работали над новым ядром, а Джон Остераут написал редактор и эмулятор терминала. В качестве языка он использовал Tcl, в результате чего пользователи получили возможность определять меню и выполнять другие действия по настройке своих программ. Мы работали во времена системы Х10, и профессор Остераут планировал создать средства X Window, базирующиеся на Tcl. Это позволило бы взаимодействовать различным программам путем обмена Tcl-командами. На мой взгляд, возможность подобного взаимодействия инструментальных программ является одним из основных преимуществ Tcl. Первоначально языку Tcl отводилась роль инструмента для настройки программ и организации высокоуровневого взаимодействия между ними. Основную же часть приложения, как нам казалось, должен был составлять скомпилированный код. Редактор тх и эмулятор терминала tx, написанные Остераутом, соответствовали этой модели. Однако впоследствии оказалось, что можно создавать приложения полностью на Tcl. Это стало возможным благодаря тому, что оболочка wish обеспечивала доступ к другим программам, к файловой системе и сетевым гнездам и в дополнение к этому позволяла создавать графический пользовательский интерфейс. Теперь нередко можно встретить приложения, содержащие тысячи строк Тс1-кода. По мере накопления опыта работы с Tcl и Тк я все больше убеждался в их преимуществах, однако осознанию возможностей, предоставляемых данными средствами, предшествовали периоды разочарования в них. Это одна из причин, по которой была написана данная книга. Сотрудничая со специалистами Xerox PARC, я убеждался в преимуществах Tcl и Тк, но в то же время получал информацию о многих их недостатках. Мои коллеги по рабо- 39 те с удовольствием использовали Tcl и Тк в своих проектах и, обнаруживая изъяны, всегда ставили меня в известность. Я, в свою очередь, создал набор программных средств, позволяющих использовать возможности Tcl и Тк и избежать возникновения проблем. Данная книга задумана как практическое руководство, которое могло бы помочь читателю использовать Tcl и Тк в своей работе и в то же время избежать разочарований, которые в свое время испытал я. С того момента, как я познакомился с Tcl, прошло около 14 лет, а первое издание данной книги было выпущено около восьми лет назад. Несколько лет я работал под руководством Джона Остераута, сначала в Sun Microsystems, а затем в Scriptics Corporation. В основном я писал программы на Tcl, в то время как остальные участники рабочей группы занимались реализацией средств Tcl на языке С. Я создавал такие приложения, как HTML-редакторы, программы для работы с электронной почтой, Web-серверы и базы данных. Опыт, полученный при этом, я попытался отразить в данной книге. Основная часть книги посвящена созданию Tcl-сценариев, однако внимание уделяется также написанию Tcl-расширений на языке С. В настоящее время я продолжаю работать с языком Tcl и получаю все большее удовольствие от этого. Надеюсь, что в данной книге мне удастся передать мое отношение к Tcl и Тк. Некоторые аргументы в пользу выбора Tcl Tcl, как и почти каждый язык сценариев, несколько напоминает такие языки оболочек Unix, как Bourne Shell (sh), С Shell (csh), Korn Shell (ksh) и Perl. Программы, написанные на языках оболочек, позволяют запускать другие программы. Они предоставляют разработчику выразительные средства (переменные, управляющие потоки и процедуры), достаточные для создания сложных сценариев, включающих в качестве составных частей существующие программы. Сценарии оболочки - незаменимое средство для автоматизации часто выполняемых рутинных операций. Несмотря на некоторые общие черты, объединяющие Tcl с другими языками сценариев, он существенно отличается от них. Дело в том, что Тс1-ин- терпретатор может быть без труда включен в состав приложения. Tcl успешно справляется с ролью языка, используемого для настройки приложений. Используя Tcl, нет надобности придумывать новый формат файлов или командный язык для приложений. Включив в программу Тс1-интерпретатор, вы получаете возможность выполнять простые операции и объединять их в сценарий, полностью удовлетворяющий потребностям пользователей. Tcl также позволяет управлять приложениями из других программ, существенно упрощая тем самым их интеграцию. 40 Библиотека Tcl С предоставляет несложный для понимания интерфейс и проста в использовании. Данная библиотека реализует основные возможности интерпретатора и поддерживает набор базовых команд, позволяющих работать с переменными, формировать потоки управления и использовать процедуры. Богатый набор API предоставляет доступ к средствам операционных систем, позволяя запускать другие программы, работать с файловой системой и использовать сетевые гнезда. Тк добавляет команды, посредством которых можно создавать графические пользовательские интерфейсы. Tcl и Тк С API реализуют виртуальную машину, обеспечивающую работу в операционных средах Unix, Windows и Macintosh. Виртуальная машина Tcl допускает расширение, поскольку приложения имеют возможность определять новые Tcl-команды. Эти команды можно связать с процедурами приложения, написанными на С или С+-Ь В результате применения подобного подхода появляется возможность создать приложение как набор относительно простых элементов, написанных на компилируемом языке и оформленных как Tcl-команды. Для объединения простых элементов, или программных примитивов, в приложение используется Тс1-сцена- рий. Средствами уровня сценариев можно запускать другие программы, обращаться к файловой системе и непосредственно вызывать скомпилированные компоненты приложения посредством Tcl-команд, определенных разработчиком. На уровне С-программ вы можете вызвать Tcl-сценарии, читать значения Tcl-переменных и присваивать им новые значения и даже отслеживать работу Тс1-интерпретатора. Многие Tcl-расширения свободно распространяются через Internet. Большинство из них включает библиотеку С, обеспечивающую новые функциональные возможности и Tcl-интерфейс к ней. В качестве примеров предлагаются системы управления базами данных, программы организации телефонных справочников, средства доступа к MIDI-контроллеру и другие программы. Tcl-команды, предназначенные для управления интерактивными программами, реализованы в продукте expect. Наиболее популярным Tcl-расширением является Тк - набор инструментальных средств разработки графических пользовательских интерфейсов. В Тк определены Tcl-команды. которые позволяют создавать компоненты интерфейса и выполнять с ними различные действия. Применение сценариев для программирования пользовательских интерфейсов имеет следующие преимущества. Поскольку компиляция отсутствует, от редактирования исходного кода до запуска его на выполнение проходит совсем немного времени. Tcl-команды реализуют интерфейс гораздо более высокого уровня по сравнению со стандартными средствами создания пользовательских ин- 41 терфейсов, содержащихся в библиотеке С. Для реализации простого интерфейса достаточно нескольких команд. В то же время, если вам необходимо изменить ту или иную характеристику компонента, вы можете сделать это в любой момент. Пользовательский интерфейс может быть отделен от остальной части приложения. Разработчик имеет возможность сосредоточить все внимание на реализации основных функциональных возможностей приложения, а затем, не затрачивая больших усилий, создать необходимые интерфейсные средства. Базовый набор компонентов Тк, как правило, оказывается достаточным для формирования интерфейсов для большинства программ. По необходимости вы можете также разработать новые компоненты Тк на языке С, кроме того, в вашем распоряжении имеется большой набор компонентов, распространяемых по сети. Для создания расширений могут использоваться самые различные языки, например Visual Basic, Scheme, Elisp, Perl, Python, Ruby или Javascript. Выбор конкретного языка зависит от вкусов разработчика. Tcl предоставляет простые языковые конструкции, похожие на средства языка С. Тс1-примитивы несложно создать путем написания процедур на С. Tcl прост в изучении. Благодаря его использованию некоторым разработчикам удавалось реализовать сложные проекты за очень короткое время (порядка нескольких недель). Такие результаты получались несмотря на то, что многие из них никогда ранее не писали программы на Tcl. Приблизительно в то же время, когда вышло в свет первое издание данной книги, появился язык Java. Этот язык в короткие сроки приобрел большую популярность. При решении некоторых задач он с успехом заменил языки С и C-iг. Несмотря на то что Tcl был ориентирован на совместную работу с С-программами, его удалось быстро адаптировать для взаимодействия с р.иртуальной машиной Java. Там, где раньше шла речь о С или С+ +, теперь можно смело говорить "С, C+ + или Java". Следует лишь учитывать некоторые детали, специфические для Java-программ. В данной книге интерфейс Tcl/Java не описывается, но на компакт-диске вы можете найти средства TclBlend. TclBlend загружает виртуальную машину Java в Tcl-приложение и позволяет вызывать Java-методы. Он также позволяет реализовывать Tcl- команды на Java вместо использования С или C++. Существует Тс1-интер- претатор, написанный на Java, который называется Jacl. Он имеет ряд ограничений по сравнению с Tcl-интерпретатором, написанным на С, но в тех случаях, когда вы не можете применить традиционный интерпретатор, Jacl оказывается незаменимым. Язык Javascript, разработанный Netscape, предназначен для организации взаимодействия с элементами Web-страниц. Он часто используется при со- 42 здании интерфейсов на базе HTML. Однако Tcl позволяет реализовать более универсальные решения, применимые в самых различных приложениях. Дополнительный модуль Web-браузера Tcl/Tk позволяет выполнять Тс1-сцена- рии в среде браузера. В результате Tcl становится альтернативным решением не только для JavaScript, но и для Java. Дополнительный модуль, организующий выполнение Tcl-сценариев в среде браузера, описан в главе 20. Версии Tcl и Тк Tcl и Тк продолжают развиваться. Информацию о новых реализациях Tcl можно найти по адресу http://www.beedub.com/book/. Реализации Tcl и Тк выпускаются парами, предназначенными для совместной работы. В первом издании этой книги описывались средства Tcl 7.4 и Тк 4.0, но в ней также можно было встретить ссылки на Tk 3.6. В четвертом издании освещаются новые средства, добавленные в Tcl/Tk 8.4. Окончательная реализация Tcl 7.5 и Тк 4.1 была выпущена в мае 1996 года. В этих версиях был осуществлен перенос Тк в операционные среды Windows и Macintosh. В них же появился механизм защиты Safe-Tcl, предназначенный для выполнения аплетов, распространяемых по сети. Кроме того, в данных версиях была реализована поддержка сетевых гнезд и новой подсистемы ввода-вывода с поддержкой высокопроизводительного обмена, управляемого событиями. Реализации Tcl 7.6 и Тк 4.2 появились в октябре 1996 года. В них были модернизированы средства Safe-Tcl и обновлен диспетчер компоновки grid, впервые появившийся в Тк 4.1. Здесь же были реализованы виртуальные события (например, событие <<Сору» может заменить ), стандартное диалоговое окно и некоторые дополнительные команды работы с файлами. Tcl 7.7 и Тк 4.3 представляли собой внутренние реализации, предназначенные для разработки дополнительных модулей Tcl/Tk для Web-браузеров Netscape Navigator и Microsoft Internet Explorer. Их разработка реально осуществлялась параллельно с работой над версиями 7.6 и Тк 4.2. Дополнительный модуль был создан для различных платформ, включая Solaris/SPARC, Solaris/INTEL, SunOS, Linux, Digital Unix, IRIX, HP/UX, Windows 95, Windows NT и Macintosh. Этот модуль поддерживает Tcl-аилеты в составе Web-страниц; в нем используется механизм защиты на базе Safe-Tcl. К основным особенностям Tcl 8.0 относится динамический компилятор Tcl-кода, применение которого позволяет многократно повысить эффективность выполнения Tcl-сценариев. Tcl 8.0 поддерживает строки, ко- 43 торые могут содержать символы с нулевым кодом. Для Tcl-сценариев компилятор прозрачен, однако разработчики, которые занимаются созданием расширений, должны знать некоторые новые С API, в противном случае они не смогут воспользоваться новыми возможностями. Процесс создания Tcl 8.0 несколько затянулся. Это было связано с переходом Джона Остераута из Sun Microsystems в Scriptics Corporation. Реализация 8.0р2 была готова осенью 1997 года и вскоре приобрела популярность. Однако выход окончательной реализации, 8.0.5, задержался до весны 1999 года. Новая версия Тк была создана лишь для того, чтобы обеспечить наилучшее соответствие Tcl 8.O. Тк 8.0 включает механизм поддержки шрифтов, не зависящий от конкретной платформы, платформенно-ониенти- рованные меню и панели инструментов, а также платформенно-ориен- тированные компоненты, внешний вид которых согласуется с другими приложениями, выполняющимися в системах Windows и Macintosh. Tcl/Tk 8.1 обеспечивают поддержку Unicode и содержат новые средства обработки регулярных выражений, которые предоставляют возможности, не уступающие Perl 5. Кроме того, эти версии поддерживают работу потоков, что позволяет без труда включать Tcl в состав многопотоковых приложений. Разработчики Тк проделали огромную работу, чтобы найти подходящие шрифты для представления символов Unicode, а каталоги сообщений существенно упрощают написание приложений с интерфейсом на различных языках. В работе над Tcl/Tk 8.1 также сказался переход Остераута из Sun в Scriptics. Первая альфа-реализация была закончена осенью 1997 года, а окончательная реализация, 8.1.1, была готова лишь в мае 1999 года. Реализация Tcl/Tk 8.2 задумывалась в основном для того, чтобы исправить замеченные ошибки и повысить надежность работы системы. Вместе с этим API библиотеки Tcl С был дополнен некоторыми средствами, увеличивающими набор доступных расширений. Работа над Tcl/Tk 8.2 закончилась быстро, и данные реализации вышли в свет летом 1999 года. Tcl/Tk 8.3 была существенно расширена по сравнению с предыдущими реализациями. В Тк были приняты шаблоны Dash и Image, предложенные Дженом Найтменсом (Jan Nijtmans). Реализация 8.3.0 была выпущена в феврале 2000 года, а последний вариант, 8.3.5, был реализован в октябре 2002 года. При разработке Tcl/Tk 8.4 основное внимание уделялось производительности, кроме того, были добавлены интерфейс виртуальной файловой системы и три компонента Tk: spinbox, labeledf rame и panedwindow. 44 Работа над этой реализацией продолжалась достаточно долго. Первая бета-версия была выпущена в июне 2000 года, а реализация 8.4.2 вышла в мае 2003 года. Расширения Tcl и Тк Tcl разработан так, что дополнения создаются в виде расширений, при этом базовые средства Tcl не затрагиваются. В настоящее время доступны многочисленные расширения. Информацию о них можно получить в Web по следующему адресу: http://www.tcl.tk/resource/ Однако для внесения некоторых изменений приходится модифицировать базовый комплект Tcl/Tk. Если вы хотите приложить свои усилия к разработке новых вариантов Tcl/Tk, ваша помощь будет с благодарностью принята. Необходимую информацию о деятельности группы разработчиков Tcl и Тк вы можете найти по следующему адресу: http://www.tcl.tk/cgi-bin/tct/tip/ Исходные коды Tcl и Тк поддерживаются в рамках проекта SourceForge. http://www.sourceforge.net/proj ects/tcl http://www.sourceforge.net/proj ects/tktoolkit Сообщения о замеченных ошибках и предложения о доработках регистрируются в базе данных. Наибольшие шансы быть принятыми имеют дополнения к исходному коду, сделанные в соответствии с руководствами Tcl Engineering Manual В руководствах описаны правила оформления кода, требования к тестированию и документации. Tcl в World Wide Web Знакомство с материалами, посвященными Tcl, можно начать со следующих Web-страниц: http://www.tcl.tk/ http://tcl.activestate.com/ http://www.purl.org/NET/Tcl-FAQ/ Узел Wiki часто обновляется по инициативе пользователей. На нем публикуются многочисленные материалы о Tcl и его расширениях (в качестве инициатора публикации новой информации можете выступить вы). http://wiki.tcl.tk/ 45 На Web-странице данной книги содержатся сведения об ошибках для всех изданий. За материалами, публикуемыми на этом узле, слежу лично я и планирую делать это и в дальнейшем. http://www.beedub.com/book/ Кроме того, полезную информацию вы можете найти на Web-узле Prentice Hall. http://www.prenhall.com/ Ftp-архивы Ниже перечислены некоторые из FTP-узлов, содержащих информацию oTcl. ftp://ftp.tcl.tk/pub/tcl ftp://src.doc.ic.ac.uk/packages/tcl/ ftp://ftp.luth.se/pub/unix/tcl/ ftp://ftp.sunet.se/pub/lang/tcl ftp://ftp.cs.Columbia.edu/archives/tcl ftp://ftp.funet.fi/pub/languages/tcl Для доступа к этим узлам можно использовать любые браузеры, например Mozilla, Netscape, Internet Explorer и Lynx. Группы новостей Группа сотр.lang.tcl отличается высокой активностью. В ее рамках действует форум, посвященный обсуждению Tcl. Сообщения о Тс1-расширениях и приложениях поступают в группу сотр. lang.tcl .announce. Для доступа к материалам групп новостей можно воспользоваться специальными Web- службами. Для этого достаточно ввести сотр.lang.tcl в иоле редактирования на следующей Web-странице: http://groups.google.com На кого рассчитана эта книга Данная книга может быть полезна как программистам, впервые приступающим к работе с Tcl, так и квалифицированным специалистам. Всем категориям читателей я рекомендую внимательно прочитать главу 1. Программная модель Tcl достаточно проста, но она существенно отличается от многих других языков программирования. Данная модель основана на подстановке строк, поэтому, внимательно разобравшись с ней, вы избежите многих проблем в работе. В книге приведено большое количество примеров, посвященных эффективному использованию средств Tcl и Тк. Практически в каждой 46 главе содержатся таблицы, в которых приводится информация о Тс1-коман- дах и компонентах. Предполагается, что читатель данной книги имеет некоторый опыт программирования, однако даже новичок, читая эту книгу, сможет достаточно быстро приобрести необходимые навыки. Знание языков оболочек Unix поможет вам, но оно не является обязательным требованием. Там, где изложение материала тесно связано с принципами работы оконных систем, приводится соответствующая информация. В главе 2 описываются детали использования Tcl и Тк в системах Unix, Windows и Macintosh. Как работать с данной книгой Лучше всего в процессе чтения книги выполнять на компьютере приведенные в ней примеры. Часто программисты испытывают затруднения при изучении Tcl. Дело в том, что в справочной информации по Tcl и Тк отсутствуют примеры использования соответствующих языковых конструкций, а реальные программы оказываются плохо документированы. Данная книга призвана предоставить читателю недостающие сведения. Для изучения конкретных команд Tcl и Тк я рекомендую использовать интерактивную справочную информацию. В ней приводится детальное описание соответствующих языковых конструкций. В данной книге содержатся многие данные из справочной системы, но в ней отсутствуют детали, которые могут изменяться в зависимости от реализации Tcl и Тк. HTML-версии страниц интерактивной справочной системы можно найти на компакт-диске, прилагаемом к данной книге. Примеры программ Данная книга поставляется с компакт-диском, на котором записаны коды всех рассмотренных в книге примеров. Диск может читаться в системах Unix, Windows и Macintosh. Кроме программ на нем находятся версии Tcl и Тк, которые были доступны на момент выхода данной книги, а также многие из программ, свободно распространяемых по Internet. Исходные коды примеров можно также найти в Web по следующему адресу: http://www.beedub.com/book/ Соглашения о представлении материала Примеры кода представлены в книге по-разному. Наиболее важные из них отделены от остального текста и оформлены в виде листингов. Коды 47 программ на Tcl и С представлены моноширинным шрифтом. Результаты выполнения Tcl-команд, кроме того, выделены курсивом. Следует заметить, что символы => не являются частью данных, возвращаемых командой. expr 5+8 => 13 Моноширинный шрифт также применяется для представления имен Tcl- команд и С-процедур в тексте. В книге часто встречаются правила использования Tcl-команд. Имя команды и неизменяемые ключевые слова отображаются моноширинным шрифтом. Указания на то, что в вызове команд присутствуют значения переменных, опций или другие данные, выделены курсивом. Если параметр не является обязательным, слева и справа от него помещаются знаки вопроса. Пример, объясняющий использование команды set, приведен ниже. set имя_переменной?значение? Пиктограммы Информация, которой желательно уделить дополнительное внимание, помечается пиктограммами. Как организована данная книга Материал книги разделен на семь частей. В первой главе описаны основные средства Tcl. В первой главе рассматриваются механизмы, лежащие в основе языка. Этот материал очень важен. Вам обязательно надо ознакомиться с ним, если вы хотите эффективно использовать Tcl. Если вы уже программировали на Tcl, вам все равно следует хотя бы бегло просмотреть главу 1. В главе 2 описываются детали использования Tcl и Тк в системах Unix, Windows и Macintosh. В главе 3 представлен пример приложения (CGI- сценарий), который иллюстрирует основные особенности составления программ на языке Tcl. Остальные главы части I посвящены детальному рассмотрению основных Tcl-команд. В частности, здесь обсуждаются работа со строками, типы данных, использование потока управления и процедур, а также области видимости. Завершается часть I рассмотрением средств обмена с файлами и запуска других программ. В части II описаны расширенные средства составления Tcl-программ. Вначале обсуждается команда eval, позволяющая динамически генерировать Tcl-программы. Дополнительные возможности по обработке строк предоставляют регулярные выражения. Если обработка данных составляет существенную часть вашего приложения и если приложение работает медленно, то вам, возможно, удастся повысить его производительность за счет использования 48 средств поддержки регулярных выражений. Пространства имен позволяют разделить глобальную область видимости процедур и переменных на отдельные области. Unicode и каталоги сообщений существенно упрощают создание многоязыковых приложений. Библиотеки и пакеты позволяют организовать код так, чтобы он мог использоваться в различных проектах. Средства интроспекции предоставляют важную информацию о внутреннем состоянии Tcl. Средства ввода-вывода, управляемого событиями, позволяют создавать приложения, работающие одновременно с несколькими клиентами. Для реализации HTTP-протокола, позволяющего получать Web-страницы, служат сетевые гнезда. В последних нескольких главах части II описываются инструментальные средства разработки приложений и особенности их использования на различных платформах. Средства Safe-Tcl служат для организации защищенной среды, в которой можно выполнять Tcl-аплеты. Для работы в Web может использоваться расширяемый Web-сервер TclHttpd, написанный полностью на Tcl. На базе TclHttpd легко создавать прикладные программы; можно также интегрировать сервер с существующими приложениями, создавая тем самыхм для них Web-интерфейс. Starkit - новое эффективное средство, позволяющее создавать пакеты и выполнять доставку приложений Tcl/Tk. Для организации файловой системы в пакете используются средства поддержки виртуальной файловой системы (VFS). В части III содержатся общие сведения о Тк. Возможности Тк проиллюстрированы рядом примеров. В этой же части описывается связывание - установление соответствия между Tcl-командой и событием, например щелчком мышью или нажатием клавиши. Три последних главы части III посвящены диспетчерам компоновки Тк, которые предоставляют мощные средства по организации пользовательского интерфейса. В части IV данной книги описываются компоненты Тк. С помощью компонентов реализуются кнопки, меню, полосы прокрутки, текстовые метки, поля редактирования, текстовые области, поддерживающие различные шрифты, холст для рисования, окна списков и линейные регуляторы. Для каждого компонента имеются средства, позволяющие изменять его конфигурацию и организовывать взаимодействие с прикладными программами, однако поведение компонента, реализованное по умолчанию, чаще всего удовлетворяет требованиям разработчиков. Для упрощения настройки компонентов и обеспечения согласованности элементов интерфейса предусмотрены базы данных ресурсов. В части V описываются те инструменты Тк, которым не было уделено достаточного внимания в предыдущих частях. В частности, здесь рассматриваются выделения, вопросы передачи фокуса ввода и стандартные диалоговые окна. Кроме того, детально рассматривается работа со шрифтами, с цветом 49 и изображениями - элементами, общими для всех компонентов Тк. Оканчивается данная часть несколькими примерами программ достаточно большого объема. Часть VI представляет собой введение в программирование Тс1-расшире- ний на языке С. Данная часть включена в книгу для того, чтобы читатель мог составить правильное представление о том, как можно дополнять Tcl командами, написанными на С, и интегрировать Tcl с существующими приложениями. Каждая глава части VII посвящена одной из реализаций Tcl/Tk, упоминаемых в данной книге. В этих главах описываются новые возможности, а также характеристики, которые могут изменяться от версии к версии. Эти характеристики приходится учитывать, адаптируя программы для новых версий Tcl/Tk. Особенности четвертого издания книги В четвертом издании изложение материала ведется с использованием версии Tcl/Tk 8.4, в которой были реализованы многие новые возможности. В Tcl появилась виртуальная файловая система, позволяющая учитывать структуру каталогов при доставке приложений, а также работать с удаленными ресурсами на FTP- и Web-узлах посредством интерфейса с обычной файловой системой. В четвертое издание добавлена глава 22, посвященная Tclkit и Starkit и использованию базы данных Metakit для хранения сценариев и других файлов. Благодаря VFS эти файлы размещаются в приватной файловой системе. Starkit - новое эффективное средство, позволяющее создавать пакеты и выполнять доставку приложений Tcl/Tk. В четвертое издание добавлена также глава 21, посвященная средствам поддержки многопотоковых программ. Эти средства оказываются очень полезными при включении Tcl в многопотоковые приложения. В данном издании также рассматриваются новые компоненты Тк. Инкрементный регулятор похож на поле редактирования, однако в нем реализованы дополнительные возможности. Фреймы с метками предоставляют новые возможности по оформлению окон. Компонент panedwindow представляет собой специализированный диспетчер компоновки, реализующий новые возможности по организации пользовательских интерфейсов. Благодарности за помощь в подготовке первого издания книги Я благодарю сотрудников Xerox PARC за помощь и понимание. Многие советы, приведенные в книге, стали результатом не только моей личной ра- 50 боты, но и опыта моих коллег. Вопросы, заданные Дейвом Николсом (Dave Nichols), воодушевили меня на изучение базовых механизмов работы интерпретатора Tcl. Ден Свайнхат (Dan Swinehart) и Лоренс Батчер (Lawrence Butcher) своими замечаниями поддерживали во мне постоянное желание продолжать работу. Рон Фредерик (Ron Frederick) и Берри Керчивел (Berry Kerchival) применили Tk для разработки графических интерфейсов своих систем. Полученные при этом результаты еще раз подтвердили высокую эффективность данного инструмента. Беки Барвел (Becky Burwell), Рич Голд (Rich Gold), Карл Хаусер (Carl Hauser), Джон Максвелл (John Maxwell), Кен Пайер (Ken Pier), Марвин Теймер (Marvin Theimer) и Моэн Вишвонет (Mohan Vishwanath) ознакомились с моими первыми набросками. Их комментарии и замечания оказали неоценимую помощь в дальнейшей работе над текстом. Керин Петерсен (Karin Petersen), Билл Шилит (Bill Schilit) и Терри Ватсон (Terri Watson) все время искали способы нестандартного применения Tcl, чем вносили приятное разнообразие в работу. Я хочу особо поблагодарить Марка Вейсера (Mark Weiser) и Дуга Терри (Doug Terry) за помощь и поддержку. Выражаю благодарность автору Tcl и Tk Джону Остерауту. Разработанные им системы -- самые замечательные из всех, которые мне когда-либо приходилось встречать. Джон снабжал меня последними реализациями Tk 4.0, благодаря чему я имел возможность изучить их новые возможности еще до выпуска первой бета-версии. Благодарю программистов, с которыми мне приходилось общаться. От них я узнал много нового. Я считаю Джона ЛоВерсо (John LoVerso) и Сте- фена Алера (Stephen Uhler) самыми талантливыми разработчиками Тс1-про- грамм из всех, кого я когда-либо знал. Выражаю искреннюю благодарность тем, кто прочитал мои первые наброски и высказал ценные замечания. Это Пайери Девид (Pierre David), Клиф Флинт (Clif Flynt), Симон Кенион (Simon Kenyon), Эджен Ли (Eugene Lee), Дон Лайбе (Don Libes), Ли Мур (Lee Moore), Джо Мосс (Joe Moss), Хэдор Шемтов (Hador Shemtov), Френк Стаджано (Prank Stajano), Чарльс Тейер (Charles Thayer) и Джим Торнтон (Jim Thornton). Многие присылали мне предложения и замечания по почте. Здесь я привожу имена лишь некоторых из них. Это Мигель Энджел (Miguel Angel), Сте- фен Бенсен (Stephen Bensen), Джеф Блейн (Jeff Blaine), Том Чарнок (Тот Charnock), Брайан Купер (Brian Cooper), Патрик Д"Круз (Patrick D"Cruze), Бенойт Десросайерс (Benoit Desrosiers), Тед Даннинг (Ted Dunning), Марк Ей- чин (Mark Eichin), Пол Фриберг (Paul Priberg), Карл Гаутиер (Carl Gauthier), Дэвид Гердес (David Gerdes), Клаус Хекенберг (Klaus Hackenberg), Торкл Хэсл (Torkle Hasle), Марти Херст (Marti Hearst), Джин-Пайери Герберт (Jean- Pierre Herbert), Джейми Хонан (Jamie Honan), Норман Клейн (Norman Klein), Джо Констан (Joe Konstan), Сьюзен Ларсон (Susan Larson), Хекен Лилдже- 51 грен (Некап Liljegren), Лайонел Маллет (Lionel Mallet), Деджен Милоджичич Dejan Milojicic), Грэг Миншелл (Greg Minshall), Бернд Mop (Bernd Mohr), Вилл Морс (Will Morse), Хейко Нердменн (Heiko Nardmann), Герд Неджебау- эр (Gerd Neugebauer), Кери Рензема (Сагу Renzema), Роб Рипел (Rob Riepel), Дэн Шенк (Dan Schenk), Джин-Гай Шнейдер (Jean-Guy Schneider), Элизабет Шолл (Elizabeth Scholl), Карл Швамб (Karl Schwamb), Рони Шапиро (Rony Shapiro), Питер Симани (Peter Simanyi), Вине Скехен (Vince Skahan), Билл Стамбо (Bill Stumbo), Глен Вандербург (Glen Vanderburg), Лэрри Вирден (Larry Virden), Рид Вейд (Reed Wade) и Джим Вайт (Jim Wight). К сожалению, я не смог ответить на все письма. Выражаю признательность редакторам и всем сотрудникам Prentice Hall. Высококвалифицированные профессионалы Марк Тауб (Mark Taub), Линн Шнейдер (Lynn Schneider) и Керри Кидон (Kerry Reardon) очень помогли мне в работе над книгой. Благодарности за помощь в подготовке второго издания книги Я снова хочу поблагодарить Джона Остераута за поддержку во время работы в группе Tcl/Tk компании Sun Microsystems. Остальные участники группы делали все возможное для того, чтобы превратить Tcl и Тк в настоящие инструменты для создания кроссплатформенных программ. Скотт Стентон (Scott Stanton) занимался переносом Тк на PC, а Рей Джонсон (Ray Johnson) обеспечивал работу Тк в среде Macintosh. Джейкоб Леви (Jacob Levy) реализовал систему ввода-вывода, управляемую событиями, Safe-Tcl, и дополнительный модуль для браузера. Брайан Левис (Brian Lewis) создал компилятор Tcl. Кен Кори (Ken Corey) занимался интеграцией Tcl и Java, а также помогал в работе над SpecTcl. Сид Полк (Syd Polk) обобщил систему меню для работы с платформенно-ориентированными компонентами в средах Macintosh и Windows. Колин Стивене (Colin Stevens) работал над поддержкой шрифтов и средствами интернационализации для Тк. Стефен Алер (Stephen Uhler) заслужил мою искреннюю благодарность за интересные примеры, которые я использовал в свой книге. Он руководил группой разработчиков SpecTcl. Стефен создал библиотеку HTML, пользуясь которой я написал редактор. Мы вместе работали над первыми версиями TclHttpd. Он научил меня писать компактный эффективный Tcl-код и использовать регулярные выражения при решении многих задач. Я многому обязан Стефену и надеюсь, что хоть в чем-то смог быть полезен ему. Я снова благодарю Марка Тауба, а также Эйлин Кларк (Eileen Clark) и Марту Вильяме (Martha Williams) из Prentice Hall. Джордж Вильяме (George Williams) помог мне собрать файлы для размещения на компакт-диске. 52 Благодарности за помощь в подготовке третьего издания книги Джон Остераут продолжает играть важную роль в развитии и распространении Tcl, на этот раз уже как основатель Scriptics Corporation. Я хочу поблагодарить всех сотрудников Scriptics, в особенности Сару Дениэлс (Sarah Daniels), Скотта Стентона (Scott Stanton), Рея Джонсона (Ray Johnson), Брайана Серлеса (Bryan Surles), Мелиссу Чавла (Melissa Chawla), Ли Бернхарда (Lee Bernhard), Суреша Шастри (Suresh Sastry), Эмиля Скеффо- на (Emil Scaffon), Пэт P. (Pat P.), Скотта Редмана (Scott Redman) и Берри Керчивела (Berry Kerchival). Все сотрудники Scriptics заслужили искреннюю благодарность за то, что создали в компании атмосферу, благоприятствующую творческой работе. Автор многих публикаций Джерри Пик (Jerry Peek) помог мне полезными советами. Кен Джонс (Ken Jones) рассказал об эффективных инструментах индексации. Большое спасибо всем читателям, приславшим свои отзывы и предложения. Сведения о новых способах использования Tcl всегда интересовали меня. Я благодарю также редакторов Prentice Hall Марка Тауба, Джоан Мак- намара (Joan McNamara) и Джоан Юрел (Joan Eurell). Они помогли мне вовремя окончить работу над третьим изданием книги. Благодарности за помощь в подготовке четвертого издания книги Благодаря Джефу Хоббсу (Jeff Hobbs) и Кену Джонсу (Ken Jones) работа над данным проектом была успешно завершена. Джефф широко известен среди программистов, использующих Tcl. Новые реализации Tcl/Tk выходили во многом благодаря его руководящим усилиям и интенсивной работе. Кен - известный преподаватель Tcl, и благодаря моему сотрудничеству с ним данная книга пополнилась новым интересным материалом. Я хочу поблагодарить участников Tcl Core Team; усилиями этой группы, Tcl становится все более мощным инструментом и приобретает новые возможности. Я хотел бы поблагодарить Джин-Клод Випплер (Jean-Claude Wippler) и Стива Лендерса (Steve Landers) за Metakit, Tclkit и Starkits. Эти инструменты предоставляют уникальные возможности по созданию пакетов и доставке Tcl-приложений. Я надеюсь, что данные технологии будут развиваться и дальше. Информацию о Starkit я получал также от некоторых пользователей. Сообщения мне прислали Роберт Течентин (Robert Techentin), Стив Блинкхорн (Steve Blinkhorn), Френк Серджент (Frank Sergeant), Ap- джен Маркус (Arjen Markus), Уве Колоска (Uwe Koloska), Лэрри Вирдсн 53 (Larry Virden), Том Крехбиел (Tom Krehbiel) и Дональд Портер (Donald Porter). Выражаю свою благодарность руководству и сотрудникам Prentice Hall за постоянную поддержку. Марк Тауб продолжает быть "крестным отцом" этой книги. Важную роль в подготовке четвертого издания к выпуску сыграла Кетлин Керен (Kathleen Caren). И, наконец, я благодарю свою жену Джоди за любовь, доброту, терпение и понимание в долгие часы работы над книгой. У меня три сына, Кристофер, Дэниел и Майкл. Мне приходится постоянно отвечать на их вопросы, поэтому я уверен, что умственная деградация мне не грозит. Как связаться с автором книги Я всегда готов выслушать мнение читателей о книге. Мой адрес: welch® acm.org. Если вы включите в поле subject письма слово "book" либо название данной книги, это поможет мне правильно сортировать приходящие письма. Новую информацию о данной книге и других сферах моей деятельности вы можете получить по адресу http://www.beedub.com/. На Web-узле я веду учет замеченных ошибок, поэтому ваши комментарии будут приняты с благодарностью. Ждем ваших отзывов Вы, читатель этой книги, и есть главный ее критик и комментатор. Мы ценим ваше мнение и хотим знать, что было сделано нами правильно, что можно было сделать лучше и что еще вы хотели бы увидеть изданным нами. Нам интересно услышать и любые другие замечания, которые вам хотелось бы высказать в наш адрес. Мы ждем ваших комментариев и надеемся на них. Вы можете прислать нам бумажное или электронное письмо, либо просто посетить наш Web-сервер и оставить свои замечания там. Одним словом, любым удобным для вас способом дайте нам знать, нравится или нет вам эта книга, а также выскажите свое мнение о том, как сделать наши книги более интересными для вас. Посылая письмо или сообщение, не забудьте указать название книги и ее авторов, а также ваш обратный адрес. Мы внимательно ознакомимся с вашим мнением и обязательно учтем его при отборе и подготовке к изданию последующих книг. Наши координаты: E-mail: inf oQwilliamspublishing. com WWW: http: //www. williamspublishing. com Информация для писем из: России: 115419, Москва, а/я 783 Украины: 03150, Киев, а/я 152 ЧАСТЬ Основы Tcl В части I приводятся основные сведения о языке Tcl. Главу 1 следует прочитать каждому читателю, независимо от того, какие задачи он собирается решать на практике. В этой главе описаны основные свойства языка. Tcl достаточно прост, поэтому освоить его не составит труда даже для начинающих программистов. Квалифицированным специалистам также необходимо просмотреть главу 1, чтобы избежать подходов, неприменимых при работе с TCL. В главе 2 приведено краткое руководство по запуску Tcl и Тк в операционных средах Unix, Windows и Macintosh. Возможно, что главу 2 вам придется прочитать в первую очередь, чтобы иметь возможность выполнить примеры, приведенные в главе 1. В главе 3 представлена типичная TCL-программа - CGI-сценарий, реализующий гостевую книгу на Web-узле. При создании этой программы применены средства, подробно описанные в последующих главах. Основная цель главы - ознакомить читателя с реальным примером, демонстрирующим возможности Tcl. Остальные главы части I посвящены непосредственно программированию на Tcl. Обработка строк описана в главе 4. О работе со списками рассказывается в главе 5. Управляющие структуры, например циклы и выражения if, описаны в главе 6. Глава 7 посвящена рассмотрению процедур Tcl, посредством которых можно реализовывать новые Tcl-команды. В главе 8 обсуждаются массивы Tcl. Массивы - одна из наиболее полезных структур в Tcl; они обеспечивают гибкость создаваемых приложений. В главе 9 рассказывается об операциях ввода-вывода и о запуске других программ. Этими средствами создаются Tcl-сценарии, которые позволяют объединять различные программы и обрабатывать данные, содержащиеся в файлах. Прочитав часть I. вы получите знания, достаточные для того, чтобы разрабатывать простые Tcl-программы, а также читать и понимать код, написанный другими программистами. Глава 1 Общие сведения о языке Tcl В данной главе описывается синтаксис языка сценариев Tcl. В частности, здесь рассматриваются подстановка и группировка, выполняемые в процессе интерпретации Tcl-ирограмм. В процессе обсуждения будут рассмотрены следующие команды Tcl: puts, format, set, expr, string, while, incr и рrос. Tcl представляет собой командный язык, ориентированный на обработку строк. В нем используется лишь несколько основных языковых конструкций. Синтаксис языка крайне прост, что позволяет быстро изучить его. Язык Tcl в основном ориентирован на решение задач, предполагающих объединение набора "строительных блоков" в готовое приложение. Tcl - интерпретируемый язык; в процессе выполнения приложения его код обрабатывается интерпретатором. Благодаря такому подходу существенно упрощается процесс разработки и модернизации приложения; необходимые для этого операции могут выполняться в интерактивном режиме. Возможность выполнения команд в интерактивном режиме существенно упрощает изучение Tcl. Если вы еще не умеете запускать Tcl-интерпретатор в вашей системе, вам следует прочитать главу 2, в которой рассматривается выполнение Tcl в операционных средах Unix, Windows и Macintosh. В этой главе излагаются общие сведения о языке Tcl. Даже если вы считаете себя опытным программистом, постарайтесь выделить время на то, чтобы прочитать данную главу. Это поможет вам убедиться, что вы действительно знаете язык Tcl, и позволит избежать в дальнейшем многих ошибок. Основные механизмы, лежащие в основе Tcl, связаны с обработкой и подстановкой строк, что позволяет без труда проследить действия интерпретатора. Модель Tcl несколько отличается от других языков программирования, и в этом вы убедитесь, прочитав данную главу. Глава 1. Общие сведения о языке Tcl 57 Команды Tcl Tcl -■ это аббревиатура от Tool Command Language. Команды выполняют различные действия, например: вывод строки, вычисление значения арифметического выражения или отображение компонентов (widget) на экране. В Tcl в виде команд представляются все действия, даже присвоение значений переменным и определение процедур. Для вызова команд в языке Tcl предусмотрены достаточно простые синтаксические конструкции. Все сложные действия выполняет интерпретатор, реализующий команды. Команда Tcl записывается в следующем виде: команда параметр1 параметр2 параметрЗ. . . Команда может представлять собой либо встроенную команду Tcl, либо процедуру. Имя команды отделяется от параметров с помощью одного или нескольких пробелов или знаков табуляции; те же символы используются для разделения параметров. Символ конца строки или точка с запятой завершают команду. В процессе интерпретации Tcl осуществляет группировку (объединение нескольких слов в один параметр) и подстановку (замену переменных и вызовов вложенных процедур). Действия интерпретатора Tcl по обработке команд можно разделить на три этапа. Группировка параметров. Подстановка вложенных команд, переменных и символов, которым предшествует обратная косая черта. Вызов команды. Интерпретация параметров самой командой. (Этот вопрос будет рассмотрен далее в настоящей главе.) Hello, World! Листинг 1.1. Программа "Hello, World!" puts stdout {Hello, World!} => Hello, World! В данном примере команде puts передаются два параметра: идентификатор потока ввода-вывода и строка. Команда puts записывает строку в поток, добавляя символ новой строки. Данный простой пример демонстрирует две следующие особенности Tcl. Параметры интерпретируются командой. В данном случае поток ввода- вывода идентифицируется с помощью имени stdout. Данное имя потока используется puts и другими командами ввода-вывода. Имя stderr 58 Часть I. Основы Tcf определяет стандартный поток ошибок, а имя stdin - стандартный поток ввода. Обмен данными с файлами подробно рассматривается в главе 9. Фигурные скобки применяются для группировки нескольких слов в один параметр. В результате команда puts воспринимает слова Hello, World! как второй параметр. Скобки не являются частью значения. Фигурные скобки предназначены для предоставления дополнительной информации интерпретатору. Перед тем как значение будет передано команде, скобки удаляются. Посредством скобок группируются все символы, включая переводы строк и вложенные скобки. Группировка оканчивается при появлении закрывающей фигурной скобки. Для группировки в Tcl также могут использоваться двойные кавычки. Группировка будет более подробно рассмотрена далее в этой главе. Переменные Для присвоения значений переменной используется команда set. Этой команде передаются два параметра: имя переменной и значение. Имя переменной может быть любой длины; регистр символов учитывается. В составе имени допустимы любые символы. При написании Tcl-программ нет необходимости объявлять переменные перед их использованием. Интерпретатор создает переменную в тот момент, когда ей необходимо впервые присвоить значение. Для того чтобы обратиться к значению переменной, надо указать перед ее именем символ $, как показано в листинге 1.2. Листинг 1.2. Использование переменных Tcl set var 5 => 5 set b $var => 5 Вторая команда set, содержащаяся в листинге, присваивает переменной b значение переменной var. В данном примере вы впервые встречаетесь с под- Глава 1. Общие сведения о языке Tcl 59 становкой. Чтобы лучше понять, как выполняется вторая команда set, ее можно переписать, заменив $var значением переменной var: set b 5 В действительности подстановка осуществляется несколько другими, более эффективными способами, что очень важно в том случае, когда значением переменной является длинная строка. Подстановка команд Помимо подстановки переменных, в Tcl используется подстановка команд. Вложенные команды помещаются в квадратные скобки. Интерпретатор Tcl воспринимает любую последовательность символов, находящуюся между открывающей и закрывающей квадратной скобкой, как команду. В процессе интерпретации осуществляется замена выражения в квадратных скобках (включая сами скобки) результатом выполнения вложенной команды. Квадратные скобки выполняют те же функции, что и одинарные кавычки в некоторых оболочках, кроме того, такой подход позволяет работать с командами любого уровня вложенности. Листинг 1.3. Подстановка команд set len => 6 В листинге 1.3 приведенное ниже выражение представляет собой вложенную команду. string length foobar Данная команда возвращает длину строки "foobar". Команда string будет подробно описана в главе 4. При выполнении выражения в первую очередь выполняется вложенная команда. Затем осуществляется подстановка, в результате чего внешняя команда приобретает следующий вид: set len б Если в составе внешней команды находится несколько вложенных команд, интерпретатор обрабатывает их слева направо. Закрывающая скобка является признаком конца очередной команды. Встретив ее, интерпретатор выполняет команду. Это надо учитывать в тех случаях, когда результат одной команды может влиять на выполнение другой. 60 Часть I. Основы Tcl Математические выражения Сам по себе интерпретатор Tcl не вычисляет значения математических выражений. Он лишь выполняет группировку, подстановку и вызов команд. Для разбора и вычисления значений математических выражений используется команда expr. Листинг 1.4. Простое арифметическое выражение expr 7.2/4 => 1.8 Синтаксис выражений, передаваемых команде expr в качестве параметров, такой же, как и синтаксис выражений в языке С. Команда expr обрабатывает целые числа, числа с плавающей точкой и логические значения. Результатом выполнения логических операций является значение 0 (false) либо 1 (true). По необходимости целые числа преобразуются в значения с плавающей точкой. Восьмеричные числа начинаются с нуля (например, значение 033 равно целому числу 27). Шестнадцатеричные значения начинаются с символов Ох. В Tcl поддерживается представление чисел с плавающей точкой. Сведения о приоритете операций приведены в конце данной главы. В математических выражениях могут присутствовать ссылки на переменные и вложенные команды. В примере, приведенном в листинге 1.5, посредством команды expr выполняется сложение значения переменной х с числом, равным длине строки "f oobar". В результате подстановки команде expr передается 6 + 7 и при выполнении команды set переменной len присваивается значение 13. Листинг 1.5. Вложенные команды set x 7 set len + $x] => 13 Средства обработки выражений поддерживают ряд встроенных функций, применяемых при проведении математических вычислений. (Перечень таких функций приведен в конце данной главы.) В примере, показанном в листинге 1.6, вычисляется число pi. Листинг 1.6. Использование встроенных математических функций set pi => 3.1415926535897931 Глава 1. Общие сведения о языке Tcl 61 При реализации функции expr были приняты меры для обеспечения корректности значений и предотвращения нежелательных преобразований числовых значений в строковые. Разработчики программ, со своей стороны, могут повысить эффективность выполнения операции expr, применяя фигурные скобки для группировки выражений. Это связано с особенностями работы компилятора, преобразующего исходный текст в байтовый код. Более подробно данный вопрос будет рассмотрен далее в этой главе. Пример использования фигурных скобок для повышения быстродействия вычислений приведен в листинге 1.7. Все выражения, содержащиеся в этом листинге, составлены корректно. Листинг 1.7. Использование фигурных скобок для группировки выражений expr {7.2 / 4} set len + $x}] set pi Подстановка символов, представленных с помощью обратной косой черты Еще один тип подстановки, выполняемый интерпретатором Tcl, связан с использованием обратной косой черты. Таким способом в состав параметров можно включать символы, которые в обычных условиях имеют специальные значения. Предположим, например, что вы собираетесь использовать в составе параметра символ $ или какую-либо скобку. Перед таким символом надо указать обратную косую черту. Если для составления требуемого выражения вам надо использовать большое число символов обратной косой черты, следует помнить, что существует более простой способ, позволяющий получить тот же результат. В частности, команда list, которая будет описана в главе 5, автоматически отменяет специальные значения символов. В листинге 1.8 приведен пример использования обратной косой черты для получения литерального значения символа $. Листинг 1.8. Отмена специального значения символа с помощью обратной косой черты set dollar \$foo => $foo set x $dollar => $foo 62 Часть I. Основы Тс! Интерпретация выполняется в один проход. Вторая команда set в приведенном выше примере иллюстрирует важную особенность Tcl. Значение переменной dollar не испытывает на себе влияния операции подстановки. Другими словами, при подстановке разбор значений переменных не производится. В данном примере значением как переменной dollar, так и переменной х является строка "$f oo". Общее правило таково: при использовании eval нет необходимости заботиться о значениях переменных. Подробнее этот вопрос будет обсуждаться в главе 10. С помощью последовательностей знаков, начинающихся с обратной косой черты, можно записывать шестнадцатеричные, восьмеричные значения символов, а также представлять их в формате Unicode. set escape \u001b set escape \0xlb set escape \033 В каждом из этих выражений переменной escape присваивается символ ASCII ESC, код которого в десятичном представлении равен 27. Правила представления символов последовательностями, начинающимися с обратной косой черты, приведены в табл. 1.1. Часто символ обратной косой черты используется для записи длинной команды в нескольких строках. Как было сказано ранее, перевод строки завершает команду. В примере, представленном в листинге 1.9, обратная косая черта обязательно должна присутствовать, иначе последним символом в записи команды expr будет знак +. Листинг 1.9. Запись длинной команды в двух строках с использованием обратной косой черты set totalLength + \ ] Отменить специальное значение перевода строки можно двумя способами. Первый способ состоит в формировании параметра посредством группировки. В этом случае никаких действий для отмены специального значения перевода строки не требуется; соответствующий символ становится частью группы и не завершает команду. Второй способ - включить в конец строки обратную косую черту. В этом случае последний символ в строке преобразуется в пробел, а все пробелы в начале следующей строки удаляются. Другими словами, символ обратной косой черты не только позволяет продолжить команду в следующей строке, но и удаляет ненужные пробелы, включаемые в начало строки для форматирования. Глава 1. Общие сведения о языке Tcl 63 Группировка с помощью фигурных скобок и двойных кавычек Двойные кавычки и фигурные скобки используются для группировки нескольких слов в один параметр. Различие между ними состоит в том, что кавычки допускают подстановку в группе, а фигурные скобки запрещают ее. Это правило действует по отношению к командам, переменным и последовательностям, начинающимся с обратной косой черты. Листинг 1.10. Группировка с помощью двойных кавычек и фигурных скобок set s Hello => Hello puts stdout "The length of $s is ." => The length of Hello is 5. puts stdout {The length of $s is .} => The length of $s is . При выполнении второй команды, приведенной в данном примере, интерпретатор Tcl, обрабатывая второй параметр puts, выполняет подстановку как значения переменной, так и команды. В третьей команде подстановка запрещена, поэтому строка выводится в том виде, в котором она указана в записи параметра. На практике группировка с помощью фигурных скобок в основном выполняется тогда, когда подстановка параметра должна быть отложена на более позднее время либо вовсе не должна выполняться. В качестве примеров можно привести циклы, условные выражения и объявления процедур. Двойные кавычки чаще всего применяются в командах, подобных puts. Кавычки также часто используются в команде format. Эта команда выполняет те же функции, что и функция printf в языке С. Первый параметр команды format определяет формат вывода. В нем часто присутствуют специальные символы, например перевод строки, знаки табуляции и пробелы. Проще всего указать эти символы с помощью последовательностей, начинающихся с обратной косой черты (например, перевод строки можно представить как \п, а знак табуляции - как \t). Перед выполнением команды format последовательности, начинающиеся с обратной косой черты, должны быть преобразованы, поэтому для формирования параметра, определяющего формат, целесообразно использовать двойные кавычки. puts В данном случае команда format используется для выравнивания при выводе значений переменных name и value с помощью символа табуляции. 64 Часть I. Основы Tcl Выражения °/es и e/e5.3f задают формат вывода остальных параметров команды. Заметьте, что символ \п, обычно указываемый при вызове команды printf языка С, здесь отсутствует. Он не нужен, так как команда puts сама добавляет символ перевода строки. Подробно команда format будет описана в главе 4. Особенности использования квадратных скобок Квадратные скобки используются для подстановки команд и не выполняют группировку. Вместо этого вложенная команда, определяемая с помощью квадратных скобок, рассматривается как часть текущей группы. В приведенной ниже команде двойные кавычки формируют последний параметр, выполняя группировки, а результаты выполнения вложенной команды включаются в группу. puts stdout "The length of $s is ." Если в состав параметра входит только вложенная команда, вам нет необходимости группировать элементы с помощью двойных кавычек, поскольку средства разбора Tcl рассматривают вложенную команду как единое целое. puts stdout В приведенном ниже выражении кавычки излишни. puts stdout " " Группировка перед подстановкой Интерпретатор Tcl выполняет разбор команды за один проход. В течение единственного прохода он принимает решение о группировке и подстановке. Группировка осуществляется перед подстановкой. Эту особенность интерпретатора Tcl необходимо иметь в виду при написании программ. Значения, полученные в результате подстановки, не влияют на группировку, так как решение о группировке было принято ранее. Приведенный ниже пример демонстрирует влияние"вложенных команд на группировку. Вложенная команда рассматривается как неразрывная последовательность символов, причем внутренняя структура этих символов не учитывается. При формировании параметров основной команды результаты подстановки включаются в текущую группу символов. Листинг 1.11. Вложенная команда и подстановка переменных set х 7; set у 9 puts stdout $x+$y= => 7+9=16 Глава 1. Общие сведения о языке Tcl 65 В листинге 1.11 второй параметр команды puts имеет следующий вид: $х+$у= Пробелы в составе вложенной команды при группировке игнорируются. В тот момент, когда интерпретатор Tcl встречает левую квадратную скобку, подстановка некоторых переменных уже выполнена и сформирована следующая строка: 7+9= При появлении левой квадратной скобки осуществляется рекурсивный вызов интерпретатора для выполнения вложенной команды. Перед выполнением ехрr подстановка переменных $х и $у уже выполнена. Результат выполнения команды ехрr включается вместо всей последовательности символов, находящихся между левой и правой квадратной скобкой. Поэтому команда puts получает в качестве второго параметра следующее значение: 7+9=16 Группировка, выполняется перед подстановкой В рассмотренном выше примере при обработке второго параметра команды puts решение о группировке принимается перед решением о подстановке. Даже если результат выполнения вложенной команды содержит пробелы или другие специальные символы, аргумент будет передан команде без учета специальных значений. Группировка и подстановка переменных соотносятся между собой так же, как группировка и подстановка команд. Пробелы или другие специальные символы в составе значений переменных не оказывают влияние на решение о группировке, так как это решение принимается еще тогда, когда значения переменных недоступны. Если вы хотите, чтобы при выводе результатов выполнения команды символы + и = были отделены от чисел пробелами, вам надо явным образом сгруппировать параметр, используя двойные кавычки. При этом команда puts примет следующий вид: puts stdout "$х + $у = " В данном случае для группировки используются кавычки. Это важно, так как в составе группы должна быть разрешена подстановка значений переменных и команды. Группировка математических выражений с помощью фигурных скобок Команда expr выполняет некоторые действия по подстановке внутри фигурных скобок. Более подробно этот вопрос будет рассмотрен далее в этой 66 Часть I. Основы Tcl главе. Таким образом, оказывается, что в приведенной ниже команде выполняется подстановка значений переменных в выражении, помещенном в фигурные скобки. puts stdout "$x + $у = " Примеры подстановки Если в составе команды присутствует несколько подстановок, не разделенных пробелами или знаками табуляции, группировка выполняется по умолчанию. Использовать двойные кавычки в этом случае не обязательно. В приведенной ниже команде осуществляется конкатенация значений переменных а, b и с. set concat $a$b$c Если же вам необходимо разделить значения переменных пробелами, необходимо использовать кавычки. set concat "$а $b $с" В общем случае команды, помещенные в квадратные скобки, и ссылки на переменные можно указывать в любой позиции строки. В приведенном ниже примере имя команды определяется в результате выполнения другой команды. параметр параметр При работе с Тк имя компонента часто используется как имя команды. $text insert end "Hello, World!" Процедуры Для определения процедур в Tcl используется команда ргос. Единожды определенная Tcl-процедура может быть использована многократно, причем вызывается она точно так же, как и встроенная команда Tcl. Определение процедуры осуществляется с помощью следующего выражения: ргос имя список_параметров тело_процедуры Первый параметр - это имя определяемой процедуры. В качестве второго параметра команды задается список параметров процедуры. Третий параметр - тело процедуры, включающее одну или несколько Тс1-команд. В имени процедуры могут содержаться практически любые символы; регистр символов учитывается. В данной книге принято соглашение об именовании, согласно которому имена процедур начинаются с символа верхнего Глава 1. Общие сведения о языке Тс! 67 регистра, а имена переменных - с символа нижнего регистра. По мере развития Tcl все большее значение приобретает стиль программирования. Этому вопросу посвящена глава 12. Листинг 1.12. Определение процедуры proc Diag {а Ъ} { set с return $c } puts "The diagonal of a 3, 4 right triangle is " => The diagonal of a 3, 4 right triangle is 5.0 Процедура Diag, определенная в данном примере, вычисляет длину гипотенузы прямоугольного треугольника. В качестве параметров процедуре передаются длины катетов. Функция sqrt - одна из функций, поддерживаемых командой expr. Переменная с - это локальная переменная процедуры; она существует только при выполнении Diag. Области видимости переменных будут обсуждаться в главе 7. Переменная с в данном примере не обязательна; при необходимости можно было бы составить код процедуры, не используя переменных. В этом случае процедура выглядела бы следующим образом: proc Diag {a b} { return } Команда return возвращает результаты выполнения процедуры. В данном случае она не обязательна, так как интерпретатор Tcl по умолчанию возвращает значение пос

Каждый раз, знакомясь с каким-нибудь новым языком программирования, не устаю поражаться настойчивости его авторов (или автора). Не будучи специалистом в какой-либо области разработки программного обеспечения, сложно даже представить, с какими трудностями можно столкнуться, если не использовать специализированные инструменты и специфические подходы к решению задач, возникающих на пути разработчика. О таком языке, как TCL, я уже кратко рассказывал на страницах "Компьютерных вестей". Но настолько кратко, что хочу вернуться к этому языку программирования и рассказать о нём уже подробнее.


Немного истории

Автор TCL (это название по-русски чаще всего произносится как "Тикль"), Джон Остераут, решил, что мир станет лучше, если в нём появится специализированный язык для встраивания в консольные приложения. Сказано - сделано. Так появилась первая версия TCL. По заявкам пользователей, Остераут расширил возможности своего детища, встроив в него средства для создания приложений с графическим пользовательским интерфейсом. Так появился TCL/TK. Долго ли, коротко ли, но язык перекочевал под крыло корпорации Sun Microsystems, которая сумела сделать интерпретатор языка максимально кросс-платформенным, хотя при этом почему-то по-прежнему свободным. Хотя, несмотря на последний факт, TCL подвергся острой критике главного идеолога свободной разработки программного обеспечения Ричарда Столлмэна. Главным доводом Столлмэна было низкое быстродействие интерпретатора языка.

Но вскоре интерес Sun к TCL сошёл практически на нет в связи с бумом языка Java, разработанным специалистами этой же компании, и Остераут основал собственную компанию Scriptics. Вскоре после этого был существенно переработан интерпретатор, который перед выполнением программы стал компилировать её в промежуточный байт-код, в результате чего скорость работы программ, написанных на TCL, возросла более чем в шесть раз. Также была добавлена поддержка Unicode и многопоточных приложений, что дало возможность разработчикам использовать TCL для написания серверных приложений. Потом фирма Scriptics была переименована в Ajuba Solutions, а затем её купила компания Interwoven, передавшая разработку TCL/TK сообществу программистов Tcl Core Team.

Однако всё это, хоть и познавательно, но мало поможет в освоении языка. Поэтому давайте посмотрим, что такое TCL сегодня.


TCL сегодня

TCL - это, вообще говоря, аббревиатура. Полное название этого языка - Tool Command Language, что по-русски значит "командный язык инструментов".

Основная особенность классического TCL состоит в том, что этот язык программирования, в отличие от львиной доли остальных популярных сегодня языков, не является объектно-ориентированным. Адепты TCL объясняют это тем, что такой подход лучше отражает суть работы программы, так как процессор оперирует не с объектами, а с последовательностями команд, которые можно объединить в процедуры. Сложно сказать, насколько это мнение соответствует реальному положению вещей, но здесь, пожалуй, дело даже не в этом. А в чём? А в том, что языку, который задуман исключительно для склеивания разных частей системы в единое целое, в общем-то, ООП и не к чему. Впрочем, поскольку сам TCL давно перерос ту идею, на основе которой был создан, есть специальные расширения языка, реализующие объектно-ориентированный подход.

Впрочем, не менее интересен и подход к тексту программы. Он - такие же данные, как и любые поступающие извне, и им можно манипулировать из программы точно так же, как и тем текстом, который ввёл пользователь. Вообще говоря, любые данные в TCL - это строки. Непривычно? Возможно. Но никто не говорит, что неудобно.

Как и широко известные, но уже довольно прочно забытые массами языки Lisp и Forth, TCL использует префиксную нотацию в написании команд. Что это значит? На самом деле всё очень просто. Каждая команда состоит из набора полей, разделённых пробелами. Первое поле должно быть именем команды, а необязательные остальные поля - передаваемые этой команде аргументы. Команда возвращает значение, иногда пустое. Команда - это то же самое, что в других языках программирования называется функцией или процедурой. Ключевых слов в TCL нет: управляющие конструкции - это тоже команды. Такой подход позволяет легко расширять язык в любую нужную программисту сторону, поскольку теоретически расширяемость у TCL - лучше некуда, было бы желание расширять. Например, все ОО-надстройки возникли именно благодаря этому свойству TCL.

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

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

Чтобы вы лучше представляли себе синтаксис TCL, который весь в одной статье изложить, само собой, никак не удастся, приведу пример небольшой программы на этом языке. Она занимается тем, что складывает цифры введённого пользователем числа.

#!/bin/tclsh set arg "" ] set result 0 foreach el $arg { set result } puts $result


А что такое TK?

Именно такой вопрос может возникнуть после прочтения текста об особенностях TCL. Да, я уже упоминал, что многие называют Тикль сейчас TCL/TK ("Так-Тикль"), и поэтому самое время рассказать, что же скрывается ещё за двумя буквами.

TK - это сокращение и без того короткого слова ToolKit, за которым скрывается мощная библиотека для создания графического пользовательского интерфейса TCL-приложений. Библиотека эта, надо сказать, имеет весьма неплохие возможности. TK реализован для операционных систем Linux, Mac OS X, Unix, и Windows, причём в современных версиях TK пользовательский интерфейс имеет "родной" для конкретной операционной системы вид, то есть элементы управления выглядят точно так же, как и во всех остальных приложениях. Для библиотеки есть различные расширения, которые используются для создания окон произвольной формы, добавления поддержки технологии drag-and-drop и прочих подобных вещей.

TK очень хорошо ложится на событийную концепцию языка TCL и позволяет разработчикам многое делать гораздо проще, чем в других языках программирования. Кроме того, компоненты TK автоматически обрабатывают большинство событий, что упрощает задачу разработчиков по созданию приложений. Для TK есть наборы дополнительных компонентов, например, BWidget, Tix или incr Widgets.

Ещё одной интересной чертой библиотеки TK является то, что она адаптирована и для других интерпретируемых языков, а не только TCL, правда, интерпретатор TCL всё равно нужен при выполнении приложений, так как другие языки используют только внешний интерфейс для кода самой библиотеки, который, как известно, написан всё же именно на TCL. Есть специальные библиотеки Perl/Tk, Ruby/Tk, Python/Tk, которые реализуют поддержку TK для соответствующих языков программирования.


Инструментарий

На практике, конечно, одних только хороших возможностей языка для создания на нём качественных приложений совсем не достаточно. Нет, я сейчас не о навыках программиста, а о тех инструментах, которыми программист будет пользоваться. Главный из этих инструментов в программировании на TCL - это, конечно же, интерпретатор этого скриптового языка.

В Linux интерпретатор TCL встроен в львиную долю дистрибутивов. Для других операционных систем всё несколько сложнее. Для Windows, например, можно воспользоваться продуктом ActiveTcl, который предлагает компания ActiveState (www.activestate.com/Products/ActiveTcl). В дистрибутив входят интерпретатор TCL, различные библиотеки и расширения, а также специальная библиотека для использования TCL через Windows Script Host. Правда, своего IDE в ActiveTCL нет, но можно воспользоваться Komodo, где есть даже специальный дизайнер TK-форм. Но если нет желания приобретать Komodo, то можно воспользоваться средой Visual TCL (). Сам интерпретатор и множество англоязычной документации можно найти на официальном сайте - tcl.tk . Русскоязычные материалы по TCL во Всемирной сети тоже присутствуют, например, по адресу tclstudy.narod.ru .


За кадром

Однако, как бы много я ни сказал о TCL и TK, но многое осталось за кадром. Например, быстродействие программ, которому ещё очень даже есть к чему стремиться (TCL-программы до сих пор заметно медленнее тех, что написаны на Perl"е). В то же время то, что адепты TCL преподносят как безоговорочные плюсы, тоже может вызвать ряд затруднений. Поразительная расширяемость языка делает очень трудной задачу стандартизации, и это, само собой, накладывает свой отпечаток на возможности использования TCL для написания действительно крупных приложений. Хотя TCL и сравнивают часто с Java, но мне кажется, что пальма первенства по популярности неспроста именно за вторым из этих языков. Своеобразный синтаксис TCL тоже делает своё чёрное дело, и потому число тех, кто желает его изучить, не возрастает экспоненциально, как это имеет место для Java, а линейно, причём не очень-то активно.

Хотя, спору нет, для склеивания нескольких приложений, написанных на компилируемых языках программирования, по отзывам многих из тех, кто пробовал TCL и сравнивал его в этой сфере с альтернативными вариантами, он был на высоте. Встраиваемость TCL в прикладные приложения - тоже очень приятная и полезная функция. Особенно заметно это в мире UNIX-подобных систем, где TCL - второй по почитаемости язык после C (ну и, может быть, ещё Emacs Lisp). Хотя и для Windows он определённо подходит - другое дело, что в этой ОС уже есть встроенные интерпретаторы VBScript"а и Jscript"а, а потому TCL испытывает с их стороны нечто, что можно было бы назвать при определённых допущениях конкуренцией.

Хотя, конечно, все эти рассуждения трудно оценить, не опробовав TCL самостоятельно. Так что я завершаю свой рассказ о нём, хочу только напоследок привести цитату из слов автора языка программирования С Брайана Кернигана: "Tcl/Tk придает работе магическую продуктивность, за несколько часов можно достигнуть тех же результатов, что за дни или недели при разработке на C или C++... Tk весьма эффективен для большинства приложений, многие элементы интерфейса (виджеты) реализованы настолько хорошо, что остается только удивляться, как подобная работа могла быть выполнена так качественно... Удачным кажется и то, что разделение задач между Тсl и С/С++ осуществляется достаточно легко, надо только знать, какой инструмент лучше справляется с задачей... Расширение системы дополнительным Tcl-кодом, загружаемым напрямую в Tcl-библиотеку приложения, в полном согласии с оригинальной идеей Остераута, повышает эффективность программы, в целом, упрощает ее структуру и улучшает мобильность... Я не уверен, что Тсl мог бы выжить как самостоятельный продукт - у него слишком много конкурентов. Но у сочетания Tcl/Tk в Unix-мире нет конкурентов... Система исключительно надежна, очень хорошо документирована... свободно доступна... безукоризненно высокого качества".