stringtranslate.com

Juego de rol de IBM

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 . [1] RPG ha presentado tradicionalmente una serie de conceptos distintivos, como el ciclo de programa y la sintaxis orientada a columnas. [2] La versión más reciente es RPG IV , que incluye una serie de características de modernización, incluida la sintaxis de forma libre. [3]

Plataformas

El lenguaje de programación RPG fue creado originalmente por IBM para sus sistemas 1401. Posteriormente, IBM produjo implementaciones para los sistemas 7070/72/74 [4] [5] y System/360 ; [6] RPG II 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 series, 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 aún reciben soporte en los sistemas operativos IBM z/VSE [7] y z/OS , [8] Unisys MCP , [9] Microsoft Windows [10] y OpenVMS . [11]

Historia

Fondo

Originalmente desarrollado por IBM en 1959, el nombre Report Program Generator era descriptivo del propósito del lenguaje: generación de informes a partir de archivos de datos. [ 12] FOLDOC acredita a Wilf Hey con el trabajo en IBM que resultó en el desarrollo de RPG. [13] FARGO ( Fourteen - o -one Automatic Report Generation Operation ) fue el predecesor de RPG en el IBM 1401 .

Ambos lenguajes tenían como finalidad facilitar la transición de los técnicos de los equipos de registro de las máquinas tabuladoras (Tab) de IBM a las nuevas computadoras de ese entonces. Los técnicos de las máquinas tabuladoras estaban acostumbrados a conectar cables a los paneles de control para implementar operaciones de entrada, salida, control y contador (sumar, restar, multiplicar, dividir). Los programas de las máquinas tabuladoras se ejecutaban mediante impulsos emitidos en un ciclo de máquina; por lo tanto, FARGO y RPG emulaban la noción del ciclo de máquina con el ciclo del programa. RPG era superior a FARGO y rápidamente lo reemplazó como el programa generador de informes preferido.

Posteriormente, IBM implementó RPG(7070-RG-902), pero no FARGO, en el IBM 7070/72/74. [14] [15]

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 ( modelos System/360 30 y superiores) y RPG era más utilizado por clientes que estaban en transición desde equipos de tabulación (modelo System/360 20).

Juego de rol II

RPG II se introdujo alrededor de 1969 con la serie de computadoras System/3 . Más tarde 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 (en ese entonces VSE/SP , VSE/ESA y z/VSE ). ICL también produjo una versión en su sistema operativo VME/K .

En los primeros días de RPG, su mayor fortaleza era el ciclo del programa . Un programador escribía código para procesar un registro individual, y el ciclo del programa ejecutaba el cambio en cada registro de un archivo, ocupándose del flujo de control. En ese momento, cada registro (tarjeta perforada individual) se comparaba con cada línea del programa, que actuaba sobre el registro, o no, en función de si esa línea tenía un "indicador" encendido o apagado. El indicador consistía en un conjunto de variables lógicas numeradas del 01 al 99 para fines 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 teniendo en mente a los lectores de tarjetas. La característica de registro coincidente del ciclo permitía un procesamiento sencillo de archivos que tenían una relación de encabezado a detalle. Los programas RPG escritos para aprovechar el ciclo del programa podí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 Archivo del programa, que enumeran todos los archivos en los que se escribe, lee o actualiza, seguidas de las Especificaciones de Definición de Datos que contienen elementos del programa como Estructuras de Datos y matrices dimensionales, de forma muy similar a una sección de "Almacenamiento de Trabajo" de un programa COBOL. A esto le siguen las Especificaciones de Cálculo, que contienen las instrucciones ejecutables. Pueden seguir las 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 gran medida 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 ejecutaba OS/VS1 . También estaba disponible en Unisys para el sistema operativo VS/9 que se ejecutaba en los mainframes UNIVAC Series 90 .

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

DE/juego de rol

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 (DDS) externas para describir datos (archivos), como en el System/38 y sus sucesores. En su lugar, la parte DDS tenía que incluirse en la fuente del propio RPG.

Juego de rol/400

RPG/400 era en realidad RPG III ejecutándose en AS/400. IBM renombró el compilador RPG como "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 IBM System/38 fueron renombrados como xxx/400 y el compilador RPG no fue una excepción. RPG III compilado con el compilador RPG/400 no ofrecía 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 en AS/400. Estas mejoras a 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 RPG ILE [16] ) se lanzó en 1994 como parte del lanzamiento V3R2 de OS/400 (ahora conocido como IBM i). [17] [18]

Con el lanzamiento de RPG IV, el nombre RPG oficialmente dejó de ser un acrónimo . RPG IV ofreció una mayor variedad de expresiones dentro de su Especificación de cálculo de factor 2 extendido y, más adelante, su sintaxis de Especificaciones de cálculo y procedimiento de formato libre. RPG IV en el marco del entorno de lenguaje integrado se conoce como ILE RPG, y las guías de usuario explican los matices de ambos. [19] [20] [21] RPG IV e ILE RPG son compatibles con IBM en la plataforma IBM i actual. [22]

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

IBM Rational Developer for i (RDi), [24] un entorno de desarrollo integrado basado en Eclipse , es recomendado por IBM para el desarrollo de RPG. [25] 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. [26] Otras herramientas de desarrollo heredadas incluyen CODE/400 (basado en IBM WorkFrame/2) y VisualAge para RPG .

Mejoras continuas del lenguaje

IBM continúa mejorando el lenguaje RPG [27] a través de lanzamientos de software y “actualizaciones tecnológicas” (TR) dentro de los lanzamientos. [28] [29] Se han agregado más funciones integradas (BIF). Tiene la capacidad de vincularse a objetos Java , [30] y API de IBM i ; se puede usar para escribir programas CGI con la ayuda del kit de herramientas web Cgidev2 de IBM, [31] la caja de herramientas RPG y otros paquetes comerciales habilitados para la Web. Incluso con los cambios, conserva una gran cantidad de 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 actuales de RPG aprovechar el motor de consultas SQL (SQL Query Engine) 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. Una vez compilado, el precompilador SQL transforma las sentencias SQL en sentencias RPG que llaman a los programas del administrador de bases de datos que, en última instancia, implementan la solicitud de consulta.

El lenguaje RPG IV se basa en el conjunto de caracteres EBCDIC , pero también admite UTF-8, UTF-16 y muchos otros conjuntos de caracteres. Algunos consideran que los aspectos de seguridad de subprocesos del lenguaje son idiosincrásicos, ya que el equipo de compilación 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 (lo que convierte a los subprocesos de RPG IV en 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 ofrece soporte integrado. [32]

Tipos de datos

RPG admite los siguientes tipos de datos.

Nota:
El carácter en la columna de tipo de datos es el carácter que está 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 son de formato libre y utilizarían una palabra clave como int para declarar una variable entera, en RPG, una variable se define con una Especificación de definición de formato fijo. En la Especificación de definición, denotada por una letra D en la columna 6 de una línea de origen, el carácter de tipo de datos se codificaría en la columna 40. Además, si se omite el carácter de 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 campos independientes y S (ZONED) cuando se especifican posiciones decimales dentro de una estructura de datos.

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 de sintaxis cada vez más modernas y reglas cada vez más relajadas.

 * Históricamente, los juegos de rol eran de naturaleza columnar, aunque con formato libre. * se permitió bajo circunstancias particulares. * El propósito de varias líneas de código está determinado por un * código de letra en la columna 6. * Un asterisco (*) en la columna 7 denota una línea de comentario * Las especificaciones "F" (archivo) definen archivos y otros dispositivos de entrada/salida F ARMstF1 IF Cambio de nombre de disco EK (ARMST:RARMST) * Las especificaciones "D" (datos) se utilizan para definir variables D pCusNo S 6p D pNombre S 30a D pAddr1 S30a D pAddr2 S30a D pCiudad S 25a D pEstado S 2a Cremallera D pZip S 10a * Las especificaciones "C" (cálculo) se utilizan para declaraciones ejecutables * Los parámetros se definen utilizando los códigos de operación plist y parm C *lista de entrada C parámetro pCusNo C parámetro pName C parámetro pAddr1 C parámetro pAddr2 C parámetro pCity C parámetro pState C parámetro pZip * El comando "chain" se utiliza para el acceso aleatorio a un archivo con clave C pCusNo cadena ARMstF1 * Si se encuentra un registro, mover campos del archivo a parámetros C si se encontró % C eval pName = ARNm01 C eval pAddr1 = ARAd01 C eval pAddr2 = ARAd02 C eval pCiudad = ARCy01 C eval pState = ARSt01 C eval pZip = ARZp15 C finif * Los juegos de rol utilizan interruptores. Uno de ellos, "LR", originalmente significaba "último registro". * LR marca el programa y su espacio de datos como extraíbles de la memoria C eval *InLR = *Activado

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

 * Las especificaciones "F" (archivo) definen archivos y otros dispositivos de entrada/salida FARMstF1 IF Cambio de nombre de disco EK (ARMST:RARMST) * Las especificaciones "D" (datos) se utilizan para definir variables y parámetros * El "prototipo" del programa está en un archivo separado * permitir que otros programas lo llamen /copiar cust_pr * La "interfaz de procedimiento" describe los parámetros *ENTRY D obtenerInfCustPI D pCusNo 6p 0 constante D pNombre 30a D pAddr1 30a D pAddr2 30a D pCiudad 25a D pEstado 2a D-Zip 10a /gratis // El comando "chain" se utiliza para el acceso aleatorio a un archivo con clave cadena pCusNo ARMstF1; // Si se encuentra un registro, mover los campos del archivo a los parámetros si se encontró %; pNombre = ARNm01; pAddr1 = ARAd01; pAddr2 = ARAd02; pCiudad = ARCy01; pEstado = ARSt01; pZip = ARZp15; finsi; // Los juegos de rol utilizan interruptores. Uno de ellos, "LR", originalmente significaba "último registro". // LR en realidad marca el programa y su espacio de datos como extraíbles de la memoria. *InLR = *Activado; /fin-libre

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

crear tabla armstf1 ( 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 libres y SQL integrado:

 * RPG IV ya no requiere el uso del indicador *INLR para finalizar un programa. * utilizando la palabra clave MAIN en la especificación "H" (encabezado) e identificando el "principal" o * nombre del procedimiento de entrada, el programa comenzará y finalizará normalmente sin utilizar el * Ciclo de RPG de hace décadas y, en cambio, una lógica de inicio y final más "similar a C". H PRINCIPAL(getCustInf) * Las especificaciones "D" (datos) se utilizan para definir variables y parámetros * El "prototipo" del programa está en un archivo separado * permitir que otros programas lo llamen /copiar cust_pr * La "interfaz de procedimiento" describe los parámetros *ENTRY P obtenerInfCustB D obtenerInfCustPI D pCusNo 6p 0 constante D pNombre 30a D pAddr1 30a D pAddr2 30a D pCiudad 25a D pEstado 2a D-Zip 10a /gratis ejecutar sql seleccionar arName, arAddr1, arAdd2, arCity, arStte, arZip en :pNombre, :pDirección1, :pDirección2, :pCiudad, :pEstado, :pCódigo Postal de ARMstF1 donde arCNum = :pCusNo Solo para buscar recuperar solo la primera fila optimizar para 1 fila con CS; /fin-libre P GetCustInf E

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

 H main ( 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 outCity como ( arCity ) D outState como ( arStte ) D outZip como ( arZip ) / free exec sql select arName , arAdd1 , arAdd2 , arCity , arStte , arZip into : outName , : outAddr1 , : outAddr2 , : outCity , : outState , : outZip from ARMSTF1 where arCNum = : inCusNo obtener solo la primera fila con el uso de CS actualmente comprometido ; / fin - libre P GetCustInf E                                                                       

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

 ctl - opt main ( GetCustInf ); dcl - ds ARMSTF1 ext fin - ds ; dcl - proc GetCustInf ; dcl - pi * n extpgm ( 'CUS001' ); inCusNo como ( arCNum ) const ; outName como ( arName ) ; outAddr1 como ( arAdd1 ) ; outAddr2 como ( arAdd2 ); outCity como ( arCity ); outState como ( arStte ); outZip como ( arZip ); fin - pi ; exec sql select arName , arAdd1 , arAdd2 , arCity , arStte , arZip into : outName ,: outAddr1 ,: outAddr2 ,: outCity ,: outState ,: outZip from ARMSTF1 where arCNum = : inCusNo obtener solo la primera fila 1 con el uso de CS actualmente confirmado ; regresar ; fin del procedimiento ;                                                            

Referencias

  1. ^ "Introducción a RPG ILE". IBM. Junio ​​de 2012. Archivado desde el original el 29 de febrero de 2024. Consultado el 16 de marzo de 2021 .
  2. ^ Tony Baritz; David Dunne (1991). AS/400: conceptos y facilidades. McGraw-Hill. ISBN 978-0-07-018301-8Archivado desde el original el 29 de febrero de 2024. Consultado el 16 de marzo de 2021 .
  3. ^ Alex Woodie (24 de agosto de 2020). "¿Es hora de cambiar el nombre de los juegos de rol?". itjungle.com . Archivado desde el original el 23 de abril de 2021. Consultado el 16 de marzo de 2021 .
  4. ^ 7070/7074 Sistemas compiladores: generador de programas de informes . IBM . C28-6113.
  5. ^ Guía de análisis de sistemas de programación - Generador de programas de informes de la serie IBM 7070 (PDF) . IBM . 1962. C28-6192. Archivado (PDF) del original el 19 de enero de 2024 . Consultado el 19 de enero de 2024 .
  6. ^ IBM System/360 - Sistema operativo - Especificaciones del lenguaje RPG - Número de programa 380S-RG-038 (OS) (PDF) (Séptima edición). IBM . Julio de 1973. GC24-3337-6. Archivado (PDF) desde el original el 19 de enero de 2024 . Consultado el 19 de enero de 2024 .
  7. ^ "IBM DOS/VS RPG-II". IBM. 2020-08-03. Archivado desde el original el 2021-04-17 . Consultado el 2021-03-17 .
  8. ^ "Lista de productos compatibles". IBM. 16 de marzo de 2021. Archivado desde el original el 2 de mayo de 2021. Consultado el 17 de marzo de 2021 .
  9. ^ "ClearPath MCP Express" (PDF) . Unisys. 2017. Archivado (PDF) del original el 2020-11-12 . Consultado el 2021-03-17 .
  10. ^ "Visual RPG para .NET". asna.com . ASNA. Archivado desde el original el 3 de abril de 2022 . Consultado el 3 de abril de 2022 .
  11. ^ "Migration RPG". immigrationspecialties.com . Archivado desde el original el 2021-05-17 . Consultado el 2021-03-17 .
  12. ^ "...IBM 1401 y el generador de programas de informes (RPG) contribuyeron significativamente a este éxito..." Archivado el 24 de enero de 2012 en Wayback Machine , IBM 1401 Data Processing System / 1959
  13. ^ pero dice 1965, en lugar del 1959 mencionado aquí.
  14. ^ 7070/7074 Sistemas compiladores: generador de programas de informes . IBM . C28-6113.
  15. ^ Guía de análisis de sistemas de programación - Generador de programas de informes de la serie IBM 7070 (PDF) . IBM . 1962. C28-6192. Archivado (PDF) del original el 19 de enero de 2024 . Consultado el 19 de enero de 2024 .
  16. ^ "Generación de números aleatorios en ILE RPG utilizando la API CEERAN0", IBM.com
  17. ^ "¿Cómo nos perdimos el paso a la madurez de RPG IV?" Archivado el 3 de marzo de 2017 en Wayback Machine , ibmsystemsmag.com
  18. ^ "RPG/400". IBM.com . International Business Machines Corporation. 8 de mayo de 2018. Archivado desde el original el 3 de abril de 2022 . Consultado el 4 de abril de 2022 .
  19. ^ "Referencia de ILE RPG". IBM.com . International Business Machines Corporation. Junio ​​de 2012. Archivado desde el original el 3 de abril de 2022 . Consultado el 4 de abril de 2022 .
  20. ^ "Guía del programador de ILE RPG". IBM.com . International Business Machines Corporation. Junio ​​de 2012. Archivado desde el original el 3 de abril de 2022 . Consultado el 4 de abril de 2022 .
  21. ^ "Quién debería utilizar esta guía". IBM.com . International Business Machines Corporation. Junio ​​de 2012. Archivado desde el original el 3 de abril de 2022 . Consultado el 4 de abril de 2022 .
  22. ^ "Lenguajes de alto nivel". IBM.com . International Business Machines Corporation. 8 de mayo de 2018. Archivado desde el original el 3 de abril de 2022 . Consultado el 4 de abril de 2022 .
  23. ^ Paris, Jon ; Gantner, Susan. «Totally Free RPG». Revista IBM Systems. Archivado desde el original el 8 de marzo de 2014 . Consultado el 8 de marzo de 2014 .
  24. ^ "IBM Rational Developer for i". IBM.com . International Business Machines Corporation. Archivado desde el original el 3 de abril de 2022 . Consultado el 3 de abril de 2022 .
  25. ^ "5770-WDS IBM Rational Development Studio para i V7.4". IBM.com . International Business Machines Corporation. Archivado desde el original el 3 de abril de 2022 . Consultado el 3 de abril de 2022 .
  26. ^ "5770-WDS IBM Rational Development Studio para i V7.4". IBM.com . International Business Machines Corporation. Archivado desde el original el 3 de abril de 2022 . Consultado el 4 de abril de 2022 .
  27. ^ IBM. «RPG Cafe». IBM.com . International Business Machines Corporation. Archivado desde el original el 3 de abril de 2022. Consultado el 3 de abril de 2022 .
  28. ^ IBM. «Actualizaciones tecnológicas de IBM i». IBM.com . International Business Machines Corporation. Archivado desde el original el 12 de abril de 2022. Consultado el 3 de abril de 2022 .
  29. ^ IBM. «Actualización tecnológica de IBM i». IBM.com . International Business Machines Corporation. Archivado desde el original el 3 de abril de 2022. Consultado el 3 de abril de 2022 .
  30. ^ "Guía del usuario de RPG/400" (PDF) . Ibm.com . Archivado (PDF) del original el 7 de agosto de 2017 . Consultado el 6 de agosto de 2017 .
  31. ^ "EASY400 CGIDEV2". Easy400.net . Archivado desde el original el 26 de marzo de 2019 . Consultado el 26 de marzo de 2019 .
  32. ^ "Rational Open Access: RPG Edition". IBM. Archivado desde el original el 29 de febrero de 2024. Consultado el 17 de marzo de 2021 .

Lectura adicional

Enlaces externos