Быстрое введение в Tcl

23:22:00


Данная статья посвящена быстрому введению в азы языка 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".

Так как программы бывают достаточно длинные, хорошим тоном и полезной практикой является оставлять в исходном коде комментарии к нему (некие объяснения, что делает тот или иной кусок кода вашей программы).
Комментарий - это все символы, которые идут после символа (#), который сообщает интерпретатору Tcl, что дальнейшие слова не надо исполнять.

Комментарий может быть отдельной строке или на одной строке с командой (прада этого я не рекомендую, т.к. это сложно воспринимается при изучении вашей программы другим человеком). В этом случае знак комментария будет ";#", чтобы интерпретатор не воспринял символ # как ещё один аргумент. Правда использовать данный метод для комментария любого вида - хорошая практика. В этом случае вы гарантированно не допустите случайной ошибки.

Давайте перейдем к практике. Создайте файл unit.tcl и наберите следующий тектс, а потом запустите его (команда запука - tclsh unit.tcl):

# Этот комментарий на отдельной строке
puts "Привет, Мир!"    ;# Это комментарий после команды
puts {Привет, Мир} # Добавьте точку с запятой, чтобы исправить ошибку

# Точка с запятой позволяет разместить две команды на одной строчке
puts "Это первая строка"; puts "А вот и вторая"

# Точка с запятой в кавычках не означает конца команды! Будьте внимательны
puts "Привет, Мир;"


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

Виртуальная машина Tcl резервирует память когда помещаются данные в новую переменную (т.е. перемнная без значения фактически не занимает места в оперативной памяти). Обратиться к этим данным можно по имени переменной.

Для создания переменной и присвоения ей значения используется команда set. Рассмотрим пример:

set fruit "Яблоко"
В примере мы помещаем слово "Яблоко" в область памяти, на которую ссылается первый аргумент, т.е. fruit. Set всегда возвращает содержимое переменной, имя которой является первым аргументом. Таким образом, при выполнении set помещает второй аргумент в область памяти, на которую ссылается первый аргумент и затем возвращает второй аргумент.

Если команда set так используется с одним аргументом, то она просто возвращается значение аргумента. Итак, повторим синтаксис данной команды:

set <имяПеременной> <значение>
Запомните!

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

Запустите пример, который приведен в конце урока и внимательно его прочитайте. Если вы внимательно изучили код, то увидили, что в команде set первый аргумент содержит только имя переменной, тогда как в команде puts имя переменной предварено символом $.

Иногда, когда передаётся значение переменной подпрограмме, требуется чтобы подпрограмма могда изменять данные, но это бы не повлияло на главную копию. В этом случае, ставьте $ перед именем переменной, когда вызываете подпрограмму. Таким образом, в памяти создаётся копия данных, с которой работает подпрограмма. После завершения значение основной переменной не изменяется. Это называется "Передача по значению", так как передаётся именно значение переменной.

Но иногда (например, для команды set) требуется, чтобы изменилось значение переменной. В этом случае нужно передать ссылку на область памяти, где хранится значение переменной, тогда команда сможет модифицировать данные в этом месте. В Tcl это делается НЕ добавлением $ перед именем переменной. Это называется "Передача по ссылке", так как команде передаётся ссылка.

Итак, с командой set используется просто имя переменной, поэтому передаётся ссылка. Set помещает данные из второго аргумента в область памяти, на которую ссылается первый аргумент.

Однако в случае с командой puts не нужно изменять оригинальные данные, поэтому команде puts передаётся значение данных, которые будут выведены.

Измените программу в примере и переходите к следующему уроку.

# Присвоение строкового значения переменной X
set X "Simple string"

# Присвоение числового значения переменной Y
set Y 10

# Вывод содержимого X и Y
puts $X
puts $Y

# Просто вывод разделителя, для удобство чтения выводимой в терминал информации
puts "..............................."

# В одной команде puts может быть выведено более одной переменной, для этого используются двойные кавычки
set label "Значение переменной Y:"
puts "$label $Y"

Последние две строки - по сути "конструктор" строки. Но о строках - мы поговорим позже. Этот урок и так получился слишком большим. Всем Удачного изучения!

P.S.: Для подготовки материала использовались материалы http://tclstudy.narod.ru, по которому я когда-то изучал данный язык.
Понравилось? Тогда вот второй урок!

Вам так же может быть интересны

0 коммент.

Дорогие друзья! Будем уважать друг друга и не превращать данный блок в linux.org.ru

Мы в социальных сетях

Контакты

  • ООО "Миллениум. Интеграция"
  • Контактный телефон: +7 (919) 932-86-97
  • Электронная почта: написать нам!