Древняя, новая, будущая

13 февраль, 2004 - 00:00Андрей Зубинский

Учитель говорил: "Я передаю, но не создаю. Я верю в древность и люблю ее".
Конфуций. Лунь юй

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

Древняя, новая, будущая
Tcl/Tk в ОС Windows демонстрирует отличную поддержку всех возможностей GUI этой платформы, включая альфа-прозрачность окон

Итак, для соблюдения журналистской традиции достаточно. Пора приступать к делу. Предмет нашего разговора -- кросс-платформенная среда разработки и интеграции программ Tcl/Tk, истории и общим характеристикам которой некогда была посвящена отдельная статья. Tcl/Tk далеко не нова (скорее даже вообще древняя, но Учитель ведь говорил...) и по каким-то таинственным причинам незаслуженно непопулярна на бывшем советском пространстве (о важной и очевидной причине невысокой популярности Tcl/Tk в "сообществе сторонников лицензии GNU" в той давней статье уже говорилось, -- судя по всему, у нас до сих пор слишком сильна вбиваемая десятилетиями вера в святость и истинность любых слов любых бородатых идеологов). И все-таки мы будем говорить именно о ней -- и дело не только в неотъемлемом праве журналиста писать что хочется и даже не в личных симпатиях, которые вовсе не скрываются. Дело в том, что за несколько прошедших лет я пытался найти нечто новенькое, соответствующее моим скромным потребностям в "повседневном программировании" (ну не обязательно журналисты проводят досуг в казино или за Unreal Tournament), и ничего лучше Tcl/Tk найти не смог. От "нечто" требовалось одновременно: мощная инструментальная поддержка (тратить время на то, что уже сделано, неразумно, но еще менее разумно истязать себя какими-то катастрофически сложными в освоении "хакерскими" штучками только из-за заботы о "хакерском" имидже), кросс-платформенность (совсем отказаться от Unix-совместимых систем не позволяет привычка, а от наивных попыток отыскать в мире этих самых систем хоть отдаленные аналоги прикладных программ Windows удерживают опыт и здравый смысл) и, наконец, то, что не имеет четких определений, но интуитивно понятно -- "выразительность", "мощность", "красота" и "удобство". Повторяю: ничего подобного Tcl/Tk найти не удалось. Есть, без сомнения, замечательные разработки -- например Python, но все-таки "тикль" (именно так принято называть Tcl/Tk) по ряду причин лично для меня, как для "непрограммирующего программиста", остался вне конкуренции (выкладывать сейчас же "на блюдечке" перечень этих причин нет никакой необходимости, мы немного поговорим о них по ходу дела).


Рабочее место

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

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

Древняя, новая, будущая
Базовый инструментальный набор "тиклера": расширенная консоль tkcon, интегрированная среда Ased, средство быстрой разработки (RAD) VisualTcl
Итак, базовая система. Пользователям ОС Windows лучше всего прибегнуть к услугам подразделения ActiveState компании Sophos. Распространяемый им легально бесплатно дистрибутив ActiveTcl регулярно обновляется, максимально приближен к реалиям ОС Windows (стандартный Windows-инсталлятор, хорошая интеграция с системой, требование минимальных "ручных" модификаций в системном окружении, структурированная документация в формате chm) и, наконец, включает самый необходимый набор компонентов для начала работы, а также практически все важнейшие расширения Tcl/Tk. Пользователям Unix-подобных систем лучше всего установить последнюю версию Tcl/Tk традиционным способом -- сборкой из исходных текстов, доступных с главного ресурс-сайта "тиклевого сообщества" www.tcl.tk (пожалуй, это первый и последний раз, когда "тикль" проявил "платформенную дискриминацию", но вот в дальнейшем нашем разговоре основное внимание будет уделено именно пользователям ОС Windows, по очевидной причине "идеологической удаленности" Tcl/Tk от привычной платформы). Особенность инсталляции базовой системы "тикля" в ОС Windows, в принципе, одна: не изменяйте без особой нужды инсталляционный каталог, предусмотренный разработчиками (конкретно -- C:\Tcl). Или, если такая потребность все же есть, придерживайтесь правила, свойственного тем программам, у которых "ноги растут" из мира Unix, -- все они недолюбливают пробелы в именах каталогов и файлов.

Теперь вы располагаете базовой системой, с которой удобнее всего "общаться" посредством расширенной консоли Tcl/Tk -- tkcon. Она входит в состав ActiveTcl (и после инсталляции автоматически заносится в соответствующий раздел меню Start ОС Windows), но не является неотъемлемой частью дистрибутива системы ("домашняя" страница проекта tkcon -- tkcon.sourceforge.net). Ее возможности целесообразно дополнить удобной и очень симпатичной интегрированной средой разработки, созданной исключительно "родными" тиклевыми средствами -- Ased. Не "вытягивайте" из Сети относительно большой исполняемый файл дистрибутива этой программы (вот и еще одно правило -- несмотря на то что "тикль" позволяет создавать самостоятельные, standalone, приложения, вы уже располагаете инсталлированной базовой системой, поэтому тратиться на лишние мегабайты незачем), ограничьтесь компрессированными исходными текстами для вашей платформы. Отличия между ними, к слову, заключаются не только в формате компрессии (zip -- "для Windows", gz -- "для Unix"), но и в застарелой разнице в представлении конца строки текстовых файлов (в Unix -- непечатным символом LF (Line Feed), в Windows/DOS -- парой непечатных символов CR LF (CR -- Carriage Return).

Второй обязательный элемент вашей персональной "тикль-среды" -- Visual Tcl. Это серьезный продукт, который понадобится вам не так скоро, но, согласитесь, 550 KB не настолько страшный размер файла, чтобы на его загрузке "сэкономить".

И, наконец, ваш незаменимый самоучитель со смехотворным размером дистрибутива в целых 150 KB -- TclTutor.

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

И не спешите сразу "набрасываться" на скачанные zip-файлы с Ased, Vtcl и TclTutor -- потерпите чуть-чуть, всему свое время.


Первый шаг

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

Начнем мы с одного незначительного размышления (или размышления незначительными не бывают?). Традиционные исполняемые программы содержат машинный код -- это, как говорится, аксиома. Если, например, "заглянуть" во "внутренности" любого exe- или com-файла текстовым редактором, то огромное количество "закорючек" в окне программы эту аксиому подтвердит.

Древняя, новая, будущая
Tcl/Tk -- весьма скромная в запросах к ресурсам система. Так, в "потреблении" памяти при выполнении весьма сложных программ она сравнима с распространенным ICQ-клиентом Miranda
А теперь давайте установим одну из скачанных программ -- допустим, TclTutor. Для этого достаточно ее просто распаковать, для поддержания порядка в системе, например в каталог С:/Tcl/TclTutor (и еще одно правило -- правда, совершенно необязательно его соблюдать: не "разбрасывайте" каталоги с "тикль"-программами по диску, "устанавливайте" их подкаталогами базового дистрибутива Tcl/Tk). Если вы посмотрите в этот каталог после распаковки, никаких традиционных исполняемых файлов в нем не найдете, а если заглянете "внутрь" любого файла -- не отыщете и "закорючек". Но между тем смело запускайте на исполнение файл TclTutor.tcl (содержащий пока, возможно, невнятный, но вполне читабельный текст), и получите на экране первое "тикль"-приложение -- к слову, по-своему уникальное, сочетающее тексты кратких уроков по "тиклю" (верхнее "окно"), редактируемые примеры (среднее "окно") и результат исполнения примеров (нижнее "окно"). Маленькое открытие -- тоже открытие (пусть даже прописной истины), и вы его только что сделали на основе рассуждения: раз tcl-программа TclTutor.tcl выполняется и не содержит машинных кодов, следовательно, "тикль" как язык относится к классу интерпретируемых -- его ключевой элемент (интерпретатор) выполняет непосредственно высокоуровневый текст программы, а не машинные коды. И маленькое уточнение: расширение в имени файла tcl и первые три буквы в названии всей системы означают одно и то же -- Tool command language, "язык управления инструментами".

Совершенно аналогично осуществляется "инсталляция" оставшихся двух программных пакетов, кстати, весьма непростых. Можете смело запустить и их главные "исполняемые" файлы (ased.tcl и vtcl.tcl соответственно) -- пока всего лишь для того, чтобы убедиться, что это далеко не "игрушки". Теперь, созерцая "лепоту", можно и нужно еще раз поразмыслить над очевидным вопросом: откуда взялись все эти красоты на экране? Традиционно работа на уровне пользовательского интерфейса не вносится в возможности языка программирования, а наоборот, выносится даже за пределы системы в отдельные библиотеки. В "тикле" все немного иначе: "библиотека" (точнее -- toolkit, инструментальный набор, "Tk" в названии) для решения этих задач в нем, конечно, присутствует, но она настолько удачно и "естественно" интегрирована в языковые средства, что как отдельный продукт практически не используется, несмотря ни на принципиальную возможность этого, ни на кросс-платформенность Tk, ни на высочайшее качество реализации.

До "красот" и возможностей Ased и Vtcl мы непременно еще доберемся, а теперь наступила пора перейти от простого к сложному. Сделайте ярлык для файла TclTutor.tcl на Windows-десктопе (вы же собрались учить "тикль"), закрывайте все "красивости" и запускайте расширенную консоль tkcon.


Алфавит -- это не только ABC...

Учитель сказал: "Хотя он и прочитал триста стихотворений “Ши цзин”, если ему передать дела управления государством, он не справится с ними. Если его послать в соседние страны, он не сможет самостоятельно отвечать на вопросы. Какая польза от того, что он столько прочитал?".
Конфуций. Лунь юй

Как говорил один программный персонаж из "Лавины" Стивенсона Нила, "прошу прощения, вследствие внутренней структуры я склонен к отступлениям". Время одного из таких отступлений пришло.

Многого прочесть о Tcl/Tk на русском языке вам не удастся -- насколько мне известно, есть всего одна русскоязычная книга, посвященная этой среде программирования. На английском же... книги по "тиклю" весьма дороги -- хотя бы потому, что "тикль" используется в массе очень серьезных программных комплексов астрономической сложности и цены (например, в системе управления жизненным циклом изделий Unigraphics NX), и его хорошее знание, естественно, означает дополнительные возможности, которые в отдельных странах принято прилично оплачивать. Наш же журнал -- издание не академическое, и, хотя у этой статьи будет не одно продолжение, 99% работы по изучению системы вам придется проделать самим (иначе -- "какая польза от того...", как сказал Учитель).


Итак, пора...

Давайте проведем первый "эксперимент". В консоли tkcons наберем следующий текст и передадим его системе нажатием Enter: set Один 1. В ответ система возвратит нам цифру "1". Теперь опять немного поразмышляем, вооружившись предварительными сведениями о "проделанной работе". Использованное слово set -- одна из многих команд "тикля", выполняющая ряд различных действий в зависимости от числа слов и синтаксиса "предложения", в котором она используется. Команды интерпретатор "распознает" согласно простому принципу: первое слово -- всегда имя команды, далее до разделительного символа следуют ее параметры. В нашем случае "предложение" предельно простое, и слов всего три (собственно имя команды set и два параметра), поэтому set выполняет действие создания переменной. Имя новой переменной заимствуется из первого параметра команды (второго слова "предложения"), содержание -- из второго параметра. Результатом выполнения команды является не только новая переменная, но и подтверждение -- вывод содержимого переменной. Теперь мы можем востребовать содержимое переменной с именем "тикль" второй формой команды set : set Один. Заметьте, как умная консоль "подсветит" второе слово в команде, обнаружив, что в системе есть такая переменная. Собственно, на этом сведения заканчиваются, можно поразмышлять. И есть о чем -- хотя бы о том, что "тикль" допускает в именах переменных не-ASCII-символы. Нечасто такое свойство встречается в языках программирования. Более того, Tcl допускает пробелы в именах переменных, специальные символы и даже... не содержащие никаких символов имена (последнее является одним из свидетельств близости Tcl к так называемым функциональным языкам, где в идеале вообще не должно быть переменных, а процесс вычислений представляет собой функцию, оперирующую результатами вычисления других функций, которые, в свою очередь, оперируют результатами выполнения...). Правда, не нужно увлекаться этими возможностями, а стоит все-таки придерживаться правил программистского благородства, думая о тех несчастных, кому волею судьбы уготовано прочесть код вашей программы: не обращайте их жизнь в кошмар, не заставляйте учить суахили, чтобы понять, что значат имена переменных в программе! Из этих соображений давайте избавимся от демонстрирующей "продвинутость" системы, но такой неблагородной переменной командой unset : unset Один. Вот и еще одна команда пополнила арсенал ваших знаний: unset удаляет из системы ранее созданную переменную, принимая в качестве параметра ее имя.

Следующий пример -- классический. C программы "Hello, World" неизбежно начинали все, включая признанных гениальных программистов. Итак, вы знаете уже почти все необходимое для ее написания (введите ее в консоли в одну строку, не забывая разделяющих пробелов, и подтвердите нажатием Enter):

set Message "Hello, World\; I like Tcl!" ;
puts stdout $Message

Несмотря на элементарность, здесь продемонстрированы сразу несколько фундаментальных принципов Tcl, в которых мы и разберемся. Будем рассматривать этот пример "покомандно" -- потому как в Tcl фактически ничего, кроме команд, нет. С первой командой вы уже знакомы -- это set, принимающая в качестве параметров имя создаваемой переменной и ее содержимое. С именем понятно -- Message, а вот представление содержимого знакомит вас с важнейшей особенностью Tcl -- группированием. В данном случае применена одна из форм группирования, когда заключенная в двойные кавычки последовательность символов, разделенных пробелами, считается системой одной единицей данных -- строкой. Теперь значение переменной как будто понятно, но учтите, что в выводе куда-то пропал символ "\". Такая реакция знакомит с еще одним новым свойством -- подавлением специальных символов. "Неподавленный" специальный символ ";" выступает в роли разделителя между командами -- все, что встречается интерпретатору после этого символа, трактуется системой как новая команда. "Puts stdout $Message" -- это вторая команда, в соответствии с документацией на Tcl записывающая в канал строку данных. Канал указывается первым параметром команды (в данном случае -- stdout, стандартный канал вывода), а вот второй параметр -- $Message -- представляет форму записи разыменования переменной, т. е. получения ее значения.

Обо всех выделенных курсивом понятиях мы поговорим в следующей статье, а сейчас просто подведем краткие итоги "о самом главном":
  • "тикль" как язык состоит только из команд и не из чего больше;
  • интерпретатор считает первое слово в строке именем команды, остальные, разделенные пробелами, -- параметрами команды.