Tcl/Tk – «двойной чай» для любителей кофе

Если бы уважаемый читатель знал, как трудно бывает порой создать название для уже "выношенной и родившейся" статьи. Слово — оно ведь не воробей, и однажды неудачно сказанное и растиражированное, может надолго отвлечь внимание от объекта, безусловно этого внимания заслуживающего. Именно так некогда и случилось с предметом нашего сегодняшнего обсуждения, но об этой истории позже.

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

Человек и его программа

Что может быть приятнее для любого родителя, чем чувство гордости за своего ребенка. И автора системы Tcl/Tk, Джона Остирхоута (John Ousterhout), можно смело назвать счастливым отцом. За сравнительно короткий период "роста" Tcl/Tk (далее, для краткости, будем использовать сокращенное русское "Тикл") полностью изменила как жизнь своего создателя, так и взгляды на компьютинг сотен тысяч своих поклонников. И, надо сказать, изменила далеко не в худшую сторону…

Восстанавливая по скудным данным историю Тикл, вряд ли удастся избежать повторений (не следует думать, что скудность исторических данных объясняется низкой популярностью Tcl/Tk, просто Джон Остирхоут очень скромный человек). Повторений не в семантическом, а в географическом смысле. Остирхоут прошел через неизбежную для всех компьютерных талантов академическую школу Университета Беркли, затем работал в почти неизбежной для всех высококлассных Unix-разработчиков корпорации Sun.

А начиналось все в Йельском (Yale) университете, где в 70-е годы будущий создатель одной из самых ярких компьютерных технологий обучался… квантовой физике. Сам Остирхоут вспоминал: "…за половину года, проведенного в созерцании перебегающих со страницы на страницу уравнений квантовой физики, я понял, что единственно привлекательной в этой науке для меня была возможность возиться с компьютерами в лаборатории…". Естественно, как и все будущие физики, Остирхоут изучал FORTRAN — в те времена (да и, по большому счету, сегодня) основной язык программирования, очень хорошо соответствующий требованиям научных вычислительных приложений.

Утрата интереса к физике вызвала необходимость сменить университет, и Остирхоут перевелся в Кэрнеджи Меллон (Carnegie Mellon), в котором очень скоро получил степень доктора (PhD computer science). В 1980 г. начинается "Берклиевский период", продлившийся 14 лет. Опять же в воспоминаниях самого Остирхоута можно найти частичный ответ на очевидный вопрос, связанный с "берклицентричностью" современного компьютинга: что же такого особенного в Беркли? Да, собственно говоря, ничего, кроме высочайшего профессионализма и доброжелательного отношения: "…в некоторых университетах поддерживается атмосфера конкуренции, направленной на подавление молодых ученых. Те, кто выжил в подобных условиях, получают поддержку. И только в Беркли к младшей профессуре относятся действительно бережно…" (Остирхоут, перевод не дословный).

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

В 1989 г. первая версия Tcl/Tk появилась на свет. За 4 года "академической истории" (до 1993 г.) характер роста популярности бесплатной и распространяемой в исходных текстах Тикл можно назвать взрывным — к концу 1993 г. Тикл-сообщество уже насчитывало несколько сотен тысяч программистов. К 1994 г. взрыв Тикл прозвучал так громко, что его услышала могучая Sun, — Остирхоут принял предложение Unix-гиганта и навсегда покинул академическую среду, став ведущим инженером проекта SunScript. Четырехгодичный "солнечный" период оказался решающим для Тикл. "Под лучами солнца" Тикл не просто осталась свободно распространяемой системой, но и значительно усовершенствовалась, приобрела свойство кросс-платформенности (все Unix, MS Windows, Apple Macintosh) и, наконец, "взорвалась" второй раз — рост количества разработчиков, активно использующих Тикл, составил за этот период 600%.

Окончание "солнечного" периода — 1998 г. — пришлось как раз на разгар Java-бума. Историческая "битва титанов" — Sun и Microsoft, превратила Java в мощное оружие конкурентной борьбы. Неумолимые требования тактики вынуждали Sun позиционировать Java как систему "для всего", что существенно сказывалось на популярности в чем-то аналогичной Тикл. И Остирхоут принимает единственно верное решение — он покидает Sun и создает компанию Scriptics, прекрасно чувствующую себя и по сей день.

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

Во всей этой истории, которая к концу статьи окажется куда более полной и интересной, обратим внимание читателя на один маленький, но очень важный факт: компания Scriptics была одной из первых программных фирм, сформировавших удачный и живучий симбиоз сугубо коммерческой структуры, основанной на бесплатной модели ПО с открытыми исходными текстами. Естественно, что у Scriptics есть и платные (можно сказать, даже очень платные) продукты, но основа основ — Тикл была, есть и будет "всенародным достоянием". И в отличие от растущих как грибы компаний Linux-дистрибьюторов, занимающихся преимущественно штамповкой CD-ROM, в основе успеха модели Scriptics лежат собственные идеи, методологии и программы…

Так о чем речь?

"Пускайте Берлагу!".
О. И. Бендер

Действительно, завесу "тайны" пора снимать. Да и ничего особенно таинственного в Tcl/Tk нет. Это "всего лишь" кросс-платформенная система, включающая в себя интерпретатор достаточно странного языка программирования Tcl и его расширения под названием Tk. Вспоминая пророческие слова Билла Гейтса по поводу Java (что-то вроде "ну, еще один язык программирования…"), здесь можно было бы остановиться и… оставить без внимания огромный и до конца еще не осознанный разработчиками программного обеспечения и им сочувствующими пласт информационной культуры. Поэтому не спешите.

Итак, Tcl. Как уже говорилось в начале статьи, это — аббревиатура. Полное название — Tool command language (язык управления инструментами). О нем мы поговорим позже, а пока стоит обратить внимание на "инструментальный" характер названия. Отношение к программам как к инструментам, по каким-то причинам вышедшее из моды, оказывается, возвращается к жизни. В полном соответствии с "инструментализмом", Tk расшифровывается как Tool kit — набор инструментов. Если быть более точным, то инструменты из "коробки" Tk представляют собой очень гибкие и удобные в использовании примитивы пользовательских графических интерфейсов, управление которыми осуществляется средствами того же языка Tcl.

Даже на уровне названия Тикл напоминает что-то очень знакомое из идей Unix, но распространяет это "что-то" чуть ли не на все возможные платформы, включая BeOS и навсегда уходящую со сцены OS/2.

Перед дальнейшими путешествиями по "джунглям" Тикл попытаемся на реальных примерах, исключающих неизбежную субъективность, ответить на один оставшийся важный вопрос: а заслуживает ли Тикл нашего столь пристального внимания? Судите сами…

Есть такая никому у нас не известная компания с несколько наивным названием CPU. К процессорам, к слову, никакого отношения не имеющая — в этом можно убедиться, посетив ее сайт в Internet (www.cpu.com). Успешные проекты CPU — один из лучших примеров использования Тикл в приложениях класса mission-critical, ведь всю технологию CPU можно назвать "Тиклцентрической". Представляете себе морскую буровую платформу стоимостью более 1 млрд. долл.? Как вы думаете, на каких технологиях основана и каков порядок сложности программной управляющей системы такого монстра? Ответ прост: основная интеграционная технология — Tcl/Tk, а вся система состоит менее чем из 200 программных модулей, каждый из которых — не более 1000 строк кода. С учетом "запаса прочности" (плюс 30%) для большей достоверности оценки, суммарный размер управляющей системы составляет около 300 тыс. строк кода. Сюда входят и полноценная геоинформационная система, и разнообразные базы данных, и подсистемы управления реального времени, и все это — с дружественным графическим пользовательским интерфейсом. Но главное — все это ВСЕГДА ХОРОШО РАБОТАЕТ (для сравнения попытайтесь узнать количество строк кода в вашем любимом текстовом процессоре, который наверняка не всегда хорошо работает).

Автомобили с маркой BMW своим высоким качеством также в некотором смысле обязаны Тикл — ведь именно на Tcl/Tk реализованы пользовательские интерфейсы и интегрирующая среда системы управления производственными процессами реального времени на заводах BMW.

"Internet-монстр" AOL создал целый "Тикл-мир": все серверы AOL используют Tcl как встроенный язык программирования — именно Тикл обеспечивает в империи AOL столь модное и необходимое сегодня динамическое формирование контента Web-сайтов и расширенные сервисы.

Тикл — королева систем тестирования. Этот статус уже стал признанным де-факто. Тестовые программы на Тикл используются Cisco, HP и еще сотнями лидирующих в самых разных отраслях компаний.

Не java

Сравнение с Java теперь напрашивается само собой — в конце концов, Java тоже интерпретируемый (а с дополнительной программной поддержкой и компилируемый) язык программирования и мощные библиотеки примитивов пользовательского интерфейса. Но даже в определении видна огромная разница — здесь нет ни слова, напоминающего об инструментальности (предвидя возмущенные отклики борцов за "джейвафикацию": объектно-ориентированный характер Java и присутствующее в названии AWT слово Toolkit не принимаются во внимание, причины этого будут понятны далее).

Классическая архитектурная модель современного ПО

Здесь пора немного уточнить историю Тикл и Джона Остирхоута. В 1997 г. Остирхоут был удостоен самой престижной награды в мире компьютинга — ACM Software System Award. Несмотря на небольшое денежное вознаграждение, награды ACM котируются на уровне Нобелевской премии. Если взглянуть на краткую цитату на сайте www.acm.org, Дж. Остирхоут получил награду за "…язык расширений Tcl, позволяющий разработчикам объединять уже существующие компоненты в сложные приложения; встроенный Tk, обеспечивающий простые механизмы создания графических пользовательских интерфейсов; концепцию совместного использования Tcl/Tk как мощное дополнение к программным репозиториям". Теперь хорошо видна разница между Java и Тикл: как ни дико может звучать это утверждение, но Тикл — намного более высокоуровневая система, выполняющая свою интегративную функцию на уровне программных компонентов, а не низкоуровневых объектов.

Раз уже речь зашла о программных компонентах и объектах, просто необходимо прояснить ситуацию. Все эти термины непосредственно связаны с одним-единственным понятием повторного использования кода. Рост производительности труда — проблема актуальная и в такой творческой области, как программирование: не только производители автомобилей не хотят выпускать гайки, необходимые для сборки, но и разработчики прикладных и системных высокоуровневых программных инструментов не желают (но в большинстве случаев все же вынуждены) кодировать каждый, уже сотни раз реализованный до них фрагмент кода. По теории, объектно-ориентированное проектирование и программирование как раз направлены на решение этой проблемы. На практике же выходит, что "хотели как лучше, получилось как всегда": две существующие модели повторного использования — "открытые ящики" и "закрытые ящики", обладают серьезными недостатками. "Открытыми ящиками" принято называть претендующие на повторное использование фрагменты кода, исходные тексты которого доступны, соответственно "закрытые ящики" представляют собой бинарные исполняемые или объектные файлы. Первая модель удовлетворительно "работает" только до определенного уровня сложности повторно используемого ПО и сильно зависит от технологических средств, применяемых разработчиками (это, в первую очередь, касается проектов, реализованных на сложных объектно-ориентированных языках, в качестве примера можно привести уже давно "умершую" библиотеку CTI, созданную Sun, которая могла быть использована только с компилятором языка C++ производства Sun). Вторая модель ("закрытых ящиков") более "удобоварима" для сложных проектов и идеально подходит при написании многоязычных приложений (например, мощную картографическую систему достаточно целесообразно реализовать на языках C++, FORTRAN и Lisp). Даже такой гранд, как Microsoft, после длительной и тяжелой поддержки "открытых ящиков" из-за сложности сопровождения вынуждена обратиться к закрытой модели (COM). Но и здесь "подводные камни" слишком велики — неизбежная и очень сложная как в реализации, так и в освоении программистами прослойка middleware, необходимость в сверхкачественной документации на интерфейсы всех повторно используемых фрагментов — все это дорого, долго, сложно и, по столь очевидным причинам, ненадежно.

"Монолитная" модель скрипт-ориентированной архитектуры ПО

Но кроме этих двух, есть еще хорошо известная и проверенная временем трехслойная модель, представляющая сложное приложение этаким "бутербродом" из повторно используемых компонентов, "удобных" в вычислительном смысле, интеграционного высокоуровневого языка программирования, и компонентов, удачных с точки зрения пользователя. Все это старо как компьютерный мир, давным-давно реализовано в ОС Unix (а с недавних пор активно развивается и в MS Windows как парадигма "скриптинга" в COM/OLE окружении) и уже не требует доказательств явных преимуществ (если бы их не было, Unix давно бы покоилась на компьютерной свалке истории). Тикл является ярчайшей представительницей трехслойной модели, добавляющей к ее базовым преимуществам две концептуально важные особенности: во-первых, Tcl/Tk является расширяющейся системой (т. е., допускающей расширение промежуточного, интегративного слоя за счет новых компонентов), во-вторых, Tcl/Tk является расширяющей системой, допускающей включение ее самой в повторно используемые компоненты. Так что, в отличие от самостоятельной, ориентированной на независимое "существование" Java, Тикл больше напоминает… обычную (но очень мощную и мобильную) командную оболочку Unix с возможностью придания ей "человеческого лица".

Великий программист
против великого апологета

Итак, договорились, Тикл — замечательная разработка… Почему же ей почти не уделяют внимания? Ну, во-первых, смотря кто не уделяет — серьезные разработчики действительно сложных информационных систем Тикл используют очень широко, просто о подобных системах известно достаточно мало. Однако есть два соображения, которые помогут уточнить ответ на поставленный вопрос. В отличие от Java, изначально ориентированной на распространение программ в мобильном байт-коде, даже современные версии Tcl (старше 8.0), также использующие внутреннее байт-код-представление, не допускают иных форм Тикл-ПО, кроме исходных текстов и бинарных, платформенно-зависимых исполняемых файлов. Возможно, такая модель и ограничивает популярность Tcl/Tk среди производителей массового коммерческого ПО — открытые исходные тексты у них не в чести. Но почему Tcl/Tk не заняла подобающего места во freeware-сообществе, в первую очередь, в FSF (Free Software Foundation)? А вот на этот вопрос есть совершенно определенный ответ: популярности Тикл в свое время был нанесен серьезный урон главным "столпом" FSF Ричардом Сталлменом (в дальнейшем, согласно традициям FSF, именуемым RMS). В сентябре 1994 г. RMS фактически надолго "утопил" продуктивные идеи Tcl/Tk своей рекомендацией "Почему вы не должны использовать Tcl", опубликованной сразу в нескольких группах новостей. Мотивация этого послания, с сегодняшней точки зрения, кажется более чем странной: RMS концентрирует внимание на якобы невозможно сложном синтаксисе Tcl (приводя в качестве контраргумента язык с куда более ужасным синтаксисом, но выигрывающий в четкости определения семантики, — Lisp), одновременно утверждая о "подкупающей хакеров простоте Tcl". Совершенно не разобравшись с основными идеями "раширяемости" и "расширения" Тикл, RMS наносит последний удар, утверждая, что Tcl пригоден только для маленьких приложений и выносит вердикт: "Поэтому проект GNU не собирается использовать Tcl в программном обеспечении GNU". Мавр сделал свое дело…

Идеальная архитектура скрипт-ориентированного ПО

А теперь давайте прислушаемся к обоснованному мнению настоящего программиста, первого лауреата премии ACM Брайана Кернигана (B. W. Kernighan, далее — BWK), автора знаменитого языка программирования C: "Tcl/Tk придает работе магическую продуктивность, за несколько часов можно достигнуть тех же результатов, что за дни или недели при разработке на C или C++… Tk весьма эффективен для большинства приложений, многие элементы интерфейса (виджеты) реализованы настолько хорошо, что остается только удивляться, как подобная работа могла быть выполнена так качественно… Удачным кажется и то, что разделение задач между Tcl и С/С++ осуществляется достаточно легко, надо только знать, какой инструмент лучше справляется с задачей… Расширение системы дополнительным Tcl-кодом, загружаемым напрямую в Tcl-библиотеку приложения, в полном согласии с оригинальной идеей Остирхоута, повышает эффективность программы в целом, упрощает ее структуру и улучшает мобильность… Я не уверен, что Tcl мог бы выжить, как самостоятельный продукт — у него слишком много конкурентов. Но у сочетания Tcl/Tk в Unix-мире нет конкурентов… Система исключительно надежна, очень хорошо документирована… свободно доступна… безукоризненно высокого качества". Более подробно с отчетом "Опыт использования Tcl/Tk в научной и инженерной визуализации" и работой "…Опыты с языками расширения и пользовательских интерфейсов" читатели могут ознакомиться на домашней странице Кернигана www.cs.bell-labs.com/who/bwk/index.html.

Идеология Тикл

Построение прикладных и системных программ на основе идеологии (или методологии) Tcl/Tk существенно отличается от традиционно принятых методов разработки ПО с интенсивным использованием GUI. Все задачи, для решения которых ранее приходилось "тщательно перемешивать спагетти" вызовов библиотек классов или функций, успешно реализуются интерпретирующей частью программы на Тикл. Если для интерактивных потребностей задачи не хватает возможностей встроенных примитивов Tk, разработчик может расширить саму Tk-подсистему новыми, недостающими виджетами. Но самое интересное заключается не в свойстве расширяемости Tcl/Tk. В правильно спроектированной "тиклцентрической" программе самая важная ее часть (или части) — компилируемые ресурсоемкие модули, созданные, например, на C или C++, больше не имеют дела с "привязанными к платформе" вызовами подпрограмм графического интерфейса. Вместо этого быстрые бинарные модули генерируют… скрипты на Tcl/Tk и передают их с помощью механизмов межпроцессного взаимодействия самой Тикл-системе. Мобильность таких программ крайне высока, ведь они работают только с обычными строками данных, а результирующая эффективность построенного программного комплекса остается достаточно высокой — все ресурсоемкие приложения выполняются в естественных для данной платформы скомпилированных машинных кодах.

XML и Tcl/Tk

XML сегодня в фаворе, и вместо неплодотворных рассуждений о том, хорошо это или плохо, лучше все-таки XML использовать. Но вот как? Каждый новый тег XML требует программной поддержки, а ведь именно в свободе "тегообразования" и формальном синтаксисе и заключается вся прелесть XML. И здесь Тикл может оказать полезную услугу — программы манипуляции XML (TclXML), DOM (TclDOM) документами, написанные на "чистом" Тикл, поражают воображение миниатюрностью и недостижимым ни C++, ни Java удобством (www.zveno.com). Теперь в модель Тикл-ориентированного приложения "до-XML" эпохи можно включать универсальные и легко настраиваемые "фильтры", позволяющие использовать массу "старых" программ без их модификации: необходимо только разработать соответствующие скрипты, преобразующие форматы обрабатываемых XML-элементов (их выделение — забота TclXML) в "понятную" программам форму.

Идеи и инструменты

В отличие от суперпопулярных сегодня разработок в области freeware-пользовательских интерфейсов — KDE и Gnome, скромный Тикл дает разработчику недостижимые для этих систем преимущества, начиная от полноценной поддержки Unicode и заканчивая явным архитектурным превосходством, — Tcl/Tk не только не нарушает классической модульной традиции Unix, но и придает ей исключительную гибкость. Расширяемая модель Тикл идеально соответствует требованиям приложений, работающих с XML, и позволяет даже сформировать новый тип документа — исполняемый. А главное, созданные на основе Тикл-идеологии программные комплексы обладают очень высокой живучестью, легко сопровождаются и развиваются и прекрасно "уживаются" на самых разных платформах (это не выдумка, а факт — созданный Sun для Бог знает какой версии Tcl/Tk замечательный конструктор SpecTcl прекрасно работает на всех платформах и современных версиях Тикл).

А уж по богатству бесплатных и достаточно качественных инструментальных средств Тикл оставляет Java далеко позади. Мощная программа автоматизации "связывания" программ на компилируемых языках и Tcl SWIG (www.swig.org), отличный конструктор графических интерфейсов, объединяющий в себе элементы интегрированной среды разработки Tcl/Tk-ПО VisualTcl (www.neuron.com/stewart/vtcl/), дружелюбный визуальный отладчик Tcl-программ Tuba (www.geocities.com/SiliconValley/Ridge/2549/tuba/), расширенные библиотеки виджетов, масса объектно-ориентированных расширений… Все это доступно и совершенно законно бесплатно, как и появившаяся на прошлой неделе "свежая" версия Tcl/Tk 8.3.0 (dev.scriptics.com).