Articulo de referencia

TScript

[http://www.ekkysoftware.com/Downloads Ekky Software] {{Webarchive|url=https://web.archive.org/web/20120929044431/http://www.ekkysoftware.com/Downloads |date=2012-09-29 }} "},"o...

TScript es un lenguaje de scripting integrable orientado a objetos para C++ que admite variables jerárquicas de tipo transitorio (TVariable). Su principal objetivo es crear un lenguaje de scripting que pueda interactuar con C++, transformando datos y devolviendo el resultado. Esto permite que las aplicaciones de C++ modifiquen su funcionalidad tras la instalación.

Ejemplo de "Hola mundo"

Ejemplo básico de TScript "¡Hola mundo!".

CTScript ts ; ts.SetParameter ( CTScript :: SOURCE_STRING , 0 , TEXT ( "main(){" ) TEXT ( "System::MessageBox(L \" ¡ Hola mundo! \ " );" ) TEXT ( "}" ) ); ts.ExecuteStaticMethod ( );

Variables de TV

La variable estándar [ 2 ] puede formarse como datos fijos, como un booleano, un entero o un decimal, y como una variable de longitud variable, como una cadena ASCII, una cadena de caracteres anchos o una cadena binaria. El tipo de datos puede usarse para definir la variable o bien el tipo puede declararse explícitamente; por ejemplo, el código - variable myInteger = 0;creará una variable llamada myInteger y le asignará el valor cero. Un tipo entero también puede declararse como - Integer myInteger;y su valor predeterminado será cero.

Las variables TVariable son jerárquicas por naturaleza y muy similares a las variables XML , JavaScript y PHP .

El tipo TVariable también es transitorio, ya que un entero puede convertirse en un AString asignándole un valor de cadena o realizando una conversión de tipo de la variable a AString. Por ejemplo, después de crear y usar una variable entera, se puede reasignar igualándola a un AString.

Los TVariables también pueden usarse para almacenar un array de TVariables. Una vez creada una variable válida, se puede usar la notación de índice de array para transformarla en un array; por ejemplo, el código variable list = {0,2,4,6};creará un array con cuatro elementos. El tipo de TVariable para "list.type" será el de una estructura y cada elemento list[0].typeserá un Integer.

Las clases en TScript son similares a los arrays en cómo los maneja TVariable, pero usan cadenas como scripts de array. Por ejemplo, el código - creará una variable estructurada donde list.Monday es verdadero y list.Tuesday es falso. En el código nativo de C++, los elementos estructurados de TVariable son accesibles en C++ por - o por cualquiera de o en el código nativo.variablelist={"Monday"=>true,"Tuesday"=>false};list["Monday"];list.Mondaylist["Monday"]

Variables definidas (clases)

Al admitir variables jerárquicas, TScript puede almacenar variables tanto primitivas como complejas dentro de la misma estructura de variables. [ 3 ] Esto elimina cualquier requisito de diferencia única entre datos primitivos y estructurados, lo que convierte la estructura de clases en una agrupación lógica de funcionalidades en lugar de un tipo de almacenamiento de datos.

TScript implementa conceptos de herencia y encapsulación de código mediante variables definidas. Por ejemplo, el siguiente fragmento de código muestra las variables definidas Foo y Bar , que admiten un constructor.

variable Bar { Entero mínimo , máximo ; Bar ( ) { este.mínimo = 1 ; } }variable Foo extiende Bar { WString nombre ; Foo ( WString nombre ) { this.nombre = nombre ; this.Bar ( ) ; } }public main (){ Foo foo ( L "Goo" ); System :: MessageBox ( foo . ToString ()); }

Declaraciones de funciones

Otra característica destacable de TScript son las declaraciones de funciones, [ 4 ] que utilizan parámetros de salida en lugar de valores de retorno y proporcionan soporte sintáctico para estos. La función estándar en muchos lenguajes procedimentales, siguiendo a Algol, tiene la forma:

[ tipo de retorno ] < nombre de la función >([ variable de entrada ], ...) .

En TScript este patrón se ha cambiado a la forma:

< nombre de la función >([ variable de entrada ],...  :[ variable de salida ],...) .

Este cambio ha tenido dos efectos: primero, permite múltiples variables de salida y, segundo, ha transformado la instrucción de retorno en una función de manejo de errores.

Permitir que las funciones tengan una lista de variables de entrada y salida separadas por el punto y coma ":" modificó el flujo habitual de cómo se llaman y utilizan las funciones. Esto reduce la necesidad de usar punteros de referencia para devolver múltiples variables, algo común en C/C++, e impide el uso de referencias en la mayoría de los demás lenguajes de scripting, obligando a utilizar una estructura o un array para devolver múltiples valores.

La segunda característica destacable de las convenciones de llamada es que ahora todas las funciones incorporan un mecanismo de manejo de errores similar al de C++ y Java. En TScript, dado que todas las funciones devuelven un error, la instrucción `return` funciona de forma similar a la instrucción `throw`. Por ejemplo, la instrucción `return error = "Have an error message";` finalizará la función y devolverá el mensaje de error. Por otro lado, la instrucción vacía `return;` finalizará la función, pero no devolverá ningún error.try{}catch(){}thrownewException()

Ejemplo de múltiples valores de retorno

public TextExtent ( WString text : Integer width , Integer height ){ text = text . Fragment ( L " \n " ); for ( height = width = 0 ; height < text . length ; height ++ ){ if ( width < text [ height ]. length ) width = text [ height ]. length ; } }

Notación taquigráfica

Para mayor comodidad, TScript ofrece una llamada a la función abreviada cuando solo hay una variable devuelta. Esta notación sustituirá el caso de . Esta notación abreviada evita que el código que realiza la llamada capture errores y estos se devolverán automáticamente al código que realiza la llamada principal.function(:variable);forvariable=function();

Manejo de errores

En muchos otros lenguajes, el manejo de errores se realiza mediante excepciones . TScript utiliza un proceso similar de manejo de errores, [ 5 ] aunque con algunas diferencias. TScript cuenta con una variable de error global similar a la tradicional `errno` en C, si bien la variable de error en TScript puede almacenar tanto un código de error como un mensaje de error detallado.

En muchos lenguajes que utilizan esta sintaxis, el error se devuelve mediante la instrucción `catch`, lo que puede dificultar el flujo operativo del código en situaciones donde algunos errores son recuperables. TScript utiliza una notación que permite al código que realiza la llamada filtrar el error, lo que puede permitir recuperarse del error y volver al funcionamiento normal, o bien devolver el error a la función que lo llamó.try{...}catch(...){...}if(...){...}else{...}

Ejemplo de errores de devolución y manejo

función (){ devuelve error = -1 ;}public main (){ if ( ! function ()){ if ( error != -1 ) return error ; } System :: MessageBox ( L "Función ejecutada correctamente" ); }

Enlace en tiempo de ejecución

C++ admite la sobrecarga de funciones , lo que permite que las funciones tengan el mismo nombre pero se diferencien por sus parámetros de entrada. Esto genera un problema en TScript al admitir variables de tipo flexible , ya que no hay forma de saber el tipo de una variable hasta que se ejecuta el software.

Para contrarrestar este problema, TScript se ha escrito con enlace en tiempo de ejecución. Esto significa que la función que se llama depende del tipo de variables en el momento de la llamada.

Esta es una táctica inusual que ofrece algunas ventajas adicionales. En primer lugar, elimina la necesidad de declarar funciones antes de usarlas; por ejemplo, en C++, dos funciones pueden llamarse entre sí, como `<function>` y `<function> `. En este caso, la función debe ser prototipada para que la función pueda llamarla. El enlace en tiempo de ejecución de TScript permite declarar las funciones en cualquier orden sin necesidad de prototiparlas. Esto facilita enormemente la escritura de código para programadores con menos experiencia, permitiéndoles centrarse en la lógica del software y no en los requisitos del lenguaje.voidFoo(){Bar();}voidBar(){Bar();}Bar()Foo()

La vinculación en tiempo de ejecución también permite que el lenguaje admita la codificación en tiempo de ejecución con métodos como AddMethod y AddDefinedVariable . Esto posibilita que los programas TScript se escriban a sí mismos. Por ejemplo, al usar la interfaz SOAP , el WSDL remoto se codificará en la biblioteca de scripts, lo que permite llamar a las funciones como si se hubieran programado en tiempo de diseño. Además, también es posible escribir código que aprenda por sí mismo, creando nuevas funciones cuando sea necesario.

Bibliotecas de enlace dinámico

TScript pertenece a un pequeño grupo de lenguajes de scripting que permiten cargar y enlazar dinámicamente bibliotecas compartidas existentes. Java, a través de su JNI , y VB6 son otros dos lenguajes de scripting que permiten escribir código para cargar una biblioteca de terceros y ejecutarla mediante su interfaz nativa. Esto le otorga a TScript la capacidad de utilizar una gran cantidad de funcionalidades y código preexistentes escritos en diferentes lenguajes, sin necesidad de modificar la interfaz de la biblioteca compartida ni compilarla con el código fuente.

Gestión de la memoria

TScript utiliza la encapsulación de clases estándar de C++ para asignar y liberar recursos de memoria. Esto significa que toda la memoria asignada se libera cuando se destruye la variable que la contiene, y funciona de manera diferente al modelo de recolección de basura de Java o al modelo de conteo de referencias de los lenguajes .NET .

Los recursos del sistema operativo, como archivos, sockets y claves de cifrado, se gestionan mediante un mecanismo de conteo de referencias similar al de .NET, por lo que se liberarán tan pronto como no haya variables que contengan sus valores.

seguridad proactiva

Gracias a su capacidad para cargar bibliotecas compartidas existentes, el script puede acceder a todos los privilegios otorgados al usuario que lo ejecuta. Para protegerse contra código malicioso, se requiere que cada script tenga acceso a todos los recursos, más allá de la memoria asignada. Esto incluye la posibilidad de usar cuadros de mensaje para solicitar información al usuario, así como el acceso de lectura y escritura a cualquier archivo o directorio, o el uso de la conexión a Internet.

Esta arquitectura de seguridad está diseñada para permitir la ejecución de scripts de forma similar a JavaScript, al tiempo que habilita la utilidad de lenguajes de scripting más potentes como Perl .

Referencias

  1. Ekky Software Archivado el 29/09/2012 en Wayback Machine
  2. Documentación de ayuda de TScript TVariable
  3. Documentación de TScript - Variables definidas
  4. Documentación de TScript - Declaraciones de funciones
  5. Documentación de TScript - Manejo de errores
  • Introducción a TScript