RPG de IBM

format_list_bulleted Contenido keyboard_arrow_down
ImprimirCitar

RPG es un lenguaje de programación de alto nivel para aplicaciones empresariales, introducido en 1959 para el IBM 1401. Es más conocido como el lenguaje de programación principal de la línea de productos informáticos de gama media de IBM., incluido el sistema operativo IBM i. Tradicionalmente, RPG ha presentado una serie de conceptos distintivos, como el ciclo del programa y la sintaxis orientada a columnas. La versión más reciente es RPG IV, que incluye una serie de funciones de modernización, incluida la sintaxis de formato libre.

Plataformas

El lenguaje de programación RPG fue creado originalmente por IBM para sus sistemas 1401. También produjeron una implementación para System/360, y se convirtió en el lenguaje de programación principal para su línea de productos informáticos de gama media (System/3, System/32, System/34, System/38, System/36 y AS/400).). También ha habido implementaciones para DEC VAX, Sperry Univac BC/7, Univac system 80, Siemens BS2000, Burroughs B700, B1700, Hewlett Packard HP 3000, la serie ICL 2900, Honeywell 6220 y 2020, Four-Phase IV/70 y IV. /90, Singer System 10 y WANG VS, así como diversos compiladores y entornos de ejecución para sistemas basados en Unix, como Infinite36 (anteriormente Unibol 36) y PC (Baby/400, Lattice-RPG).

Las aplicaciones RPG II todavía son compatibles con los sistemas operativos IBM z/VSE y z/OS, Unisys MCP, Microsoft Windows y OpenVMS.

Historia

Fondo

Desarrollado originalmente por IBM en 1959, el nombre Generador de programas de informes describía el propósito del lenguaje: generación de informes a partir de archivos de datos. FOLDOC acredita a Wilf Hey por su trabajo en IBM que resultó en el desarrollo de RPG. FARGO (Ccatorce-o-uno Generación Ode Reportes automáticos O peration) fue el predecesor de RPG en el IBM 1401.

Ambos idiomas estaban destinados a facilitar la transición de los técnicos de equipos de registro de unidades de máquinas tabuladoras (Tab) de IBM a las computadoras entonces nuevas. Los técnicos de máquinas de pestañas estaban acostumbrados a enchufar cables en paneles de control para implementar operaciones de entrada, salida, control y contador (suma, resta, multiplicación, división). Los programas de las máquinas Tab se ejecutaban mediante impulsos emitidos en un ciclo de máquina; por lo tanto, FARGO y RPG emularon la noción de ciclo de máquina con el ciclo de programa. RPG fue superior y rápidamente reemplazó a FARGO como el programa generador de informes preferido.

Los lenguajes alternativos generalmente disponibles en ese momento eran Assembler, COBOL o FORTRAN. Assembler y COBOL eran más comunes en las operaciones comerciales de mainframe (System/360 modelos 30 y superiores) y RPG eran más utilizados por clientes que estaban en transición desde equipos de tabulación (System/360 modelo 20).

Juego de rol II

RPG II se introdujo alrededor de 1969 con la serie de computadoras System/3. Posteriormente se utilizó en System/32, System/34 y System/36, con una versión mejorada del lenguaje. RPG II también estaba disponible para sistemas más grandes, incluido el mainframe IBM System/370 que ejecutaba DOS/VSE (luego VSE/SP, VSE/ESA y z/VSE). ICL también produjo una versión de su sistema operativo VME/K.

En los primeros días de RPG, su principal fortaleza era el ciclo del programa. Un programador escribiría código para procesar un registro individual y el ciclo del programa ejecutaría el cambio en cada registro de un archivo, encargándose del flujo de control. En ese momento, cada registro (tarjeta perforada individual) se compararía con cada línea del programa, que actuaría sobre el registro, o no, en función de si esa línea tenía un "indicador" encendido "encendido" o "apagado". El indicador consistía en un conjunto de variables lógicas numeradas del 01 al 99 para propósitos definidos por el usuario, u otros conjuntos más pequeños basados en funciones de procesamiento de registros, campos o informes. El concepto de saltos de nivel y registros coincidentes es exclusivo del lenguaje RPG II y se desarrolló originalmente pensando en los lectores de tarjetas. La función de registro coincidente del ciclo permitió un fácil procesamiento de archivos que tenían una relación de encabezado a detalle. Los programas RPG escritos para aprovechar el ciclo del programa podrían producir informes complejos con muchas menos líneas de código informático que los programas escritos en COBOL y otros lenguajes centrados en los negocios.

Las Especificaciones de archivos del programa enumeran todos los archivos que se escriben, se leen o se actualizan, seguidas de las Especificaciones de definición de datos que contienen elementos del programa como estructuras de datos y matrices dimensionales, muy parecido a un archivo de "almacenamiento de trabajo" sección de un programa COBOL. A esto le siguen las Especificaciones de cálculo, que contienen las instrucciones ejecutables. Pueden seguir especificaciones de salida que se pueden utilizar para determinar el diseño de otros archivos o informes. Alternativamente, los archivos, algunas estructuras de datos e informes se pueden definir externamente, eliminando en su mayoría la necesidad de codificar manualmente las especificaciones de entrada y salida ("E/S").

Juego de rol III

RPG III fue creado para el System/38 y su sucesor el AS/400. RPG III se alejó significativamente del lenguaje original, proporcionando construcciones estructuradas modernas como bloques IF-ENDIF, bucles DO y subrutinas. RPG III también estaba disponible para sistemas más grandes, incluido el mainframe IBM System/370 que ejecuta OS/VS1. También estaba disponible en Unisys para el sistema operativo VS/9 que se ejecuta en los mainframes UNIVAC Serie 90.

Desde la introducción del IBM System/38 en 1979, la mayoría de los programadores de RPG descontinuaron el uso del ciclo en favor de controlar el flujo del programa con construcciones de bucle estándar, aunque IBM ha seguido proporcionando compatibilidad con versiones anteriores para el ciclo.

DE/RPG

DE/RPG o Data Entry RPG estaba disponible exclusivamente en la serie IBM 5280 de estaciones de trabajo de entrada de datos a principios de los años 80. Era similar a RPG III pero carecía de descripciones de datos externas (DDS) para describir datos (archivos) como en System/38 y sus sucesores. En cambio, la parte DDS tuvo que incluirse en la fuente del RPG.

Juego de rol/400

RPG/400 era efectivamente RPG III ejecutándose en AS/400. IBM cambió el nombre del compilador RPG a "RPG/400" pero en el momento de su introducción era idéntico al compilador RPG III en System/38. Prácticamente todos los productos de IBM fueron renombrados como xxx/400 y el compilador RPG no fue la excepción. RPG III compilado con el compilador RPG/400 no ofreció nada nuevo al lenguaje RPG III hasta que IBM comenzó a desarrollar nuevos códigos de operación, como SCAN, CAT y XLATE después de varios años de disponibilidad de AS/400. Estas mejoras de RPG III no estaban disponibles en la versión System/38 de RPG III.

RPG IV y ILE RPG

RPG IV, también conocido como RPGLE) se lanzó en 1994 como parte de la versión V3R2 de OS/400 (ahora conocido como IBM i).

Con el lanzamiento de RPG IV, el nombre del RPG ya no era oficialmente una inicial. RPG IV ofrecía una mayor variedad de expresiones dentro de su Especificación de cálculo de factor 2 extendido y, más adelante, su sintaxis de procedimiento y especificaciones de cálculo de formato libre. RPG IV en el marco de Integrated Language Environment se conoce en ILE RPG, y las guías de usuario explican los matices de ambos. IBM admite RPG IV e ILE RPG en la plataforma IBM i actual.

En 2001, con el lanzamiento de OS/400 V5R1, RPG IV ofreció mayor libertad para los cálculos que la ofrecida por la Especificación de cálculo de factor 2 extendido: una entrada fuente con capacidad de texto de formato libre, como alternativa al formato fuente original dependiente de columnas. El programa "/GRATIS" el cálculo no requería que el código de operación se colocara en una columna particular; el código de operación es opcional para las operaciones EVAL y CALLP; y la sintaxis generalmente se parece más a la de los lenguajes de programación convencionales de propósito general. Hasta noviembre de 2013, el formato libre se aplicaba exclusivamente a las especificaciones de cálculo. Con la actualización del lenguaje IBM i V7R1 TR7, la versión "/gratuita" y "/sin final" Los cálculos ya no son necesarios y el lenguaje finalmente ha roto los vínculos con las tarjetas perforadas.

IBM recomienda IBM Rational Developer for i (RDi), un entorno de desarrollo integrado basado en Eclipse, para el desarrollo de RPG. El editor de texto Source Entry Utility (SEU) ya no se recomienda para el desarrollo de RPG y el desarrollo cesó después de IBM i 6.1. Otras herramientas de desarrollo heredadas incluyen CODE/400 (basado en IBM WorkFrame/2) y VisualAge para RPG.

Mejoras continuas del idioma

IBM continúa mejorando el lenguaje RPG a través de lanzamientos de software y “actualizaciones tecnológicas” (TR) dentro de cada lanzamiento. Se han agregado más funciones integradas (BIF). Tiene la capacidad de vincularse a objetos Java y API de IBM i; se puede utilizar para escribir programas CGI con la ayuda del kit de herramientas web Cgidev2 de IBM, RPG Toolbox y otros paquetes comerciales habilitados para web. Incluso con los cambios, conserva una gran compatibilidad con versiones anteriores, por lo que un programa RPG escrito hace 37 años podría ejecutarse hoy con poca o ninguna modificación.

El precompilador SQL permite a los desarrolladores de RPG actuales aprovechar el SQE (motor de consulta SQL) basado en costos de IBM. Con el enfoque tradicional de F-Spec, un desarrollador tenía que identificar una ruta de acceso específica a un conjunto de datos; ahora pueden implementar sentencias SQL integradas estándar directamente en el programa. Cuando se compila, el precompilador de SQL transforma declaraciones SQL en declaraciones RPG que llaman a los programas del administrador de bases de datos que finalmente implementan la solicitud de consulta.

El lenguaje RPG IV se basa en el juego de caracteres EBCDIC, pero también admite UTF-8, UTF-16 y muchos otros juegos de caracteres. Algunos consideran que los aspectos seguros para subprocesos del lenguaje son idiosincrásicos, ya que el equipo compilador ha abordado los subprocesos dándole a cada subproceso su propio almacenamiento estático, en lugar de hacer que el entorno de ejecución de RPG sea reentrante. Se ha observado que esto confunde la distinción entre un subproceso y un proceso (haciendo que los subprocesos de RPG IV sean una especie de híbrido entre subprocesos y procesos).

En 2010, IBM lanzó RPG Open Access, también conocido como Rational Open Access: RPG Edition. Permite que un programador defina nuevos controladores de E/S, lo que permite leer y escribir datos en fuentes para las que RPG no proporciona soporte incorporado.

Tipos de datos

RPG admite los siguientes tipos de datos.

Nota:
El carácter en la columna tipo de datos es el carácter codificado en la Especificación de definición en la columna designada para el tipo de datos. Para comparar, en un lenguaje como C donde las definiciones de variables tienen formato libre y se usa una palabra clave como int para declarar una variable entera, en RPG, una variable se define con una definición de formato fijo. Especificación. En la Especificación de definición, indicada por una letra D en la columna 6 de una línea de origen, el carácter del tipo de datos se codificaría en la columna 40. Además, si se omite el carácter tipo de datos, es decir, se deja en blanco, el valor predeterminado es A si no se especifican posiciones decimales, P cuando se especifican posiciones decimales para el estándar. a lo largo de los campos y S (ZONED) cuando se especifican posiciones decimales dentro de una estructura de datos.

Tipo de datos Nombre Duración Descripción
ACarácter alfabético 1 a 16.773.104 bytes (fijo)
1 a 16.773.100 bytes (varying-length)
Carácter alfabético
BBinario numérico 1 byte (8-bit)
2 byte (16-bit)
4 bytes (32-bit)
8 bytes (64-bit)
Signed binario integer
CUCS-2 character 1 a 8.386.552 caracteres (fijo)
1 a 8.386.550 caracteres (varying)
caracteres UCS-2 de 16 bits (DBCS o EGCS)
DFecha 10 bytes Fecha: año, mes, día
FNumérica de punto flotante 4 bytes (32-bit)
8 bytes (64-bit)
Signado binario punto flotante real
GCarácter gráfico 1 a 8.386.552 caracteres (fijo)
1 a 8.386.550 caracteres (varying)
Carácter gráfico de 16 bits (DBCS o EGCS)
IInteger numeric 1 byte (8-bit)
2 bytes (16-bit)
4 bytes (32-bit)
8 bytes (64-bit)
Signed binario integer
NIndicador de caracteres 1 byte '1' = TRUE
'0' = FALSE
OObjeto Tamaño no incluido Referencia del objeto
PNumérica decimal embalada 1 a 63 dígitos,
2 dígitos por byte más signo
Número decimal de punto fijo firmado con números enteros y fracciones
SNumérica decimal en zona 1 a 63 dígitos,
1 dígto por byte
Número decimal de punto fijo firmado con números enteros y fracciones
THora 8 bytes Hora, hora, minuto, segundo
UInteger numeric 1 byte (8-bit)
2 bytes (16-bit)
4 bytes (32-bit)
8 bytes (64-bit)
Unsigned binario integer
ZTimestamp 26 bytes Fecha y hora:
año, mes, día, hora, minuto, segundo, microseconds
*Basing-Pointer
Procedure-Pointer
System-Pointer
16 bytes Address to Data
Address to Activated Procedure
Address to Object

Código de ejemplo

El siguiente programa recibe un número de cliente como parámetro de entrada y devuelve el nombre y la dirección como parámetros de salida. Esta es la versión más primitiva de la sintaxis de RPG IV. El mismo programa se muestra más adelante con versiones gradualmente más modernas de la sintaxis y reglas gradualmente más relajadas.

 * Históricamente RPG fue columnar en la naturaleza, aunque free-formatting
* was allowed under particular circumstances.
* El propósito del código de varias líneas se determina por un
* código de letra en la columna 6.
* Un asterisco (*) en la columna 7 denota una línea de comentarios

* "F" (file) las especificaciones definen archivos y otros dispositivos i/o
F ARMstF1 IF E K Disk Rename (ARMST:RARMST)

* Las especificaciones "D" (datos) se utilizan para definir variables
D pCusNo S 6p
D pName S 30a
D pAddr1 S 30a
D pAddr2 S 30a
D pCity S 25a
D pState S 2a
D pZip S 10a

* Las especificaciones "C" (calculación) se utilizan para las declaraciones ejecutables
* Los parámetros se definen usando opcodes de plist y parm
C * Lista de entrada
C parm pCusNo
C parm pName
C parm pAddr1
C parm pAddr2
C parm pCity
C parm pState
C parm pZip

* El comando "chain" se utiliza para el acceso aleatorio de un archivo clave
C pCusNo cadena ARMstF1

* Si se encuentra un registro, mueva campos desde el archivo en parámetros
C if %found
C eval pName = ARNm01
C eval pAddr1 = ARAd01
C eval pAddr2 = ARAd02
C eval pCity = ARCy01
C eval pState = ARSt01
C eval pZip = ARZp15
C endif

* RPG hace uso de interruptores. Un interruptor "LR" originalmente era para "último registro"
* LR marca el programa y su espacio de datos como extraíble de la memoria

C eval *InLR = *On

El mismo programa que utiliza cálculos gratuitos disponibles a partir de V5R1:

 * "F" (file) las especificaciones definen archivos y otros dispositivos i/o
FARMstF1 IF E K Disk Rename (ARMST:RARMST)

* Las especificaciones "D" (datos) se utilizan para definir variables y parámetros
* El "prototipo" para el programa está en un archivo separado
* permitiendo que otros programas lo llamen
/copia cust_pr
* La "interfase de procesamiento" describe los parámetros *ENTRY
D getCustInf PI
D pCusNo 6p 0 const
D pName 30a
D pAddr1 30a
D pAddr2 30a
D pCity 25a
D pState 2a
D pZip 10a
/libre
// El comando "chain" se utiliza para el acceso aleatorio de un archivo clave
cadena pCusNo ARMstF1;

// Si se encuentra un registro, mueva campos desde el archivo en parámetros
si es un porcentaje infundado;
pName = ARNm01;
pAddr1 = ARAd01;
pAddr2 = ARAd02;
pCity = ARCy01;
pState = ARSt01;
pZip = ARZp15;
endif;

// RPG hace uso de interruptores. Un interruptor "LR" originalmente era para "último registro"
// LR realmente marca el programa y su espacio de datos como extraíble de la memoria.
*InLR = *On;
/end-free

Supongamos que la tabla de ejemplo ARMSTF1 se creó utilizando la siguiente declaración SQL:

crear Cuadro Armistf1()arcnum decimal()7,0), arname char()30), aradd1 char()30), aradd2 char()30), arcity char()25), arstte char()2), arzip char()10)

El mismo programa que utiliza cálculos gratuitos y SQL incorporado:

 * RPG IV ya no requiere el uso del indicador *INLR para terminar un programa.
* utilizando la palabra clave MAIN sobre la especificación "H" (Header) e identificando el "mano" o
* nombre del procedimiento de entrada, el programa comenzará y terminará normalmente sin utilizar el
* Ciclo RPG de décadas de edad y en su lugar una lógica más "C como" comienza y termina.
H MAIN(getCustInf)
* Las especificaciones "D" (datos) se utilizan para definir variables y parámetros
* El "prototipo" para el programa está en un archivo separado
* permitiendo que otros programas lo llamen
/copia cust_pr
* La "interfase de procesamiento" describe los parámetros *ENTRY
P getCustInf B
D getCustInf PI
D pCusNo 6p 0 const
D pName 30a
D pAddr1 30a
D pAddr2 30a
D pCity 25a
D pState 2a
D pZip 10a
/libre
arName, arAddr1, arAdd2, arCity, arStte, arZip
en:pName,:pAddr1,:pAddr2,:pCity,:pState,:pZip
de ARMstF1
dónde arCNum =:pCusNo
para buscar sólo
buscar primero 1 fila
optimización para 1 fila
con CS;
/end-free
P GetCustInf E

A partir de V7R1 del sistema operativo, el programa anterior no necesariamente necesitaría el prototipo en un archivo separado, por lo que podría escribirse completamente como:

 H principal()GetCustInf) D ARMSTF1 E DS P GetCustInf B D GetCustInf PI extpgm()CUS001 ') D inCusNo como()arCNum) const D outName como()arName) D outAddr1 como()arAdd1) D outAddr2 como()arAdd2) D Fuera. Ciudad como()arCity) D Estado como()arStte) D Fuera. Zip como()arZip) /gratis exec sql seleccionar arName, arAdd1, arAdd2, arCity, arStte, arZip en :outName, :outAddr1, :outAddr2, :Fuera. Ciudad, :Estado, :Fuera. Zip desde ARMSTF1 Donde arCNum = :inCusNo . primero 1 fila sólo con CS uso Actualmente comprometidos; /final-gratis P GetCustInf E

Por último, si aplica el compilador PTF relacionado con Technology Refresh 7 (TR7) a su sistema operativo 7.1, entonces el programa anterior se puede codificar completamente en formato libre, de la siguiente manera:

 ctl-opt principal()GetCustInf); dcl-ds ARMSTF1 ext final-ds; dcl-proc GetCustInf; dcl-pi *n extpgm()CUS001 '); inCusNo como()arCNum) const; outName como()arName); outAddr1 como()arAdd1); outAddr2 como()arAdd2); Fuera. Ciudad como()arCity); Estado como()arStte); Fuera. Zip como()arZip); final-pi; exec sql seleccionar arName, arAdd1, arAdd2, arCity, arStte, arZip en :outName, :outAddr1, :outAddr2, :Fuera. Ciudad, :Estado, :Fuera. Zip desde ARMSTF1 Donde arCNum = :inCusNo . primero 1 fila sólo con CS uso Actualmente comprometidos; Regreso; final-proc;

Contenido relacionado

Tarjeta perforada

Una tarjeta perforada es un trozo de papel rígido que contiene datos digitales representados por la presencia o ausencia de agujeros en posiciones...

CPython

CPython es la implementación de referencia del lenguaje de programación Python. Escrito en C y Python, CPython es la implementación predeterminada y más...

Arquitectura Harvard

La Arquitectura Harvard es un modelo de arquitectura informática que separa físicamente la memoria de código de programa de la memoria de almacenamiento de...
Más resultados...
Tamaño del texto:
undoredo
format_boldformat_italicformat_underlinedstrikethrough_ssuperscriptsubscriptlink
save