Tcl

редактировать
Язык программирования высокого уровня
Tcl
Tcl logo
Парадигма Мультипарадигма : событие- управляемый, функциональный, императивный, объектно-ориентированный
Разработан Джоном Остерхаутом
Разработчик Основная группа 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.

Содержание

  • 1 История
  • 2 Возможности
    • 2.1 Safe-Tcl
  • 3 Синтаксис и фундаментальная семантика
    • 3.1 Базовые команды
    • 3.2 Расширенные команды
    • 3.3 Верхний уровень
    • 3.4 Upvar
    • 3.5 Объектно-ориентированный
  • 4 Разработка веб-приложений
  • 5 Взаимодействие с другими языками
  • 6 Пакеты расширений
  • 7 См. Также
  • 8 Ссылки
  • 9 Дополнительная литература
  • 10 Внешние ссылки

История

Язык программирования 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 и расширенные регулярные выражения.
Август 1999Tcl 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 редактируется в Eclipse IDE

Возможности Tcl включают

  • Все операции - это команды, включая языковые структуры. Они записываются в префиксной нотации .
  • Команды обычно принимают переменное количество аргументов (переменное ).
  • Все может быть динамически переопределено и переопределено. На самом деле нет ключевых слов, поэтому даже управляющие структуры могут быть добавлены или изменены, хотя это не рекомендуется.
  • Все типы данных можно манипулировать как строки, включая исходный код. Внутренние переменные имеют такие типы, как integer и double, но преобразование выполняется полностью автоматически.
  • Переменные не объявляются, но присваиваются им. Использование неопределенной переменной приводит к ошибке.
  • Полностью динамический, класс на основе объектной системы, TclOO, включая расширенные функции, такие как мета-классы, фильтры и миксины.
  • событийный интерфейс с сокетами и файлы. Также возможны временные и определяемые пользователем события.
  • Видимость переменной ограничена лексической (статической) областью действия по умолчанию, но верхним уровнеми upvar, разрешающий процессы для взаимодействия с областями включающих функций.
  • Все команды, определенные самим Tcl, генерируют сообщения об ошибках при неправильном использовании.
  • Расширяемость, через C, C ++, Java, Python и Tcl.
  • Интерпретируемый язык с использованием байт-кода
  • Полная поддержка Unicode (3.1 в начале, регулярно обновляется), впервые выпущена в 1999 году.
  • Регулярные выражения
  • Кросс-платформенный : Windows API ; Unix, Linux, Macintosh и т. Д.
  • Близкая межплатформенная интеграция с оконным интерфейсом (GUI ) Tk.
  • Существует несколько механизмов распространения:
    • Полная версия для разработки (для Windows, например, ActiveState Tcl, см. [1] )
    • Tclkits (один исполняемый файл, содержащий полный среда выполнения сценариев, размером всего около 4 мегабайт), Starkits (механизм упаковки для автономной доставки приложения без установки и высокой переносимости) и Starpacks (объединить Starkit с Tclkit для создания Starpack - исполняемого файла для одной платформы, идеально подходящего для простого развертывания)
    • The Jim Interpreter, небольшая реализация Tcl
    • Свободно распространяемый исходный код под лицензией BSD.

Safe-Tcl

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позволяет выполнять командный сценарий в области , отличной от текущей внутренней области в стеке. Поскольку командный сценарий сам может вызывать процедуры, использующие команду 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упорядочивает одну или несколько локальных переменных в текущей процедуре для ссылки к переменным в вызове включающей процедуры или к глобальным переменным. Команда 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 всегда разрешались пакеты расширений, которые предоставляют дополнительные функции, такие как графический интерфейс, терминал- автоматизация приложений, доступ к базе данных и так далее. Обычно используемые расширения включают:

Tk
Наиболее популярным расширением Tcl является набор инструментов Tk, который предоставляет библиотеку графического пользовательского интерфейса для различных операционных систем. Каждый графический интерфейс состоит из одного или нескольких кадров. У каждого фрейма есть менеджер компоновки.
Expect
Одним из других очень популярных расширений Tcl является расширение Expect. Ранние тесные отношения Expect с Tcl в значительной степени ответственны за популярность Tcl в разнообразных областях использования, таких как тестирование Unix, где Expect был (и все еще используется) очень успешно для автоматизации telnet, ssh и последовательных сеансов для выполнения. множество повторяющихся задач (например, написание сценариев ранее интерактивных приложений). Tcl был единственным способом запустить Expect, поэтому Tcl стал очень популярным в этих областях промышленности.
Tile / Ttk
Tile / Ttk - это коллекция виджетов стилей и тем, которая может заменить большую часть виджеты в Tk с вариантами, которые действительно являются нативными для платформы, через вызовы API операционной системы. Таким образом охватываются следующие темы: Windows XP, Windows Classic, Qt (который подключается к библиотекам среды X11 KDE ) и Aqua (Mac OS X). Тема также может быть создана без этих вызовов, используя определения виджетов, дополненные изображениями растровыми изображениями. Созданные таким образом темы включают Classic Tk, Step, Alt / Revitalized, Plastik и Keramik. В Tcl 8.4 этот пакет известен как Tile, а в Tcl 8.5 он был включен в основной дистрибутив Tk (как Ttk).
Tix
Tix, расширение интерфейса Tk, представляет собой набор компонентов пользовательского интерфейса, расширяющих возможности приложений Tcl / Tk и Python. Это пакет программного обеспечения с открытым исходным кодом, поддерживаемый добровольцами из Tix Project Group и выпущенный под лицензией в стиле BSD.
Itcl / IncrTcl
Itcl - объектная система для Tcl, обычно с именем [incr Tcl] (это способ увеличения в Tcl, аналогичный по способу имени C ++).
Tcllib
Tcllib - это набор пакетов со сценариями для Tcl, которые могут быть используется без этапов компиляции.
Tklib
Tklib - это набор служебных модулей для Tk, дополняющий Tcllib.
tDOM
tDOM - это расширение Tcl для анализа XML на основе Expat parser
TclTLS
TclTLS - это расширение OpenSSL для Tcl.
TclUDP
Расширение TclUDP предоставляет простую библиотеку для поддержки сокетов User Datagram Protocol (UDP) в Tcl.
Базы данных
Подключение к базе данных Tcl (TDBC), часть Tcl 8.6, представляет собой общий интерфейс доступа к базе данных для сценариев Tcl. В настоящее время он поддерживает драйверы для доступа к базам данных MySQL, ODBC, PostgreSQL и SQLite. В будущем планируется еще больше. Доступ к базам данных также поддерживается с помощью расширений, специфичных для баз данных, которых существует множество.

См. Также

  • icon Портал компьютерного программирования

Ссылки

Дополнительная литература

Внешние ссылки

Викиучебники книга по теме: Программирование на Tcl
Викискладе есть носители, относящиеся к семейству языков программирования Tcl.
Последняя правка сделана 2021-06-09 11:26:07
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте