Данная статья посвящена быстрому введению в азы языка 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, я уже кратко рассказывал на страницах "Компьютерных вестей". Но настолько кратко, что хочу вернуться к этому языку программирования и рассказать о нём уже подробнее.
Немного истории
Автор 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-мире нет конкурентов... Система исключительно надежна, очень хорошо документирована... свободно доступна... безукоризненно высокого качества".