Como mapear JCL para COBOL e por que isso importa

Como mapear JCL para COBOL e por que isso importa

Todo mainframe empresarial executa duas linguagens interligadas que a maioria dos desenvolvedores modernos nunca escreveu. O COBOL implementa a lógica de negócios, cálculos, processamento de arquivos, transformações de registros e relatórios regulatórios. O JCL (Job Control Language) orquestra a execução dessa lógica, definindo quais programas são executados, em que ordem, com quais arquivos, sob quais condições e o que acontece quando eles são bem-sucedidos ou falham. Nenhuma das linguagens é completa sem a outra. Um programa COBOL não tem ideia de onde vêm seus arquivos de entrada ou para onde vai sua saída; o JCL responde a ambas as perguntas antes mesmo do primeiro registro ser lido.

Para organizações que realizam manutenção, auditoria ou modernização de sistemas mainframe, compreender a relação entre JCL e COBOL não é um conhecimento opcional. É pré-requisito para tudo: análise de impacto antes de qualquer alteração, documentação antes de qualquer migração, transferência de conhecimento antes que qualquer especialista se aposente. O job que processa a fatura noturna, o batch run que gera relatórios regulatórios trimestrais, o procedimento que transfere dados de um sistema para outro, tudo isso é definido por JCL, executado por COBOL e compreendido apenas pelo número cada vez menor de engenheiros que trabalharam com ambas as linguagens.

Precisa de uma ferramenta de mapeamento de JCL para COBOL?

Explorar SMART TS XL!

Mais informações

O que é JCL?

JCL significa Job Control Language (Linguagem de Controle de Tarefas). É a linguagem de script usada em sistemas mainframe da IBM para submeter tarefas em lote para execução. O JCL não processa dados diretamente. Ele informa ao sistema operacional como executar programas: qual programa executar, quais arquivos disponibilizar, quais recursos de memória e CPU alocar, o que fazer se uma etapa falhar e em qual sequência executar várias etapas dentro de uma única tarefa.

Cada tarefa JCL consiste em três tipos fundamentais de instruções:

A declaração JOB identifica a tarefa no sistema e define os parâmetros de contabilização, prioridade e agendamento.

A instrução EXEC especifica o programa ou procedimento a ser executado em uma etapa.

A declaração DD (Data Definition) define os conjuntos de dados que o programa irá ler ou gravar, incluindo sua localização, formato e disposição.

jcl

//PAYBATCH JOB (ACCT#7), 'PAYROLL RUN',
//          CLASS=A, MSGCLASS=X, NOTIFY=&SYSUID
//*
//STEP010  EXEC PGM=PAYROLL1
//STEPLIB  DD   DSN=PROD.PAYROLL.LOADLIB,DISP=SHR
//EMPFILE  DD   DSN=PROD.PAYROLL.EMPLOYEE,DISP=SHR
//TRANSACT DD   DSN=PROD.PAYROLL.TRANS.D&&DATE,DISP=SHR
//PAYRPT   DD   SYSOUT=A
//SYSOUT   DD   SYSOUT=*
//SYSIN    DD   DUMMY

Neste exemplo: PAYBATCH é o nome do cargo, STEP010 é uma etapa do trabalho, PGM=PAYROLL1 O programa COBOL é nomeado e as instruções DD definem todos os arquivos que o programa pode acessar. PAYROLL1 não sabe nem se importa onde EMPFILE or TRANSACT Os dados vêm de uma localização física; o sistema simplesmente os lê pelo nome do registro (ddname). O JCL resolve a localização física, o formato do registro e o modo de acesso antes do início da execução.

Procedimentos catalogados JCL (PROCs)

Em vez de escrever o mesmo padrão JCL para cada tarefa, as equipes de mainframe definem procedimentos catalogados (PROCs) que encapsulam padrões de execução reutilizáveis. Um PROC é um modelo armazenado em uma biblioteca de procedimentos; tarefas individuais o referenciam e substituem parâmetros específicos conforme necessário.

jcl

//PAYPROC  PROC RUNDATE=TODAY
//COMPILE  EXEC PGM=IGYCRCTL,PARM='OBJECT,NODUMP'
//SYSIN    DD   DSN=PROD.COBOL.SRC(&MEMBER),DISP=SHR
//SYSOBJ   DD   DSN=&&OBJSET,DISP=(NEW,PASS),
//              UNIT=SYSDA,SPACE=(TRK,(10,5))
//LKED     EXEC PGM=IEWL,PARM='LIST,LET,XREF'
//SYSLIN   DD   DSN=&&OBJSET,DISP=(OLD,DELETE)
//SYSLMOD  DD   DSN=PROD.PAYROLL.LOADLIB(&MEMBER),
//              DISP=SHR
//         PEND

Chamando o PROC a partir de um trabalho:

jcl

//COMPILE  EXEC PAYPROC,MEMBER=PAYROLL1,RUNDATE=20251205

Esta única instrução EXEC se expande para o PROC completo no momento da execução, com MEMBER e RUNDATE substituído onde quer que seja &MEMBER e &RUNDATE Os PROCs são um dos principais motivos pelos quais o mapeamento de JCL para COBOL é complexo: um job pode invocar dezenas de programas COBOL por meio de uma única referência de PROC, e os programas realmente invocados dependem de parâmetros simbólicos que variam a cada execução.

Qual a diferença entre JCL e COBOL?

JCL e COBOL são frequentemente mencionados juntos, mas desempenham funções completamente diferentes. Nenhum substitui o outro, e ambos são necessários para o funcionamento do processamento em lote em mainframe.

DimensãoJclCOBOL
PropósitoOrquestra a execuçãoImplementa a lógica de negócios.
O que isso defineEmpregos, etapas, arquivos, condiçõesProgramas, estruturas de dados, cálculos
Quando ele funcionaAntes da execução do programa (configuração) e depois (limpeza)Durante a execução do programa
Lê/escreve dadosPor meio de alocação de conjunto de dados (instruções DD)Por meio de instruções FILE SECTION e READ/WRITE
Tratamento de errosCódigos de retorno, execução condicional de etapasmanipuladores de exceção, rotinas de erro PERFORM
PortabilidadeEspecífico para IBM z/OSPortátil entre plataformas com compiladores
Quem escreve issoProgramadores de sistemas, engenheiros de lotesDesenvolvedores de aplicativos
Equivalente modernoPipeline CI/CD + orquestração de contêineresCódigo da aplicação (Java, Python, C++)

A maneira mais fácil de entender a relação é a seguinte: JCL é a camada de implantação e orquestração; COBOL é a camada de aplicação. Em um sistema moderno nativo da nuvem, o papel do JCL seria desempenhado por manifestos de tarefas do Kubernetes, scripts de shell e estágios de pipeline de CI/CD. O papel do COBOL seria desempenhado por serviços de aplicação escritos em Java, Python ou Go.

Como o JCL invoca o COBOL: A cadeia de execução

O caminho de uma tarefa JCL para a execução em COBOL segue uma cadeia consistente. Compreender cada etapa é fundamental para entender o que um mapeamento JCL-para-COBOL deve abranger.

Etapa 1: Submissão da tarefa. A tarefa JCL é submetida ao Subsistema de Entrada de Tarefas (JES). O JES enfileira a tarefa e começa a ler suas instruções.

Etapa 2: Configuração da etapa. Para cada etapa EXEC, o sistema localiza o programa nomeado na biblioteca de carregamento especificada pela instrução DD STEPLIB. Se nenhum STEPLIB for especificado, o sistema pesquisa na biblioteca de vínculo do sistema.

Etapa 3: Alocação de conjuntos de dados. Antes da execução do programa, o sistema aloca todos os conjuntos de dados definidos pelas instruções DD na etapa. Isso inclui abrir arquivos, verificar se os conjuntos de dados de entrada existem e criar conjuntos de dados de saída.

Etapa 4: Execução do programa. O programa COBOL é executado. Ele acessa arquivos usando os ddnames definidos no JCL. OPEN INPUT EMPFILE Em COBOL, mapeia diretamente para a instrução DD chamada EMPFILE em JCL.

Etapa 5: Avaliação do código de retorno. Quando o programa COBOL termina, ele define um código de retorno (normalmente 0 para sucesso, 4 para aviso, 8 para erro, 12 ou 16 para erro grave). O JCL utiliza COND parâmetros ou IF/THEN/ELSE estruturas para determinar se as etapas subsequentes devem ser executadas com base nesse código.

Etapa 6: Disposição do conjunto de dados. Após esta etapa, o sistema processa as disposições do conjunto de dados definidas em cada instrução DD: manter, excluir, catalogar, descatalogar ou passar para a próxima etapa.

O exemplo a seguir mostra como essa cadeia se apresenta na prática, com o JCL à esquerda e os elementos COBOL correspondentes à direita:

jcl

//STEP020  EXEC PGM=ACCTREC
//STEPLIB  DD   DSN=PROD.ACCOUNT.LOADLIB,DISP=SHR
//INFILE   DD   DSN=PROD.ACCT.DAILY.INPUT,DISP=SHR     ← maps to COBOL SELECT/ASSIGN
//OUTFILE  DD   DSN=PROD.ACCT.PROCESSED,               ← maps to COBOL SELECT/ASSIGN
//              DISP=(NEW,CATLG,DELETE),
//              UNIT=SYSDA,SPACE=(CYL,(5,2),RLSE)
//RPTFILE  DD   SYSOUT=A                                ← maps to COBOL WRITE report
//SYSOUT   DD   SYSOUT=*

O programa COBOL ACCTREC contém:

cobol

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT INFILE    ASSIGN TO INFILE.         *> maps to DD INFILE
           SELECT OUTFILE   ASSIGN TO OUTFILE.        *> maps to DD OUTFILE
           SELECT RPTFILE   ASSIGN TO RPTFILE.        *> maps to DD RPTFILE

       DATA DIVISION.
       FILE SECTION.
       FD  INFILE
           RECORDING MODE IS F
           BLOCK CONTAINS 0 RECORDS
           RECORD CONTAINS 200 CHARACTERS.
       01  ACCOUNT-RECORD.
           05  ACCT-NUMBER    PIC X(10).
           05  ACCT-BALANCE   PIC S9(13)V99 COMP-3.
           05  ACCT-STATUS    PIC X(2).

O SELECT INFILE ASSIGN TO INFILE Na seção FILE-CONTROL do COBOL, conecta-se à instrução DD chamada INFILE Em JCL. Esta é a relação de mapeamento fundamental: COBOL usa nomes de arquivos lógicos; JCL os resolve para conjuntos de dados físicos.

Códigos de abend JCL: o que eles significam

Os códigos de término anormal (abend codes) do JCL identificam o motivo pelo qual uma etapa do job foi encerrada inesperadamente. Eles aparecem na saída do job como S000 (falha do sistema) ou U0000 (códigos de abend do usuário). Compreendê-los é essencial para diagnosticar falhas em trabalhos em lote.

Código de interrupçãoFormatoCausa comum
S001SystemErro de E/S ao ler ou gravar um conjunto de dados
S013SystemIncompatibilidade de atributos DCB, incompatibilidade de comprimento de registro ou formato entre JCL DD e COBOL FD
S0C4SystemExceção de proteção de armazenamento: o programa tentou acessar memória fora da região alocada.
S0C7SystemExceção de dados, tentativa de aritmética em dados não numéricos (abend muito comum em COBOL)
S322SystemO limite de tempo foi excedido; a tarefa foi executada por mais tempo do que o permitido pelo parâmetro TIME.
S806SystemMódulo de carregamento não encontrado; o programa nomeado em EXEC PGM= não está em nenhuma biblioteca de carregamento pesquisada.
S913SystemViolação de segurança de acesso ao conjunto de dados, acesso negado pelo RACF ou equivalente.
U0000UtilizadorAbend definido pela aplicação, programa COBOL chamado STOP RUN com um código de usuário.
U4076Utilizadorabend específico do IMS, falha de acesso ao banco de dados

A falha de produção mais comum, S0C7Ocorre quando um programa COBOL tenta realizar operações aritméticas em um campo que contém espaços ou caracteres não numéricos. A causa típica é uma incompatibilidade entre o formato de dados esperado no programa COBOL e os dados reais fornecidos pelo JCL, que é exatamente o tipo de discrepância que o mapeamento de JCL para COBOL revela antes que cause uma falha crítica na produção.

O parâmetro COND e a execução condicional

O JCL controla quais etapas são executadas com base nos códigos de retorno das etapas anteriores, usando o COND parâmetro:

jcl

//STEP010  EXEC PGM=VALIDATE,COND=(4,LT)
//STEP020  EXEC PGM=PROCESS, COND=(4,LT,STEP010)
//STEP030  EXEC PGM=CLEANUP, COND=(0,NE,STEP010)

COND=(4,LT) Significa: ignore esta etapa se o código de retorno de qualquer etapa anterior for menor que 4. COND=(4,LT,STEP010) Significa: ignore esta etapa se o código de retorno de STEP010 for menor que 4. COND=(0,NE,STEP010) Significa: ignore o STEP030 se o código de retorno do STEP010 for diferente de 0, ou seja, execute a limpeza somente se o STEP010 for bem-sucedido.

O JCL moderno usa o IF/THEN/ELSE/ENDIF Em vez disso, construa, o que é mais legível:

jcl

//IF010    IF (STEP010.RC = 0) THEN
//STEP020  EXEC PGM=PROCESS
//         ENDIF
//IF020    IF (STEP010.RC > 4) THEN
//STEP030  EXEC PGM=ERRORHANDLER
//         ENDIF

Mapear caminhos de execução condicional é um dos elementos mais críticos e mais frequentemente negligenciados na análise de JCL para COBOL. Um programa COBOL que só é executado quando uma etapa anterior falha pode estar lidando com condições de erro, lógica de rollback ou procedimentos de recuperação, funcionalidades que são totalmente invisíveis se você observar apenas o código-fonte COBOL sem o JCL que o controla.

JCL, COBOL e DB2: A estrutura de três camadas

A maioria dos sistemas de transação de mainframe envolve um terceiro componente além do JCL e do COBOL: o DB2, o banco de dados relacional da IBM. Os programas COBOL acessam o DB2 por meio de instruções SQL incorporadas (blocos EXEC SQL). O JCL gerencia a conexão do subsistema DB2 e o DBRM (Módulo de Requisição de Banco de Dados) por meio de instruções DD específicas.

jcl

//DBRM     DD   DSN=PROD.DBRMLIB.DATA(ACCTREC),DISP=SHR
//SYSPRINT DD   SYSOUT=*

cobol

       WORKING-STORAGE SECTION.
       EXEC SQL
           INCLUDE SQLCA
       END-EXEC.

       PROCEDURE DIVISION.
       MAIN-LOGIC.
           EXEC SQL
               SELECT ACCT_BALANCE, ACCT_STATUS
               INTO   :WS-BALANCE, :WS-STATUS
               FROM   ACCOUNT_MASTER
               WHERE  ACCT_NUMBER = :WS-ACCT-NUM
           END-EXEC.

           IF SQLCODE NOT = 0
               PERFORM DB2-ERROR-ROUTINE
           END-IF.

Na pilha JCL-COBOL-DB2, o JCL fornece o ambiente de execução e o acesso ao conjunto de dados; o COBOL implementa a lógica de negócios e acessa o banco de dados; o DB2 armazena e recupera dados de acordo com o SQL incorporado no programa COBOL. Um mapa de dependências completo de qualquer programa COBOL que utilize o DB2 deve incluir não apenas quais jobs JCL o invocam, mas também quais tabelas do DB2 ele lê e grava, quais colunas ele acessa e quais outros programas acessam as mesmas tabelas, pois uma alteração no esquema de uma tabela afeta todos os programas COBOL que a referenciam.

Por que o mapeamento de JCL para COBOL é importante para a modernização

Mapear JCL para COBOL não é primordialmente um exercício técnico. É um exercício de gestão de riscos. Cada alteração em um sistema mainframe, seja modificando um parâmetro JCL, adicionando uma etapa, alterando o nome de um conjunto de dados ou modificando o programa COBOL invocado por um job, acarreta consequências que vão além do componente alterado. A única maneira de dimensionar essas consequências com precisão antes de efetuar uma alteração é ter um mapeamento completo do que existe e de como tudo se conecta.

Antes da migração : Mover cargas de trabalho em lote do mainframe para a nuvem exige saber quais jobs JCL existem, quais programas COBOL eles invocam, quais conjuntos de dados fluem entre as etapas, qual é a sequência de execução e o que acontece quando as etapas falham. Sem esse mapeamento, a equipe de migração trabalha com documentação incompleta ou sem documentação alguma. Etapas são esquecidas. Dependências são descobertas em produção. Os prazos de transição são adiados.

Antes de qualquer alteração no código : Um programa COBOL modificado sem verificar quais jobs JCL o invocam pode interromper jobs executados sob diferentes condições ou com diferentes configurações de conjunto de dados. Uma alteração em um parâmetro JCL que pareça local pode afetar o comportamento de um programa COBOL que depende de atributos específicos do conjunto de dados. A análise de impacto exige o conhecimento de toda a cadeia JCL-COBOL-conjunto de dados antes de qualquer alteração ser feita.

Para transferência de conhecimento : Quando um desenvolvedor COBOL que manteve um sistema de processamento em lote por vinte anos se aposenta, ele leva consigo o modelo mental de como os jobs JCL e os programas COBOL se conectam. Um mapa documentado é o único mecanismo para transferir esse conhecimento para a próxima equipe. Sem ele, os novos desenvolvedores herdam um sistema que não podem modificar com segurança.

Para auditorias de conformidade : Auditorias regulatórias frequentemente exigem a demonstração de que cálculos financeiros, transformações de dados ou controles de acesso se comportam conforme documentado. Se a relação entre JCL e COBOL não estiver documentada, demonstrar isso é impossível sem realizar engenharia reversa do sistema sob pressão da auditoria.

Ferramentas de Gestão e Plataformas de Análise JCL

A natureza multilíngue dos dados do Search Console para este artigo, com consultas em italiano, francês, espanhol, japonês e alemão, todas sobre ferramentas de gerenciamento de JCL, reflete a distribuição global da comunidade de TI de mainframe e a consistência com que equipes em todas as regiões enfrentam o mesmo problema: sua documentação de JCL e COBOL está incompleta, desatualizada ou inexistente.

As ferramentas disponíveis para análise e gerenciamento de JCL se dividem em três categorias:

Ferramentas nativas da IBM : A IBM oferece recursos do Job Entry Subsystem (JES), gerenciamento de spool do JES e o IBM z/OS Batch Runtime. Essas ferramentas lidam com a execução e o monitoramento, mas não fornecem análise ou visualização de dependências entre programas.

Agendadores de tarefas de terceiros : CA7, TWS (Tivoli Workload Scheduler) e ESP Workload Automation da Broadcom gerenciam o agendamento em lote de milhares de tarefas, fornecem agendamento baseado em dependências e alertam sobre falhas. Eles entendem as dependências em nível de tarefa, mas normalmente não analisam os programas COBOL invocados em cada etapa.

Plataformas de análise estática de código e mapeamento de dependências : Ferramentas que analisam o código-fonte JCL e COBOL para construir um modelo estrutural de quais tarefas invocam quais programas, quais programas acessam quais conjuntos de dados e como os dados fluem pelo sistema. Elas fornecem a visibilidade entre camadas que os agendadores de tarefas e as ferramentas nativas da IBM não conseguem: a relação entre uma instrução DD JCL específica e a entrada FILE-CONTROL COBOL correspondente, ou entre um programa COBOL que grava em um conjunto de dados e a próxima tarefa que lê esse conjunto de dados como entrada.

SMART TS XL Pertence a esta terceira categoria e a amplia para abranger todas as linguagens no ambiente empresarial, COBOL, JCL, PL/I, Assembler, SQL, Java e outras, fornecendo a análise estrutural entre linguagens que nenhuma ferramenta de linguagem única consegue oferecer.

Como SMART TS XL Mapeia JCL para COBOL em escala empresarial

O mapeamento manual de JCL para COBOL é viável para um único job com três etapas. No entanto, não é viável para uma organização com 50,000 jobs JCL, 200,000 programas COBOL e milhões de referências a conjuntos de dados acumuladas ao longo de quatro décadas. A relação entre um PROC específico, os parâmetros simbólicos usados ​​para invocá-lo, os programas COBOL aos quais esses parâmetros são atribuídos e os conjuntos de dados acessados ​​por esses programas não pode ser rastreada manualmente nessa escala.

SMART TS XL Analisa o código-fonte JCL e COBOL, incluindo PROCs com substituição simbólica de parâmetros, procedimentos in-stream, membros INCLUDE, sobrescritas e lógica de execução condicional, e constrói um modelo de referência cruzada unificado que representa cada relacionamento estrutural no sistema. Esse modelo é consultável, navegável e está sempre atualizado, pois é regenerado a partir da fonte, em vez de ser mantido como um documento atualizado manualmente.

O Expansão JCL A capacidade de resolver a substituição simbólica de parâmetros mostra os programas e conjuntos de dados reais invocados por qualquer PROC, levando em consideração as substituições aplicadas por cada tarefa de chamada. Um PROC que usa &PGMNAME Um parâmetro simbólico aparece no modelo como todos os programas concretos aos quais ele se resolve em todos os seus chamadores, e não como uma referência não resolvida.

A funcionalidade de mapeamento de dependências de aplicativos constrói o grafo completo, desde o job JCL até o programa COBOL, passando pela tabela DB2 e chegando ao programa subsequente, mostrando cada componente do sistema e todas as conexões entre eles. Antes de qualquer alteração de modernização, a equipe pode consultar: quais jobs invocam este programa? Quais conjuntos de dados este programa lê? Quais outros programas gravam nesses conjuntos de dados? Quais jobs são executados em seguida na sequência?

A funcionalidade de análise de impacto gera um escopo enumerado de consequências para qualquer alteração proposta: modifique este copybook e veja todos os programas que o incluem; altere o layout deste conjunto de dados e veja todas as instruções JCL DD que o referenciam; remova esta etapa de um job e veja todas as etapas subsequentes que dependiam de sua saída.

Para equipes que enfrentam o mapeamento de JCL para COBOL como parte de um modernização legada programa SMART TS XL Fornece a base que os fornecedores de modernização, como Astadia, TSRI, Advanced e outros, precisam antes de iniciar qualquer trabalho de conversão: um inventário estrutural completo e preciso do que existe, para que o escopo da conversão seja definido por análise e não por suposição.

O mapa não é o território, mas é o ponto de partida.

JCL e COBOL não vão desaparecer. Os sistemas em lote que processam a folha de pagamento, gerenciam sinistros de seguros, geram relatórios regulatórios e liquidam transações financeiras continuarão rodando em mainframes enquanto as migrações para a nuvem são planejadas, aprovadas, financiadas e executadas, um processo que normalmente leva anos, e não meses. Durante esses anos, os sistemas precisam ser mantidos, modificados e compreendidos.

O mapeamento de JCL para COBOL não é um projeto pontual. É uma prática contínua: manter o modelo estrutural atualizado à medida que os programas são modificados, os jobs são adicionados e os conjuntos de dados são reorganizados. As equipes que investem nessa prática mantêm a capacidade de fazer alterações com segurança em sistemas que a maioria da indústria trata como caixas-pretas. As equipes que não o fazem estão realizando alterações em sistemas que não conseguem visualizar completamente, em ambientes onde uma dependência não atendida não gera um erro de compilação, mas sim uma falha em produção às 3 da manhã durante a execução noturna do processamento em lote.