Парадигма | Мультипарадигма : событие- управляемый, функциональный, императивный, объектно-ориентированный |
---|---|
Разработан | Джоном Остерхаутом |
Разработчик | Основная группа Tcl |
Впервые появилось | 1988 г.; 32 года назад (1988 г.) |
Стабильный выпуск | 8.6.10 / 21 ноября 2019 г.; 11 месяцев назад (21.11.2019) |
Предварительный выпуск | 8.7a3 / 25 ноября 2019 г.; 11 месяцев назад (2019-11-25) |
Дисциплина набора текста | Динамический набор текста, все можно рассматривать как строку |
Лицензия | BSD -стиль |
Расширения имен файлов | .tcl,.tbc |
Веб-сайт | www.tcl-lang.org. www.tcl.tk |
Major реализации | |
ActiveTcl Androwish | |
Диалекты | |
Джим | |
Под влиянием | |
AWK, Lisp | |
Под влиянием | |
PHP, PowerShell, Tea |
Tcl (произносится как «щекотка» или как инициализм ) - это высокоуровневый, универсальный, интерпретируемый, язык динамического программирования. Он был разработан с целью сделать его очень простым, но мощным. Tcl превращает все в форму команды , даже программные конструкции, такие как присвоение переменных и определение процедуры. Tcl поддерживает несколько парадигм программирования, включая объектно-ориентированный, императивный и стили функционального программирования или процедурный.
Обычно используется встраиваемым в приложения C, для быстрого прототипирования, приложений со сценариями, графических интерфейсов пользователя и тестирования. Интерпретаторы Tcl доступны для многих операционных систем, что позволяет коду Tcl работать в самых разных системах. Поскольку Tcl - очень компактный язык, он используется на платформах встроенных систем как в полной форме, так и в нескольких других небольших версиях.
Популярная комбинация Tcl с Tk расширение упоминается как Tcl / Tk и позволяет создавать графический пользовательский интерфейс (GUI) изначально в Tcl. Tcl / Tk включен в стандартную установку Python в виде Tkinter.
Язык программирования Tcl был создан весной 1988 года компанией Джон Остерхаут во время работы в Калифорнийском университете в Беркли. По словам автора, изначально «рожденный из разочарования», когда программисты разрабатывали свои собственные языки, предназначенные для встраивания в приложения, Tcl получил признание сам по себе. Компания Ousterhout была удостоена награды ACM Software System Award в 1997 году за Tcl / Tk.
Первоначально название происходит от T ool C ommand L, но обычно пишется «Tcl», а не «TCL».
Дата | Событие |
---|---|
январь 1990 г. | Tcl объявлен за пределами Беркли (Winter USENIX ). |
июнь 1990 г. | анонсирован Expect (лето USENIX). |
Январь 1991 г. | Первое объявление о Tk (Winter USENIX). |
июнь 1993 г. | Первая конференция Tcl / Tk (Беркли). Там объявлен менеджер геометрии [table] (предшественник [grid]), [incr Tcl], TclDP и Groupkit. |
август 1997 г. | Tcl 8.0 представил компилятор байт-кода. |
апрель 1999 г. | Tcl 8.1 представляет полную поддержку Unicode и расширенные регулярные выражения. |
Август 1999 | Tcl 8.2 представляет архитектуру расширений Tcl (TEA) |
август 2000 | Сформирована основная группа Tcl, переводящая Tcl в модель разработки, более ориентированную на сообщества. |
сентябрь 2002 г. | Девятая конференция Tcl / Tk (Ванкувер). Анонс системы упаковки Старкит. Выпущен Tcl 8.4.0. |
декабрь 2007 г. | В Tcl 8.5 добавлены новые типы данных, новый репозиторий расширений, bignums, lambdas. |
декабрь 2012 г. | В Tcl 8.6 добавлена встроенная система динамических объектов, TclOO и оценка без стека. |
Конференции и семинары по Tcl проводятся как в США, так и в Европе.
Возможности Tcl включают
верхним уровнем
и upvar
, разрешающий процессы для взаимодействия с областями включающих функций.Safe-Tcl - это подмножество Tcl, обладающее ограниченными функциями, чтобы сценарии Tcl не могли нанести вред хост-машине или приложению. Доступ к файловой системе ограничен и арбитраж Запрещено выполнение некоторых системных команд. Он использует модель двойного интерпретатора с ненадежным интерпретатором, выполняющим код в ненадежном сценарии. Он был разработан Натаниэлем Боренштейном и Маршаллом Роуз для включения активных сообщений в электронную почту. Safe-Tcl может быть включен в электронную почту, если поддерживаются application / safe-tcl и multipart / enabled-mail. Функциональные возможности Safe-Tcl с тех пор включены в стандартные выпуски Tcl / Tk.
Синтаксис и семантика Tcl охватываются двенадцатью правилами, известными как Dodekalogue.
Сценарий Tcl состоит из серии вызовов команд. Вызов команды - это список слов, разделенных пробелом и завершающихся новой строкой или точкой с запятой. Первое слово - это имя команды, которое может быть встроено в язык, найдено в доступной библиотеке или определено в самом скрипте. Последующие слова служат аргументами команды:
имя_команды аргумент1 аргумент2... аргументN
В следующем примере команда put используется для отображения строки текста на консоли хоста:
ставит "Hello, World!"
Это отправляет строку «Hello, World!» на устройство стандартного вывода вместе с добавленным символом новой строки.
Переменные и результаты других команд могут быть подставлены в строки, как в этом примере, где используются команды set и expr для сохранения результата вычисления в переменной (обратите внимание, что Tcl не использует =
в качестве оператора присваивания), а затем использует put (сокращение от "put string") для печати результата вместе с пояснительным текстом:
# expr оценивает текстовую строку как сумму набора выражений [expr 1+ 2 + 3 + 4 + 5] ставит «Сумма чисел 1..5 равна $ sum».
Символ #
вводит комментарий. Комментарии могут появляться везде, где интерпретатор ожидает имени команды.
# с фигурными скобками, подстановка переменных выполняется expr set x 1 set sum [expr {$ x + 2 + 3 + 4 + 5}]; # $ x не подставляется перед передачей параметра в expr; # expr заменяет 1 на $ x при вычислении выражения put "Сумма чисел 1..5 равна $ sum."; # сумма равна 15
# без фигурных скобок, подстановка переменных происходит в месте определения (лексическая область видимости) set x 2 set op * set y 3 set res [expr $ x $ op $ y]; # $ x, $ op и $ y заменяются, и выражение вычисляется следующим образом: "2 * 3 is $ res."; # 6 заменяется на $ res
Как видно из этих примеров, в языке есть одна базовая конструкция: команда. Механизмы заключения в кавычки и правила замены определяют, как обрабатываются аргументы каждой команды.
Одна специальная подстановка выполняется перед анализом любых команд или аргументов. Если последний символ в строке (т. Е. Непосредственно перед новой строкой) является обратной косой чертой, то комбинация обратной косой черты и новой строки (и любые пробелы или табуляции, следующие сразу за новой строкой) заменяются одним пробелом. Это обеспечивает механизм продолжения строки, с помощью которого длинные строки в исходном коде могут быть перенесены на следующую строку для удобства читателей.
Продолжая обычную обработку аргументов, слово, которое начинается с символа двойной кавычки ("
), продолжается до следующего символа двойной кавычки. Таким образом, такое слово может содержать пробелы и точки с запятой без эти символы интерпретируются как имеющие какое-либо особое значение (т. е. они рассматриваются как обычные текстовые символы). Слово, которое начинается с открывающего символа фигурной скобки ({
), продолжается до следующего закрывающего символа фигурной скобки (}
). Внутри фигурных скобок все формы подстановки подавляются, кроме ранее упомянутого исключения обратной косой черты и новой строки. Слова, не заключенные ни в одну из конструкций, известны как голые слова.
В голых и двойных - слова, заключенные в кавычки, возможны три типа подстановки:
[expr 1 + 2 + 3]
заменяется результатом вычисления содержащегося в нем выражения (в данном случае 6).$ foo
заменяется содержимым переменной с именем «foo». Имя переменной может быть окружено фигурными скобками, чтобы отделить его от последующего текста в других случаях неоднозначности (например, $ {foo} ing
).\ n
заменяется новой строкой.Замена выполняется слева направо за одно сканирование каждого слова. Любой замененный текст не будет повторно сканироваться на предмет возможных дальнейших замен. Однако любой количество замен может появиться в одном слове.
Начиная с Tcl 8.5, любое слово может иметь префикс {*}
, что приводит к разделению слова на составляющие его под- слов для создания вызова команды (аналогично последовательности , @
в квазицитатной функции Lisp ).
Как следствие этих правил, Результат любой команды может быть использован в качестве аргумента для любой другой команды.Кроме того, нет оператора или команды для конкатенации строк, поскольку язык конкатенируется напрямую. Обратите внимание, что, в отличие от командных оболочек Unix, Tcl не выполняет повторный анализ строк, если это явно не указано, что делает интерактивное использование более громоздким, а использование сценариев более предсказуемым (например, наличие пробелов в именах файлов делает не вызывает затруднений).
Единственный знак равенства (=
) вообще не играет особой роли в языке. Двойной знак равенства (==
) - это проверка на равенство, которая используется в контекстах выражений, таких как команда expr
и в первом аргументе if
. (Обе команды являются частью стандартной библиотеки; они не имеют специального места в библиотеке и при желании могут быть заменены.)
Большинство команд Tcl, особенно в стандартной библиотеке, являются вариативными, а proc
(конструктор для командных процедур со сценарием) позволяет определять значения по умолчанию для неуказанных аргументов и универсальный аргумент, позволяющий коду обрабатывать произвольное количество аргументов.
Tcl не имеет статической типизации: каждая переменная может содержать целые числа, числа с плавающей запятой, строки, списки, имена команд, словари или любое другое значение; значения переинтерпретируются (с учетом синтаксических ограничений) как другие типы по запросу. Однако значения являются неизменяемыми, и операции, которые меняют их, на самом деле вместо этого просто возвращают новое значение.
Наиболее важные команды, относящиеся к выполнению программы и операциям с данными:
set
записывает новое значение в переменную (создает переменную, если не существует). Если используется только с одним аргументом, он возвращает значение данной переменной (в данном случае оно должно существовать).proc
определяет новую команду, выполнение которой приводит к выполнению заданного сценария Tcl, записанного как набор команд. return
может использоваться для немедленного возврата управления вызывающей стороне.Обычные команды управления выполнением:
if
выполняет заданное тело скрипта (второй аргумент), если условие (первый аргумент) удовлетворяется. За ним могут следовать дополнительные аргументы, начиная с elseif
с альтернативным условием и телом или else
с дополнительным блоком., в то время как
повторяет выполнение данного сценария body, пока выполняется условие (первый аргумент)foreach
выполняет заданное тело, в котором управляющей переменной присваиваются элементы списка один за другим.для
ярлык для инициализации элемента управления переменная, условие (как в while
) и дополнительный оператор «следующей итерации» (команда, выполняемая после выполнения тела)Этими вышеупомянутыми командами цикла можно дополнительно управлять с помощью следующих команд:
break
прерывает выполнение тела и возвращается из команды цикла.continue
прерывает выполнение тела, но управление по-прежнему возвращается команде цикла. Для while
это означает повторный цикл, для для
и foreach
выбрать следующую итерацию.return
прерывает выполнение текущего body, независимо от того, насколько глубоко внутри процедуры, до достижения границы процедуры, и возвращает данное значение вызывающей стороне.expr
передает аргумент в отдельный интерпретатор выражения и возвращает вычисленное значение. Обратите внимание, что тот же интерпретатор используется также для «условного» выражения для if
и команд цикла.list
создает list, содержащий все аргументы, или пустую строку если аргумент не указан. Команда lindex
может использоваться с результатом для повторного извлечения исходных аргументов.array
управляет переменными array.dict
манипулирует dictionary (начиная с версии 8.5), которые представляют собой списки с четным числом элементов, где каждые два элемента интерпретируются как пара ключ / значение.regexp
сопоставляет регулярное выражение со строкой.regsub
Выполняет подстановки на основе сопоставления с шаблоном регулярного выражения.uplevel
- это команда, которая позволяет выполнять командный сценарий в области другой чем текущая самая внутренняя область в стеке.upvar
создает ссылку на переменную в другом фрейме стека.пространство имен
позволяет создавать, получать доступ и уничтожать отдельные контексты для команд и переменные.apply
применяет анонимную функцию (начиная с версии 8.6).сопрограмма
, yield
и yieldto
создают и создают значения из сопрограммы (начиная с 8.6).try
позволяет перехватывать и обрабатывать ошибки nd исключения.catch
позволяет перехватывать исключительные возвраты.zlib
обеспечивает доступ к средствам сжатия и контрольного суммирования библиотеки Zlib (начиная с версии 8.6).uplevel
позволяет выполнять командный сценарий в области , отличной от текущей внутренней области в стеке. Поскольку командный сценарий сам может вызывать процедуры, использующие команду uplevel, это имеет чистый эффект преобразования стека вызовов в дерево вызовов.
Первоначально он был реализован для разрешения процедур Tcl переопределить встроенные команды (например, for, if или while) и по-прежнему иметь возможность манипулировать локальными переменными. Например, следующий сценарий Tcl является повторной реализацией команды for (без обработки исключений ):
proc для {initCmd testExpr advanceCmd bodyScript} {uplevel 1 $ initCmd set testCmd [list expr $ testExpr] while {[uplevel 1 $ testCmd]} {uplevel 1 $ bodyScript uplevel 1 $ advanceCmd}}
upvar
упорядочивает одну или несколько локальных переменных в текущей процедуре для ссылки к переменным в вызове включающей процедуры или к глобальным переменным. Команда upvar упрощает реализацию вызова процедур по имени, а также упрощает создание новых управляющих конструкций в виде процедур Tcl.
Команда decr, которая работает как встроенная incr
, за исключением того, что она вычитает значение из переменной, а не добавляет его:
proc decr {varName {декремент 1}} {upvar 1 $ varName var incr var [expr {- $ декремент}]}
В Tcl 8.6 в 2012 году добавлена встроенная система динамических объектов, TclOO. Она включает такие функции, как:
oo :: class create fruit {method eat {} {put "вкуснятина!" }} oo :: class create banana {суперкласс фруктовый конструктор {} {мой очищенный набор переменных очищенный 0} метод peel {} {мой очищенный набор переменных очищенный 1 помещает "скин теперь снят"} метод съедобный? {} {моя очищенная переменная return $ peeled} method eat {} {if {! [my edible?]} {my peel} next}} set b [banana new] $ b eat → печатает "скин теперь отключен" и "yummy ! " Fruit destroy $ b eat → error «unknown command»
Tcl не имел синтаксиса объектно-ориентированного (OO) до 2012 года, поэтому появились различные пакеты расширений, позволяющие объектно-ориентированное программирование. Они широко распространены в существующем исходном коде Tcl. Популярные расширения включают:
TclOO был добавлен не только для построения сильной объектно-ориентированной системы, но и для того, чтобы пакеты расширений могли создавать объект. ориентированные абстракции, используя его как основу. После выпуска TclOO incr Tcl был обновлен, чтобы использовать TclOO в качестве своей основы.
Веб-сервер Tcl - это реализация протокола HTTP на чистом Tcl. сервер протокола. Он работает как сценарий поверх ванильного интерпретатора Tcl.
Apache Rivet - это система программирования с открытым исходным кодом для HTTP-сервера Apache, которая позволяет разработчикам использовать Tcl в качестве языка сценариев для создания динамических веб-приложений. Заклепка аналогична PHP, ASP и JSP. Заклепку в первую очередь разработали Дэймон Кортни, Дэвид Велтон, Массимо Манги, Харальд Ольманн и Карл Лехенбауэр. Rivet может использовать любой из тысяч общедоступных пакетов Tcl, которые предлагают бесчисленные функции, такие как взаимодействие с базой данных (Oracle, PostgreSQL, MySQL, SQLite и т. Д.), Или интерфейсы для популярных приложений, таких как GD Graphics Library.
Tcl изначально взаимодействует с языком C. Это связано с тем, что изначально он был написан как среда для обеспечения синтаксического интерфейса для команд, написанных на C, и всех команд на языке (включая вещи, которые в противном случае могли бы быть ключевыми словами, например если
или , а
) реализованы таким образом. Каждой реализации команды , функции передается массив значений, описывающих (уже подставленные) аргументы команды, и он может интерпретировать эти значения по своему усмотрению.
Цифровые логические имитаторы часто включают интерфейс сценариев Tcl для моделирования Verilog, VHDL и SystemVerilog аппаратные языки.
Существуют инструменты (например, SWIG, Ffidl ) для автоматической генерации необходимого кода для соединения произвольных функций C и среды выполнения Tcl, а Critcl делает обратное, позволяя встраивать произвольные Код C внутри сценария Tcl и компиляция его во время выполнения в DLL.
В языке Tcl всегда разрешались пакеты расширений, которые предоставляют дополнительные функции, такие как графический интерфейс, терминал- автоматизация приложений, доступ к базе данных и так далее. Обычно используемые расширения включают:
Викиучебники книга по теме: Программирование на Tcl |
Викискладе есть носители, относящиеся к семейству языков программирования Tcl. |