tcl | |
---|---|
clase de idioma |
multiparadigma : orientado a objetos , funcional , procedimental , impulsado por eventos , imperativo |
tipo de ejecución | interpretado |
Apareció en | 1988 |
Autor | Juan Ousterhout |
extensión de archivo | .tcl |
Liberar |
|
sistema de tipos | dinámica |
sido influenciado | concha , ceceo |
influenciado | pitón , rubí |
Licencia | similar a BSD |
Sitio web | tcl.tk |
Archivos multimedia en Wikimedia Commons |
Tcl (del inglés Tool Command Language - "lenguaje de comandos de herramientas", léase "ticle" o "ti-si-el") es un lenguaje de secuencias de comandos de alto nivel .
Tcl se usa a menudo junto con la biblioteca de gráficos Tk (Tool Kit) . El paquete Tcl / Tk en ruso a veces se llama "Tak-tikl" (la versión en inglés es "tikl-tok").
Las áreas de aplicación del lenguaje son la creación rápida de prototipos , la creación de interfaces gráficas para programas de consola (paquetes de software), la integración en programas de aplicación, las pruebas . Tcl también se utiliza en el desarrollo web .
En Tcl, los datos de todo tipo, incluido el código del programa, se pueden manipular como cadenas. Esto lo convierte en un lenguaje con soporte natural para la metaprogramación . Este paradigma de programación se tuvo en cuenta durante el desarrollo y evolución del lenguaje.
Un programa Tcl consta de comandos separados por saltos de línea o punto y coma. Cada comando consta de un conjunto de campos separados por espacios. El primer campo debe ser el nombre del comando y los campos restantes opcionales son los argumentos pasados a ese comando. El comando devuelve un valor, a veces vacío. Es decir, como Lisp , Tcl usa notación de prefijos.
No hay palabras clave como tales: el concepto de comando en Tcl es similar al concepto de procedimiento o función en los lenguajes de programación comunes. Esto también se aplica a las construcciones de control de lenguaje. Combinado con la sintaxis elemental, esto hace que el lenguaje sea bien extensible, incluyendo librerías escritas en otros lenguajes como C / C++ o Java .
Tcl también tiene un modelo de control de programa basado en eventos bien implementado . Los eventos pueden ser generados por un temporizador, cuando aparecen datos en un canal, cuando cambia el valor de una variable, cuando finaliza un programa externo, o simplemente cuando el usuario trabaja con la interfaz Tk. Puede configurar sus propios eventos y administrarlos.
Como la mayoría de los lenguajes de secuencias de comandos modernos , Tcl contiene herramientas avanzadas para trabajar con expresiones regulares, funciona con matrices asociativas y otras estructuras de datos dinámicas.
Tcl básico no soportaba programación orientada a objetos hasta la versión 8.6, sin embargo, debido a la facilidad de extender la sintaxis del lenguaje, existen muchas extensiones de Tcl con mecanismos orientados a objetos, implementadas como librerías de enlaces en C o en el mismo Tcl. Antes de la versión 8.5, los más comunes eran: incr Tcl , XOTcl y Snit [3] . Otra implementación de los mecanismos OOP que utilizan el propio Tcl, incluida en la biblioteca estándar de Tcl [4] , es la biblioteca STOOOP [5] . Desde la versión 8.5 existe una nueva implementación de OOP para Tcl, TclOO , incluida desde la versión 8.6 en el núcleo del lenguaje [6] [nota 1] :
extensión | implementado en | caracteristicas del modelo utilizado |
---|---|---|
XOTcl | C | potente sistema de objetos con definición dinámica de clases y métodos, cercano a CLOS |
aumentar Tcl | C | POO en estilo C++ , ampliado con la introducción de configuradores |
mocoso | tcl | implementación del modelo de objetos basada en la delegación , no en la herencia |
INCORRECTAR | tcl | OOP en un estilo lo más cercano posible a C ++, también se ha introducido un mecanismo de cambio de clase |
TclOO [7] | C | Un sistema compacto pero potente orientado a objetos que se puede usar tanto directamente como marco para construir modelos OOP avanzados. |
Los espacios de nombres se admiten en el nivel básico del idioma. Al implementar mecanismos OOP en Tcl, se utiliza soporte para la jerarquía de anidamiento de espacios de nombres en este lenguaje [8] .
Tcl es fácil de programar en un estilo funcional : proporciona mecanismos tales como funciones de orden superior y abstracciones de funciones [9] , aunque Tcl rara vez se usa de esta manera. Aquí hay un ejemplo de cómo se pueden componer dos funciones :
proc o { f g x } { $f [ $g $x ]}En la versión 8.5, Tcl también introdujo el comando de aplicación , que hace que este estilo de programación sea mucho más fácil.
Aquí hay un ejemplo de su uso de la documentación oficial:
mapa de proceso { lista lambda } { establecer resultado {} para cada elemento $ lista { resultado lappend [aplicar $lambda $elemento ] } devolver $resultado } map { x { return [ longitud de cadena $x ] : $x }} { a bb ccc dddd }el resultado de este ejemplo será
1:a 2:bb 3:ccc 4:ddddEl lenguaje fue desarrollado por John Ousterhout mientras estaba en la Universidad de California en Berkeley. El objetivo original era crear un lenguaje universal para incrustar en aplicaciones de consola . Después de esto, Ousterhout amplió su lenguaje con herramientas para crear interfaces gráficas : así nació Tcl / Tk. [diez]
Durante 4 años de desarrollo dentro de los muros de la universidad, la comunidad Tikl ha crecido a varios cientos de miles de programadores. En 1993, se desarrolló la primera extensión orientada a objetos, incr Tcl .
En 1994, Ousterhout se convirtió en ingeniero principal del proyecto SunScript. Durante los siguientes 4 años, convirtiéndose en uno de los proyectos de Sun Corporation , Tikl no solo siguió siendo un sistema de libre distribución , sino que también mejoró significativamente, convirtiéndose en multiplataforma .
Richard Stallman asestó un golpe significativo a la popularidad del lenguaje cuando publicó en septiembre de 1994 en varios grupos de noticias la recomendación "Por qué no debería usar Tcl" [11] . En él, se basa en las afirmaciones de que "Tcl no está diseñado como un lenguaje de programación serio" y "Tcl tiene una sintaxis particular que atrae a los piratas informáticos debido a su simplicidad. Pero la sintaxis de Tcl parece extraña para la mayoría de los usuarios". , y también en relación con la promoción de Emacs Lisp , emitió un veredicto: "el proyecto GNU no va a utilizar Tcl en el software GNU" . Además de las afirmaciones subjetivas sobre el diseño del lenguaje, Stallman señaló un inconveniente objetivo en ese momento: el bajo rendimiento.
Sin embargo, el crecimiento en el número de desarrolladores que utilizan activamente tikl ascendió al 600 % durante este período.
En 1998, debido al auge de Java y la feroz competencia asociada con él, la corporación ya no pudo prestar la misma atención a tikl. John Ousterhout deja Sun para formar (con el apoyo de Sun) Scriptics, continuando el desarrollo de la tecnología Tcl/Tk [12] [13] . Fue una de las primeras empresas de software comercial en centrarse en el software libre .
En marzo de 1998, Ousterhout escribió el ya clásico artículo “Scripting: High-Level Programming for the 21st Century” [14] , en el que denominó lenguajes de scripting lenguajes de integración de sistemas, porque están enfocados principalmente a trabajar con objetos del sistema operativo. entorno, y no con datos elementales. Esto permite, sin escribir miles de líneas de código , “pegar” tales objetos en uno solo con dos o tres comandos.
En el mismo año, ganó dos importantes premios por el desarrollo del lenguaje Tcl. El primero es el ACM Software System Award, que reconoce "el software más significativo". El premio ha honrado previamente a sistemas fundamentales como la pila de protocolos TCP/IP , la primera hoja de cálculo , la primera base de datos relacional , la World Wide Web , Unix , PostScript y Smalltalk . El segundo es el premio anual USENIX Software Tools User Group (STUG) en reconocimiento al software destacado.
En 1999, se lanzó Tcl 8.0; en esta implementación, apareció por primera vez la compilación a bytecode , lo que permitió aumentar la velocidad en 6 veces [15] . La próxima versión de Tcl 8.1 presenta compatibilidad completa con Unicode e introduce subprocesos múltiples por primera vez . En relación con este comunicado, Ousterhout declaró:
“En general, 8.1 mueve Tcl a una nueva categoría, ya que ahora se puede usar para aplicaciones de servidor. C, C++ y Java todavía se pueden usar para construir las partes críticas de rendimiento de las aplicaciones, mientras que Tcl se puede usar para integrar y construir componentes front-end”. [dieciséis]
En 2000, Scriptics pasó a llamarse Ajuba Solutions y luego fue comprada por Interwoven, que no estaba interesada en trabajar con software libre . En este sentido, se trasladó el desarrollo de Tcl a la comunidad de programación. Así se conformó el Core Team de Tcl .
En la 9.ª Conferencia Tcl/Tk en Vancouver , se presentó el sistema de archivos virtual StarKit , que proporciona una forma nueva y fácil de usar para distribuir programas Tcl.
La primera palabra es el nombre del comando, el resto son sus argumentos. Cualquier argumento puede ser reemplazado por otro comando encerrado entre corchetes. Los argumentos entre llaves se pasan al comando tal cual, como un solo argumento.
Sintaxis:
establecer valor variableEjemplo:
establecer un 2 conjunto b 3Sintaxis:
# texto del comentarioEjemplo:
# es un comentarioSintaxis:
poner expresiónEjemplo:
pone "¡Hola! Soy yo". pone 123 pone $a pone "b = $b"Sintaxis:
mientras que { Tcl_Expression_With_Boolean_Value } { TclCommand otroTclCommand ... ... }Ejemplo:
mientras que { $x < 10 } { pone $x incrementa x }Sintaxis:
si { Expresión_Tcl_Con_Valor_Booleano } { Comando tcl }Ejemplo:
si { $x < 0 } { establecer x 0 }Ejemplo:
cambiar - globo -- $var { { ver } - { vio } - { visto } { pone "¡Todo significa lo mismo!" } }simplemente devuelve el directorio de trabajo actual. y el equipo
establecer wdir [ contraseña ]almacena el nombre del directorio actual en la variable wdir .
devolverá una lista de nombres de archivos en el directorio actual que coincidan con el patrón Pattern .
Los procedimientos se definen de la siguiente manera
proc ProcedimientoNombre { Lista de argumentos } { … … }El siguiente fragmento de código creará e inicializará una matriz asociativa (también llamada mapa, diccionario o hash en otros idiomas).
set capital ( Francia ) Paris set capital ( Italia ) Roma set capital ( Alemania ) Berlin set capital ( Polonia ) Varsovia set capital ( Rusia ) Moscú set capital ( España ) MadridPara consultar y mostrar uno de los valores de una matriz asociativa, utilice
pone $capital ( Italia )Se puede obtener una lista de todos los países (claves de matriz) con el comando
matriz nombres capitalEl resultado no se ordenará porque las matrices Tcl se basan en tablas hash .
Polonia España Rusia Alemania Italia FranciaLa clasificación se puede hacer con el comando
lsort [matriz de nombres mayúsculas ]Para hacer referencia a una matriz (pasarla como referencia), use el nombre de la variable que la contiene:
proc demo arrName { upvar 1 $arrName arr ; # vincular la referencia a un nombre local #hacer algo con arr }Para acceder a una matriz por valor, use array get o array set . Por ejemplo, para copiar una matriz a otra:
conjunto de matriz Newarr [matriz obtener Oldarr ]Tcl 8.5 introdujo matrices pasadas por valor - diccionarios ( dict ).
Para convertir una variable escalar en una matriz y viceversa, elimine la variable existente con el comando unset .
De forma predeterminada, solo las variables definidas en el procedimiento son visibles dentro del procedimiento. Fuera de la definición de un procedimiento, sus variables no son accesibles excepto a través del mecanismo de paso de parámetros. Es posible tener variables en un procedimiento con el mismo nombre que en el programa principal, mientras que los valores de estas variables diferirán, de hecho serán variables diferentes. Para cambiar este comportamiento se utilizan los comandos global o upvar .
Hola, el programa mundial se ve así .
pone "¡Hola mundo!"más o menos
pone { ¡ Hola mundo ! _ }Visualización del valor del elemento de matriz OldArray (precisión), cuyo nombre (matriz) viene dado por la nueva variable NewArray
establecer NewArray OldArray pone [establecer $ { NewArray }( precisión )] Adición de números en una matrizMétodo (A) - Adición usando el ciclo 'foreach'
establecer números { 1 2 3 4 5 6 7 8 9 10 } establecer resultado 0 para cada número $números { establecer resultado [expr { $resultado + $número }] } pone $resultadoMétodo (B): una forma mucho más elegante usando el comando 'unirse'
establecer números { 1 2 3 4 5 6 7 8 9 10 } pone [expr [ unir $números + ]] Listado del contenido de una matrizLa matriz tcl_platform contiene información sobre las propiedades de la plataforma en la que se ejecuta Tcl. Se puede obtener una lista de nombres de propiedades con
nombres de matriz tcl_platformEl siguiente fragmento los muestra junto con sus valores:
foreach i [ nombres de matriz tcl_platform ] { pone "$i = $tcl_platform($i)" }Si las propiedades deben ordenarse
foreach i [ lsort [ nombres de matriz tcl_platform ] ] { pone "$i = $tcl_platform($i)" }Aquí se demuestra el anidamiento de comandos. Se pueden anidar a cualquier profundidad. Se puede lograr un resultado similar con el comando parray [17] introducido en Tcl 8.5.
El procedimiento de filtro devuelve aquellos elementos de la lista para los cuales el script se evalúa como VERDADERO:
filtro de proceso { guión de lista } { establecer res {} foreach e $lista {if {[uplevel 1 $script $e ]} { lappend res $e }} return $res }El comando de nivel superior 1 evalúa una expresión en el contexto en el que se llama al filtro de palabras .
El procedimiento in es una notación abreviada para incluir conjuntos:
proc en { lista e } { expr {[ lsearch - $lista exacta $e ] >= 0 } }Examen:
% filtro { a b c } { en { b c d }} b cEsto demuestra que el nombre del comando puede ser cualquier cadena, así como el operador ?: conocido en otros idiomas .
Tcl es un lenguaje interpretado , es decir, los programas Tcl están listos para ejecutarse sin compilación ni enlace .
El intérprete de Tcl ha sido portado a la mayoría de las plataformas comunes [18] . Se distribuye bajo una licencia libre , sin copyleft , lo que permite su uso sin restricciones en el desarrollo de aplicaciones propietarias , así como para crear sistemas derivados propietarios. Los desarrolladores se refieren a ella como similar a BSD , aunque, en comparación con la licencia BSD, la licencia Tcl impone menos restricciones.
Actualmente, el trabajo en el núcleo del lenguaje Tcl está siendo llevado a cabo por un grupo de desarrolladores [19] llamado Tcl Core Team [20] . Las últimas versiones del traductor de Tcl y las bibliotecas principales están disponibles en el repositorio de SourceForge.net , consulte la lista de proyectos de sourceforge incluidos en la distribución principal de Tcl/Tk [21] .
El traductor Tcl compila el programa en una representación intermedia - bytecode , y luego lo interpreta. A diferencia, por ejemplo, de Python , esta representación intermedia no se guarda en disco, el programa solo se puede almacenar en código fuente, posiblemente empaquetado en un módulo StarKit o utilizando algún otro contenedor . Dependiendo de las opciones de compilación, el intérprete de Tcl puede o no admitir subprocesos múltiples .
Si bien la mayoría de los libros de texto de Tcl para principiantes dicen algo como "Tcl tiene solo un tipo de variable, la cadena", la realidad es que los traductores de Tcl han estado haciendo las cosas de manera diferente durante mucho tiempo. Internamente, Tcl utiliza un sistema de tipo dinámico con conversión automática de cadenas transparentes.
Tcl está incluido en casi todas las distribuciones de Linux . Microsoft Windows requiere un paquete de instalación independiente.
La versión Tcl 8.4 se diferencia de la anterior con nuevas características (optimización de código de 64 bits, VFS, adiciones en términos de introspección ) y cierto aumento de rendimiento debido a la optimización del trabajo con bytecode.
Las nuevas funciones añadidas en la versión 8.1 (como la compatibilidad con subprocesos múltiples, las instalaciones de internacionalización y el manejo de caracteres Unicode) redujeron la velocidad de Tcl en aproximadamente un 19 % en comparación con la versión 8, que dio un salto en la velocidad. Los desarrolladores de 8.4 han hecho todo lo posible para maximizar la velocidad de ejecución del programa, para garantizar que no solo funcionen más lento, sino incluso más rápido que cuando apareció la versión 8.0. Este objetivo se logró para casi todas las herramientas Tcl y Tk: la versión 8.4 es en promedio 8 veces más rápida que la versión 7.6 [15] .
La versión actual de TCL es 8.6.
Implementaciones alternativas y dialectosHay implementaciones alternativas de Tcl para máquinas virtuales populares de uso general . Este es un intérprete de Java : Jacl [22] (última versión de 2008) y el proyecto Eagle [23] , que implementa la mayoría de los comandos Tcl 8.4 para CLR (se encuentran disponibles compilaciones para .NET 4.0 y 2.0). Se están realizando experimentos para traducir programas Tcl al código de la máquina virtual Parrot , que se está desarrollando para la sexta versión de Perl [24] .
Para la programación de sistemas integrados y la integración en aplicaciones, se ha desarrollado un dialecto especial de Tcl: Jim [25] [26] . Este es un intérprete que implementa un gran subconjunto de Tcl, ampliado con mecanismos adicionales de programación funcional y orientada a objetos , y ocupa menos de 100 kilobytes en forma compilada.
Otro dialecto de Tcl es el lenguaje de programación móvil Hecl [27] , desarrollado por David Welton e implementado en Java ( J2ME ) [28] [29] . En cuanto a la plataforma Android , el soporte de Tcl en ella (junto con otros lenguajes de secuencias de comandos) es proporcionado por: capa de secuencias de comandos SL4A [30] ; también hay una implementación nativa de Tcl para este sistema operativo llamada AndroWish [31] .
Todas las distribuciones enumeradas a continuación se distribuyen libremente y se ensamblan a partir de componentes que tienen una u otra licencia libre . La mayoría de ellos son multiplataforma (excepto WinTclTk y Tcl/Tk Aqua ), aunque en los sistemas Unix Tcl/Tk suele formar parte de la distribución del sistema operativo .
Tcl, junto con Perl y Python , se ha convertido en uno de los tres lenguajes clásicos de secuencias de comandos de propósito general. Esta trinidad aparece no solo como una lista de distribuciones libres compiladas en ActiveState , sino también, por ejemplo, como lenguajes en los que (además del dialecto PL/pgSQL ) se pueden escribir disparadores y procedimientos almacenados del popular servidor de base de datos PostgreSQL .
Tcl como lenguaje integrable ha encontrado aplicación en el campo de CAD ( CAD | CAM | CAE ) [41] [42] . Se utiliza, por ejemplo, como sintonizador de base de datos en el posprocesador Unigraphics . Además, es el lenguaje de automatización e integración de facto en todos los principales paquetes de software de diseño de chips ( FPGA y ASIC ).
En la programación web, Tcl generalmente se usa junto con el servidor web AOLServer o uno de los servidores web FastCGI "ligeros" como lighttpd . Para integrar Tcl con Apache , existe el módulo Rivet [43] .
Bajo el control de AOLServer, en particular, OpenACS [44] es un sistema de gestión de contenido para sitios web con rica extensibilidad en el lenguaje Tcl, XOtcl extendido o proyecto abierto [45] - un sistema de trabajo en grupo con una interfaz web .
También existen proyectos como TclHttpd [46] y su sucesor, Wub [47] , que son frameworks web completos . Basado en la nueva extensión de objetos del lenguaje TclOO, se está desarrollando el marco web Woof (Web Oriented Object Framework) [48] . Un ejemplo de un CMS para TclHttpd es Ucome [49] .
Además de usarse como lenguaje de implementación de aplicaciones web, Tcl se puede usar como lenguaje de secuencias de comandos para ampliar las aplicaciones existentes. Por ejemplo, los módulos para el bot Eggdrop IRC están escritos en él [50] [51] .
La desventaja de las primeras versiones de Tcl/Tk fue, sin duda, el bajo rendimiento. Las versiones anteriores a la 8 utilizaron una interpretación directa del código fuente, sin embargo, el uso de bytecode resolvió este problema. Ahora, en términos de velocidad, Tcl no es muy diferente de PHP , aunque es notablemente inferior a lenguajes de secuencias de comandos como, por ejemplo, Python o Lua . Se recomienda ejecutar secciones de código complejas o de tiempo crítico como módulos externos en C / C++ .
Tcl/Tk tiene una sintaxis desconocida para los programadores en lenguajes "tradicionales". Está más cerca de la sintaxis de shell estándar de Unix . Esta sintaxis se puede modificar arbitrariamente (como en otros "lenguajes de programación programables" como Forth [nota 2] o Common Lisp ). Esto puede ser una ventaja para un programador individual o un pequeño grupo de programadores, pero hace que Tcl/Tk no sea adecuado para su uso como lenguaje de propósito general para el desarrollo industrial. Aunque la presencia de extensiones estandarizadas reduce la gravedad de este problema. Tcl también se puede utilizar en grandes proyectos dentro de su "nicho ecológico" (scripts embebidos, componentes "pegados", programación WEB).
Aunque Tcl tiene todas las propiedades de un lenguaje funcional , su intérprete anterior a la versión 8.6 no realizaba optimización de recursión de cola , lo que dificultaba el uso de un estilo puramente funcional y reducía su efectividad. Sin embargo, la flexibilidad del lenguaje hace posible eludir este problema implementando una apariencia de tal optimización a un alto nivel [52] . Finalmente, el comando tailcall , que apareció en la versión de prueba 8.6, le permite usar la recursividad de cola sin ningún problema.
La integración más cercana de Tcl con la biblioteca de gráficos Tk , que a menudo se usa en combinación con otros lenguajes de programación, es una ventaja indudable de Tcl. Para crear contenedores de GUI para programas de consola o paquetes de programas de consola, Tcl puede ser la mejor opción.
Aunque no es un lenguaje de programación muy utilizado, Tcl, junto con lenguajes (anteriores) como Lisp y Smalltalk , ha tenido una notable influencia en la programación. Se convirtió en el primer lenguaje centrado en la facilidad de integración en las aplicaciones [53] .
La facilidad de uso de la biblioteca de widgets gráficos de Tk no tenía paralelo y se hizo popular en otros lenguajes de secuencias de comandos de propósito general además de Tcl . Tkinter sigue siendo la herramienta predeterminada para crear aplicaciones GUI en Python . También hay bibliotecas de enlace Tk para Perl [ 54] (Tkx) y Ruby [53] .
SQLite , un sistema de gestión de bases de datos SQL ligero e integrable , se desarrolló originalmente como una extensión de Tcl [53] .
Lenguajes de programación | |
---|---|
|