Tcl — как скриптовый язык для университетских проектов стали использовать по всему миру
Одна из ключевых облачных фич — масштабирование (о возможностях облака с примерами из реального бизнеса мы расскажем 30 октября, подключайтесь). Настраивать масштабирование, а также балансировщики нагрузки и виртуальные машины можно различными способами. Один из нетипичных вариантов — использование языка Tcl.
Tcl (Tool Command Language) разработал программист Джон Оустерхаут в середине 1980-х. Tcl достаточно универсален — он помогает управлять сетевыми устройствами и работать с облачными интерфейсами.
В начале девяностых вокруг решения сформировалось серьезное академическое комьюнити. Затем сообщество стало шире — участники разрабатывали новые расширения и средства для работы с БД.
История языка насчитывает уже больше тридцати лет, и сегодня мы расскажем о том, как продвигалось его развитие.
Первые шаги
Джон Оустерхаут получил степень бакалавра по физике в Йельском университете и стал доктором в области компьютерных наук в Университете Карнеги — Меллона. После завершения учёбы Оустерхаут преподавал в Калифорнийском университете в Беркли, где участвовал в развитии сетевой операционной системы Sprite и первой журнально-структурированной файловой системы.
Позже Оустерхаут разрабатывал инструменты для проектирования интегральных схем. Но для каждого из них приходилось кастомизировать командный язык, что увеличивало время разработки.
Поэтому в 1987 году Оустерхаут решил написать свой простой и универсальный язык с расширяемыми базовыми возможностями — так зародилась идея языка Tcl. Работу над ним разработчик начал в начале 1988 года, а уже весной использовал первую его версию в текстовом редакторе. Также он спроектировал Tk (Tool Kit), который дополняет Tcl инструментами для построения графических интерфейсов.
Впоследствии инженер использовал Tcl/Tk в нескольких учебных приложениях, а в 1990 году представил доклад об инструменте на престижной компьютерной конференции USENIX. После выступления Оустерхаута проектом заинтересовались многие разработчики в академическом сообществе. Тогда автор Tcl/Tk решил передать свое детище в open source.
Что интересно, на той же USENIX доклад Оустерхаута посетил инженер Дон Либес. Он давно планировал разработать программу для автоматизации интерактивных Unix-приложений, но проект тормозило отсутствие подходящего языка. Tcl помог ему реализовать Expect для автоматизации смены паролей и управления маршрутизаторами, которое стало первой широко распространённой имплементацией Tcl.
Tcl/Tk набирает обороты
В период с 1989 по 1993 годы количество пользователей Tcl/Tk выросло до десятков тысяч. Дело в том, что инструментарий Tcl/Tk упростил разработку графических пользовательских интерфейсов под Unix. Приложения можно было написать на Tcl, не прибегая к другим языкам. Так, Tcl стали использовать в самых разных отраслях — от биржевой торговли до научной визуализации и автоматизации производства.
В это же время вокруг языка активно формировалось комьюнити. Его участниками стали инженеры Марк Диханс и Карл Лехенбауэр. Они написали TclX — первое свободно распространяемое расширение Tcl для работы с файлами и датами. Многие решения TclX позже вошли в базовые релизы Tcl.
В 1993 году другой участник сообщества Майкл МакЛеннан написал расширение [incr Tcl] с инструментами для объектно-ориентированного программирования на Tcl/Tk. Появлялись и другие приложения, например, BLT, которое добавило средства для визуализации, Sybtcl и Oratcl для работы с базами данных. Эти расширения были представлены на первой конференции Tcl, проведенной летом 1993 года, и впоследствии ставшей регулярной.
Со временем даже релизы Tcl синхронизировались с датами проведения конференций. Там Оустерхаут презентовал новую версию языка, а участники голосовали за добавление или удаление тех или иных функций простым поднятием руки. Хотя у некоторых членов комьюнити возникали сомнения в объективности такого подхода. Они отмечали, что часто у Оустерхаута уже было решение по вынесенному на голосование вопросу, поэтому он «не замечал» некоторые поднятые руки. Такой процесс голосования даже получил собственное название — Oustervote.
Сообщество Tcl обменивалось опытом не только на конференциях. Оустерхаут запустил email-рассылку для комьюнити, которая позже переросла в форум. Группа comp.lang.tcl стала местом для общения и обсуждения разных тем, посвящённых Tcl.
Tcl покидает академию
В 1994 году Оустерхаут решил уйти из Калифорнийского университета и принял предложение о работе от Sun Microsystems. Инженер планировал развивать Tcl как универсальный скриптовый язык, а ресурсы компании помогли бы ему в этом.
В Sun ушла и команда, работавшая над Tcl в Беркли. Однако изначально сообщество с недоверием отнеслось к переходу Оустерхаута — в частности, звучали опасения, что Tcl/Tk может стать проприетарным языком. Однако инженер заключил соглашение с компанией, по которому библиотеки Tcl и Tk должны были остаться опенсорсными.
По мере выхода релизов Tcl в комьюнити поняли, что поддержка Sun позволяет языку развиваться быстрее, и недоверие сменилось энтузиазмом.
С появлением новых версий Tcl/Tk начал поддерживать ОС Windows 95 и Macintosh. Продолжали появляться и расширения, например, Safe-Tcl для безопасного запуска недоверенных скриптов, Jacl и TclBlend для интеграции с Java. За три года число загрузок Tcl с сайта Sun увеличилось с 2 до 5 тыс. в неделю.
Также Tcl начал использовать бизнес. Так, NBC разработала на его базе интегрированную систему управления спутниковым вещанием, а крупный производитель сетевого оборудования внедрил Tcl в свой софт.
В 1996 году директор по технологиям Sun Эрик Шмидт предложил Оустерхауту выделить команду Tcl в независимую команду SunScript, чтобы запустить платные версии продуктов Tcl/Tk. Оустерхаут согласился, однако в 1997 году Шмидт покинул Sun. Руководство компании не поддержало развитие нового подразделения, поэтому SunScript пришлось распустить. Команда решила сосредоточиться на разработке бесплатных продуктов и сделать опенсорсными решения, которые должны были стать коммерческими — например, плагин SpecTcl и расширение WebTk. Реструктуризация также высвободила ресурсы для новых проектов, связанных с Java. Например, команда начала разработку пакета для интеграции с интерпретатором Tcl.
Однако со временем поддержка командного языка внутри Sun начала слабеть. Компания полностью сосредоточилась на развитии Java. По словам бывших сотрудников корпорации, руководство считало его перспективным инструментом в конкурентной борьбе против Microsoft.
Свой отпечаток наложила и история с Ричардом Столлманом. В 1994 году он опубликовал пост «Почему вам не следует использовать Tcl». Разработчик критиковал синтаксис языка и его проблемы с производительностью. Столлман утверждал, что Tcl больше подходит для нишевого использования и не сможет стать таким же популярным, как, например, Python. Есть мнение, что «гнев» основателя движения свободного программного обеспечения вызвало заявление Sun Microsystems о том, что Tcl может стать универсальным скриптовым языком.
Сомнения касательно будущего Tcl/Tk в составе Sun были и у самого Оустерхаута. Поэтому он решил продолжать работу над языком отдельно от компании.
Годы Scriptics
В январе 1998 года Оустерхаут основал компанию Scriptics вместе с Сарой Дэниелс, которая стала вице-президентом по продажам и маркетингу. В скором времени к ним присоединилось более половины команды, работавшей над Tcl в Sun. Компания начала разрабатывать коммерческий продукт TclPro, который вышел в сентябре 1998 года под лицензиями Named User и Shared Network. При этом Scriptics продолжила развитие опенсорсной версии Tcl/Tk. В 1998-м компания выпустила несколько патчей для Tcl 8.0, а в апреле 1999-го вышла версия языка, разработанная внутри Scriptics — Tcl/Tk 8.1. Релиз получил поддержку Юникода и новый пакет регулярных выражений.
Примерно в то же время Tcl/Tk получил награду ACM Software System Award и премию USENIX Software Tools User Group (STUG), а число еженедельных загрузок достигло планки в 12 тыс.
Независимая команда
В 1999-м в Scriptics начали разрабатывать программы на Tcl/Tk. Чтобы обозначить смену направления и расширение портфолио, компанию переименовали в Ajuba Solutions. Первый продукт — B2B-сервер — компания выпустила в 2000 году. Но в то же время произошел «крах доткомов», что помешало ему стать успешным.
Тогда многие бизнесы объединялись друг с другом, чтобы выжить, и Оустерхаут решил последовать их примеру. Он нашел потенциального покупателя — производителя CMS-решений Interwoven. Но Оустерхаут подозревал, что компанию интересует не Tcl/Tk, а XML-технологии для их CMS-продуктов, а также команда инженеров. Поэтому еще до продажи бизнеса он передал разработку ядра Tcl/Tk и TclPro в руки независимой группе программистов, получившей название Tcl Core Team.
В обязанности Tcl Core Team и по сей день входит внедрение новых функций, подготовка документации, сборка релизов и управление сайтом Tcl Developer Exchange. С 2000-го Оустерхаут не принимал активного участия в развитии проекта. Многие программисты из команды Scriptics/Ajuba Solutions ушли в другие компании, где руководили отделами по внедрению Tcl/Tk, оставаясь в составе Tcl Core Team.
Первая версия Tcl/Tk под руководством Tcl Core Team вышла в сентябре 2002 года. Это была версия 8.4, в которой появился упаковщик Starkit, упростивший распространение Tcl-приложений. В декабре 2007-го вышла версия 8.5, в которой были добавлены новые типы данных, репозиторий расширений и поддержка лямбда-выражений. Релиз 8.6 в 2012-м ознаменовал появление Tcl Object Oriented (TclOO).
Что мог предложить язык
Писать код на Tcl было до смешного просто. Каждая строка представляет собой отдельную команду, которая следует модифицированной парадигме UNIX:»Команда должна решать всего одну задачу, но делать это хорошо». Первое слово отражает имя (название), а все последующие — аргументы. Команды разделяют переводом строки или точкой с запятой, а аргументы — пробелами.
Программы на Tcl могут выполняться без компилирования, хотя профильный компилятор существует. Сам по себе язык расширяемый, также в Tcl реализована модель событийно-ориентированного программирования, интегрированная с библиотекой ввода-вывода, что облегчает написание сетевых программ. Например, следующая программа представляет собой параллельный TCP-сервер, который выводит текущее время клиенту.
socket -server handler 9999
proc handler {fd clientaddr clientport} {
set t [clock format [clock seconds]]
puts $fd «Hello $clientaddr:$clientport, current date is $t»
close $fd
}
vwait forever
В то же время Tcl позволяет писать функциональные примитивы, которые согласуются с логикой языка. При этом центральной структурой данных является список, который хорошо знаком программистам на Lisp.
Tcl сегодня
Когда-то в комьюнити программистов Tcl/Tk пророчили будущее «универсального языка» в интернете. Это будущее не наступило, однако многие разработчики до сих пор пишут на нем код, особенно в специализированных областях — например, для управления космическими спутниками и в автоматизации электронного проектирования (EDA).
Tcl/Tk продолжают использовать для построения графических интерфейсов. Достаточно вспомнить tkinter — обёртку Python для Tk, а в Git встроена графическая утилита gitk, которая написана на Tcl/Tl, также есть расширение TclCloud для автоматизации работы с виртуальной инфраструктурой.
Язык продолжает развиваться — в сентябре этого года вышла версия Tcl/Tk 9.0, которая, по сути, стала первым крупным релизом за 27 лет. Например, в неё вошла поддержка 64-битной архитектуры. Несмотря на то что Tcl уже не так активно используют, у него его есть будущее. Есть мнение, что на основе Tcl можно построить язык, который сможет соперничать с Ruby, Lisp и Python. Одна из возможных сфер для конкуренции — работа с большими языковыми моделями. Так, язык вполне можно использовать для управления промптами при работе с LLM.
Но даже если Tcl останется исключительно нишевым языком, им по-прежнему будут пользоваться энтузиасты. Они продолжат писать на нем непрактичные, но интересные DIY-проекты вроде приложения на Android для управления кофемашиной в офисе.