Скрипт не забыт
Языки и системы программирования принято делить на пять (точнее, уже шесть - см. PC Week/RE, № 46/97, с. 64) поколений. Однако в эту классификацию не укладывается большая группа так называемых языков сценариев (скрипт-языков, или СЯЗ). Программы на СЯЗ обычно вставляются в исходных текстах в приложения для их гибкой настройки или, наоборот, служат мощным средством объединения ПО, написанного на других языках. Но большинство разработчиков считают СЯЗ только вспомогательным инструментом. Например, JavaScript обычно воспринимается как урезанный Java и используется в основном для создания бегущих строк в браузере. Программисты иногда даже возмущаются отсутствием в JavaScript типизации, что говорит о полном непонимании предназначения этого языка. Ведь он обладает уникальными возможностями по интеграции объектов Windows - например, автоматическим управлением Internet Explorer, который является OLE-объектом. При работе с ним использовать переменные конкретных типов неудобно, а иногда и невозможно.
В своей классической статье “Скрипт-языки - высокоуровневое программирование XXI века” Джон Аустераут (John Ousterhout), создатель скрипт-языка Tcl/Tk, назвал СЯЗ языками системной интеграции, потому что они ориентированы прежде всего на работу не с элементарными данными, а с объектами операционной среды. Это позволяет очень эффективно использовать ОС, интегрируя ее ресурсы с помощью языков, которые на высоком уровне, без написания тысяч строк кода, с помощью двух-трех команд дают возможность манипулировать системными объектами и “склеивать” их в одно целое. По мнению Аустераута, принципы объектно-ориентированного программирования (ООП) не завоевали должной популярности только потому, что их пытаются реализовать на уровне примитивных операторов языков третьего поколения (3GL) типа Си++, что приводит к громоздкому и неуклюжему коду, а не на уровне свойств и методов самих объектов. В отличие от 3GL-языков в современных СЯЗ парадигма ООП воплощена наиболее полно. Она встречается даже в старых СЯЗ типа командных языков MS-DOS или UNIX, которые позволяют довольно эффективно работать с объектами ОС - файлами и программами.
Практически все СЯЗ относятся к интерпретируемому типу (в последнее время для ускорения интерпретации все более активно используется компиляция в промежуточный код). Это связано с тем, что для работы с объектами ОС язык должен обладать высокой гибкостью, а процесс выполнения системных программ часто зависит от многих факторов, которые трудно предусмотреть на этапе компиляции. Обычно СЯЗ не свойственна строгая типизация, что повышает их гибкость. Основной элемент данных в этих языках - строка, которую при работе с двоичными объектами нередко надо интерпретировать как последовательность байтов. Кроме того, настройка крупной системы требует быстрого создания или модификации небольших программ, для чего удобнее использовать интерпретаторы. Конечно, СЯЗ проигрывают компилируемым 3GL-языкам в производительности (оператор Си транслируется в среднем в 3 - 7 машинных команд, а для выполнения одного оператора СЯЗ необходимы сотни тысяч команд), зато позволяют разрабатывать ПО в десятки раз быстрее. К тому же их легче освоить, что очень важно при подготовке специалистов по сопровождению ОС, сетей и т. д.
Как стать знаменитым
Сотрудник университета Беркли (шт. Калифорния) Джон Аустераут в конце 80-х был известен не более своих коллег. Сегодня же его знают программисты всего мира, так как именно он придумал популярный скрипт-язык Tool command language (Tcl) и библиотеку Tk. Впервые идея языка Tcl (произносится “такль”) пришла Аустерауту в 1987 г. В Tcl он попытался воплотить свое видение идеального СЯЗ, и в дальнейшем всемирная популярность Tcl подтвердила правильность его взглядов. Первая работающая версия языка появилась в 1989 г., библиотека Tk вышла в 91-м. Реализуется Tcl чаще всего в виде встраиваемой в приложения библиотеки на Си, содержащей интерпретатор Tcl.
Tcl представляет собой язык, синтаксически немного похожий на Perl. Ориентированный преимущественно на автоматизацию рутинных процессов ОС и крупных программных систем, он состоит из мощных команд, предназначенных для работы с абстрактными нетипизированными объектами. Принципиальное отличие Tcl от командных языков ОС состоит в том, что он не зависит от типа системы (т. е. вам не надо утруждать себя изучением нового командного языка) и, самое главное, позволяет создавать переносимые программы с графическим интерфейсом пользователя (ГИП). Можно, например, написать утилиту просмотра всех каталогов и подкаталогов с уничтожением временных файлов, приделать к ней симпатичную оболочку с кнопочками, меню, картинками, диалогом ввода расширения уничтожаемых файлов, и эта утилита будет работать практически в любой ОС!
Tcl - расширяемый язык. В нем разрешено самостоятельно определять новые команды (как в Форте). Классический пример определения команды Tcl:
button .b -text Hello! -font {Times 16} -command {puts hello}
Команда button предназначена для создания кнопки (.b) с надписью “Hello!” (можно указать картинку), которая пишется шрифтом Times размером 16 пунктов. При нажатии на кнопку в стандартное устройство вывода посылается строка hello (puts hello). Набор таких команд позволяет очень компактно и наглядно описать ГИП с полным функциональным наполнением. Эти команды можно вызывать из других языков или на их основе писать ПО полностью на Tcl. В последнем случае приложение считается “Pure Tcl 100%”.
Tcl/Tk разрабатывался одновременно как язык и библиотека. Позже эта идея была реализована в Java, языке фирмы Sun, где Аустераут трудится с середины 90-х годов. Библиотека Tk содержит стандартизованный набор команд поддержки ГИП в стиле Motif. Управляющие элементы, хранящиеся в Tk, называются виджетами (widget). Большое количество нетиповых виджетов можно найти в Internet. На основе Tk создаются переносимые приложения, например на Си с ГИП.
На Tcl написано очень много мобильных приложений с ГИП, которые используются в самых разных областях: при управлении ОС, администрировании сетей, обслуживании Web-серверов и т. д. В Tk имеются команды для работы с “гнездами”, с помощью которых можно создавать приложения для Сети. Для браузеров разработаны подключаемые модули, позволяющие вставлять Tcl-скрипты (таклеты, taclet) в html-страницы (см. www.neuron. com). Известно использование Tcl/Tk в масштабных российских проектах, в частности, в кодогенераторах фирмы DataX/Florin для поддержки платформно-независимого пользовательского интерфейса.
Tcl/Tk распространяется в исходных текстах бесплатно (http://sunscript.sun.com/TclTkCore/). Он может легко интегрироваться с Си++, Адой, Прологом, Модулой-3, Perl и многими другими языками. Tcl реализован для Windows 3.1/ 95/NT (http://sunscript.sun.com/win/wintcl-project.html), Macintosh, AIX 3.x, VMS, практически для всех UNIX-платформ - SunOS, SCO Unix, HP-UX, BSDI, Linux, QNX, а также для суперкомпьютеров Cray и NEC. На “Pure Tcl 100%” написана оболочка Visual Tcl, которая позволяет разрабатывать кросс-платформное ПО для UNIX, Windows и Macintosh. Версию Tcl/Tk для OS/2 Presentation Manager написал некий Илья Захаревич из шт. Огайо (не исключено, что наш соотечественник: в этом штате работает много российских программистов). Имеется расширение языка incrTcl/incrTk, ориентированное на создание больших приложений.
С начала 90-х годов проект Tcl взялась поддерживать фирма Sun. Была создана рабочая группа SunScript (название языка осталось прежним), где сейчас работает Джон Аустераут. SunScript создает коммерческие версии Tk, в частности для Windows и Macintosh. Несколько месяцев назад эта группа приступила к интеграции Tcl и Java. Разработана версия Tcl, написанная на Java, - Jacl (JAva Command Language). Расширение языка Tcl Blend позволяет работать с Java VM и интегрировать Tcl-сценарии с Java-кодом.
В конце августа 1997 г. вышла новая, восьмая версия Tcl/Tk. Интерпретация заменена компиляцией в байт-код “на лету” (по аналогии с Java). Полностью переделана обработка строк. Работа с двоичными объектами и большими текстовыми массивами по сравнению с версией 7.x ускорилась в 2 - 20 раз. Добавлены новые команды быстрой сортировки, ввода-вывода двоичных данных с поддержкой различных типов периферийных устройств, поддерживается протокол http, реализованы новые средства обеспечения безопасности. Увеличена (до 12 цифр вместо шести) точность при работе с числами с плавающей запятой. Подробно документирован интерфейс с Си. Полностью переписана библиотека Tk. Усовершенствована работа с объектами управления, меню и шрифтами, добавлены новые команды для работы с графическими файлами и т. д. Наконец, приложения на Tcl/Tk могут сопровождаться логотипом “Tcl Powered” (по лицензии Sun). Появилась, правда, некоторая несовместимость с программами, написанными на старых версиях Tcl. В частности, даты, выраженные двумя цифрами года, трактуются как даты следующего столетия: например, 17 г. означает не 1917-й, а 2017-й год. В версии Tcl 8.1 обещана поддержка Unicode.
Учитывая, что фирма Sun активно развивает Tcl/Tk, можно предсказать этому языку очень хорошее будущее. А история его создания является классическим примером на тему “как стать знаменитым”. Хотите прославиться? Разработайте свой скрипт-язык для использования в какой-нибудь быстро развивающейся области ИТ, поместите исходные тексты интерпретатора на свою страничку, напишите в конференцию по программированию и ждите, когда вас пригласят в Sun или Microsoft. Как написал один мой коллега, “с вещами”.
Сергей Бобровский
К Сергею Бобровскому можно обратиться по Web-адресу softart@postman.ru.