REXX (REstructured eXtended eXecutor) es un lenguaje de programación desarrollado en IBM por Mike Cowlishaw del que existen numerosas implementaciones disponibles con código abierto. Es un lenguaje de programación estructurado de alto nivel diseñado para ser al mismo tiempo fácil de entender y fácil de leer. Hay intérpretes para REXX tanto comerciales como de código abierto para un amplio rango de plataformas y hay compiladores para los mainframes de IBM.
El nombre también se aplica a la familia de lenguajes relacionados con el lenguaje de programación REXX: el propio REXX (llamado en ese contexto REXX clásico o tradicional), Object REXX y NetREXX.
Características
REXX tiene, entre otras, las siguientes características:
tiene la cadena de caracteres como base no hay declaraciones no hay palabras reservadas (excepto en un contexto local) precisión numérica arbitraria aritmética decimal un gran conjunto de funciones (especialmente para procesado de cadenas y palabras) gestión automática de la memoria arrays asociativos acceso directo a las órdenes y facilidades del sistema manejo de errores sencillo herramientas de trazado y depuración dentro del intérprete acceso a la entrada y salida simplificado
REXX tiene solamente 23 instrucciones de significado bastante evidente para los angloparlantes (call, parse y select son unos ejemplos) con unos requerimientos mínimos de puntuación y formateo. Es esencialmente un lenguaje de formato libre con solamente un tipo de dato primitivo: la cadena de caracteres. Esta filosofía implica que todos los datos son visibles y que la depuración y el trazado se simplifican.
La sintaxis de REXX parece similar a la de PL/I, pero tiene menos notaciones; esto hace que el código sea más difícil de analizar por el intérprete o el compilador pero más fácil de usar para el programador.
Historia REXX fue diseñado e implementado por vez primera como un proyecto personal de Mike Cowlishaw de IBM entre el 20 de marzo de 1979 y mediados de 1982, originalmente como un lenguaje de programación de 'scripting' para reemplazar los lenguajes EXEC y EXEC 2. Fue diseñado para ser un lenguaje de scripting o macros para cualquier sistema y como tal, se considera a REXX precursor de lenguajes como Tcl y Python. Además, Cowlishaw se centró en que estuviese orientado a las personas en lugar de orientado a los ordenadores e intentó que el lenguaje se mantuviese pequeño y manejable por ello ("Keep the language small" -"Mantén el lenguaje pequeño"- se leía en la pared sobre su escritorio).
La primera versión pública apareció en mayo de 1979 distribuida a través de VNET, la red interna de IBM y los primeros usuarios aparte del propio Cowlishaw fueron Ray Mansell (de Hursley en el Reino Unido) y Les Koehler (de Raleigh en Carolina del Norte) que contribuyeron al lenguaje. A finales de 1979 al menos había unos 70 ordenadores con una implementación del lenguaje.
Algunas versiones fueron distribuidas entre compradores seleccionados de IBM como el SLAC (Stanford Linear Accelerator Center) donde la capacidad de REXX de trabajar con aritmética decimal de precisión arbitraria fue bien recibida. Al ser descrito por primera vez en público en la conferencia SHARE 56 en Houston, Texas, en 1981, la reacción de los clientes de IBM, liderada por Ted Johnston de SLAC (parcialmente motivada por la aritmética de REXX), condujo a que se convirtiese en producto oficial de IBM en 1982 y se incluyese en 1983 como parte del sistema VM/CMS.
A lo largo de los años, IBM incluyó REXX en forma de intérprete o compilador en casi todos sus sistemas operativos desde los mainframes a los ordenadores personales (VM/CMS, VM/GCS, MVS TSO/E, AS/400, OS/2, VSE/ESA, AIX, CICS/ESA y PC-DOS) y ha hecho versiones disponibles para Novell Netware, Windows, Java y Linux.
La primera versión fuera de IBM fue escrita por Charles Daney en 1984/5. Otras versiones han sido también desarrolladas para Atari, Amiga, Unix (múltiples variantes), Solaris, DEC, Windows, Windows CE, PocketPC, MS-DOS, Palm OS, QNX, OS/2, Linux, BeOS, EPOC32, AtheOS, OpenVMS, OpenEdition, Macintosh y Mac OS X.
La versión de REXX para Amiga, llamada ARexx debida a Bill Hawes se incluyó con AmigaOS 2 y fue popular tanto para scripting como para control de aplicaciones. Muchas aplicaciones Amiga tienen "puertos ARexx" en ellas lo que permite controlar la aplicación a través de un "script" definido por el usuario.
Numerosas versiones gratuitas de REXX están disponibles. En 1992 aparecieron las dos versiones de código abierto más ampliamente utilizadas: REXX/imc del británico Ian Collier para UNIX y Regina del noruego Anders Christensen (posteriormente adoptada por el australiano Mark Hessling) para Windows y Linux. BREXX del griego Vasilis Vlachoudis es bien conocido para DOS, WinCE y PocketPC.
Microsoft decidió incluir Regina en todos sus Windows Resource Kits como lenguaje de scripting y continuó esta práctica hasta Windows 2000 mientras introducía sus propias aproximaciones al scripting a través de WSH (Windows Scripting Host) y VBA (Visual Basic for Applications).
En 1990, Cathy Dager de SLAC organizó el primer simposio REXX independiente que conduciría cuatro años después a la formación de la RexxLA (REXX Language Association). Los simposios se llevan a cabo anualmente.
La RexxLA promovió la aparición de un estándar ANSI para REXX así como de un borrador para un estándar de Object REXX.
En 1996, ANSI se publicó el estándar para REXX: ANSI X3.274–1996 “Information Technology – Programming Language REXX”.
Desde mediados de la década de 1990, existen dos variantes nuevas de REXX:
NetREXX – que compila a bytecodes Java o es interpretado directamente. Object REXX – que es una versión orientada a objetos compatible con REXX.
REXX cumplió su vigesimoquinto aniversario el 20 de marzo de 2004, lo que se celebró en el decimoquinto Simposio Internacional de REXX organizado por la RexxLA (REXX Language Association) en Böblingen, Alemania, en mayo de 2004.
En el mismo decimoquinto Simposio Internacional de REXX, el 4 de mayo de 2004, IBM anuncia que retira Object REXX como producto y la intención de abrir el código fuente de Object REXX. Ante este anuncio, la RexxLA se ofrece a gestionar el futuro de Object REXX y nombra un comité para encargarse de la transición. El 12 de octubre de ese mismo año anuncia que transferirá el código a RexxLA para que se convierta en un proyecto de código abierto bajo la licencia Common Public License y el 29 de noviembre de ese mismo año se ha terminado de transferir todo el código excepto el código específico de la versión para OS/2, el IBM Resource Workshop (que permitía crear diálogos para Windows), Object REXX Workbench (IDE) y el paquete de funciones RxFTP. En febrero de 2005 aparece la primera versión pública de ooRexx (Open Object REXX) gestionada por David Ashley y Rick McGuire.
Variables
En REXX las variables no tienen tipo e inicialmente se les asigna como valor su nombre en mayúsculas. De este modo, el tipo de una variable puede cambiar con el uso dentro del programa. Como ilustra el siguiente código:
say hola /* HOLA <= La variable no tenía valor asignado */ hola = "25" /* Se le asigna la cadena "25" */ say hola || "0" /* 250 <= La variable es tratada como cadena */ say hola + 1 /* 26 <= La variable es tratada como número */ hola = "say 5 + 3" /* Se le asigna la cadena "say 5 + 3" */ say hola /* say 5 + 3 */ interpret hola /* 8 <= La variable es interpretada */ drop hola /* Se le desasigna el valor */ say hola /* HOLA */
REXX ofrece solamente un tipo de variable primitivo (la cadena) y un tipo de variable compuesta (que en REXX suele nombrarse precisamente de ese modo).
Variables simples
Los símbolos para las variables simples en REXX tienen como caracteres permitidos los típicos en casi todos los lenguajes de programación, pero nunca pueden tener un punto después del primer carácter dado que eso las convierte en una variable compuesta.
Como cadenas
REXX ofrece la operación de concatenación, la instrucción PARSE y un gran número de funciones para trabajar con cadenas por lo que muchas tareas con ellas resultan especialmente sencillas en este lenguaje.
Las cadenas están delimitadas por apóstrofos o comillas y al contrario que en otros lenguajes de programación interpretados, no existen las secuencias de escape ni la interpolación de variables; normalmente se utiliza la concatenación para conseguir los mismos efectos.
cadena = 'Una cadena delimitada por apóstrofos' cadena = "Una cadena delimitada por comillas" say "Hola.\a" /* Hola.\a <= No hay secuencias de escape */ say "$cadena" /* $cadena <= No hay interpolación de variables */ /* La siguiente cadena está delimitada por apóstrofos */ cadena = '"La vida es sueño", por Calderón de la Barca' /* La siguiente cadena está delimitada por comillas. Para escribir comillas dentro de la cadena, basta escribirlas por duplicado */ cadena = """La vida es sueño"", por Calderón de la Barca"
La concatenación de cadenas puede hacerse implícitamente al poner de forma contigua dos variables o explícitamente con el operador de concatenación (||):
uno = 'Una' dos = 'cadena' say uno dos /* Una cadena */ say uno||dos /* Unacadena */ say uno || ' 'dos /* Una cadena */
Cuando una cadena literal va seguida de "b" o "x" es tratada como una cadena binaria o hexadecimal:
/* El carácter para el tabulador horizontal: */ tab = '09'x /* en hexadecimal */ tab = '1001'b /* en binario */ campo_uno = 'Primero' campo_dos = 'Segundo' say campo_uno || tab || campo_dos
Como números
Las cadenas son tratadas como números dependiendo del contexto y cuando son números, pueden escribirse sin los delimitadores:
pi = 3.141592 seis = "6" say pi || seis /* 3.1415926 */ say pi + 6 /* 9.141592 */ numero_avogadro = 6.022e23
REXX ofrece la instrucción NUMERIC para establecer la precisión de los cálculos numéricos (con NUMERIC DIGITS), la forma de la salida de las cadenas como números (con NUMERIC FORM) y los dígitos significativos descartados a la hora de realizar las comparaciones (con NUMERIC FUZZ). Además las funciones digits(), form() y fuzz() permiten consultar la precisión, la forma y los dígitos significativos descartados en las comparaciones.
REXX ofrece una serie de funciones y operadores básicos para trabajar con números, pero carece de las funciones matemáticas básicas (raíz cuadrada, funciones trigonométricas...).
Como valores lógicos
Si una cadena vale uno o cero, entonces puede utilizarse como un valor lógico:
existe = "1" if existe & existe = 1 then say 'Esta cadena siempre se imprimirá' else say 'Esta cadena nunca se imprimirá'
Puede asignarse el valor lógico de una expresión:
AmayorqueB = A > B /* se asignará 1 a AmayorqueB si A > B, en caso contrario 0 */ if AmayorqueB then say 'A es mayor que B' else say 'A NO es mayor que B'
Como estructuras de datos
Debido a la facilidades que ofrece REXX para trabajar con cadenas, resulta relativamente sencillo crear con una cadena una estructura de datos concreta (un número complejo, una matriz, los datos de un libro...):
/* Por convención, el programador puede tratar la cadena como la unidad imaginaria */ unidad_imaginaria = "0 1" /* Por convención, el programador puede tratar la cadena como la matriz identidad de orden tres */ matriz = "1,0,0;0,1,0;0,0,1" /* O, con otra convención distinta: */ matriz = "3,3,1,0,0,0,1,0,0,0,1" /* Por convención, el programador puede tratar la cadena como los datos de un libro */ delimitador = '00'x titulo = 'The Rexx Language'||, ': A Practical Approach to Programming'||, ' (Second Edition)' autor = 'Michael Cowlishaw' isbn = '0137806515' libro = titulo || delimitador || autor ||, delimitador || isbn
Variables compuestas