El lenguaje de control de trabajos ( JCL ) es un lenguaje de programación para la creación de scripts y el lanzamiento de trabajos por lotes en computadoras centrales IBM . [ 1 ] El código JCL determina qué programas ejecutar y con qué archivos y dispositivos de entrada y salida. [ 2 ] Los parámetros en el JCL también pueden proporcionar información de contabilidad para el seguimiento de los recursos utilizados por un trabajo y pueden establecer en qué máquina debe ejecutarse el trabajo.
Hay dos variantes principales según la plataforma anfitriona y el linaje asociado. Una versión está disponible en el linaje de plataforma que comienza con DOS/360 y ha progresado hasta z/VSE . La otra versión comienza con OS/360 y continúa hasta z/OS que incluye extensiones JES , Job Entry Control Language (JECL) . Las variantes comparten sintaxis y conceptos básicos pero tienen diferencias significativas. [ 3 ] El sistema operativo de la máquina virtual no tiene JCL como tal; los componentes CP y CMS tienen cada uno lenguajes de comandos .
En términos generales, un lenguaje de control de trabajos es cualquier lenguaje de programación para el control de trabajos ; no solo el del mainframe de IBM. [ 4 ]
Terminología
La terminología específica de JCL incluye:
- Conjunto de datos
Un archivo, ya sea temporal o permanente; puede estar ubicado en una unidad de disco, almacenamiento en cinta u otro dispositivo. [ 5 ] [ 6 ]
- Conjunto de datos particionado (PDS)
Una colección de archivos; un PDS se usa comúnmente para almacenar datos textuales como código fuente , macros de ensamblador (SYS1.MACLIB), configuración del sistema (SYS1.PARMLIB), procedimientos JCL reutilizables (SYS1.PROCLIB), etc. Como colección de archivos, un PDS es como un archivo comprimido ( ZIP , TAR , etc.) que a su vez es como un directorio del sistema de archivos . Un PDS puede contener código ejecutable (módulos de carga u objetos de programa), lo que lo hace similar a una biblioteca estática basada en Unix . Un miembro, una vez almacenado, no se puede actualizar, aunque se puede eliminar y reemplazar, por ejemplo, mediante la utilidad IEBUPDTE . [ 7 ] Desde el lanzamiento de MVS DFP 3.2 en 1989, ha estado disponible una versión mejorada, el conjunto de datos particionado extendido (PDSE). [ 8 ]
- Miembro
Un archivo (conjunto de datos) en un PDS. Se puede acceder a un miembro especificando el nombre del PDS con el nombre del miembro entre paréntesis. Por ejemplo, la macro del sistema GETMAIN en SYS1.MACLIB se puede referenciar como SYS1.MACLIB(GETMAIN). [ 7 ]
- Servicios del sistema Unix (USS)
Un entorno Unix completo que se ejecuta como parte del programa de control base MVS. Permite que archivos, scripts, tareas y programas Unix se ejecuten en un ordenador central en un entorno Unix compatible con POSIX sin virtualización.
Motivación
Originalmente, los sistemas mainframe estaban orientados al procesamiento por lotes . Muchos trabajos por lotes requieren configuración, con requisitos específicos para el almacenamiento principal y dispositivos dedicados como cintas magnéticas , volúmenes de disco privados e impresoras configuradas con formularios especiales. [ 9 ] JCL se desarrolló como un medio para asegurar que todos los recursos necesarios estén disponibles antes de que se programe la ejecución de un trabajo. Por ejemplo, muchos sistemas, como Linux, permiten que la identificación de los conjuntos de datos necesarios se especifique en la línea de comandos y, por lo tanto, estén sujetos a sustitución por el shell o generados por el programa en tiempo de ejecución.
En estos sistemas, el planificador de tareas del sistema operativo desconoce prácticamente todos los requisitos de la tarea. En cambio, JCL especifica explícitamente todos los conjuntos de datos y dispositivos necesarios. El planificador puede preasignar los recursos antes de autorizar la ejecución de la tarea. Esto ayuda a evitar el bloqueo mutuo , donde la tarea A retiene el recurso R1 y solicita el recurso R2, mientras que la tarea B, que se ejecuta simultáneamente, retiene el recurso R2 y solicita R1. En tales casos, la única solución es que el operador del equipo finalice una de las tareas, la cual deberá reiniciarse. Con el control de tareas, si la tarea A está programada para ejecutarse, la tarea B no se iniciará hasta que la tarea A finalice o libere los recursos necesarios.
Características comunes a DOS y JCL de sistemas operativos
Trabajos, pasos y procedimientos
Tanto en DOS como en OS, la unidad de trabajo es la tarea . Una tarea consta de uno o varios pasos, cada uno de los cuales es una solicitud para ejecutar un programa específico. Por ejemplo, antes de la llegada de las bases de datos relacionales , una tarea para generar un informe impreso para la gerencia podría constar de los siguientes pasos: un programa escrito por el usuario para seleccionar los registros apropiados y copiarlos a un archivo temporal ; ordenar el archivo temporal según el orden requerido, generalmente utilizando una utilidad de propósito general; un programa escrito por el usuario para presentar la información de manera que sea fácil de leer para los usuarios finales e incluya otra información útil, como subtotales; y un programa escrito por el usuario para formatear las páginas seleccionadas de la información del usuario final para su visualización en un monitor o terminal.
Tanto en DOS como en OS JCL, la primera "tarjeta" debe ser la tarjeta JOB, que: [ 10 ]
- Identifica el trabajo.
- Normalmente proporciona información para que el departamento de servicios informáticos pueda facturar al departamento de usuarios correspondiente.
- Define cómo se debe ejecutar el trabajo en su conjunto, por ejemplo, su prioridad en relación con otros trabajos en la cola.
Los procedimientos (comúnmente llamados procs ) son JCL preescritos para pasos o grupos de pasos que se insertan en un trabajo. Ambos JCL permiten el uso de dichos procedimientos. Los procs se utilizan para repetir pasos que se usan varias veces en un mismo trabajo o en varios trabajos diferentes. Ahorran tiempo al programador y reducen el riesgo de errores. Para ejecutar un procedimiento, basta con incluir en el archivo JCL una única "tarjeta" que copia el procedimiento desde un archivo específico y lo inserta en el flujo del trabajo. Además, los procs pueden incluir parámetros para personalizar el procedimiento en cada uso.
Sintaxis básica
Tanto DOS como OS JCL tienen una longitud máxima de línea utilizable de 80 caracteres, porque cuando se usaron por primera vez DOS/360 y OS/360 el método principal para proporcionar nueva entrada a un sistema informático eran las tarjetas perforadas de 80 columnas . [ 11 ] Posteriormente fue posible enviar trabajos a través de archivos de disco o cinta con longitudes de registro más largas, pero los componentes de envío de trabajos del sistema operativo ignoraban todo lo que seguía al carácter 80.
En rigor, ambas familias de sistemas operativos utilizan solo 71 caracteres por línea. Los caracteres 73 a 80 suelen ser números de secuencia de tarjeta que el sistema imprime en el informe de fin de trabajo y que son útiles para identificar la ubicación de cualquier error reportado por el sistema operativo. El carácter 72 generalmente se deja en blanco, pero puede contener un carácter no vacío para indicar que la instrucción JCL continúa en la siguiente tarjeta.
Todos los comandos, nombres de parámetros y valores deben estar en mayúsculas, excepto los nombres de archivo USS .
Todas las líneas, excepto las de entrada en flujo (ver más abajo), deben comenzar con una barra inclinada " /", y todas las líneas que procesa el sistema operativo deben comenzar con dos barras inclinadas //, siempre comenzando en la primera columna . Sin embargo, hay dos excepciones: la instrucción delimitadora y la instrucción de comentario. Una instrucción delimitadora comienza con una barra inclinada y un asterisco (* /*), y una instrucción de comentario en JCL del sistema operativo comienza con un par de barras inclinadas y un asterisco (* //*) o un asterisco en JCL de DOS.
Muchas sentencias JCL son demasiado largas para caber en 71 caracteres, pero se pueden extender a un número indefinido de tarjetas de continuación mediante:
La estructura de los tipos de tarjeta más comunes es: [ 12 ]
Entrada en flujo
Tanto DOS como JCL de sistemas operativos permiten la entrada de datos en flujo, es decir, "tarjetas" que son procesadas por el programa de aplicación en lugar del sistema operativo. Los datos que se conservan durante mucho tiempo normalmente se almacenan en disco, pero antes de que el uso de terminales interactivas se generalizara, la única forma de crear y editar dichos archivos de disco era introduciendo los nuevos datos en tarjetas.
DOS y el JCL del sistema operativo tienen diferentes maneras de señalar el inicio de la entrada en flujo, pero ambos finalizan la entrada en flujo en /*la columna 1 de la tarjeta que sigue a la última tarjeta de datos en flujo. Esto hace que el sistema operativo reanude el procesamiento del JCL en la tarjeta siguiente /*. [ 13 ]
- JCL del sistema operativo: Las sentencias DD se pueden usar para describir datos en flujo, así como conjuntos de datos. Una sentencia DD que trata datos en flujo tiene un asterisco (*) después del identificador DD, por ejemplo
//SYSIN DD *, . Las sentencias JCL se pueden incluir como parte de los datos en flujo usando las sentencias DD DATA.
- Un operando llamado DLM permitía especificar un delimitador (el valor predeterminado es "/*"). Especificar un delimitador alternativo permite que JCL se lea como datos, por ejemplo, para copiar procedimientos a un miembro de la biblioteca o para enviar un trabajo al lector interno .
- Un ejemplo [ 14 ] que envía un trabajo al Lector Interno ( INTRDR ) y luego elimina dos archivos es:
// SUBM EXEC PGM = IEBGENER // SYSPRINT DD SYSOUT = Z // SYSUT2 DD SYSOUT = ( A , INTRDR ) // SYSIN DD DUMMY // SYSUT1 DD DATA , DLM = ZZ // RUNLATR JOB ACCT , MANIX , CLASS = A . TYPRUN = HOLD //* ^ un TRABAJO para ejecutar más tarde // CPUHOG EXEC PGM = PICALC1K // SALIDA DD DSN = PICALC .1000 DGTS , ESPACIO = ( TRK , 1 ), DISP = (, MANTENER ) ZZ //* ^ como se especifica en DLM=ZZ // DROPOLDR EXEC PGM = IEFBR14 // DELETE4 DD DSN = PICALC .4 DGTS , DISP = ( ANTIGUO , ELIMINAR ) // DELETE5 DD DSN = PICALC .5 DGTS , DISP = ( ANTIGUO , ELIMINAR )- El programa llamado PICALC1K esperará a que se libere manualmente (TYPRUN=HOLD).
- El programa llamado IEFBR14 se ejecutará AHORA y, una vez finalizado, se eliminarán los dos archivos existentes, PICALC.4DGTS y PICALC.5DGTS.
- JCL de DOS: Simplemente introduzca los datos en el flujo después de la tarjeta EXEC del programa.
Complejidad
Fred Brooks , quien supervisó el proyecto OS/360 en el que se creó JCL, lo calificó como "el peor lenguaje de programación jamás ideado por nadie, en ningún lugar" en The Design of Design , donde lo usó como ejemplo en el capítulo "Cómo se equivocan los diseñadores expertos". [ 15 ] Atribuyó esto a la incapacidad de los diseñadores para darse cuenta de que JCL es, de hecho, un lenguaje de programación.
Gran parte de la complejidad de JCL de los sistemas operativos, en particular, se deriva de la gran cantidad de opciones para especificar la información de los conjuntos de datos . Mientras que los archivos en sistemas operativos tipo Unix se abstraen en flujos ordenados de bytes, y la tarea de leer y escribir datos estructurados corresponde exclusivamente a los programas de nivel de usuario (que, en última instancia, ingieren y emiten dichos flujos), y los detalles prácticos del almacenamiento y acceso a los datos son gestionados en gran medida por el sistema operativo sin el conocimiento de los programas de usuario; los conjuntos de datos en OS/360 y sus sucesores exponen sus tipos y tamaños de archivo, tipos y longitudes de registro, tamaños de bloque, información específica del dispositivo, como la densidad de la cinta magnética , e información de etiquetas. Aunque existen valores predeterminados del sistema para muchas opciones, aún queda mucho por especificar por parte del programador, mediante una combinación de JCL e información codificada en el programa. Cuanta más información se codifique en el programa, menos flexible será, ya que la información del programa anula cualquier cosa en JCL; por lo tanto, la mayor parte de la información generalmente se proporciona a través de JCL.
Por ejemplo, para copiar un archivo en un sistema operativo Unix , el usuario introduciría un comando como este:
copiar archivoantiguo archivonuevo
El siguiente ejemplo, utilizando JCL, podría usarse para copiar un archivo en OS/360:
// IS198CPY TRABAJO ( IS198T30500 ), 'COPIAR TRABAJO' , CLASE = L , MSGCLASS = X // COPY01 EXEC PGM = IEBGENER // SYSPRINT DD SYSOUT = * // SYSUT1 DD DSN = ARCHIVO ANTIGUO , DISP = SHR // SYSUT2 DD DSN = ARCHIVO NUEVO , // DISP = ( NUEVO , CATLG , ELIMINAR ), // ESPACIO = ( CYL ,( 40 , 5 ), RLSE ), // DCB = ( LRECL = 115 , BLKSIZE = 1150 ) // SYSIN DD DUMMYUna segunda explicación de la complejidad de JCL radica en las diferentes expectativas para ejecutar una tarea en comparación con las que se encuentran en un PC o en un entorno tipo Unix.
- Las CPU System/360 de gama baja eran menos potentes y más caras que las PC de mediados de la década de 1980 para las que se diseñó MS-DOS . OS/360 estaba pensado para sistemas con un tamaño mínimo de memoria de 32 KB y DOS/360 para sistemas con un mínimo de 16 KB. Una CPU 360/30 —de gama baja cuando se anunció System/360 en 1964— procesaba de 1,8K a 34,5K instrucciones por segundo. [ 16 ] La primera IBM PC en 1981 tenía 16 KB o 64 KB de memoria y procesaría alrededor de 330K instrucciones por segundo. [ 17 ] [ 18 ] Como resultado, JCL tenía que ser fácil de procesar para la computadora , y la facilidad de uso para los programadores era una prioridad mucho menor. En esta época, los programadores eran mucho más baratos que las computadoras.
- JCL fue diseñado para el procesamiento por lotes . Por lo tanto, debe indicarle al sistema operativo todo, incluyendo qué hacer según el resultado de cada paso. Por ejemplo,
DISP=(NEW,CATLG,DELETE)significa "si el programa se ejecuta correctamente, crea un nuevo archivo y cataloga; de lo contrario, elimina el archivo nuevo". Los programas que se ejecutan en una PC a menudo dependen de que el usuario limpie los archivos después de que surjan problemas de procesamiento. - Las máquinas System/360 fueron diseñadas para ser compartidas por todos los usuarios de una organización. Por lo tanto, la
JOBtarjeta le indica al sistema operativo cómo facturar la cuenta del usuario (IS198T30500), qué cantidad predefinida de almacenamiento y otros recursos se pueden asignar (CLASS=L), y varias otras cosas.//SYSPRINT DD SYSOUT=*le indica a la computadora que imprima el informe del programa en la impresora predeterminada que está cargada con papel normal, no en alguna otra impresora que podría estar cargada con cheques en blanco.DISP=SHRle indica al sistema operativo que otros programas pueden leerOLDFILEal mismo tiempo .
Las versiones posteriores de los sistemas operativos DOS/360 y OS/360 conservan la mayoría de las características del JCL original , aunque se han simplificado para evitar que los clientes tengan que reescribir todos sus archivos JCL. Muchos usuarios guardan como procedimiento cualquier conjunto de instrucciones JCL que probablemente se utilice más de una o dos veces. [ 19 ]
La sintaxis de JCL del sistema operativo es similar a la sintaxis de las macros en el lenguaje ensamblador de System/360 y, por lo tanto, habría resultado familiar para los programadores en una época en la que muchos programas se codificaban en lenguaje ensamblador.
JCL de DOS
Parámetros de posición
// TLBL TAPEFIL,'COPYTAPE.JOB',,,,2 // ASSGN SYS005,200 // DLBL DISKFIL,'COPYTAPE.JOB',0,SD // EXTENT SYS005,VOL01,1,0,800,1600Los parámetros JCL de DOS son posicionales, lo que dificulta su lectura y escritura, pero facilita su análisis por parte del sistema.
- El programador debe recordar qué elemento va en qué posición en cada tipo de instrucción.
- Si se omiten algunos parámetros opcionales pero se incluyen otros posteriormente, los parámetros omitidos deben representarse mediante comas sin espacios, como en la instrucción TLBL anterior.
En cierta medida, el JCL de DOS mitiga las dificultades de los parámetros posicionales al utilizar más instrucciones con menos parámetros que el JCL del sistema operativo. En el ejemplo, las instrucciones ASSGN, DLBL y EXTENT realizan la misma función (especificar dónde se debe almacenar un nuevo archivo de disco) que una sola DDinstrucción en el JCL del sistema operativo.
Dependencia del dispositivo
En la versión original de DOS/360 y en la mayoría de las versiones de DOS/VS, era necesario especificar el número de modelo del dispositivo que se utilizaría para cada archivo de disco o cinta , incluso para los archivos existentes y los temporales que se eliminarían al finalizar el proceso. Esto significaba que, si un cliente actualizaba a un equipo más moderno, era necesario modificar muchos archivos JCL.
Los modelos posteriores de la familia DOS/360 redujeron el número de situaciones en las que se requerían los números de modelo de los dispositivos.
Asignación manual de archivos
Originalmente, DOS/360 requería que el programador especificara la ubicación y el tamaño de todos los archivos en la tarjeta DASD . La EXTENTtarjeta especifica el volumen donde reside la extensión, la pista absoluta inicial y el número de pistas. En z/VSE, un archivo puede tener hasta 256 extensiones en diferentes volúmenes.
JCL del sistema operativo
El JCL del sistema operativo consta de tres tipos de sentencias básicas: [ 20 ]
JOBDeclaración que identifica el inicio del trabajo e información sobre todo el trabajo, como la facturación, la prioridad de ejecución y los límites de tiempo y espacio.EXECdeclaración, que identifica el programa o procedimiento [ 21 ] que se ejecutará en este paso del trabajo, e información sobre el paso, incluidas las CONDICIONES para ejecutar u omitir un paso.DDLas declaraciones (de definición de datos) identifican un archivo de datos que se utilizará en un paso, e información detallada sobre ese archivo.DDEstas declaraciones pueden aparecer en cualquier orden dentro del paso.
Desde el principio, JCL para la familia de sistemas operativos (hasta z/OS inclusive ) fue más flexible y fácil de usar.
Los siguientes ejemplos utilizan la sintaxis antigua que se proporcionó desde el lanzamiento de System/360 en 1964. Esta sintaxis antigua sigue siendo bastante común en trabajos que se han estado ejecutando durante décadas con solo cambios menores.
Reglas para codificar sentencias JCL
Cada instrucción JCL se divide en cinco campos: [ 22 ]
Campo identificador Campo nombre Campo operación Campo parámetro Campo comentarios ^ ^ ^ ^ sin espacio espacio espacio espacio
El campo Identificador debe concatenarse con el campo Nombre , es decir, no debe haber espacios entre ellos.
- Campo identificador (
//): El campo identificador indica al sistema que una instrucción es una instrucción JCL y no datos. El campo identificador consta de lo siguiente:- Las columnas 1 y 2 de todas las sentencias JCL, excepto la sentencia delimitadora, contienen
// - Las columnas 1 y 2 de la instrucción delimitadora contienen
/* - Las columnas 1, 2 y 3 de una declaración de comentario JCL contienen
//*
- Las columnas 1 y 2 de todas las sentencias JCL, excepto la sentencia delimitadora, contienen
- Campo de nombre : El campo de nombre identifica una instrucción específica para que otras instrucciones y el sistema puedan hacer referencia a ella. Para las instrucciones JCL, debe codificarse de la siguiente manera:
- El nombre debe comenzar en la columna 3.
- El nombre consta de 1 a 8 caracteres alfanuméricos o nacionales (
$,#,@). - El primer carácter debe ser alfabético.
- El nombre debe ir seguido de al menos un espacio en blanco.
- Campo de operación : El campo de operación especifica el tipo de instrucción o, en el caso de la instrucción de comando, el comando. El campo de operación debe codificarse de la siguiente manera:
- El campo de operación consta de los caracteres que aparecen en el cuadro de sintaxis de la instrucción.
- La operación sigue al campo de nombre.
- La operación debe ir precedida y seguida de al menos un espacio en blanco.
- La operación será una de
JOB,EXECyDD.
- Campo de parámetros : El campo de parámetros, también conocido a veces como campo de operando, contiene parámetros separados por comas. El campo de parámetros debe codificarse de la siguiente manera:
- El campo de parámetros sigue al campo de operación.
- El campo de parámetros debe ir precedido de al menos un espacio en blanco.
- El campo de parámetros contiene parámetros que son palabras clave utilizadas en la instrucción para proporcionar información como el nombre del programa o del conjunto de datos.
- Campo de comentarios : Contiene comentarios . El campo de comentarios debe codificarse de la siguiente manera:
- El campo de comentarios sigue al campo de parámetros.
- El campo de comentarios debe ir precedido de al menos un espacio en blanco.
Parámetros de palabras clave
// NEWFILE DD DSN = MYFILE01 , UNIT = DISK , SPACE = ( TRK , 80 , 10 ), // DCB = ( LRECL = 100 , BLKSIZE = 1000 ), // DISP = ( NEW , CATLG , DELETE )Todos los parámetros principales de las sentencias JCL del sistema operativo se identifican mediante palabras clave y pueden presentarse en cualquier orden. Algunos de estos contienen dos o más subparámetros, como SPACE(cuánto espacio en disco asignar a un nuevo archivo) y DCB(especificación detallada de la estructura de un archivo) en el ejemplo anterior. Los subparámetros a veces son posicionales, como en SPACE, pero los parámetros más complejos, como DCB, tienen subparámetros de palabras clave.
Los parámetros posicionales deben preceder a los parámetros de palabra clave. Los parámetros de palabra clave siempre asignan valores a una palabra clave mediante el signo igual ( =). [ 23 ]
Acceso a datos (sentencia DD)
Esta DDinstrucción se utiliza para hacer referencia a datos. Vincula la descripción interna de un conjunto de datos de un programa con los datos de dispositivos externos: discos, cintas, tarjetas, impresoras, etc. La instrucción DD puede proporcionar información como el tipo de dispositivo (por ejemplo, '181', '2400-5', 'TAPE'), el número de serie del volumen para cintas o discos y la descripción del archivo de datos, denominada DCBsubparámetro después del Bloque de Control de Datos (DCB) en el programa que se utiliza para identificar el archivo.
La información que describe el archivo puede provenir de tres fuentes: la información de la tarjeta DD, la información de la etiqueta del conjunto de datos de un archivo existente almacenado en cinta o disco, y la macro DCB codificada en el programa. Al abrir el archivo, estos datos se combinan, priorizando la información de la tarjeta DD sobre la información de la etiqueta, y la información de la DCB sobre ambas. La descripción actualizada se escribe entonces en la etiqueta del conjunto de datos. Esto puede tener consecuencias no deseadas si se proporciona información incorrecta de la DCB. [ 24 ]
Debido a los parámetros mencionados anteriormente y a la información específica para diversos métodos y dispositivos de acceso, la instrucción DD es la instrucción JCL más compleja. En un manual de referencia de IBM, la descripción de la instrucción DD ocupa más de 130 páginas, más del doble que las instrucciones JOB y EXEC combinadas. [ 25 ]
La instrucción DD permite insertar datos en línea en el flujo de trabajo. Esto resulta útil para proporcionar información de control a utilidades como IDCAMS, SORT, etc., así como para proporcionar datos de entrada a los programas.
Independencia del dispositivo
Desde sus inicios, el JCL para la familia de sistemas operativos OS ofreció un alto grado de independencia del dispositivo. Incluso para los archivos nuevos que debían conservarse tras finalizar el trabajo, se podía especificar el tipo de dispositivo en términos genéricos, por ejemplo, UNIT=DISK, UNIT=TAPE, o UNIT=SYSSQ(cinta o disco). Por supuesto, si era necesario, se podía especificar un número de modelo o incluso una dirección de dispositivo específica. [ 26 ]
Procedimientos
Los procedimientos permiten agrupar una o más sentencias " EXEC PGM= " y DD y luego invocarlas con " EXEC PROC= procname" -o- simplemente "EXEC procname" [ 27 ]
Una herramienta denominada Biblioteca de Procedimientos permitía almacenar previamente los procedimientos.
PROC Y PENDIENTE
Los procedimientos también pueden incluirse en el flujo de trabajo finalizando el procedimiento con una // PENDinstrucción y luego invocándolo por su nombre de la misma manera que si estuviera en una biblioteca de procedimientos.
Por ejemplo:
// PROCESO DE IMPRIMIR // EJECUTAR IMPRIMIR PGM=IEBGENER // SYSUT1 DD DSN = CEO . FILES . DAYEND . RPT24A , DISP = SHR // SYSUT2 DD SYSOUT = A // SYSIN DD DUMMY // PEND // EJECUTAR IMPRIMIRProcedimientos parametrizados
Los procedimientos JCL del sistema operativo se parametrizaron desde el principio, lo que los convirtió en algo parecido a macros o incluso subrutinas simples y, por lo tanto, aumentó su reutilización en una amplia gama de situaciones. [ 28 ]
// MYPROC PROC FNAME = MYFILE01 , SPTYPE = TRK , SPINIT = 50 , SPEXT = 10 , LR = 100 , BLK = 1000 ..... // NEWFILE DD DSN =& FNAME , UNIT = DISK , SPACE = ( & SPTYPE , & SPINIT , & SPEXT ), // DCB = ( LRECL =& LR , BLKSIZE =& BLK ), DISP = ( NEW , CATLG , DELETE ) ....En este ejemplo, todos los valores que comienzan con el signo de ampersand " &" son parámetros que se especificarán cuando un trabajo solicite el uso del procedimiento. La instrucción PROC, además de darle un nombre al procedimiento, permite al programador especificar valores predeterminados para cada parámetro. Por lo tanto, se podría usar el mismo procedimiento de este ejemplo para crear nuevos archivos de diferentes tamaños y formatos. Por ejemplo:
// JOB01 JOB .......... // STEP01 EXEC MYPROC FNAME=JOESFILE,SPTYPE=CYL,SPINIT=10,SPEXT=2,LR=100,BLK=2000 o // JOB02 JOB .......... // STEP01 EXEC MYPROC FNAME=SUESFILE,SPTYPE=TRK,SPINIT=500,SPEXT=100,LR=100,BLK=5000Referencias
En trabajos de varios pasos, un paso posterior puede usar una referencia en lugar de especificar completamente un archivo que ya se ha especificado en un paso anterior. Por ejemplo:
// MYPROC ................ // MYPR01 EXEC PGM = .......... // NEWFILE DD DSN =& MYFILE , UNIT = DISK , SPACE = ( TRK , 50 , 10 ), // DCB = ( LRECL = 100 , BLKSIZE = 1000 ), DISP = ( NEW , CATLG , DELETE ) .... // MYPR02 EXEC PGM = .......... // INPUT01 DD DSN = * . MYPR01 . NEWFILEAquí, MYPR02se utiliza el archivo identificado como NEWFILEen el paso MYPR01( DSNsignifica "nombre del conjunto de datos" y especifica el nombre del archivo; un DSN no puede exceder los 44 caracteres [ 29 ] ).
En trabajos que contienen una combinación de JCL específico del trabajo y llamadas a procedimientos, un paso específico del trabajo puede hacer referencia a un archivo que se especificó completamente en un procedimiento, por ejemplo:
// MI TRABAJO TRABAJO .......... // PASO01 EJECUTAR MIPROC Utilizando un procedimiento // PASO02 EJECUTAR PGM = ......... Paso que es específico de este trabajo // ENTRADA01 DD DSN = * . PASO01 . MIPROCEDENTE01 . NUEVOARCHIVOdonde DSN=*.STEP01.MYPR01.NEWFILEsignifica "utilizar el archivo identificado como NEWFILEen el paso MYPR01del procedimiento utilizado por el paso STEP01de este trabajo". Usar el nombre del paso que llamó al procedimiento en lugar del nombre del procedimiento permite al programador usar el mismo procedimiento varias veces en el mismo trabajo sin confusión sobre qué instancia del procedimiento se utiliza en la referencia.
Comentarios
Los archivos JCL pueden ser largos y complejos, y el lenguaje no es fácil de leer. OS JCL permite a los programadores incluir dos tipos de comentarios explicativos:
- En la misma línea que una instrucción JCL. Se pueden extender colocando un carácter de continuación (convencionalmente "
X") en la columna 72, seguido de "//" en las columnas 1 a 3 de la siguiente línea. - Las líneas que contienen únicamente comentarios se utilizan a menudo para explicar los puntos principales de la estructura general del JCL, en lugar de detalles específicos. Estas líneas también se emplean para dividir archivos JCL largos y complejos en secciones.
// MYJOB JOB .......... //* Líneas que contienen solo comentarios. //******** Se usa a menudo para dividir la lista JCL en secciones ******** // STEP01 EXEC MYPROC Comentario 2 en la misma línea que la instrucción // STEP02 EXEC PGM = ......... El comentario 3 se ha extendido y X // se desborda a otra línea. // INPUT01 DD DSN = STEP01 . MYPR01 . NEWFILEConcatenación de archivos de entrada
OS JCL permite a los programadores concatenar ("encadenar") archivos de entrada para que el programa los vea como un solo archivo, por ejemplo
// INPUT01 DD DSN = MYFILE01 , DISP = SHR // DD DSN=JOESFILE,DISP=SHR // DD DSN=SUESFILE,DISP=SHRLa segunda y la tercera instrucción no tienen valor en el campo de nombre, por lo que el sistema operativo las trata como concatenaciones. Los archivos deben ser del mismo tipo básico (casi siempre secuenciales) y deben tener la misma longitud de registro; sin embargo, la longitud del bloque no tiene por qué ser la misma.
En versiones anteriores del sistema operativo (ciertamente antes de OS/360 R21.8), la longitud del bloque debe estar en orden descendente, o el usuario debe inspeccionar cada instancia y agregar a la instrucción DD nombrada la longitud máxima del bloque encontrada, como en, por ejemplo,
// INPUT01 DD DSN = MYFILE01 , DISP = SHR , BLKSIZE = 800 // DD DSN=JOESFILE,DISP=SHR (BLKSIZE se asume igual o menor que 800) // DD DSN=SUESFILE,DISP=SHR (BLKSIZE se asume igual o menor que 800)En versiones posteriores del sistema operativo (sin duda después de OS/MVS R3.7 con las "unidades seleccionables" adecuadas), el propio sistema operativo, durante la asignación, inspeccionaba cada instancia en una concatenación y la sustituía por la longitud máxima de bloque encontrada.
Una solución habitual era simplemente determinar la longitud máxima posible del bloque en el dispositivo y especificarla en la instrucción DD con nombre, como por ejemplo:
// INPUT01 DD DSN = MYFILE01 , DISP = SHR , BLKSIZE = 8000 // DD DSN=JOESFILE,DISP=SHR (BLKSIZE se asume igual o menor que 8000) // DD DSN=SUESFILE,DISP=SHR (BLKSIZE se asume igual o menor que 8000)El objetivo de esta medida de reserva era garantizar que el método de acceso asignara un conjunto de búferes de entrada lo suficientemente grande como para albergar todos y cada uno de los conjuntos de datos especificados.
Procesamiento condicional
El sistema operativo espera que los programas establezcan un código de retorno que indique el grado de éxito que el programa consideró. Los valores convencionales más comunes son: [ 30 ] : p.87
- 0 = Normal - todo correcto
- 4 = Advertencia: errores o problemas menores
- 8 = Error: errores o problemas importantes
- 12 = Error grave: errores o problemas importantes, no se debe confiar en los resultados (por ejemplo, archivos o informes generados).
- 16 = Error terminal: problemas muy graves, ¡no utilice los resultados!
OS JCL se refiere al código de retorno como COND("código de condición") y puede usarlo para decidir si se ejecutan los pasos subsiguientes. Sin embargo, a diferencia de la mayoría de los lenguajes de programación modernos, los pasos condicionales en OS JCL no se ejecutan si la condición especificada es verdadera , lo que da origen al acrónimo , "Si es verdadero, continuar [sin ejecutar el código]". Para complicar aún más las cosas, la condición solo se puede especificar después del paso al que se refiere. Por ejemplo:
// MI TRABAJO TRABAJO ........... // PASO01 EJECUTAR PROGRAMA = PROG01 .... // PASO02 EJECUTAR PROGRAMA = PROG02 , COND = ( 4 , GT , PASO01 ) .... // PASO03 EJECUTAR PROGRAMA = PROG03 , COND = ( 8 , LE ) .... // PASO04 EJECUTAR PROGRAMA = PROG04 , COND = ( SOLO , PASO01 ) .... // PASO05 EJECUTAR PROGRAMA = PROG05 , COND = ( PAR , PASO03 ) ....medio:
- Ejecuta el programa
STEP01y recopila su código de retorno. - No ejecute
STEP02si el número 4 es mayor queSTEP01el código de retorno de . - No ejecute
STEP03si el número 8 es menor o igual que cualquier código de retorno anterior. - Ejecutar
STEP04solo siSTEP01finaliza de forma anómala. - Ejecutar
STEP05, incluso siSTEP03termina de forma anormal.
Esto se traduce en el siguiente pseudocódigo :
Ejecutar STEP01 si el código de retorno de STEP01 es mayor o igual a 4 entonces Ejecutar PASO02 fin si si algún código de retorno anterior es menor que 8 entonces Ejecutar PASO03 fin si si STEP01 terminó anormalmente entonces Ejecutar PASO04 fin si si STEP03 terminó anormalmente entonces Ejecutar PASO05 demás Ejecutar PASO05 fin si
Tenga en cuenta que, al leer los pasos que contienen CONDinstrucciones al revés, se pueden comprender con bastante facilidad. Este es un ejemplo de transposición lógica . Sin embargo, IBM introdujo posteriormente la condición IF en JCL, lo que facilitó la codificación para los programadores, manteniendo el CONDparámetro (para evitar realizar cambios en los JCL existentes donde COND parmse utiliza).
El CONDparámetro también puede especificarse en la JOBinstrucción. En ese caso, el sistema "realiza las mismas pruebas de código de retorno para cada paso de un trabajo. Si se cumple una prueba de código de retorno de la instrucción JOB, el trabajo finaliza". [ 31 ]
Servicios públicos
Los trabajos utilizan varios programas de utilidad de IBM para facilitar el procesamiento de datos. Estas utilidades son especialmente útiles en el procesamiento por lotes. Las utilidades se pueden agrupar en tres conjuntos:
- Utilidades para conjuntos de datos: cree, imprima, copie, mueva y elimine conjuntos de datos.
- Utilidades del sistema: Mantener y gestionar catálogos y otra información del sistema.
- Servicios de métodos de acceso: Procesar conjuntos de datos con y sin método de acceso de almacenamiento virtual (VSAM).
Dificultad de uso
El JCL del sistema operativo es innegablemente complejo [ 32 ] y se ha descrito como "hostil para el usuario" [ 33 ] [ 34 ] . Como preguntaba un libro de instrucción sobre JCL: "¿Por qué incluso los programadores sofisticados dudan cuando se trata del lenguaje de control de trabajos?" [ 35 ]. El libro afirmaba que muchos programadores copiaban tarjetas de control sin comprender realmente su funcionamiento, o "creían en los rumores generalizados de que el JCL era horrible y que solo los informáticos 'recalcitrantes' lo entendían", y delegaban la tarea de descifrar las instrucciones del JCL a otra persona [ 35 ] . Esta actitud se podía encontrar en los libros de texto de lenguajes de programación, que preferían centrarse en el lenguaje en sí y no en cómo se ejecutaban los programas. Como decía un libro de texto de Fortran IV al enumerar los posibles mensajes de error del compilador WATFOR : "¿Has sido tan insensato como para intentar escribir tus propias tarjetas de control del sistema 'DD'? Detente de inmediato; corre, no camines, en busca de ayuda" [ 36 ] .
Sin embargo, algunos libros que profundizaban en JCL enfatizaban que, una vez aprendido hasta alcanzar un nivel de competencia al menos aceptable, se obtenía libertad respecto a las configuraciones predeterminadas de la instalación y un control mucho mayor sobre cómo un sistema IBM procesaba la carga de trabajo. [ 35 ] [ 32 ] Otro libro comentaba sobre la complejidad, pero decía: «Anímense. La capacidad de JCL que obtendrán del capítulo anterior es todo lo que la mayoría de los programadores necesitarán». [ 32 ]
Idioma de control de entrada de empleo
En los sistemas mainframe de IBM, el lenguaje de control de entrada de trabajos ( JECL) es el conjunto de instrucciones de control del lenguaje de comandos que proporcionan información para el subsistema de cola de impresión ( JES2 o JES3 en z/OS o VSE/POWER en z/VSE ). Las instrucciones JECL pueden "especificar en qué equipo de red ejecutar el trabajo , cuándo ejecutarlo y dónde enviar la salida resultante". [ 30 ]
JECL es distinto de JCL, que indica al sistema operativo cómo ejecutar la tarea.
Existen diferentes versiones de JECL para los tres entornos.
Sistema operativo/360
Una versión temprana del lenguaje de control de entrada de trabajos para la entrada remota de trabajos de OS/360 (número de programa 360S-RC-536) utilizaba el identificador en las columnas 1 y 2 del registro de entrada y consistía en una única instrucción de control: (Definición de entrada de trabajo). Los "comandos de estación de trabajo", como , , y también comenzaban con . [ 37 ] .. JEDLOGONLOGOFFSTATUS ..
pre-JES JECL
Aunque el término aún no se había desarrollado, HASP sí tenía una funcionalidad similar a la que se convertiría en el JECL de JES , incluida /*la sintaxis.
z/OS
Para JES2, las sentencias JECL comienzan con /*, para JES3 comienzan con //*, excepto para los comandos remotos y . Los comandos para los dos sistemas son completamente diferentes. /*SIGNON /*SIGNOFF
JES2 JECL
Las siguientes sentencias JECL de JES2 se utilizan en z/OS 1.2.0. [ 38 ]
JES3 JECL
Las siguientes sentencias JECL de JES3 se utilizan en z/OS 1.2.0 [ 40 ]
z/VSE
Para VSE, las sentencias JECL comienzan con ' * $$' (nótese el espacio único ). El lenguaje de control de entrada de trabajos define las líneas de inicio y fin de los trabajos JCL. Indica a VSE / POWER cómo se maneja este trabajo. Las sentencias JECL definen el nombre del trabajo (utilizado por VSE/POWER), la clase en la que se procesa el trabajo y la disposición del trabajo (es decir D, L, , K, H).
Ejemplo:
* $$ TRABAJO JNM=NOMBRE,DISP=K,CLASE=2[algunas declaraciones de JCL aquí]* $$ EOJOtros sistemas
Otros sistemas de procesamiento por lotes de mainframes tenían algún tipo de lenguaje de control de trabajos, ya fuera con ese nombre [ 4 ] o no; su sintaxis era completamente diferente a la de las versiones de IBM, pero generalmente proporcionaban capacidades similares. Dicho lenguaje tendría tarjetas de control con un indicador especial, como un signo de dólar inicial para indicar $JOBque era la primera tarjeta de este tipo, intercaladas con tarjetas que contenían código de programa, datos a ejecutar, etc. [ 4 ]
Los sistemas interactivos incluyen lenguajes de comandos : los archivos de comandos (como los archivos ".bat" de PCDOS) se pueden ejecutar de forma no interactiva, pero generalmente no proporcionan un entorno tan robusto para ejecutar trabajos desatendidos como JCL. En algunos sistemas informáticos, el lenguaje de control de trabajos y el lenguaje de comandos interactivo pueden ser diferentes. Por ejemplo, TSO en sistemas z/OS utiliza CLIST o Rexx como lenguajes de comandos junto con JCL para el procesamiento por lotes. En otros sistemas, estos lenguajes pueden ser iguales.
Véase también
Referencias
- ↑ "Cada trabajo enviado para su ejecución... debe incluir sentencias JCL" – ibm.com
- ↑ y muchos más aspectos, como si el archivo debe conservarse o eliminarse, el espacio máximo en disco al que puede llegar, el nombre de una cinta que se montará previamente e indicar bajo qué condiciones se debe omitir un paso.
- ↑ Ashley y Fernández, Lenguaje de control de trabajos , pág. 1.
- 1 2 3 Stallings, William (1996). Organización y arquitectura de computadoras: diseño para el rendimiento (Cuarta ed.). Upper Saddle River, Nueva Jersey: Prentice-Hall. pág. 228. ISBN 0-13-359985-X.
- ↑ Ashley y Fernández, Lenguaje de control de trabajos , pág. 5.
- ↑ McQuillen, System/360–370 Assembler Language , pp. 385–386.
- 1 2 McQuillen, System/360–370 Assembler Language , pp. 288–289, 400.
- ↑ Lewis, Cecilia (8 de agosto de 2011). "Lo que hemos hecho por usted últimamente con PDSE" (PDF) . SHARE en Orlando . Recuperado el 3 de marzo de 2023 .
- ↑ McQuillen, Lenguaje ensamblador System/360–370 , págs. 22–24.
- ↑ McQuillen, System/360–370 Assembler Language , pp. 380–382.
- ↑ Stern y Stern, Programación COBOL estructurada , págs. 528–529.
- ↑ Stern y Stern, Programación COBOL estructurada , págs. 529, 531.
- ↑ Stern y Stern, Programación COBOL estructurada , págs. 529, 537.
- ↑ modelado a partir de https://www.ibm.com/support/knowledgecenter/SSLTBW_2.2.0/com.ibm.zos.v2r2.hasc300/has2z1_Submitting_to_the_internal_reader_from_jobs_or_tasks.htm , utilizando conocimientos que se remontan a cuando las Green Cards provenían de IBM y Manix trabajaba para una empresa propietaria de un clasificador de tarjetas de IBM.
- ↑ Brooks, Frederick P. (2010). El diseño del diseño . Addison-Wesley . págs. 167–173 . ISBN 978-0-201-36298-5.
- ↑ "Archivos de IBM: System/360 Modelo 30" . www-03.ibm.com . 23 de enero de 2003. Archivado del original el 17 de diciembre de 2004. Consultado el 25 de abril de 2016 .
- ↑ "IBM PC" . Archivado del original el 5 de julio de 2006. Consultado el 21 de octubre de 2007 .
- ↑ Computadoras compatibles con IBM Historia de las PC Archivado el 14 de agosto de 2007 en Wayback Machine
- ↑ Brown, Gary DeWard (2002). zOS JCL (quinta ed.). John Wiley & Sons. pág. 248. ISBN 0471-236357.
- ↑ Ashley y Fernández, Job Control Language , págs. 8, 23. También hay dos instrucciones adicionales, PROC y PEND, que se utilizan para probar los procedimientos JCL.
- ↑ Un conjunto prealmacenado de comandos JCL "EXEC PGM=" y "DD" que podrían ser parametrizados
- ↑ Ashley y Fernández, Lenguaje de control de trabajos , págs. 12–16.
- ↑ Ashley y Fernández, Lenguaje de control de trabajos , págs. 13–15.
- ↑ IBM Corporation (agosto de 1978). Guía de servicios de administración de datos de OS/VS MVS (PDF) . Consultado el 17 de octubre de 2014 .
- ↑ IBM Corporation (junio de 1971). Sistema operativo IBM System/360: Referencia del lenguaje de control de trabajos (PDF) . Consultado el 25 de junio de 2019 .
- ↑ McQuillen, System/360–370 Assembler Language , pp. 297, 406–407.
- ↑ El valor predeterminado para la instrucción EXEC es PROC=
- ↑ Ashley y Fernández, Lenguaje de control de trabajos , págs. 129–131.
- ↑ "Nombres de conjuntos de datos" . IBM . 27 de marzo de 2014.
Los nombres de los conjuntos de datos no deben exceder los 44 caracteres, incluidos todos los segmentos y puntos.
- 1 2 Brown, Gary DeWard (2002). zOS JCL . John Wiley & Sons. ISBN 9780471426738. Consultado el 5 de mayo de 2014 .
- ↑ IBM Corporation. "Relación de los parámetros COND en las sentencias JOB y EXEC" . Centro de conocimiento de IBM . Consultado el 21 de febrero de 2018 .
- 1 2 3 McQuillen, Lenguaje ensamblador System/360–370 , págs. 406–407.
- ↑ Charley, Alfred (1993). NetView: Producto de gestión de redes de IBM . Nueva York: Van Nostrand Reinhold. pág . 93. ISBN 0-442-01407-4.
- ↑ Mathew W. Blode (6 de abril de 2020). "Los neoyorquinos recién desempleados se sienten frustrados por la tecnología de la década de 1970 (nytimes.com)" . Recuperado el 7 de mayo de 2020. JCL
en particular es notoriamente hostil para el usuario y ha sido llamado "el peor lenguaje de programación jamás diseñado" por Fred Brooks... (http://dtsc.dfw.ibm.com/MVSDS/'HTTPD2.APPS.ZOSCLASS.PDF(ZCLA...)[enlace en el original].
- 1 2 3 Ashley y Fernández, Lenguaje de control de trabajos , págs. vii–viii, contraportada.
- ↑ Blatt, John M. (1971). Introducción a la programación en FORTRAN IV: Uso de los compiladores WATFOR/WATFIV . Pacific Palisades, California: Goodyear Publishing Company. pág. 276. ISBN 0-87620-440-X.
- ↑ IBM Corporation (1968). Entrada remota de trabajos del sistema operativo IBM System/360 (PDF) . Consultado el 5 de mayo de 2014 .
- ↑ IBM Corporation. "Instrucciones de control del subsistema de entrada de trabajos 2 (JES2)" . JCL de MVS de z/OS V1R2.0 . Archivado del original el 18 de octubre de 2015. Consultado el 25 de febrero de 2013 .
- ↑ Otros ejemplos pueden consultarse en Houston Automatic Spooling Priority#Operator Commands
- ↑ IBM Corporation. "Instrucciones de control del subsistema de entrada de trabajos 3 (JES3)" . JCL de MVS de z/OS V1R2.0 . Archivado del original el 18 de octubre de 2015. Consultado el 25 de febrero de 2013 .
- ↑ IBM Corporation (1974). Instalación y funcionamiento de DOS/VS POWER/VS (PDF) .
Fuentes
- Guía del usuario de JCL de MVS para z/OS V1R6.0 (PDF) (5.ª ed.). IBM. Septiembre de 2004. Archivado del original (PDF) el 19 de agosto de 2013. Consultado el 12 de octubre de 2006 .
- Referencia JCL de z/OS V1R7.0 MVS (PDF) (11.ª ed.). IBM. Abril de 2006. Archivado del original (PDF) el 19 de agosto de 2013. Consultado el 12 de octubre de 2006 .
- Johnston, Jerry (1 de abril de 2005). "VSE: Una mirada a los últimos 40 años" . z/Journal . Thomas Communications. Archivado del original el 4 de marzo de 2009.
- "Crónicas de la informática: 1972 - 1981" . ThinkQuest . Oracle Corporation . 1998. Archivado del original el 21 de junio de 2009.
- DeWard Brown, Gary (7 de junio de 2002). zOS JCL (5.ª ed.). Wiley. ISBN 978-0-471-23635-1.
- "Campos de sentencias JCL" . Referencia JCL de MVS para z/OS V1R11.0 y z/OS V1R10.0-V1R11.0 . IBM. 2010.
- IBM Corporation (marzo de 2007). Introducción al nuevo mainframe: Fundamentos de z/VSE (PDF) . IBM, Organización Internacional de Soporte Técnico. ISBN 978-0-73-848624-6. Consultado el 06-12-2017 .
- Ashley, Ruth; Fernandez, Judi N. (1978). Job Control Language: A Self-Teaching Guide . Nueva York: John Wiley & Sons. ISBN 0-471-03205-0.
- McQuillen, Kevin (1975). Lenguaje ensamblador System/360–370 (SO) . Fresno, California: Mike Murach & Associates. LCCN 74-29645 .
- Stern, Nancy; Stern, Robert A. (1980). Programación COBOL estructurada (3.ª ed.). Nueva York: John Wiley & Sons. ISBN 0-471-04913-1.
- Lenguajes de scripting
- Programación de trabajos
- Sistemas operativos para mainframes de IBM