Paradigma | Multiparadigma : orientado a objetos ( basado en clases ), procedimental ( imperativo ), estructurado |
---|---|
Diseñado por | Simon C. Nash (IBM) |
Apareció por primera vez | 1988 ( 1988 ) |
Versión estable | 5.0.0 / 10 de mayo de 2023 ( 10 de mayo de 2023 ) |
Versión preliminar | 5.1.0 |
Lenguaje de implementación | C++ |
Plataforma | IA-32 , x86-64 , ARM , s390x |
Sistema operativo | Multiplataforma : Linux , Microsoft Windows , macOS , Solaris , OpenIndiana , AIX , FreeBSD , OS/2 |
Licencia | Licencia CPL 1.0, GPLv2 |
Extensiones de nombre de archivo | .rxs, .rex, .rexx, .cls |
Sitio web | www.rexxla.org |
Implementaciones principales | |
Objeto REXX (hasta 2004) ooRexx (desde 2005) | |
Influenciado por | |
Rexx , charla informal | |
Influenciado | |
NetRexx |
Object REXX es un lenguaje de programación de alto nivel , de propósito general , interpretado y orientado a objetos ( basado en clases ) .
Es una continuación y una extensión significativa del lenguaje de programación Rexx (a menudo llamado "Classic Rexx"). Object REXX conserva todas las características y la sintaxis de "Classic Rexx" al tiempo que agrega capacidades completas de programación orientada a objetos (OOP). Aunque Object REXX no implementa todos los aspectos del estándar "Tecnología de la información: lenguaje de programación REXX" ANSI X3.274-1996 [1] , ofrece muchas características nuevas propias.
Siguiendo la influencia de "Classic Rexx", Object REXX está diseñado para que sea fácil de aprender, usar y mantener. Hay varias implementaciones orientadas a objetos de REXX disponibles, incluidas Open Object Rexx ("ooRexx") y Rexx Object Oriented ("roo!"). [2] : 311
En 1988, el proyecto "Oryx" de IBM , bajo la dirección técnica de Simon C. Nash, experimentó con la fusión de "Classic Rexx" con el modelo de objetos de Smalltalk . [3] [4] La motivación detrás del proyecto era transferir las ventajas de OOP a "Classic Rexx" mientras se mantenía la compatibilidad y, por lo tanto, transferir la usabilidad de "Classic Rexx" a OOP. [5] Al principio, los proyectos se centraron en el aspecto de OOP, como tratar todo como un objeto, encapsulación y paso de mensajes basados en objetos, concurrencia basada en objetos , clases y herencia . [6]
Este trabajo inicial condujo posteriormente, bajo la dirección de Rick McGuire, al primer prototipo de Object REXX, que se presentó en 1992. En 1994, IBM anunció que Object REXX reemplazaría a "Classic Rexx" como el intérprete REXX estándar en la siguiente versión de OS/2 . [4] En 1996, Object REXX [a] fue lanzado como parte del sistema operativo OS/2 Warp 4. [7] En 1997, siguieron versiones para Windows 95 , Windows NT y Linux . [8] [9] En 1999 se lanzó una versión de Object REXX para AIX V4.1.5 o superior. [10] En 2000, siguieron versiones para zLinux y Sun/Solaris . Para Windows 2000 , Windows Me , Windows 98 y Windows NT 4.0 , la última actualización importante de Object REXX se lanzó en 2001. [11]
El 12 de octubre de 2004, IBM anunció la discontinuación de Object REXX y transfirió el código fuente y los derechos de licencia [b] al grupo de interés especial (SIG) sin fines de lucro, Rexx Language Association (RexxLA). El código que IBM lanzó al código abierto no incluía las clases para IBM System Object Model (SOM) y Workplace Shell (WPS). [12] La versión OS/2 de Object REXX incluye clases para soportar SOM [13] y WPS. [14] Estas también están incluidas en el producto de continuación inicial de OS/2, eComStation , y también en su descendiente actual, ArcaOS , para el cual el intérprete Object REXX original de IBM continúa estando disponible. [15]
En 2005, RexxLA lanzó ooRexx como una nueva encarnación de Object REXX como software libre y de código abierto bajo la Licencia Pública Común . [16] Esta primera versión de ooRexx 3.0.0 ha sido refactorizada en gran medida en comparación con el código fuente original de IBM para aumentar la legibilidad. Más tarde, el núcleo de ooRexx fue reescrito en C++ puro , y se diseñó e implementó una nueva arquitectura e interfaz nativa bajo la dirección técnica de Rick McGuire. Este trabajo permitió a RexxLA lanzar ooRexx 4.0.0 con soporte para 64 bits en 2009. Hasta el día de hoy, RexxLA continúa desarrollando, brindando soporte y manteniendo ooRexx, así como "Classic Rexx" y NetRexx . Además, RexxLA organiza simposios anuales. [17]
La siguiente tabla contiene características y cambios destacables de las principales versiones de los intérpretes Object REXX y ooRexx. Todas las versiones de ooRexx y la documentación necesaria están disponibles en Sourceforge . [18] [19] Para las distribuciones basadas en Arch Linux, la versión actual y la versión de desarrollo están disponibles como Arch User Repository . Para ooRexx 5.0.0 está disponible un puerto no oficial para OS/2. Desde la versión 5.0.0, están disponibles versiones portátiles del intérprete que permiten su uso sin instalación. Para Intellij IDEA , el complemento ooRexxPlugin agrega soporte para resaltado de sintaxis , verificación de sintaxis, finalización de código y soporte de documentación modelado a partir de Javadoc usando anotaciones . [20]
Lanzamientos importantes | Fecha de lanzamiento | Características y cambios notables |
---|---|---|
Versión antigua, ya no se mantiene:Objeto REXX 1.0.0 (OS/2) [21] | 25 de septiembre de 1996 |
|
Versión antigua, ya no se mantiene:Objeto REXX 1.0.0 (Windows) [8] | 1997-02-28 (IE) 1997-05-30 (DE) |
|
Versión antigua, ya no se mantiene:Objeto REXX 1.1.0 (AIX) [22] | 09-04-1999 |
|
Versión antigua, ya no se mantiene:Objeto REXX 2.1.0 (Windows) [23] | 21 de abril de 2001 |
|
Versión antigua, ya no se mantiene:ooRexx 3.0.0 [24] [25] | 30 de marzo de 2005 |
|
Versión antigua, ya no se mantiene:ooRexx 3.1.0 [26] | 21 de agosto de 2006 |
|
Versión antigua, ya no se mantiene:ooRexx 3.1.1 [27] | 23 de noviembre de 2006 | |
Versión antigua, ya no se mantiene:ooRexx 3.1.2 [28] | 17 de septiembre de 2007 |
|
Versión antigua, ya no se mantiene:ooRexx 3.2.0 | 22 de enero de 2008 |
|
Versión antigua, ya no se mantiene:ooRexx 4.0.0 [29] | 30 de septiembre de 2009 |
|
Versión antigua, ya no se mantiene:ooRexx 4.1.0 [30] | 28 de septiembre de 2011 |
|
Versión antigua, ya no se mantiene:ooRexx 4.2.0 [32] | 23 de febrero de 2014 |
|
Versión estable actual: ooRexx 5.0.0 [33] | 22 de diciembre de 2022 |
|
Última versión preliminar de una futura versión:ooRexx 5.1.0 | 19-09-2024 |
ooRexx sigue la filosofía de diseño de "Classic Rexx" para crear un lenguaje de programación "centrado en el ser humano" que sea fácil de aprender, codificar, recordar y mantener. Esto se logra, en parte, manteniendo el lenguaje pequeño y siguiendo el principio del menor asombro . [2] [34] Se posibilita una sintaxis legible al no distinguir entre mayúsculas y minúsculas, de forma libre, requiriendo la menor puntuación posible y utilizando instrucciones que son un inglés sencillo. [34] Además, es un lenguaje de programación dinámico que ofrece flexibilidad y permite centrarse en el desarrollo en lugar de en las limitaciones del lenguaje. Solo hay un tipo de datos, la cadena de caracteres , que no tiene que declararse, lo que reduce el esfuerzo de los programadores en comparación con los lenguajes estrictamente tipados . [35]
Siguiendo el principio de diseño de “documentación antes de la implementación” de “Classic Rexx”, ooRexx ofrece documentación completa de acuerdo con la Guía de estilo de IBM que incluye diagramas de sintaxis y ejemplos. [34] [36]
Al igual que en "Classic Rexx", hay instrucciones de asignación, instrucciones de palabras clave e instrucciones de comando, y en ooRexx también hay instrucciones de directiva. En línea con el deseo de mantener el lenguaje pequeño, solo hay treinta instrucciones de palabras clave en ooRexx 5.0.0. [36] A diferencia de muchos otros lenguajes, no se reservan palabras clave, por lo que no es necesario memorizar una larga lista de palabras reservadas . [37] En los casos en que la cadena no es una instrucción de asignación ni de palabra clave, se considera una instrucción de comando, que hace que el intérprete la pase al sistema operativo para su ejecución y establezca una variable RC
para el código de retorno. Además, la ADDRESS
instrucción permite redirigir los comandos a entornos específicos como Bourne Shell , Bash , Z-Shell , Command Prompt y otros, así como interceptar errores.
a = "hola mundo" /* instrucción de asignación */ do i = 1 a 2 /* instrucción de palabra clave "DO" */ decir "ronda #" i ": " a /* instrucción de palabra clave "DECIR" */ fin /* instrucción de palabra clave "END" */ "echo Hello World" /* comando al sistema operativo */ decir "RC:" rc /* código de retorno */
ooRexx tiene una sintaxis de formato libre donde la posición del código del programa es irrelevante, lo que permite un alto grado de flexibilidad. Antes de la ejecución, el intérprete fusiona múltiples espacios en blanco sin comillas en uno solo, mientras que una cadena de caracteres entre comillas (simples o dobles) no se modifica. La concatenación se puede solicitar explícitamente con dos barras verticales ( ||
), o implícitamente separando términos con espacios o mediante términos contiguos. Opcionalmente, las cláusulas se pueden distribuir en varias líneas utilizando la coma ( ,
) o el signo menos ( -
) como carácter de continuación, o se pueden utilizar varias cláusulas en una sola línea, separadas por un punto y coma ( ;
). [36] Dado que un lenguaje de formato libre proporciona flexibilidad y requiere que se consideren menos reglas sintácticas, se supone que facilita el esfuerzo de aprendizaje al reducir la carga cognitiva intrínseca . [38]
decir "¡Hola mundo!" /* salida: ¡Hola mundo! */ decir "Esto" 'es' - /* signo menos para continuación */ "REXX" || "!" /* salida: ¡Éste es REXX! */
Como "Classic Rexx", ooRexx es un lenguaje de programación que no distingue entre mayúsculas y minúsculas . El intérprete pone en mayúsculas todos los caracteres que no están entre comillas antes de ejecutarlos. Como no es necesario diferenciar entre mayúsculas y minúsculas, se necesitan aprender menos detalles adicionales y se evitan errores de sintaxis frustrantes. [38]
a = "¡Éste es REXX!" Di A /* salida: ¡Esto es REXX! */ DIGA una salida /*: ¡Esto es REXX! */
De manera similar al paradigma de mensajería implementado por Alan Kay en Smalltalk, todo en ooRexx es un objeto con el que se puede comunicar mediante el envío de mensajes que nombran un método. La noción de enviar mensajes a objetos como si fueran seres vivos ayuda a los principiantes a aprender los conceptos de programación orientada a objetos. [37]
A diferencia de Smalltalk, existe un operador de mensaje explícito, la tilde ( ~
), donde el objeto receptor se coloca a la izquierda de él y se devuelve el resultado de la operación. Al igual que Smalltalk, los mensajes de ooRexx se pueden poner en cascada si ~~
se utilizan dos tildes ( ) en lugar de una, devolviendo el objeto que recibió el método en lugar del resultado producido. El comportamiento predeterminado de la mayoría de los métodos se puede cambiar especificando una opción, que puede escribirse con todas las letras o abreviarse y no distingue entre mayúsculas y minúsculas. Esto permite una comprensión literal y reduce el esfuerzo de aprendizaje para los principiantes. [38] Por ejemplo, el método strip elimina por defecto los espacios en blanco iniciales y finales. Este comportamiento se puede cambiar, por ejemplo, especificando "leading"
o "l"
como opción. Mientras que las funciones están anidadas en "Classic Rexx", los mensajes se pueden encadenar en ooRexx, lo que mejora la legibilidad de una declaración . [37]
a = " ¡Soy ooRexx!" decir una /* salida: ¡Soy ooRexx! */ decir una ~ Tira ( "Líder" ) /* salida: ¡Soy ooRexx! */ decir una ~ tira ( "l" ) ~ revertir /* salida: !xxeRoo ma I */
ooRexx está diseñado para conservar todas las características de "Classic Rexx". Cumple [c] con el estándar ANSI para el lenguaje Rexx (X3.274-1996, "Programming Language Rexx" [1] ), para la interoperabilidad entre plataformas con otras implementaciones que lo cumplan. Por lo tanto, los programas "Classic Rexx" normalmente se ejecutan bajo ooRexx sin ningún cambio. Esto facilita la transferencia tanto del código del programa como del conocimiento del desarrollador desde "Classic Rexx" a ooRexx. A esto, ooRexx agrega todas las características de OOP, como subclasificación , polimorfismo y encapsulamiento de datos . Otras características incluyen herencia múltiple a través de clases mixin .
La PARSE
instrucción de palabra clave permite analizar de forma rápida y flexible una cadena y asignar partes de ella a variables en un solo paso. [2] La instrucción posterior se utiliza para especificar la fuente de la cadena, por ejemplo, ARG
para argumentos que se enumeran cuando se llama al programa o la función, VAR
para variables, PULL
para colas de datos o entrada estándar (normalmente el teclado), VALUE
para cualquier expresión. Cuando se utiliza VALUE
, WITH
se requiere la palabra clave para especificar el final de una expresión, seguido de un patrón de análisis. Este patrón puede ser una lista de variables, un número de posición o delimitadores literales; es posible utilizar estos patrones en combinación. Opcionalmente, las mayúsculas y minúsculas de la cadena se pueden convertir antes del análisis. [36]
aString = "Persona: Rick McGuire" analizar valor aString con tipo ":" primero segundo /* delimitador y lista de variables */ decir primer segundo /* salida: Rick McGuire */
Además de los tres tipos de instrucciones de "Classic Rexx", ooRexx agrega instrucciones directivas que no son ejecutables, con la primera directiva marcando el final de la parte ejecutable de un programa. [36] Para hacer que las instrucciones directivas sean fácilmente reconocibles, se introducen con dos puntos consecutivos ( ::
). La ::CLASS
directiva hace que el intérprete defina una nueva clase y la ::METHOD
directiva defina un nuevo método. La ::ATTRIBUTE
directiva se utiliza para definir un método de acceso que puede recuperar o asignar una variable de objeto. Con la EXPOSE
instrucción, la variable de objeto se expone a un método, mientras que PARSE
se puede utilizar para analizar el parámetro y asignarlo a una variable.
d = . dog ~ new ( "Bella" ) /* crea y asigna un perro */ d ~ bark /* enviar mensaje de corteza */ decir d ~ nombre /* salida: Bella */ :: clase perro /* directiva de clase */ :: Nombre del atributo /* directiva del atributo */ :: método init /* método de iniciación del objeto */ Exponer nombre /* expone el nombre del perro */ Analizar el nombre del argumento /* asigna "Bella" al nombre */ :: método corteza /* directiva de método */ Exponer nombre decir Nombre "¡hace guau!" /* salida: ¡Bella hace guau! */
Hay cuatro tipos diferentes de clases: clases de objeto, que actúan como una fábrica para crear objetos, clases mixin que agregan métodos a otras clases, clases abstractas para proporcionar definiciones de métodos y metaclases que se pueden usar para crear otras clases. [36]
El intérprete ooRexx ofrece clases integradas y métodos y funciones asociados que realizan diversas operaciones de procesamiento de texto y números, búsqueda y comparación, capacidades de formato y cálculos aritméticos. [39]
Además de las clases integradas, ooRexx 5.0.0 proporciona 82 funciones integradas , incluidas funciones de manipulación de caracteres, conversión e información, muchas de las cuales llaman a métodos de la clase String. [36] La biblioteca de vínculo dinámico incorporada RexxUtil ofrece 29 funciones multiplataforma, 25 específicas de Windows y cuatro específicas de Unix para manipular archivos del sistema, directorios, clases y objetos. [36]
Conceptualmente, ooRexx proporciona concurrencia basada en objetos , según la cual los objetos tienen recursos independientes para ejecutar métodos y pueden comunicarse entre sí utilizando el paradigma de mensajería. Varios objetos pueden estar activos al mismo tiempo e intercambiar mensajes para la sincronización . [36] La concurrencia se puede lograr ya sea con la REPLY
palabra clave instrucción, que provoca un retorno temprano de un método mientras su resto continúa ejecutándose en un nuevo hilo, con la GUARD
palabra clave instrucción, que puede establecer un método como no protegido para que pueda ejecutarse junto con otros métodos de la misma clase, o utilizando el start
método de la clase Object, que hace que el receptor procese el mensaje en un hilo separado. [36]
Al igual que en “Classic Rexx”, la TRACE
instrucción de palabra clave y la función incorporada TRACE()
facilitan la depuración, permiten controlar el nivel de detalle y habilitan la depuración interactiva en tiempo de ejecución. [40] Cuando se realiza una depuración interactiva, el intérprete hace una pausa después de la mayoría de las instrucciones que se rastrean. [36] Si bien los programas multiproceso se pueden rastrear, ooRexx 5.1.0 introduce como una adición la clase TraceObject, que proporciona información adicional como la instancia del intérprete, el número del hilo en el que se envía el mensaje y el estado de los bloqueos de protección, lo que permite juzgar qué método está bloqueado actualmente. [40]
Mediante la ::REQUIRES
directiva , se pueden integrar paquetes de funciones externas en cada programa. Esta directiva se coloca después de la sección de código principal y permite el acceso a clases y rutinas públicas de un programa Rexx o, especificando la LIBRARY
opción, a bibliotecas externas. Dichas bibliotecas suelen estar organizadas en torno a funciones específicas del dominio. [36]
La biblioteca de extensión Rexx proporciona una clase para leer y escribir archivos de valores separados por comas (CSV), para crear y procesar datos de notación de objetos JavaScript (JSON) y un entorno de subcomandos que emula parcialmente un entorno TSO / CMS . [41] La biblioteca RxSock permite incorporar protocolos TCP/IP , [42] mientras que la biblioteca RxFtp [43] proporciona específicamente acceso al protocolo de transferencia de archivos . La biblioteca RxMath ofrece funciones matemáticas avanzadas como cálculo de raíz cuadrada, función exponencial, logaritmo, seno, coseno, tangente, arcoseno y cálculo de potencia. [44]
Digamos rxcalcsin ( 1 ) /* salida: 0.0174524064 */ :: requiere la BIBLIOTECA 'rxmath'
Para Windows, ooRexx incluye el marco OODialog que permite producir cuadros de diálogo de Windows y, por lo tanto, interfaces gráficas de usuario . [45] El intérprete de ooRexx se entrega con varios programas de ejemplo y paquetes de funciones que demuestran el uso de este marco. [39]
Para los sistemas operativos compatibles con POSIX , la biblioteca de clases nCurses permite escribir interfaces de usuario basadas en texto utilizando la biblioteca de programación ncurses . [46] La biblioteca RxUnixSys proporciona funciones en la mayoría de los sistemas Unix para interactuar con procesos e hilos, usuarios y grupos de usuarios, archivos y sistemas de archivos y otros. [47]
Si bien ooRexx, en comparación con Object REXX, ya no contiene clases para compatibilidad con SOM y WPS, ofrece interfaces de programación de aplicaciones (API) para interactuar con código escrito en C o C++ . [48] Además, se proporcionan clases que permiten la automatización de aplicaciones de Windows. La clase ooSQLite proporciona una interfaz para SQLite , una biblioteca en proceso que implementa un motor de base de datos SQL transaccional autónomo, sin servidor y de configuración cero . [49] También hay una biblioteca externa que implementa un puente Java bidireccional , basado en Bean Scripting Framework , llamado BSF4ooRexx, que permite utilizar clases Java en programas ooRexx. [37]
Como "Rexx clásico", ooRexx incluye API para ampliar aplicaciones Rexx con programas escritos en C y viceversa. Esto incluye la creación de controladores para subcomandos utilizados en programas Rexx que se ejecutan como macros de aplicación, funciones externas que permiten una extensión directa del conjunto de funciones de ooRexx y funciones del sistema que permiten personalizar el comportamiento del intérprete. [48]
Además, hay API disponibles que permiten que las aplicaciones C++ extiendan ooRexx y viceversa. Esto incluye controladores para métodos y funciones escritos en C++ que extienden ooRexx, ambos empaquetados como bibliotecas externas. Estas bibliotecas se empaquetan como bibliotecas de vínculo dinámico en Windows o como bibliotecas compartidas en sistemas basados en Unix. Una biblioteca externa se puede cargar con la ::REQUIRES
directiva o utilizando la EXTERNAL
palabra clave instruction como parte de una directiva ::ROUTINE
, ::METHOD
o .::ATTRIBUTE
La extensión de Windows incluye el motor de scripts de Windows Script Host (WSH) que se puede utilizar para realizar tareas de automatización general. También incluye compatibilidad con Object Linking and Embedding / ActiveX (OLE) que permite interactuar con programas de Windows a través de OLEObject
. [50] La automatización OLE es un mecanismo de comunicación entre procesos desarrollado por Microsoft que se basa en un subconjunto del Modelo de objetos componentes (COM) y permite, entre otras cosas, la invocación de funciones de programa, la consulta y configuración de atributos y la interceptación de eventos de componentes. El intérprete ooRexx incluye ejemplos que demuestran algunas características de WSH, la interacción con Access , Word , Excel y otros programas a través de OLE, y una utilidad para explorar los objetos OLE disponibles. [39]
excelApplication = . OLEObject ~ new ( "Excel.Application" ) /* crear objeto para Excel */ excelApplication ~ visible = . true /* hacer que Excel sea visible */ Hoja de trabajo = excelApplication ~ Libros de trabajo ~ Agregar ~ Hojas de trabajo [ 1 ] /* agregar hoja de trabajo */ Hoja de trabajo ~ celdas ( 1 , 1 ) ~ Valor = “ Primera celda ” /* insertar cadena en la celda */
Además del soporte OLE, la extensión de Windows permite la interacción con el administrador de programas de Windows, el registro de eventos del sistema , el portapapeles y el registro, así como consultar, editar e interactuar con ventanas, menús o submenús. [50]