Translate

Mostrar mensagens com a etiqueta Load Library. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta Load Library. Mostrar todas as mensagens

terça-feira, 24 de maio de 2022

Da Compilação à Execução de um Programa COBOL

 

Bellacosa Mainframe e a compilaçao de um programa cobol

☕ Um Café no Bellacosa Mainframe

Da Compilação à Execução de um Programa COBOL

A jornada completa do código-fonte até a CPU do IBM Z

Para quem está começando no universo mainframe, compilar um programa COBOL pode parecer uma tarefa simples:

Escrever o código
Compilar
Executar

Mas, no IBM Z, existe uma verdadeira cadeia industrial entre a primeira linha do fonte e o momento em que uma CPU começa a executar as instruções do programa.

O código pode depender de copybooks, comandos CICS, instruções SQL, chamadas IMS, interfaces Adabas, arquivos QSAM, clusters VSAM, bibliotecas de carga, JCL, JES2, Language Environment, memória e vários componentes do z/OS.

Por isso, dizer que um programa foi apenas “compilado e executado” é como afirmar que um avião simplesmente saiu do papel e começou a voar.

Entre o projeto e o voo existem dezenas de etapas.

Esta série em quatro capítulos foi criada para mostrar essa jornada completa de maneira progressiva, sempre pensando no Programador COBOL Padawan que deseja compreender não apenas como escrever código, mas como o mainframe realmente pensa.


O grande mapa da jornada

Antes de conhecer cada capítulo, observe o fluxo completo:

Regra de negócio
       ↓
Código-fonte COBOL
       ↓
Copybooks
       ↓
Tradução CICS
       ↓
Processamento Db2
       ↓
Interfaces IMS e Adabas
       ↓
Compilação
       ↓
Código objeto
       ↓
Binder
       ↓
Load module
       ↓
Load library
       ↓
JCL ou transação
       ↓
JES2 ou subsistema online
       ↓
Loader
       ↓
Memória
       ↓
Dispatcher
       ↓
CPU
       ↓
Dados, relatórios e resultados

Cada etapa possui uma responsabilidade específica.

Quando uma delas falha, o problema pode aparecer como:

  • erro de compilação;

  • erro de linkedição;

  • package Db2 inválido;

  • programa não encontrado;

  • arquivo ausente;

  • FILE STATUS;

  • SQLCODE;

  • erro CICS;

  • status IMS;

  • response code Adabas;

  • return code;

  • abend.

A melhor forma de investigar qualquer problema é descobrir em qual parte dessa cadeia ele ocorreu.


Parte I — O nascimento do programa COBOL

Código-fonte, bibliotecas e copybooks

O primeiro capítulo apresenta o ponto de partida: o código-fonte COBOL.

É nele que o programador transforma uma regra de negócio em instruções como:

MOVE
COMPUTE
PERFORM
READ
WRITE
CALL

Porém, o programa raramente vive sozinho.

Muitas aplicações utilizam copybooks para compartilhar:

  • layouts de arquivos;

  • registros;

  • áreas de comunicação;

  • constantes;

  • códigos de retorno;

  • estruturas de mensagens;

  • campos de tabelas;

  • contratos entre programas.

Um programa pode conter:

       COPY CPYCLI01.

Durante o processo de compilação, o conteúdo desse copybook é incorporado logicamente ao fonte.

O capítulo também explica uma diferença fundamental:

COPY inclui fonte.
CALL executa outro programa.

Essa distinção é importante porque um copybook não é um módulo executável.

Ele é uma estrutura reutilizável inserida no programa durante sua preparação.

Outro ponto central é que o copybook funciona como um contrato.

Se dois programas compartilham uma área de memória, ambos precisam interpretar exatamente o mesmo layout.

Uma alteração feita sem análise de impacto pode provocar:

  • campos deslocados;

  • valores incorretos;

  • erros numéricos;

  • corrupção de dados;

  • abends;

  • falhas silenciosas.

A primeira parte também mostra como o compilador localiza copybooks por meio de bibliotecas associadas a DD statements como SYSLIB.

A ordem dessas bibliotecas pode determinar qual versão do copybook será utilizada.

Isso significa que até mesmo uma compilação com retorno zero pode gerar um programa incorreto caso tenha utilizado uma versão inadequada de determinada estrutura.

Leia a Parte I

https://eljefemidnightlunch.blogspot.com/2022/01/da-compilacao-execucao-de-um-programa.html


Parte II — CICS, Db2, IMS e Adabas

O que acontece antes da compilação

O segundo capítulo mostra que nem tudo o que aparece dentro de um programa COBOL pertence diretamente à linguagem.

Comandos como:

           EXEC CICS
                READ FILE('CLIENTES')
           END-EXEC.

ou:

           EXEC SQL
                SELECT NOME
                  INTO :WS-NOME
                  FROM CLIENTES
           END-EXEC.

precisam ser processados por componentes especializados.

CICS

Os comandos EXEC CICS são interpretados pelo tradutor CICS.

O fluxo conceitual é:

Fonte COBOL com EXEC CICS
             ↓
Tradutor CICS
             ↓
Fonte COBOL preparado
             ↓
Compilador

O programa pede ao CICS que execute serviços como:

  • leitura de arquivos;

  • envio e recebimento de mapas;

  • acesso a filas;

  • chamada de programas;

  • controle de transações;

  • sincronização;

  • gerenciamento de recursos.

O COBOL contém a regra de negócio.

O CICS administra o ambiente transacional.

Db2

Comandos EXEC SQL precisam ser processados pelo pré-compilador Db2 ou por um coprocessador integrado.

Esse processamento pode gerar:

Fonte COBOL preparado
DBRM

O fonte segue para o compilador.

O DBRM segue para o BIND do Db2.

Esse BIND cria um package com as instruções SQL preparadas.

O capítulo esclarece uma confusão frequente:

Binder do z/OS cria o executável.
BIND do Db2 cria o package SQL.

São processos diferentes.

IMS

Programas COBOL podem acessar bancos hierárquicos e mensagens IMS por meio de chamadas DL/I.

Entre as funções comuns estão:

GU
GN
GNP
ISRT
REPL
DLET

O ambiente também utiliza estruturas como:

  • DBD;

  • PSB;

  • PCB;

  • SSA;

  • layouts de segmentos.

Adabas

O acesso ao Adabas pode envolver:

  • control blocks;

  • format buffers;

  • record buffers;

  • search buffers;

  • value buffers;

  • interfaces de chamada;

  • response codes.

Apesar de suas diferenças, CICS, Db2, IMS e Adabas compartilham o mesmo princípio:

O programa COBOL executa a regra de negócio e solicita serviços a subsistemas especializados.

Leia a Parte II

https://eljefemidnightlunch.blogspot.com/2022/02/da-compilacao-execucao-de-um-programa.html


Parte III — Compilação, linkedição e load library

Como o fonte se transforma em executável

O terceiro capítulo entra no coração técnico da transformação.

Depois que o fonte foi preparado, o compilador COBOL entra em cena.

Seu trabalho não se limita a trocar comandos por instruções de máquina.

Ele também analisa:

  • sintaxe;

  • campos;

  • tipos de dados;

  • tamanhos;

  • parágrafos;

  • referências;

  • opções;

  • arquivos;

  • copybooks;

  • expressões;

  • compatibilidade;

  • oportunidades de otimização.

O resultado principal é o código objeto.

Fonte COBOL
      ↓
Compilador
      ↓
Código objeto

Porém, o código objeto ainda pode possuir referências não resolvidas.

Um programa pode chamar:

           CALL 'PGMVALID'
                USING AREA-DADOS.

Se essa chamada precisar ser resolvida antecipadamente, será necessário localizar o módulo correspondente durante a linkedição.

O Binder

O Binder do z/OS reúne:

  • código objeto;

  • rotinas;

  • interfaces;

  • módulos externos;

  • pontos de entrada;

  • componentes de runtime.

O resultado é o módulo executável.

Código objeto
      +
Dependências
      ↓
Binder
      ↓
Load module ou program object

Esse executável é gravado em uma biblioteca como:

EMPRESA.SISTEMA.LOADLIB(PGMCLI01)

Chamadas estáticas e dinâmicas

O capítulo também explica a diferença entre chamadas estáticas e dinâmicas.

Estática

A dependência é resolvida durante a linkedição.

Dinâmica

O módulo é procurado durante a execução.

Essa escolha afeta:

  • implantação;

  • tamanho do executável;

  • manutenção;

  • versionamento;

  • risco de programa não encontrado;

  • necessidade de relinkedição.

Return codes

Compilador e Binder produzem mensagens e return codes.

Um RC=0 indica que a etapa terminou normalmente, mas não prova que a lógica está correta.

Um RC=4 pode conter warnings importantes.

Um erro de linkedição pode indicar:

  • símbolo não resolvido;

  • módulo ausente;

  • biblioteca errada;

  • ponto de entrada incorreto;

  • interface incompatível.

O capítulo reforça uma lição essencial:

Programa compilado não significa programa testado.

Leia a Parte III

https://eljefemidnightlunch.blogspot.com/2022/03/da-compilacao-execucao-de-um-programa.html


Parte IV — Da load library à CPU

JCL, JES2, QSAM, VSAM, memória e processamento

O quarto capítulo acompanha o executável durante a execução real.

Depois da linkedição, o programa está pronto, mas ainda permanece parado em uma load library.

No ambiente batch, o JCL solicita sua execução:

//STEP01 EXEC PGM=PGMCLI01

Uma STEPLIB pode informar onde o módulo deve ser procurado:

//STEPLIB DD DISP=SHR,
//           DSN=EMPRESA.SISTEMA.LOADLIB

Se o módulo não for encontrado, pode ocorrer um erro como S806.

QSAM

Programas que acessam arquivos sequenciais podem utilizar QSAM.

No COBOL:

ASSIGN TO CLIENTES

No JCL:

//CLIENTES DD DISP=SHR,
//            DSN=EMPRESA.DADOS.CLIENTES

A ligação é:

Nome lógico COBOL
       ↓
DDNAME
       ↓
Dataset físico

VSAM

VSAM oferece organizações como:

  • KSDS;

  • ESDS;

  • RRDS;

  • LDS;

  • VRRDS.

Um KSDS pode ser acessado por chave e também de forma sequencial.

O programa precisa verificar o FILE STATUS depois das operações.

Retornos como 00, 10, 22, 23, 35 e 39 possuem significados diferentes conforme a operação e o contexto.

JES2

O JES2 administra o fluxo batch.

Ele:

  • recebe o job;

  • mantém filas;

  • utiliza o spool;

  • organiza classes;

  • administra saídas;

  • acompanha o processamento.

O JES2 não executa diretamente as instruções COBOL.

O fluxo correto é mais próximo de:

JES2 administra o job
Initiator inicia o step
z/OS prepara o ambiente
Loader carrega o módulo
Dispatcher entrega processador
CPU executa as instruções

Memória e CPU

O programa é carregado em um address space.

O Language Environment prepara o runtime.

O dispatcher distribui capacidade de processamento.

O WLM ajuda a priorizar workloads conforme objetivos de serviço.

A CPU não executa comandos COBOL como:

MOVE
READ
PERFORM
COMPUTE

Ela executa as instruções de máquina produzidas pelo compilador.

O capítulo também explica a diferença entre:

Tempo de CPU
Tempo decorrido

Um job pode permanecer dez minutos em execução e consumir apenas alguns segundos de CPU.

O restante pode ser espera por:

  • arquivos;

  • Db2;

  • IMS;

  • Adabas;

  • locks;

  • filas;

  • mensagens;

  • armazenamento;

  • rede.

Leia a Parte IV

https://eljefemidnightlunch.blogspot.com/2022/04/da-compilacao-execucao-de-um-programa.html


O que o Padawan aprende com a série

Ao concluir os quatro capítulos, o iniciante passa a compreender que um programa COBOL não é apenas um membro dentro de uma biblioteca.

Ele faz parte de uma cadeia maior.

Fonte
Copybook
Tradutor
Pré-compilador
Compilador
Objeto
Binder
Load
Package
JCL
JES2
Spool
Loader
Memória
CPU
Dados
Resultado

Essa visão permite investigar problemas com muito mais precisão.

Em vez de dizer:

“O programa não funciona”,

o profissional começa a perguntar:

  • O fonte correto foi compilado?

  • O copybook correto foi utilizado?

  • O CICS traduziu os comandos?

  • O DBRM foi gerado?

  • O package Db2 foi criado?

  • O Binder resolveu todas as referências?

  • O load foi gravado na biblioteca correta?

  • A STEPLIB aponta para essa biblioteca?

  • O DDNAME corresponde ao ASSIGN TO?

  • O dataset existe?

  • O FILE STATUS foi tratado?

  • O SQLCODE foi verificado?

  • O programa terminou com return code ou abend?

  • O tempo foi gasto em CPU ou em espera?

Essas perguntas transformam uma investigação baseada em tentativa e erro em um diagnóstico técnico estruturado.


A diferença entre escrever COBOL e entender o mainframe

Escrever COBOL é uma habilidade importante.

Mas compreender o ciclo completo de construção e execução é o que permite ao profissional atuar com segurança em ambientes corporativos.

O programador que conhece apenas o fonte pode corrigir uma linha.

O profissional que conhece o ecossistema consegue compreender:

  • por que uma alteração não chegou ao ambiente;

  • por que o programa antigo continua executando;

  • por que um package está incompatível;

  • por que o arquivo não abriu;

  • por que o job está aguardando;

  • por que o tempo decorrido aumentou;

  • por que a CPU não é a causa da lentidão;

  • por que uma recompilação em massa foi necessária;

  • por que um copybook deve ser tratado como contrato.

Esse é o verdadeiro objetivo da série.

Não ensinar apenas comandos.

Ensinar a enxergar o sistema completo.


Leia a série completa

Parte I

O Nascimento do Programa COBOL: Código-fonte e Copybooks

Parte II

CICS, Db2, IMS e Adabas: O Código Antes da Compilação

Parte III

Compilação, Linkedição e Load Library

Parte IV

Da Load Library à CPU: JCL, JES2, QSAM, VSAM e Execução


Conclusão

A jornada de um programa COBOL começa muito antes da execução.

Ela nasce na regra de negócio.

Ganha forma no código-fonte.

Reutiliza estruturas por meio de copybooks.

Conversa com CICS, Db2, IMS e Adabas.

É analisada pelo compilador.

Transforma-se em código objeto.

É reunida pelo Binder.

Torna-se um módulo executável.

É armazenada em uma load library.

Depois, um JCL, uma transação ou um subsistema solicita sua execução.

O JES2 administra o job.

O initiator inicia os steps.

O loader coloca o programa em memória.

O z/OS gerencia recursos.

O WLM orienta prioridades.

O dispatcher entrega capacidade de processamento.

A CPU executa as instruções.

QSAM, VSAM, Db2, IMS, CICS e Adabas fornecem os dados e serviços necessários.

Por fim, o programa produz relatórios, atualizações, mensagens, arquivos e resultados de negócio.

Nada simplesmente “roda”.

Tudo é preparado, ligado, controlado, carregado, executado e registrado.

“O Padawan observa o código-fonte. O especialista acompanha toda a jornada, desde o primeiro COPY até o último ciclo de CPU.”

 

sexta-feira, 15 de abril de 2022

Da Compilação à Execução de um Programa COBOL — Parte IV

 

Bellacosa Mainframe compilacao cobol parte iv

☕ Um Café no Bellacosa Mainframe

Da Compilação à Execução de um Programa COBOL — Parte IV

Da Load Library à CPU: Como JES2, JCL, QSAM, VSAM, Memória e z/OS Colocam o Programa para Trabalhar

Introdução

Nas três primeiras partes desta jornada, acompanhamos o nascimento e a transformação de um programa COBOL.

Primeiro, vimos que tudo começa com o código-fonte e com os copybooks, que funcionam como contratos de dados compartilhados entre programas, arquivos e subsistemas.

Depois, conhecemos o papel de ambientes especializados como:

  • CICS;

  • Db2;

  • IMS;

  • Adabas.

Descobrimos que comandos EXEC CICS precisam ser traduzidos, que instruções EXEC SQL precisam ser processadas pelo Db2 e que aplicações IMS ou Adabas dependem de interfaces específicas.

Na terceira parte, entramos na fábrica de software do IBM Z.

O compilador transformou o fonte em código objeto.

O Binder resolveu referências, reuniu módulos e criou o executável.

Ao final, o programa foi armazenado em uma load library:

EMPRESA.SISTEMA.LOADLIB(PGMCLI01)

Agora, finalmente, chegou a hora de responder à pergunta que todo Programador COBOL Padawan faz:

Como esse membro armazenado em uma biblioteca realmente começa a executar?

Ter um load module não significa que o programa já esteja trabalhando.

Ele ainda precisa ser:

  • solicitado;

  • localizado;

  • carregado;

  • associado aos arquivos;

  • colocado em memória;

  • entregue ao ambiente de execução;

  • despachado para um processador;

  • monitorado até o término.

Nesta quarta e última parte, acompanharemos essa jornada completa.

Veremos como o JCL solicita a execução, como o JES2 administra o job, como o initiator inicia os steps, como QSAM e VSAM são conectados ao programa, como o z/OS administra memória e processadores e por que a CPU nunca enxerga uma única linha de COBOL.

Prepare a última xícara desta série.

O programa já foi construído.

Agora ele precisa entrar em produção.


1. O executável está pronto, mas ainda está parado

Depois da linkedição, temos um módulo executável armazenado em uma biblioteca:

EMPRESA.SISTEMA.LOADLIB(PGMCLI01)

Esse módulo contém instruções de máquina, pontos de entrada, referências resolvidas e estruturas necessárias para a execução.

Porém, sozinho, ele não realiza trabalho algum.

É como um automóvel estacionado dentro de uma garagem.

O veículo está montado.

O motor existe.

Os sistemas estão disponíveis.

Mas alguém ainda precisa:

  • localizar o carro;

  • abrir a garagem;

  • fornecer combustível;

  • ligar o motor;

  • definir o destino;

  • colocá-lo na estrada.

No ambiente batch, essa missão normalmente começa com um JCL.


2. O JCL solicita a execução

JCL significa Job Control Language.

Ele não é uma linguagem de programação de negócio como COBOL.

Sua função é descrever ao sistema operacional:

  • qual programa deverá ser executado;

  • quais arquivos serão utilizados;

  • quais bibliotecas contêm os módulos;

  • para onde enviar as saídas;

  • quais recursos serão necessários;

  • quais condições controlam os steps;

  • como o job deverá ser classificado.

Um exemplo simples:

//EXECUTA  JOB (1234),'BELLACOSA',
//             CLASS=A,
//             MSGCLASS=X,
//             NOTIFY=&SYSUID
//*
//STEP01   EXEC PGM=PGMCLI01
//STEPLIB  DD DISP=SHR,
//            DSN=EMPRESA.SISTEMA.LOADLIB
//CLIENTES DD DISP=SHR,
//            DSN=EMPRESA.DADOS.CLIENTES
//RELATORIO DD SYSOUT=*
//SYSOUT   DD SYSOUT=*

A instrução principal é:

//STEP01 EXEC PGM=PGMCLI01

Ela informa ao sistema:

Execute o programa chamado PGMCLI01.

Mas para isso funcionar, o z/OS precisa encontrar esse módulo.


3. Como o sistema encontra o programa?

O nome informado em:

PGM=PGMCLI01

não contém o nome completo da biblioteca.

O sistema precisa pesquisar em bibliotecas disponíveis para localizar o módulo.

Em batch, uma das formas mais comuns é utilizar STEPLIB:

//STEPLIB DD DISP=SHR,
//           DSN=EMPRESA.SISTEMA.LOADLIB

Isso informa que, durante aquele step, a biblioteca deverá participar da procura pelo executável.

Também podem existir outros mecanismos, como:

  • JOBLIB;

  • TASKLIB;

  • LNKLST;

  • bibliotecas do sistema;

  • bibliotecas privadas;

  • bibliotecas concatenadas;

  • ambientes especializados.

O princípio é:

Nome do programa
       ↓
Pesquisa nas bibliotecas
       ↓
Módulo localizado
       ↓
Carga e execução

4. A ordem das bibliotecas importa

Imagine:

//STEPLIB DD DISP=SHR,
//           DSN=EMPRESA.TESTE.LOADLIB
//        DD DISP=SHR,
//           DSN=EMPRESA.ANTIGA.LOADLIB

Se PGMCLI01 existir na primeira biblioteca, essa versão será utilizada.

Agora imagine a ordem inversa:

//STEPLIB DD DISP=SHR,
//           DSN=EMPRESA.ANTIGA.LOADLIB
//        DD DISP=SHR,
//           DSN=EMPRESA.TESTE.LOADLIB

O programa antigo poderá ser encontrado primeiro.

O programador compila uma alteração, executa o job e não percebe nenhuma mudança.

Então começa a revisar:

  • o COBOL;

  • o copybook;

  • o IF;

  • o MOVE;

  • o SQL;

  • os dados.

Mas o problema real é muito mais simples:

O sistema está executando outro load.

Essa situação é tão comum que todo profissional mainframe deveria verificar primeiro:

  • em qual load library o módulo foi gerado;

  • qual biblioteca está no JCL;

  • qual é a ordem da concatenação;

  • se existe outro membro com o mesmo nome;

  • se o ambiente online já carregou a nova versão.


5. O que acontece se o programa não for encontrado?

Quando o módulo não está disponível nas bibliotecas pesquisadas, o sistema pode produzir um erro associado a programa não encontrado.

Um exemplo clássico é o abend:

S806

Isso geralmente significa que o sistema tentou localizar o módulo, mas não encontrou uma versão executável disponível.

As causas podem incluir:

  • STEPLIB ausente;

  • biblioteca incorreta;

  • membro inexistente;

  • erro no nome do programa;

  • programa gravado em outra load library;

  • módulo não promovido;

  • biblioteca indisponível;

  • ponto de entrada incorreto.

Observe que o fonte COBOL pode estar perfeito.

A compilação pode ter terminado com RC=0.

A linkedição também pode ter terminado corretamente.

Mesmo assim, a execução falha porque o executável não foi encontrado.

Essa é a diferença entre:

Criar o programa

e:

Disponibilizar o programa para execução

6. O programa precisa de dados

Localizar o executável é apenas o começo.

Um programa real costuma depender de:

  • arquivos sequenciais;

  • clusters VSAM;

  • tabelas Db2;

  • bancos IMS;

  • arquivos Adabas;

  • mensagens MQ;

  • filas CICS;

  • parâmetros;

  • relatórios;

  • arquivos de trabalho.

No batch, muitos desses recursos são associados ao programa por DD statements no JCL.

É aqui que entramos no universo de QSAM e VSAM.


7. O que é QSAM?

QSAM significa Queued Sequential Access Method.

Ele é um método tradicional de acesso sequencial a datasets no z/OS.

Em um arquivo sequencial, os registros normalmente são processados na ordem em que estão armazenados.

No COBOL:

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.

           SELECT ARQ-CLIENTES
               ASSIGN TO CLIENTES
               ORGANIZATION IS SEQUENTIAL
               ACCESS MODE IS SEQUENTIAL
               FILE STATUS IS WS-FILE-STATUS.

Na FILE SECTION:

       FD  ARQ-CLIENTES.

       01  REGISTRO-CLIENTE.
           05 REG-CODIGO        PIC 9(09).
           05 REG-NOME          PIC X(40).
           05 REG-SALDO         PIC S9(11)V99 COMP-3.

Na lógica:

           OPEN INPUT ARQ-CLIENTES

           PERFORM UNTIL FIM-ARQUIVO
               READ ARQ-CLIENTES
                   AT END
                       SET FIM-ARQUIVO TO TRUE
                   NOT AT END
                       PERFORM PROCESSAR-CLIENTE
               END-READ
           END-PERFORM

           CLOSE ARQ-CLIENTES.

O programa conhece o arquivo pelo nome lógico:

CLIENTES

O JCL conecta esse nome lógico a um dataset físico.


8. O contrato entre COBOL e JCL

No programa:

ASSIGN TO CLIENTES

No JCL:

//CLIENTES DD DISP=SHR,
//            DSN=EMPRESA.DADOS.CLIENTES

A ligação é:

SELECT ARQ-CLIENTES
       ↓
ASSIGN TO CLIENTES
       ↓
DDNAME CLIENTES
       ↓
EMPRESA.DADOS.CLIENTES

Essa separação é extremamente poderosa.

O programa não precisa possuir no fonte:

EMPRESA.DADOS.CLIENTES

O mesmo executável pode ser usado em diferentes ambientes.

Desenvolvimento

//CLIENTES DD DISP=SHR,
//            DSN=DESENV.DADOS.CLIENTES

Homologação

//CLIENTES DD DISP=SHR,
//            DSN=HOMOLOG.DADOS.CLIENTES

Produção

//CLIENTES DD DISP=SHR,
//            DSN=PROD.DADOS.CLIENTES

O load module é o mesmo.

O que muda é o JCL e o ambiente.


9. Quando o DDNAME está errado

Imagine que o COBOL espera:

ASSIGN TO CLIENTES

Mas o JCL fornece:

//ARQCLI DD DISP=SHR,
//          DSN=EMPRESA.DADOS.CLIENTES

O dataset existe.

O programa existe.

A biblioteca está correta.

Porém, o nome lógico não corresponde ao DDNAME esperado.

O programa procura CLIENTES.

O JCL forneceu ARQCLI.

Essa divergência poderá provocar erro de abertura.

Esse problema ensina uma grande lição:

Em mainframe, muitos erros surgem da quebra de contratos entre componentes.

O COBOL, o JCL, os arquivos e os subsistemas precisam falar a mesma língua.


10. OPEN, READ, WRITE e CLOSE

Um programa QSAM normalmente segue um ciclo.

OPEN
  ↓
READ ou WRITE
  ↓
Processamento
  ↓
CLOSE

Exemplo de entrada:

           OPEN INPUT ARQ-ENTRADA

Exemplo de saída:

           OPEN OUTPUT ARQ-SAIDA

Leitura:

           READ ARQ-ENTRADA
               AT END
                   SET FIM-ARQUIVO TO TRUE
           END-READ

Gravação:

           WRITE REGISTRO-SAIDA

Finalização:

           CLOSE ARQ-ENTRADA
                 ARQ-SAIDA

O compilador gera chamadas e instruções necessárias para trabalhar com o access method.

Durante a execução, o z/OS e seus componentes realizam o acesso real ao dataset.


11. O que é VSAM?

VSAM significa Virtual Storage Access Method.

Ele fornece diferentes formas de organização de dados.

Entre elas:

  • KSDS;

  • ESDS;

  • RRDS;

  • LDS;

  • VRRDS.

Para um Programador COBOL Padawan, o KSDS é um dos mais importantes.

KSDS significa Key-Sequenced Data Set.

Os registros podem ser acessados por uma chave.

Exemplo:

       FILE-CONTROL.

           SELECT ARQ-CLIENTES
               ASSIGN TO CLIENTES
               ORGANIZATION IS INDEXED
               ACCESS MODE IS DYNAMIC
               RECORD KEY IS REG-CODIGO
               FILE STATUS IS WS-FILE-STATUS.

O campo:

REG-CODIGO

é a chave do registro.


12. Acesso sequencial e direto no VSAM

Um KSDS pode permitir diferentes formas de acesso.

Acesso sequencial

O programa lê os registros em ordem de chave.

           READ ARQ-CLIENTES NEXT RECORD
               AT END
                   SET FIM-ARQUIVO TO TRUE
           END-READ.

Acesso direto

O programa informa uma chave específica.

           MOVE WS-CODIGO-PESQUISA
             TO REG-CODIGO

           READ ARQ-CLIENTES
               KEY IS REG-CODIGO
               INVALID KEY
                   DISPLAY 'CLIENTE NAO ENCONTRADO'
           END-READ.

Acesso dinâmico

Permite combinar acessos sequenciais e diretos.

ACCESS MODE IS DYNAMIC

Esse tipo de flexibilidade tornou VSAM fundamental em muitas aplicações corporativas.


13. FILE STATUS

Um programa não deve presumir que uma operação de arquivo sempre funcionou.

Por isso, pode utilizar:

FILE STATUS IS WS-FILE-STATUS

Definição:

       01  WS-FILE-STATUS       PIC X(02).

Depois de uma operação:

           IF WS-FILE-STATUS NOT = '00'
               DISPLAY 'ERRO NO ARQUIVO: '
                       WS-FILE-STATUS
           END-IF.

Alguns retornos conhecidos são:

00 → operação concluída com sucesso
10 → fim de arquivo
22 → possibilidade de chave duplicada
23 → registro não encontrado
35 → problema na abertura ou arquivo ausente
39 → conflito de atributos

A interpretação exata precisa considerar:

  • operação executada;

  • organização do arquivo;

  • ambiente;

  • documentação;

  • mensagem adicional.


14. FILE STATUS 10 não é necessariamente erro

Em processamento sequencial, o retorno:

10

normalmente indica fim de arquivo.

Isso faz parte do fluxo esperado.

Exemplo:

           READ ARQ-ENTRADA
               AT END
                   SET FIM-ARQUIVO TO TRUE
           END-READ.

O programa precisa distinguir:

Fim normal de arquivo

de:

Erro de leitura

Tratar todos os retornos diferentes de 00 como falha pode produzir lógica incorreta.


15. QSAM e VSAM não ficam dentro do executável

O load module contém o programa.

Os dados permanecem em datasets separados.

LOADLIB
  └── PGMCLI01

Dataset QSAM
  └── registros sequenciais

Cluster VSAM
  └── registros organizados

Tabela Db2
  └── linhas relacionais

Banco IMS
  └── segmentos hierárquicos

Arquivo Adabas
  └── registros gerenciados pelo Nucleus

O executável contém a lógica.

Os datasets e bancos contêm os dados.

O JCL e os subsistemas conectam os dois mundos.


16. O que é JES2?

JES2 significa Job Entry Subsystem 2.

Ele é um dos componentes mais importantes do processamento batch no z/OS.

Uma confusão comum é imaginar que o JES2 executa diretamente o programa COBOL.

Ele não faz isso.

O JES2 administra o fluxo do job.

Entre suas responsabilidades estão:

  • receber jobs;

  • armazenar entrada;

  • organizar filas;

  • considerar classes;

  • controlar prioridades;

  • administrar spool;

  • acompanhar saída;

  • direcionar impressão;

  • reter resultados;

  • fornecer informações ao operador.

Podemos pensar no JES2 como um grande controlador de tráfego batch.


17. O ciclo de um job

Um fluxo simplificado:

Programador submete o JCL
            ↓
JES2 recebe o job
            ↓
Job é colocado no spool
            ↓
JCL é analisado
            ↓
Job aguarda em uma fila
            ↓
Um initiator seleciona o job
            ↓
Os steps são executados
            ↓
As saídas voltam ao spool
            ↓
Usuário consulta no SDSF

O JES2 não executa a instrução COBOL:

ADD WS-VALOR TO WS-TOTAL

Ele gerencia o job que contém o step responsável por iniciar o programa.


18. O que é spool?

Spool é uma área em disco utilizada para armazenar entrada e saída dos jobs.

O termo vem historicamente de:

Simultaneous Peripheral Operations On-Line

Na prática, o spool permite desacoplar a produção da saída de seu consumo imediato.

Por exemplo, um programa pode gerar milhares de linhas de relatório.

Essas linhas não precisam ser enviadas instantaneamente a uma impressora física.

Elas podem ser armazenadas no spool.

Depois, poderão ser:

  • consultadas;

  • impressas;

  • transferidas;

  • retidas;

  • apagadas;

  • analisadas.


19. Saídas comuns no spool

Ao consultar um job no SDSF, podemos encontrar:

JESMSGLG
JESJCL
JESYSMSG
SYSPRINT
SYSOUT
SYSUDUMP
CEEDUMP

JESMSGLG

Contém mensagens relacionadas ao job e ao JES.

JESJCL

Mostra o JCL processado.

Pode incluir expansão de procedures e parâmetros.

JESYSMSG

Contém mensagens do sistema para os steps.

SYSPRINT

Normalmente recebe listagens, relatórios ou mensagens de utilitários.

SYSOUT

Pode conter saída produzida pelo programa.

SYSUDUMP

Pode receber dumps em caso de falha.

CEEDUMP

Pode conter informações produzidas pelo Language Environment.

Essas saídas são fundamentais para diagnóstico.


20. SDSF: a janela para o processamento

SDSF significa System Display and Search Facility.

Por meio dele, o profissional pode:

  • visualizar jobs;

  • acompanhar execução;

  • analisar return codes;

  • consultar spool;

  • verificar classes;

  • observar held output;

  • cancelar jobs;

  • liberar saída;

  • investigar abends;

  • acompanhar started tasks.

O Padawan submete o job e olha apenas a última linha.

O especialista abre cada saída relevante.

Ele procura:

  • qual step falhou;

  • qual RC foi retornado;

  • qual biblioteca foi usada;

  • qual dataset não abriu;

  • qual mensagem apareceu antes do abend;

  • qual componente emitiu o diagnóstico.


21. O que é um initiator?

Um initiator é um componente que seleciona jobs elegíveis para execução e inicia seus steps.

Ele trabalha com elementos como:

  • classe do job;

  • disponibilidade;

  • configuração;

  • capacidade;

  • regras operacionais;

  • prioridade;

  • recursos.

Considere:

//EXECUTA JOB ...,CLASS=A

O job pertence à classe A.

Para que ele seja processado, deve existir um ambiente preparado para executar jobs dessa classe.

O initiator seleciona o job e inicia o processamento.


22. O que acontece quando o step começa?

Para:

//STEP01 EXEC PGM=PGMCLI01

o sistema precisa realizar diversas ações.

  1. Interpretar o step.

  2. Processar parâmetros.

  3. Alocar DD statements.

  4. Verificar datasets.

  5. Localizar o módulo executável.

  6. Preparar o ambiente de execução.

  7. Carregar o programa.

  8. Inicializar o runtime.

  9. Entregar o controle ao programa.

  10. Acompanhar seu término.

  11. Registrar o return code.

  12. Liberar recursos.

  13. Decidir se o próximo step será executado.

Quando o programador vê apenas:

STEP01 RC=0000

toda essa infraestrutura já trabalhou nos bastidores.


23. Alocação de datasets

Antes da execução, o sistema precisa alocar os recursos descritos no JCL.

Exemplo:

//ENTRADA DD DISP=SHR,
//          DSN=EMPRESA.ARQ.ENTRADA

O z/OS verifica elementos como:

  • existência;

  • disponibilidade;

  • catálogo;

  • volume;

  • disposição;

  • compartilhamento;

  • segurança;

  • atributos;

  • conflitos.

Se outro job mantiver um dataset com uso exclusivo, o job atual poderá aguardar.

Por isso, um job pode ficar em estados de espera mesmo antes de iniciar o programa COBOL.


24. O significado de DISP

O parâmetro DISP ajuda a indicar como um dataset será tratado.

Exemplo:

DISP=SHR

Indica compartilhamento.

Outro exemplo:

DISP=OLD

Pode indicar uso exclusivo.

Também é comum:

DISP=(NEW,CATLG,DELETE)

Isso pode significar:

  • criar o dataset;

  • catalogar em término normal;

  • apagar em término anormal.

O JCL participa diretamente da governança dos dados utilizados pelo programa.


25. O loader

Depois que o módulo foi localizado, entra em cena o mecanismo de carga.

O loader coloca o programa no ambiente de memória apropriado.

Ele precisa:

  • localizar o módulo;

  • interpretar sua estrutura;

  • disponibilizar suas seções;

  • resolver elementos necessários em runtime;

  • preparar o ponto de entrada;

  • transferir o controle.

O módulo estava armazenado em disco.

Agora precisa ficar acessível para execução.

Essa passagem é:

Load library
      ↓
Loader
      ↓
Memória
      ↓
Execução

26. O que significa carregar em memória?

Quando dizemos que o programa foi carregado, não significa necessariamente que todo o universo da aplicação foi copiado como um único bloco simples.

O ambiente pode envolver:

  • código executável;

  • áreas de trabalho;

  • runtime COBOL;

  • módulos compartilhados;

  • bibliotecas;

  • buffers;

  • parâmetros;

  • áreas do Language Environment;

  • storage obtido dinamicamente.

O z/OS gerencia memória virtual.

O programa trabalha com endereços virtuais dentro de seu address space.

O sistema operacional administra a relação entre memória virtual, real storage e armazenamento auxiliar.


27. O address space

Um address space é um ambiente de endereçamento no qual programas e tarefas executam.

Um job batch normalmente recebe um address space para sua execução.

Started tasks, regiões CICS, regiões IMS, Db2 e outros subsistemas também possuem seus próprios ambientes.

O address space ajuda a fornecer isolamento.

Um programa em um job não deveria acessar livremente a memória de outro job.

Isso é fundamental para:

  • segurança;

  • estabilidade;

  • confiabilidade;

  • proteção;

  • recuperação.


28. O Language Environment entra em cena

Programas COBOL modernos normalmente utilizam o Language Environment.

Ele fornece serviços comuns para várias linguagens.

Entre suas funções estão:

  • inicialização;

  • passagem de parâmetros;

  • gerenciamento de storage;

  • tratamento de condições;

  • mensagens;

  • dumps;

  • datas;

  • conversões;

  • finalização;

  • interoperabilidade.

Antes de o primeiro parágrafo COBOL realmente executar, o runtime pode precisar preparar o ambiente.

No final, o Language Environment também participa da finalização.

Por isso, muitas falhas aparecem acompanhadas de mensagens iniciadas por:

CEE

29. O programa recebe o controle

Depois da preparação, o controle é transferido para o ponto de entrada do módulo.

Em um programa COBOL, o processamento começa conforme a estrutura gerada pelo compilador.

A lógica da PROCEDURE DIVISION passa a executar.

Exemplo:

       PROCEDURE DIVISION.

           PERFORM INICIALIZAR
           PERFORM PROCESSAR
           PERFORM FINALIZAR

           GOBACK.

Nesse momento, as instruções COBOL já foram transformadas.

A CPU não enxerga:

PERFORM PROCESSAR

Ela enxerga instruções de máquina.


30. A CPU não entende COBOL

A CPU do IBM Z executa instruções da arquitetura.

Ela não interpreta diretamente:

MOVE
READ
COMPUTE
EVALUATE
PERFORM

Esses comandos existiam apenas no fonte.

O compilador transformou a lógica em instruções de máquina.

Portanto:

COBOL → linguagem humana estruturada
Objeto → representação intermediária
Load → módulo executável
CPU → instruções de máquina

Essa abstração permite que o programador pense em regras de negócio, e não em registradores e opcodes durante todo o tempo.


31. A CPU não fica dedicada ao programa

Em um sistema multiprogramado, diversos trabalhos competem por recursos.

O programa não recebe necessariamente uma CPU exclusiva até terminar.

O sistema operacional pode alternar entre unidades de trabalho.

Enquanto um programa está pronto para executar, ele pode receber tempo de processador.

Quando aguarda um recurso, outra tarefa pode utilizar a CPU.

Esse mecanismo permite que milhares de trabalhos coexistam.


32. O dispatcher

O dispatcher é responsável por entregar capacidade de processador a unidades de trabalho elegíveis.

Ele considera prioridades e estados.

Uma tarefa pode estar:

  • executando;

  • pronta;

  • aguardando;

  • bloqueada;

  • suspensa;

  • terminada.

Quando a tarefa está aguardando uma leitura, uma resposta Db2 ou outro recurso, ela não precisa ocupar a CPU.

Outra tarefa pode executar.


33. O papel do WLM

WLM significa Workload Manager.

Ele ajuda o z/OS a gerenciar cargas de trabalho com base em objetivos de serviço.

O WLM trabalha com conceitos como:

  • service classes;

  • goals;

  • importance;

  • performance periods;

  • workload classification;

  • response time;

  • velocity.

Em vez de administrar apenas prioridades fixas, o sistema pode considerar objetivos de negócio.

Por exemplo:

  • uma transação bancária online pode ter meta de resposta rápida;

  • um relatório batch noturno pode possuir janela de horas;

  • um processamento crítico de fechamento pode receber maior importância;

  • uma tarefa de baixa prioridade pode aguardar mais tempo.

O WLM ajuda o sistema a decidir onde a capacidade será mais importante.


34. JES2 não escolhe diretamente a instrução que vai para a CPU

É importante separar responsabilidades.

JES2

Administra jobs, filas, spool e fluxo batch.

Initiator

Seleciona e inicia jobs elegíveis.

z/OS

Gerencia execução, memória, tarefas e recursos.

WLM

Ajuda a orientar objetivos e importância.

Dispatcher

Entrega capacidade de processador às unidades de trabalho.

CPU

Executa instruções de máquina.

Portanto, não é correto dizer simplesmente:

O JES2 executa o COBOL na CPU.

Uma descrição melhor seria:

O JES2 administra o job, o initiator inicia o step, o z/OS prepara o ambiente e o dispatcher permite que a CPU execute as instruções do programa.


35. O programa faz uma leitura

Considere:

           READ ARQ-CLIENTES

Para o programador, é uma única instrução.

Por trás dela, podem participar:

  • runtime COBOL;

  • QSAM ou VSAM;

  • buffers;

  • sistema de arquivos;

  • canais;

  • controladores;

  • armazenamento;

  • cache;

  • memória;

  • interrupções;

  • scheduler;

  • dispositivos.

A aplicação solicita a leitura.

O sistema inicia o acesso.

Enquanto os dados não estão disponíveis, a tarefa pode entrar em espera.

A CPU fica livre para outro trabalho.

Quando a operação termina, a tarefa volta a ficar elegível.


36. Tempo de CPU não é tempo decorrido

Imagine um job que inicia às 01:00 e termina às 01:10.

Tempo decorrido:

10 minutos

Porém, o job pode ter utilizado apenas:

30 segundos de CPU

O restante pode ter sido espera por:

  • leitura de arquivos;

  • escrita;

  • Db2;

  • IMS;

  • Adabas;

  • locks;

  • filas;

  • rede;

  • ENQs;

  • recursos compartilhados;

  • armazenamento.

Por isso:

Elapsed time ≠ CPU time

Essa diferença é essencial em análise de performance.


37. Um programa lento pode não estar consumindo CPU

Quando um job demora, o iniciante pode pensar:

A CPU está lenta.

Mas o problema pode estar em:

  • excesso de I/O;

  • leitura desnecessária;

  • espera por dataset;

  • SQL sem índice;

  • lock Db2;

  • buffer insuficiente;

  • fila MQ;

  • contenção VSAM;

  • acesso IMS;

  • espera por serviço externo;

  • classe inadequada;

  • baixa prioridade.

O diagnóstico exige observar onde o tempo está sendo gasto.


38. Execução de um programa Db2

Um programa Db2 possui pelo menos dois componentes essenciais:

Load module
Package Db2

Durante a execução:

  1. O load é localizado.

  2. O programa inicia.

  3. A interface Db2 é acionada.

  4. A conexão com o subsistema é utilizada.

  5. O package correspondente é localizado.

  6. O SQL é executado.

  7. O Db2 acessa tabelas e índices.

  8. Os dados retornam às host variables.

  9. A SQLCA recebe o resultado.

  10. O programa continua.

Se o load existir, mas o package estiver ausente ou inválido, a execução pode falhar.

O executável COBOL e o artefato Db2 precisam estar alinhados.


39. O Db2 pode fazer o programa esperar

Imagine:

           EXEC SQL
                UPDATE CONTAS
                   SET SALDO = SALDO - :WS-VALOR
                 WHERE CONTA = :WS-CONTA
           END-EXEC.

Se outro processo mantém um lock incompatível, o programa pode esperar.

Durante essa espera, ele não está necessariamente consumindo CPU.

O tempo decorrido aumenta.

O consumo de CPU pode permanecer baixo.

Essa situação reforça a diferença entre processamento e espera.


40. Execução de um programa CICS

Um programa CICS normalmente não é iniciado por um novo job para cada transação.

A região CICS já está ativa como um ambiente de longa duração.

Quando uma transação é solicitada:

  1. O CICS identifica a transação.

  2. Verifica segurança.

  3. Localiza a definição.

  4. Identifica o programa inicial.

  5. Cria uma task.

  6. Carrega o módulo, se necessário.

  7. Entrega o controle.

  8. Processa comandos EXEC CICS.

  9. Gerencia recursos.

  10. Finaliza ou suspende a task.

O JES2 pode ter participado da inicialização da região CICS.

Porém, cada transação não é um job batch independente.


41. A biblioteca DFHRPL

Programas CICS precisam estar disponíveis em bibliotecas acessíveis à região.

Tradicionalmente, a concatenação DFHRPL participa desse processo.

Se o módulo novo foi gravado em uma biblioteca que não está acessível ao CICS, a região pode continuar usando outro load ou não localizar o programa.

Mesmo quando a biblioteca está correta, o CICS pode manter uma versão já carregada.

Pode ser necessário realizar ações como:

  • new copy;

  • phase-in;

  • refresh;

  • atualização do recurso;

  • implantação controlada.

Isso explica por que recompilar um programa CICS não garante que a nova versão já esteja em uso.


42. Reentrância e concorrência no CICS

Múltiplas tasks podem utilizar o mesmo programa.

Por isso, o módulo precisa ser adequado ao ambiente transacional.

Programas reentrantes podem compartilhar código de forma segura, desde que suas áreas mutáveis sejam tratadas corretamente.

Se um programa armazenar estado compartilhado de maneira inadequada, duas transações podem interferir entre si.

O resultado pode ser:

  • dados trocados;

  • corrupção;

  • informações de um cliente em outra transação;

  • falhas imprevisíveis.

O CICS não é apenas uma forma de executar COBOL mais rapidamente.

Ele é um ambiente de alta concorrência e controle transacional.


43. Execução de um programa IMS

Programas IMS podem executar em regiões específicas, como:

  • MPP;

  • BMP;

  • batch DL/I.

O módulo COBOL precisa ser chamado com o ambiente correto.

Também dependem de artefatos como:

  • PSB;

  • PCB;

  • DBD;

  • definições IMS;

  • bibliotecas;

  • parâmetros.

Durante a execução, o programa faz chamadas DL/I.

O IMS navega pelos bancos hierárquicos ou filas de mensagens.

A PCB informa o resultado.

O COBOL continua executando a regra de negócio.


44. Execução de um programa Adabas

Um programa COBOL Adabas utiliza interfaces de comunicação para enviar comandos ao Nucleus.

Durante a execução:

  1. O módulo COBOL é carregado.

  2. A interface Adabas é acionada.

  3. Control block e buffers são fornecidos.

  4. A solicitação chega ao Nucleus.

  5. O Adabas acessa o arquivo.

  6. Os dados retornam ao programa.

  7. O response code é analisado.

Assim como no Db2 e IMS, o programa pode aguardar a resposta do subsistema.

O tempo de CPU não representa sozinho todo o tempo da operação.


45. Chamadas dinâmicas durante a execução

Na terceira parte, vimos chamadas dinâmicas.

Exemplo:

       01  WS-PROGRAMA          PIC X(08).

           MOVE 'PGMVALID'
             TO WS-PROGRAMA

           CALL WS-PROGRAMA
                USING AREA-DADOS.

Nesse caso, PGMVALID será procurado durante a execução.

O sistema precisa localizar o módulo nas bibliotecas disponíveis.

Se não encontrar, poderá ocorrer falha.

Isso significa que um programa pode iniciar corretamente e falhar somente quando chega a determinada chamada.


46. Carregamento de subprogramas

Quando o programa principal chama um módulo dinâmico, podem participar:

  • Language Environment;

  • loader;

  • bibliotecas de carga;

  • cache de módulos;

  • mecanismos do subsistema;

  • regras de compartilhamento.

O subprograma pode ser carregado e mantido disponível conforme o ambiente.

Em CICS, o gerenciamento pertence à região.

Em batch, o runtime e o z/OS participam da carga.


47. CANCEL em COBOL

Em determinados cenários, o COBOL possui a instrução:

           CANCEL 'PGMVALID'

Ela pode influenciar o estado de um programa chamado dinamicamente.

O uso precisa ser compreendido com cuidado.

Nem sempre é necessário ou desejável cancelar módulos após cada chamada.

Isso pode afetar:

  • desempenho;

  • reinicialização;

  • estado;

  • reutilização;

  • comportamento de subprogramas.

O Padawan não deve utilizar CANCEL apenas por costume.

Precisa entender o ciclo de vida do módulo.


48. O programa termina

Um programa pode finalizar com:

STOP RUN

ou:

GOBACK

O comportamento depende do contexto.

Em um programa principal batch, STOP RUN encerra a execução do run unit.

Em subprogramas, GOBACK é frequentemente mais apropriado, pois devolve o controle ao chamador.

No final, o runtime e o z/OS precisam:

  • encerrar o programa;

  • fechar recursos;

  • registrar condições;

  • liberar storage;

  • devolver return code;

  • finalizar o step.


49. RETURN-CODE

COBOL permite definir o código de retorno do programa.

Exemplo:

           MOVE 8 TO RETURN-CODE
           GOBACK.

O JCL e o sistema podem utilizar esse valor para controlar steps posteriores.

Exemplo:

//STEP02 EXEC PGM=PGMREL01,
//        COND=(4,LT)

A lógica de condições JCL precisa ser estudada com cuidado, pois sua leitura pode parecer invertida para iniciantes.

O importante aqui é entender:

O programa pode comunicar ao job se terminou com sucesso, advertência ou falha.


50. Return code não é abend

Um return code é uma finalização controlada.

Exemplo:

RC=0000
RC=0004
RC=0008
RC=0012

Um abend indica término anormal.

Exemplos:

S0C7
S0C4
S806
S013
Uxxxx

Diferença conceitual:

Return code → o programa terminou e devolveu um resultado
Abend       → a execução foi interrompida de forma anormal

Um programa pode escolher retornar RC=8 após detectar uma condição de negócio.

Isso não é o mesmo que sofrer um abend.


51. Exemplos de abends

S0C7

Frequentemente associado a operação numérica com dados inválidos.

S0C4

Pode estar relacionado a acesso inválido à memória ou endereço incorreto.

S806

Módulo executável não encontrado.

S013

Pode estar relacionado a problemas com dataset, DCB ou abertura.

User Abend

Pode ser produzido pelo próprio programa ou por componentes da aplicação.

O diagnóstico precisa combinar:

  • mensagem;

  • dump;

  • step;

  • módulo;

  • offset;

  • dados;

  • contexto.


52. O dump

Quando um programa termina anormalmente, pode ser produzido um dump.

Ele ajuda a investigar:

  • módulo;

  • instrução;

  • registradores;

  • áreas de memória;

  • call stack;

  • condição;

  • offset;

  • campos;

  • runtime.

O dump não deve ser encarado como um amontoado de caracteres incompreensíveis.

Ele é uma fotografia técnica do momento da falha.

Com listagem de compilação, map e ferramentas adequadas, o profissional pode relacionar o offset à instrução COBOL correspondente.


53. O job pode ter vários steps

Exemplo:

//STEP01 EXEC PGM=PGMEXTR
//STEP02 EXEC PGM=PGMVALD
//STEP03 EXEC PGM=PGMREL

Um job pode representar uma cadeia.

STEP01 → extrai dados
STEP02 → valida
STEP03 → gera relatório

Cada step possui:

  • programa;

  • DD statements;

  • return code;

  • recursos;

  • condições.

Se um step falhar, os próximos podem ou não executar conforme as regras do JCL.


54. Datasets temporários entre steps

Um step pode produzir um dataset temporário:

//ARQTEMP DD DSN=&&TEMP,
//           DISP=(NEW,PASS),
//           UNIT=SYSDA,
//           SPACE=(CYL,(5,5))

Outro step pode recebê-lo:

//ENTRADA DD DSN=&&TEMP,
//           DISP=(OLD,DELETE)

Esse mecanismo permite conectar etapas.

Programa A
   ↓
Dataset temporário
   ↓
Programa B

O dataset existe durante o job e pode ser apagado ao final.


55. O job termina

Depois que todos os steps elegíveis terminam:

  • os recursos são liberados;

  • os datasets recebem disposição final;

  • as saídas permanecem no spool;

  • o JES2 registra o término;

  • o usuário pode consultar resultados.

O job pode aparecer como:

CC 0000
CC 0004
CC 0008
ABEND S0C7
JCL ERROR

Cada resultado aponta para uma fase diferente.


56. JCL ERROR

Um job pode falhar antes de executar qualquer programa.

Exemplos:

  • sintaxe JCL incorreta;

  • parâmetro inválido;

  • procedure não encontrada;

  • dataset mal definido;

  • DD duplicado;

  • erro de referência;

  • nome inválido.

Nesse caso, não adianta revisar o COBOL.

O programa nem chegou a começar.

Novamente, diagnóstico significa identificar a fase.


57. A cadeia completa de execução

Vamos reunir tudo.

Load module na LOADLIB
          ↓
JCL é submetido
          ↓
JES2 recebe o job
          ↓
Job entra no spool
          ↓
JCL é interpretado
          ↓
Job aguarda na fila
          ↓
Initiator seleciona o job
          ↓
DD statements são alocados
          ↓
Módulo é localizado
          ↓
Loader carrega o programa
          ↓
Language Environment inicia o runtime
          ↓
Controle chega à PROCEDURE DIVISION
          ↓
Dispatcher entrega CPU
          ↓
Programa acessa QSAM, VSAM ou subsistemas
          ↓
Pode alternar entre execução e espera
          ↓
Programa termina
          ↓
Return code é registrado
          ↓
Saída volta ao spool
          ↓
Usuário consulta no SDSF

Essa é a verdadeira jornada do executável.


58. Da primeira linha ao último ciclo de CPU

Agora podemos visualizar a série completa.

Regra de negócio
       ↓
Fonte COBOL
       ↓
Copybooks
       ↓
Tradução CICS
       ↓
Processamento Db2
       ↓
Interfaces IMS ou Adabas
       ↓
Compilação
       ↓
Código objeto
       ↓
Binder
       ↓
Load module
       ↓
Load library
       ↓
JCL ou transação
       ↓
JES2 ou subsistema online
       ↓
Loader
       ↓
Memória
       ↓
Dispatcher
       ↓
CPU
       ↓
Dados e resultados

O programa não nasce quando é executado.

Sua história começou muito antes.


59. Uma analogia com um aeroporto

Imagine um aeroporto internacional.

O load module é o avião pronto no hangar.

O JCL é o plano de voo.

A load library é o hangar onde a aeronave está estacionada.

O JES2 é o centro que recebe planos de voo e organiza partidas.

O spool é o sistema onde ficam armazenados documentos, ordens e registros.

O initiator é a equipe que autoriza e prepara o voo.

Os DD statements representam combustível, bagagem, tripulação e rotas.

O loader retira o avião do hangar e o prepara para operar.

O z/OS é toda a administração do aeroporto.

O WLM ajuda a decidir quais voos são mais prioritários.

O dispatcher controla o uso das pistas.

A CPU é o motor que produz o movimento.

QSAM é como uma fila de cargas processadas em sequência.

VSAM é um depósito no qual uma caixa pode ser localizada por código.

Db2, IMS e Adabas são grandes centros especializados de dados.

O programa COBOL é o plano operacional que define o que deve acontecer durante a viagem.

Se uma única parte falhar, o voo pode atrasar, aguardar ou ser cancelado.


60. Diagnóstico por fase

Quando surgir um problema, pergunte em qual fase ele ocorreu.

O JCL foi aceito?

Se não, pode ser JCL ERROR.

O job iniciou?

Se não, pode estar aguardando classe, initiator ou recurso.

Os datasets foram alocados?

Se não, pode haver conflito, catálogo ou segurança.

O programa foi localizado?

Se não, pode ocorrer S806.

O programa iniciou?

Se sim, analise mensagens e runtime.

O arquivo abriu?

Verifique FILE STATUS.

O SQL executou?

Verifique SQLCODE e SQLSTATE.

O CICS respondeu?

Verifique RESP e RESP2.

O IMS retornou?

Verifique o status da PCB.

O Adabas respondeu?

Verifique o response code.

O programa terminou normalmente?

Verifique return code ou abend.

Essa sequência reduz a investigação aleatória.


61. Checklist de execução batch

Antes de executar, verifique:

  • O programa está na load library correta?

  • A STEPLIB aponta para essa biblioteca?

  • A ordem das bibliotecas está correta?

  • O membro possui o nome usado em PGM=?

  • Todos os DDNAMEs esperados estão presentes?

  • Os datasets existem?

  • O DISP é adequado?

  • Os atributos dos arquivos correspondem ao programa?

  • O usuário possui autorização?

  • O package Db2 está disponível?

  • O PSB IMS é o correto?

  • As interfaces Adabas estão acessíveis?

  • Os arquivos VSAM estão disponíveis?

  • Existe espaço para datasets de saída?

  • As condições entre steps estão corretas?

  • O job está na classe adequada?


62. Checklist depois da execução

Depois do job:

  • Qual foi o resultado geral?

  • Qual step falhou?

  • Houve return code ou abend?

  • O programa correto foi carregado?

  • Qual versão do load foi utilizada?

  • O arquivo foi realmente processado?

  • Quantos registros foram lidos?

  • Quantos foram gravados?

  • Houve rejeições?

  • O SQL retornou erros?

  • O relatório foi produzido?

  • O dataset de saída foi catalogado?

  • Existem mensagens no JESYSMSG?

  • Foi gerado dump?

  • O tempo foi de CPU ou espera?

  • A execução pode ser repetida com segurança?


63. Reprocessamento

Em ambiente corporativo, uma pergunta essencial é:

O job pode ser executado novamente?

Imagine que o programa debitou cem contas e sofreu abend na conta cento e um.

Se for reiniciado desde o começo, poderá debitar novamente as primeiras cem.

Por isso, aplicações batch precisam considerar:

  • checkpoints;

  • commits;

  • arquivos de controle;

  • chaves de reinício;

  • idempotência;

  • rollback;

  • recuperação;

  • reconciliação.

Compilar e executar é apenas parte da engenharia.

Executar com segurança é o verdadeiro desafio.


64. Commit e unidade de trabalho

Em programas Db2, o COMMIT confirma alterações.

Exemplo:

           EXEC SQL
                COMMIT
           END-EXEC.

Se o programa atualiza milhões de linhas e faz commit somente no final, pode provocar:

  • locks prolongados;

  • consumo de log;

  • dificuldade de recuperação;

  • impacto em concorrência;

  • rollback gigantesco.

Se fizer commit a cada registro, pode gerar:

  • excesso de overhead;

  • unidades muito pequenas;

  • dificuldade de garantir consistência lógica.

O tamanho da unidade de trabalho precisa equilibrar:

  • integridade;

  • desempenho;

  • recuperação;

  • concorrência.


65. O JES2 não é apenas um entregador de jobs

Embora sua função seja diferente da CPU, o JES2 é essencial para a operação.

Ele fornece uma infraestrutura confiável para:

  • receber trabalhos;

  • manter filas;

  • separar classes;

  • priorizar;

  • reter saída;

  • reexecutar;

  • integrar impressão;

  • fornecer rastreabilidade;

  • apoiar operação.

Sem esse gerenciamento, milhares de jobs batch disputariam recursos sem coordenação.

O JES2 transforma a execução batch em um processo industrial.


66. O mainframe não executa um programa isolado

Quando PGMCLI01 roda, ele depende de um ecossistema.

JCL
JES2
Spool
Initiator
z/OS
Loader
Language Environment
WLM
Dispatcher
CPU
Storage
QSAM
VSAM
Db2
CICS
IMS
Adabas
Segurança
Catálogo
Operação

O iniciante olha o código.

O especialista enxerga todos os contratos ao redor.


67. O papel da segurança

Antes de abrir um dataset ou acessar uma biblioteca, o sistema pode verificar autorização.

Podem estar envolvidos:

  • RACF;

  • SAF;

  • perfis;

  • grupos;

  • permissões;

  • acessos de leitura;

  • atualização;

  • execução;

  • controle de subsistemas.

Um programa pode existir e estar corretamente configurado, mas falhar porque o usuário ou started task não possui autorização.

Segurança não é uma camada colocada depois.

Ela participa da execução.


68. O catálogo

Datasets catalogados podem ser localizados por nome.

Quando o JCL informa:

DSN=EMPRESA.DADOS.CLIENTES

o sistema pode consultar o catálogo para descobrir onde o dataset está armazenado.

Sem catálogo ou volume informado, a localização pode falhar.

O catálogo funciona como um diretório de datasets.

Ele não contém necessariamente os dados do arquivo.

Contém informações para localizá-lo.


69. A diferença entre dataset e arquivo lógico

No COBOL:

SELECT ARQ-CLIENTES

Esse é o nome de arquivo dentro do programa.

No JCL:

//CLIENTES DD ...

Esse é o DDNAME.

No sistema:

EMPRESA.DADOS.CLIENTES

Esse é o nome do dataset.

Portanto:

ARQ-CLIENTES → nome COBOL
CLIENTES     → DDNAME
EMPRESA.DADOS.CLIENTES → dataset

Esses três nomes podem ser diferentes.

Compreender essa cadeia evita muitos erros.


70. O programa executa em uma LPAR

Ambientes IBM Z podem ser divididos em LPARs.

LPAR significa Logical Partition.

Cada LPAR funciona como um sistema lógico separado, com seus próprios:

  • z/OS;

  • recursos;

  • configurações;

  • subsistemas;

  • workloads;

  • bibliotecas;

  • segurança.

O mesmo mainframe físico pode hospedar várias LPARs.

Por isso, um load presente em uma LPAR de teste não está automaticamente disponível em produção.


71. PR/SM e processadores lógicos

A virtualização do IBM Z permite que recursos físicos sejam compartilhados entre partições.

O PR/SM gerencia essa divisão.

O z/OS enxerga processadores lógicos disponíveis para sua LPAR.

O dispatcher entrega trabalho a esses processadores conforme a capacidade e as regras.

O programa COBOL não precisa conhecer esses detalhes para executar.

Mas o especialista em performance precisa compreender que existe uma cadeia entre:

Programa
z/OS
Processador lógico
LPAR
PR/SM
Processador físico

72. Tipos de processadores

No ecossistema IBM Z, diferentes categorias de processadores podem ser utilizadas conforme a carga.

Entre elas, podem aparecer conceitos como:

  • CP;

  • zIIP;

  • IFL;

  • ICF;

  • SAP.

Um programa COBOL tradicional executa principalmente em processadores gerais, mas determinados componentes ou workloads podem utilizar processadores especializados.

O Padawan não precisa dominar todos neste primeiro momento.

Mas deve compreender que “a CPU” no mainframe é um universo mais sofisticado do que uma única peça física.


73. O resultado do programa

Depois de processar, o programa pode produzir:

  • dataset;

  • relatório;

  • atualização Db2;

  • registros VSAM;

  • mensagem;

  • saída no spool;

  • retorno a uma transação;

  • atualização IMS;

  • operação Adabas;

  • código de retorno.

O resultado precisa ser validado.

Um RC=0 não garante que o conteúdo do relatório esteja correto.

Assim como uma compilação bem-sucedida não garante lógica correta, uma execução normal não garante resultado de negócio correto.


74. Auditoria e rastreabilidade

Sistemas críticos precisam registrar:

  • quem executou;

  • quando;

  • qual versão;

  • quais arquivos;

  • quais parâmetros;

  • quantos registros;

  • quais erros;

  • quais retornos;

  • quais atualizações;

  • qual tempo;

  • qual consumo.

Isso permite:

  • investigação;

  • conformidade;

  • reconciliação;

  • recuperação;

  • análise de capacidade;

  • melhoria contínua.

O mainframe não é apenas uma máquina rápida.

É uma plataforma de controle.


75. O mapa completo das quatro partes

Parte I — Fonte e copybooks

Regra de negócio
      ↓
Fonte COBOL
      ↓
Copybooks

Parte II — Preparação dos subsistemas

EXEC CICS
EXEC SQL
IMS
Adabas

Parte III — Construção do executável

Compilação
      ↓
Código objeto
      ↓
Binder
      ↓
Load module

Parte IV — Execução

JCL
      ↓
JES2
      ↓
Initiator
      ↓
Loader
      ↓
Memória
      ↓
CPU
      ↓
Dados e resultados

Agora a jornada está completa.


76. Conselhos finais ao Programador COBOL Padawan

Nunca pense no programa apenas como um fonte.

Pergunte sempre:

  • Onde está o load?

  • Quem o gerou?

  • Quais copybooks foram utilizados?

  • Qual procedure foi executada?

  • Qual load library está sendo pesquisada?

  • Quais DDNAMEs o programa espera?

  • Quais datasets foram alocados?

  • O programa está esperando CPU ou I/O?

  • Qual subsistema está envolvido?

  • Qual código de retorno precisa ser analisado?

  • A execução é reiniciável?

  • O resultado é reconciliável?

  • A versão é rastreável?

  • O processo é seguro?

Essas perguntas são mais importantes do que decorar comandos isolados.


Conclusão

Nesta quarta parte, acompanhamos o programa COBOL desde a load library até a execução real.

Vimos que o JCL solicita ao sistema a execução do módulo.

A STEPLIB e outras bibliotecas ajudam o z/OS a localizar o executável.

Os DD statements conectam os nomes lógicos do programa aos datasets físicos.

QSAM permite o processamento sequencial.

VSAM oferece organizações e acessos mais estruturados, incluindo acesso por chave.

O JES2 recebe o job, administra filas e mantém entradas e saídas no spool.

O initiator seleciona o trabalho e inicia seus steps.

O loader coloca o módulo no ambiente de memória.

O Language Environment prepara o runtime.

O WLM ajuda a orientar objetivos de serviço.

O dispatcher entrega capacidade de processador.

A CPU executa as instruções de máquina produzidas pelo compilador.

Durante esse processo, o programa alterna entre uso de CPU e espera por arquivos, bancos, locks, mensagens e outros recursos.

Por isso, tempo de CPU e tempo total decorrido são conceitos diferentes.

Também aprendemos que CICS, Db2, IMS e Adabas possuem seus próprios ambientes de execução, mas todos dependem do mesmo princípio:

O COBOL executa a regra de negócio, enquanto o z/OS e seus subsistemas administram os recursos necessários.

Ao final dessa série, o Programador COBOL Padawan deixa de enxergar apenas:

       STOP RUN.

e passa a enxergar toda a arquitetura ao redor:

Fonte
Copybook
Tradutor
Pré-compilador
Compilador
Objeto
Binder
Load
JCL
JES2
Spool
Loader
Memória
CPU
Dados
Resultado

É essa visão que separa quem apenas altera linhas de código de quem realmente compreende o funcionamento de uma aplicação corporativa no IBM Z.


Palavra final do Mestre Bellacosa

Quando alguém disser:

“Esse programa só lê um arquivo e grava outro”,

lembre-se de que por trás dessa frase existem bibliotecas, contratos, compiladores, módulos, filas, processadores, subsistemas, segurança, memória, canais de I/O e décadas de engenharia.

No mainframe, nada simplesmente acontece.

Cada execução é preparada, controlada, registrada e monitorada.

O Padawan vê uma linha de JCL.

O especialista vê uma cadeia completa de responsabilidades.

O Padawan vê um READ.

O especialista vê acesso lógico, buffer, I/O, espera e retorno.

O Padawan vê um RC=0.

O especialista pergunta se o resultado está correto, íntegro, rastreável e recuperável.

Essa é a verdadeira evolução no mundo COBOL.

Não basta saber escrever programas.

É preciso entender como eles nascem, como são transformados, como são carregados e como convivem com toda a arquitetura do IBM Z.

“O código-fonte expressa a intenção. A compilação constrói a forma. A linkedição reúne as partes. O JES2 organiza a jornada. O z/OS governa os recursos. E a CPU transforma regras de negócio em realidade.”

terça-feira, 1 de março de 2022

Da Compilação à Execução de um Programa COBOL — Parte III

 

Bellacosa Mainframe compilacao cobol parte iii

☕ Um Café no Bellacosa Mainframe

Da Compilação à Execução de um Programa COBOL — Parte III

Compilação, Linkedição e Load Library: Como o Código-Fonte se Transforma em um Programa Executável

Introdução

Na segunda parte desta jornada, vimos que muitos programas COBOL corporativos não seguem diretamente para o compilador.

Antes disso, eles podem passar por outras etapas especializadas.

Comandos como:

EXEC CICS

precisam ser traduzidos.

Comandos como:

EXEC SQL

precisam ser processados pelo pré-compilador ou coprocessador Db2.

Programas IMS utilizam interfaces DL/I, PCBs, PSBs e DBDs.

Aplicações Adabas dependem de control blocks, buffers e módulos de comunicação.

Depois que todo esse material foi preparado, finalmente chega o momento em que o compilador COBOL entra em cena.

É aqui que o texto escrito pelo programador começa a se transformar em instruções realmente compreendidas pela máquina.

Entretanto, existe uma confusão muito comum entre iniciantes:

Compilar não significa necessariamente criar o executável final.

A compilação produz um código objeto.

Depois disso, outra ferramenta, chamada Binder, precisa reunir esse objeto com interfaces, rotinas e módulos necessários.

Esse processo é conhecido como linkedição.

Somente após a linkedição surge o módulo executável que poderá ser gravado em uma load library.

Nesta terceira parte, vamos acompanhar essa transformação passo a passo.

Prepare o café, abra o SDSF e venha entender o que realmente acontece entre o fonte COBOL e o módulo executável.


1. O que significa compilar?

Compilar significa transformar o código-fonte escrito pelo programador em código objeto.

O fluxo mais simples é:

Código-fonte COBOL
          ↓
Compilador COBOL
          ↓
Código objeto

O código-fonte é legível para seres humanos treinados em COBOL.

Exemplo:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. PGMCALC.

       DATA DIVISION.
       WORKING-STORAGE SECTION.

       01  WS-VALOR-A           PIC S9(09) COMP.
       01  WS-VALOR-B           PIC S9(09) COMP.
       01  WS-TOTAL             PIC S9(09) COMP.

       PROCEDURE DIVISION.

           MOVE 100 TO WS-VALOR-A
           MOVE 250 TO WS-VALOR-B

           COMPUTE WS-TOTAL =
                   WS-VALOR-A + WS-VALOR-B

           DISPLAY 'TOTAL: ' WS-TOTAL

           STOP RUN.

A CPU do IBM Z não executa diretamente instruções como:

MOVE
COMPUTE
DISPLAY
STOP RUN

Essas instruções precisam ser transformadas em instruções de máquina compatíveis com a arquitetura do processador.

O compilador realiza essa conversão.


2. O compilador faz muito mais do que traduzir

Muitos iniciantes imaginam que o compilador apenas troca comandos COBOL por instruções de máquina.

Na realidade, ele executa várias análises.

Entre elas:

  • verificação de sintaxe;

  • validação de nomes;

  • análise de tipos de dados;

  • cálculo de tamanhos;

  • validação de referências;

  • verificação de parágrafos;

  • resolução de campos;

  • tratamento de copybooks;

  • validação de arquivos;

  • análise de expressões;

  • geração de código;

  • otimização;

  • emissão de mensagens;

  • criação de listagens;

  • produção do módulo objeto.

Considere:

       01  WS-NOME              PIC X(40).
       01  WS-IDADE             PIC 9(03).

           MOVE WS-NOME TO WS-IDADE.

O compilador poderá identificar que um campo alfanumérico está sendo movido para um campo numérico.

Dependendo das opções e do conteúdo, isso poderá produzir:

  • advertência;

  • conversão;

  • risco de erro em execução;

  • mensagem de diagnóstico.

O compilador é, portanto, uma espécie de auditor técnico do programa.


3. O compilador precisa conhecer os copybooks

Na primeira parte, vimos que um programa pode utilizar:

       COPY CPYCLI01.

O compilador precisa localizar esse copybook.

Normalmente, as bibliotecas são indicadas por meio de um DD statement como:

//SYSLIB DD DISP=SHR,
//          DSN=EMPRESA.SISTEMA.COPYLIB

Pode haver várias bibliotecas:

//SYSLIB DD DISP=SHR,
//          DSN=EMPRESA.SISTEMA.COPYLIB
//       DD DISP=SHR,
//          DSN=EMPRESA.CORPORATIVO.COPYLIB
//       DD DISP=SHR,
//          DSN=FORNECEDOR.PRODUTO.COPYLIB

A ordem pode ser importante.

Se duas bibliotecas possuírem um membro com o mesmo nome, o primeiro encontrado poderá ser utilizado.

Imagine:

EMPRESA.TESTE.COPYLIB(CPYCLI01)
EMPRESA.PRODUCAO.COPYLIB(CPYCLI01)

Se a biblioteca errada estiver antes na concatenação, o programa poderá ser compilado com uma versão incorreta do layout.

O fonte estará correto.

O copybook existirá.

A compilação poderá terminar com sucesso.

Mesmo assim, o programa poderá utilizar uma estrutura incompatível.

Essa é uma das razões pelas quais o processo de compilação precisa ser controlado.


4. O compilador trabalha com opções

O comportamento do compilador pode ser alterado por opções.

Essas opções podem controlar:

  • geração de listagem;

  • otimização;

  • tratamento de chamadas;

  • compatibilidade;

  • informações de depuração;

  • aritmética;

  • encoding;

  • migração;

  • geração de dados de teste;

  • integração com CICS;

  • integração com Db2;

  • tratamento de warnings.

Exemplos de opções frequentemente encontradas em ambientes COBOL incluem conceitos como:

OPTIMIZE
LIST
MAP
XREF
SSRANGE
NUMCHECK
RENT
DYNAM
NODYNAM
TEST
ARCH
TUNE

Os nomes e efeitos exatos dependem da versão e da configuração do Enterprise COBOL.

O importante para o Padawan é entender:

O mesmo fonte pode gerar executáveis diferentes conforme as opções utilizadas.


5. Otimização

O compilador pode reorganizar ou melhorar o código gerado para produzir maior eficiência.

Considere:

           MULTIPLY WS-VALOR BY 2
               GIVING WS-RESULTADO.

O programador descreve a regra.

O compilador decide como representá-la em instruções de máquina.

Com opções de otimização, ele pode:

  • reduzir instruções;

  • eliminar operações desnecessárias;

  • reorganizar processamento;

  • utilizar recursos modernos da arquitetura;

  • melhorar acesso a dados;

  • produzir código mais eficiente.

Porém, níveis elevados de otimização podem tornar a depuração mais complexa.

O código gerado pode não seguir exatamente a ordem visual do fonte.

Por isso, ambientes de desenvolvimento e produção podem utilizar estratégias diferentes.


6. Opções de diagnóstico

Opções como validação de subscritos, verificação numérica e informações de teste podem ajudar a detectar problemas.

Imagine:

       01  TABELA-VALORES.
           05 ITEM-VALOR OCCURS 10 TIMES
                PIC 9(05).

       01  WS-INDICE             PIC 9(02).

           MOVE 15 TO WS-INDICE
           MOVE 100 TO ITEM-VALOR(WS-INDICE).

A tabela possui dez elementos.

O programa tenta acessar a posição quinze.

Sem verificações adequadas, o programa pode sobrescrever outra área de memória.

Com opções de runtime e compilação apropriadas, esse erro pode ser detectado.

Entretanto, verificações adicionais também podem consumir mais processamento.

Em produção, as empresas equilibram:

Segurança
Desempenho
Diagnóstico
Governança

7. O que é o código objeto?

O código objeto é o resultado principal da compilação.

Ele contém instruções de máquina e informações necessárias para a próxima fase.

Porém, ele ainda pode possuir referências externas.

Exemplo:

           CALL 'PGMVALID'
                USING WS-CPF
                      WS-RETORNO.

O compilador sabe que o programa possui uma referência a PGMVALID.

Dependendo do tipo de chamada e das opções utilizadas, essa referência poderá ser resolvida durante a linkedição ou durante a execução.

O objeto pode conter:

  • instruções de máquina;

  • áreas;

  • referências externas;

  • símbolos;

  • informações de relocação;

  • pontos de entrada;

  • dados necessários ao Binder.

Podemos pensar assim:

Código objeto = programa parcialmente montado

Ele já deixou de ser fonte, mas ainda pode não estar pronto para ser carregado.


8. O objeto não é o executável final

Essa é uma das maiores confusões entre iniciantes.

Depois da compilação, o programa ainda pode precisar de:

  • interfaces CICS;

  • interfaces Db2;

  • interfaces IMS;

  • módulos Adabas;

  • rotinas estáticas;

  • bibliotecas de suporte;

  • módulos de linguagem;

  • pontos de entrada;

  • resolução de referências.

Por isso, o processo continua:

Código objeto
      ↓
Binder
      ↓
Módulo executável

A compilação produz peças.

A linkedição reúne as peças.


9. O que é linkedição?

Linkedição é o processo de combinar o código objeto com outros módulos e referências para criar uma unidade executável.

Em inglês, você poderá encontrar termos como:

Link-edit
Linkage edition
Binding

Em ambientes modernos, a ferramenta principal é o Binder do z/OS.

Em documentações antigas, também aparece o termo Linkage Editor.

Podemos representar assim:

Objeto do programa principal
           +
Rotinas externas
           +
Interfaces de subsistemas
           +
Módulos estáticos
           +
Pontos de entrada
           ↓
Binder
           ↓
Módulo executável

10. O Binder do z/OS

O Binder é responsável por organizar e combinar os módulos recebidos.

Ele pode:

  • resolver referências externas;

  • incluir módulos;

  • definir pontos de entrada;

  • organizar seções;

  • produzir mapas;

  • gerar referências cruzadas;

  • identificar símbolos não resolvidos;

  • criar load modules;

  • criar program objects;

  • gravar o resultado em uma biblioteca executável.

Um JCL tradicional pode utilizar:

//LKED EXEC PGM=IEWL

O nome IEWL possui origem histórica no Linkage Editor.

Mesmo com a evolução para o Binder, ele continua aparecendo em muitos JCLs e procedures.


11. Um exemplo simples de compilação

Um JCL conceitual de compilação poderia ser:

//COMPILA  JOB (1234),'BELLACOSA',
//             CLASS=A,
//             MSGCLASS=X,
//             NOTIFY=&SYSUID
//*
//COBOL    EXEC PGM=IGYCRCTL
//STEPLIB  DD DISP=SHR,
//            DSN=IGY.V6R5M0.SIGYCOMP
//SYSIN    DD DISP=SHR,
//            DSN=EMPRESA.SISTEMA.COBOL(PGMCLI01)
//SYSLIB   DD DISP=SHR,
//            DSN=EMPRESA.SISTEMA.COPYLIB
//SYSLIN   DD DISP=(NEW,PASS),
//            DSN=&&OBJ,
//            UNIT=SYSDA,
//            SPACE=(TRK,(5,5))
//SYSPRINT DD SYSOUT=*
//SYSUT1   DD UNIT=SYSDA,
//            SPACE=(CYL,(1,1))

Esse exemplo é simplificado.

O compilador lê o fonte em:

//SYSIN

Procura copybooks em:

//SYSLIB

Produz o objeto em:

//SYSLIN

Gera a listagem em:

//SYSPRINT

O dataset:

&&OBJ

é temporário.

Os dois sinais de && indicam um dataset temporário associado ao job.

O parâmetro:

DISP=(NEW,PASS)

significa que ele é criado nessa etapa e passado para a próxima.


12. A etapa de linkedição

Depois da compilação:

//LKED     EXEC PGM=IEWL,
//            PARM='LIST,MAP,XREF'
//SYSLIN   DD DISP=(OLD,DELETE),
//            DSN=&&OBJ
//SYSLMOD  DD DISP=SHR,
//            DSN=EMPRESA.SISTEMA.LOADLIB(PGMCLI01)
//SYSPRINT DD SYSOUT=*

O Binder recebe o objeto por meio de:

//SYSLIN

O resultado é gravado em:

//SYSLMOD

Nesse exemplo:

EMPRESA.SISTEMA.LOADLIB(PGMCLI01)

será o módulo executável.

A saída de diagnóstico será enviada para:

//SYSPRINT

13. O papel de SYSLIN e SYSLMOD

Esses DDNAMEs aparecem frequentemente em processos de linkedição.

SYSLIN

Contém a entrada para o Binder.

Pode incluir:

  • objetos;

  • control statements;

  • referências;

  • comandos INCLUDE;

  • instruções de entrada.

SYSLMOD

Define onde o módulo executável será gravado.

Exemplo:

//SYSLMOD DD DISP=SHR,
//           DSN=EMPRESA.TESTE.LOADLIB(PGMCLI01)

Podemos resumir:

SYSLIN  → entra objeto
SYSLMOD → sai executável

14. Comandos do Binder

O Binder pode receber comandos de controle.

Exemplo conceitual:

ENTRY PGMCLI01
NAME PGMCLI01(R)

O comando ENTRY pode definir o ponto inicial do programa.

O comando NAME pode indicar o nome do módulo que será criado.

Também podem existir comandos como:

INCLUDE
ALIAS
REPLACE
RENAME
SETCODE

A utilização varia conforme o processo e a arquitetura da aplicação.

Em muitas empresas, esses comandos ficam escondidos dentro de procedures ou ferramentas de build.


15. O que é ponto de entrada?

O ponto de entrada representa o local pelo qual a execução começa dentro do módulo.

Em um programa COBOL simples, isso normalmente é definido automaticamente.

Entretanto, módulos mais complexos podem possuir:

  • mais de um ponto de entrada;

  • aliases;

  • rotinas reutilizáveis;

  • estruturas compostas;

  • entry points adicionais.

Em COBOL, também existe a instrução:

       ENTRY 'OUTROENT'
           USING AREA-DADOS.

Esse recurso cria pontos adicionais de entrada em um programa.

Seu uso deve ser controlado, pois pode tornar a manutenção mais complexa.


16. Chamadas estáticas

Considere:

           CALL 'PGMVALID'
                USING WS-DADOS.

Em uma chamada estática, o módulo chamado é resolvido durante a linkedição.

O Binder precisa localizar PGMVALID.

Ele poderá incorporá-lo ou ligá-lo ao módulo principal.

Fluxo:

Objeto PGMCLI01
       +
Objeto ou módulo PGMVALID
       ↓
Binder
       ↓
Executável combinado

Vantagens da chamada estática:

  • resolução antecipada;

  • menor risco de programa não encontrado em runtime;

  • controle sobre a versão ligada;

  • menos busca dinâmica.

Desvantagens:

  • alteração no subprograma pode exigir relinkedição;

  • executável pode crescer;

  • vários chamadores podem precisar ser atualizados;

  • maior acoplamento entre módulos.


17. Chamadas dinâmicas

Em uma chamada dinâmica, o módulo é localizado durante a execução.

Exemplo com nome variável:

       01  WS-PROGRAMA          PIC X(08).

           MOVE 'PGMVALID' TO WS-PROGRAMA

           CALL WS-PROGRAMA
                USING WS-DADOS.

O nome está em uma variável.

Isso caracteriza uma chamada dinâmica.

Dependendo das opções do compilador, chamadas literais também podem ser tratadas dinamicamente.

O módulo não precisa ser incorporado ao chamador durante a linkedição.

Na execução, o sistema procurará PGMVALID nas bibliotecas disponíveis.

Vantagens:

  • atualização independente;

  • maior reutilização;

  • executável principal menor;

  • menor necessidade de relinkedição.

Desvantagens:

  • o programa pode não ser encontrado;

  • bibliotecas precisam estar corretas;

  • versões incompatíveis podem causar falhas;

  • o problema aparece somente em execução.


18. DYNAM e NODYNAM

Opções de compilação podem influenciar o tratamento das chamadas.

Conceitualmente:

DYNAM   → favorece chamadas dinâmicas
NODYNAM → permite resolução estática de chamadas literais

O comportamento exato depende da forma da chamada e das opções utilizadas.

Um iniciante não deve apenas decorar os nomes.

É melhor compreender a pergunta principal:

O módulo chamado será ligado agora ou procurado durante a execução?

Essa resposta influencia:

  • tamanho do executável;

  • implantação;

  • dependências;

  • manutenção;

  • diagnóstico.


19. O que acontece quando uma referência não é resolvida?

Imagine que o programa possui:

           CALL 'PGMVALID'
                USING WS-DADOS.

O Binder espera localizar o módulo, mas ele não está nas bibliotecas informadas.

Pode ocorrer uma referência externa não resolvida.

O Binder poderá emitir mensagens indicando:

  • símbolo não encontrado;

  • módulo ausente;

  • biblioteca incorreta;

  • erro na resolução;

  • ponto de entrada inexistente.

Dependendo das opções, o processo poderá:

  • terminar com erro;

  • gerar módulo incompleto;

  • permitir execução com risco;

  • impedir a gravação do executável.

Por isso, a listagem do Binder precisa ser analisada.


20. Bibliotecas de objetos e módulos

O processo pode utilizar bibliotecas como:

EMPRESA.SISTEMA.OBJLIB
EMPRESA.SISTEMA.LOADLIB
EMPRESA.COMUM.LOADLIB
PRODUTO.INTERFACE.LOADLIB

OBJLIB

Pode armazenar módulos objeto.

Nem todas as empresas mantêm objetos permanentemente.

Algumas utilizam datasets temporários.

LOADLIB

Armazena módulos executáveis.

Bibliotecas comuns

Podem conter:

  • rotinas reutilizáveis;

  • interfaces;

  • subprogramas;

  • componentes corporativos;

  • módulos de fornecedores.

O Binder recebe essas bibliotecas por DD statements específicos, muitas vezes como:

//SYSLIB DD DISP=SHR,
//          DSN=EMPRESA.COMUM.LOADLIB

21. Load module e program object

Durante décadas, o termo tradicional foi load module.

Com a evolução do z/OS e das bibliotecas PDSE, tornou-se comum utilizar program objects.

Um iniciante poderá ouvir:

  • load;

  • load module;

  • módulo de carga;

  • program object;

  • executável;

  • membro da loadlib.

Embora existam diferenças técnicas de formato e capacidade, todos representam o mesmo conceito geral:

Um artefato preparado para ser localizado, carregado e executado.

O program object moderno pode suportar recursos que os antigos load modules não suportavam da mesma forma.

Porém, no cotidiano, muitos profissionais continuam chamando tudo simplesmente de “load”.


22. A load library

A load library é uma biblioteca que contém módulos executáveis.

Exemplo:

EMPRESA.SISTEMA.LOADLIB

Membros:

PGMCLI01
PGMCLI02
PGMCALC
PGMREL01
PGMVALID

Ao abrir essa biblioteca no ISPF, o conteúdo não será um fonte COBOL legível.

Ela contém estruturas binárias.

O programador normalmente não edita diretamente um load module.

A alteração correta é feita no fonte.

Depois disso, o programa é recompilado e linkedidado.


23. Fonte, objeto e load

É importante visualizar a diferença.

Fonte

EMPRESA.SISTEMA.COBOL(PGMCLI01)

Contém código COBOL.

Objeto

EMPRESA.SISTEMA.OBJLIB(PGMCLI01)

Contém o resultado intermediário da compilação.

Load

EMPRESA.SISTEMA.LOADLIB(PGMCLI01)

Contém o módulo executável.

O mesmo nome pode existir em bibliotecas diferentes.

Isso não significa que sejam o mesmo tipo de conteúdo.


24. O perigo de executar a versão errada

Imagine que o programador compile uma nova versão em:

EMPRESA.TESTE.LOADLIB(PGMCLI01)

Porém, o JCL de teste utiliza:

//STEPLIB DD DISP=SHR,
//           DSN=EMPRESA.ANTIGA.LOADLIB

O job executará a versão antiga.

O programador poderá dizer:

“Minha alteração não funcionou.”

Na realidade, o programa correto nunca foi carregado.

Esse problema é extremamente comum.

Sempre verifique:

  • onde o load foi gravado;

  • qual biblioteca está no JCL;

  • qual biblioteca está primeiro na concatenação;

  • se existe outro membro com o mesmo nome;

  • se o ambiente online carregou a nova versão.


25. Linkedição de programas CICS

Um programa CICS precisa ser preparado com as interfaces necessárias.

Historicamente, a linkedição poderia incluir módulos específicos do CICS.

Dependendo da arquitetura e versão, o processo pode utilizar stubs ou interfaces fornecidas pelo produto.

Além disso, o executável precisa ser disponibilizado em uma biblioteca acessível à região CICS.

Normalmente, encontramos referências a bibliotecas concatenadas na DFHRPL.

Fluxo simplificado:

Fonte CICS
    ↓
Tradução
    ↓
Compilação
    ↓
Linkedição com interfaces CICS
    ↓
Load library
    ↓
Biblioteca acessível ao CICS

Depois, o CICS precisa reconhecer ou atualizar o programa em execução.

Pode ser necessário utilizar recursos como:

  • new copy;

  • phase-in;

  • atualização de definição;

  • pipeline de deployment;

  • refresh do programa.


26. Linkedição de programas Db2

Programas Db2 também utilizam interfaces de conexão.

Um programa batch Db2 pode ser linkedidado com componentes apropriados para o método de conexão utilizado.

Além disso, o DBRM precisa passar pelo BIND.

Portanto, existem dois resultados:

Load module COBOL
Package Db2

Os dois precisam estar compatíveis.

Podem ocorrer problemas como:

  • load novo com package antigo;

  • package novo com load antigo;

  • collection incorreta;

  • plano incorreto;

  • versão incompatível;

  • módulo em biblioteca errada.

Esse tipo de situação mostra por que a implantação precisa coordenar artefatos.


27. Linkedição de programas IMS

Programas IMS podem precisar de interfaces DL/I durante a linkedição.

O método exato varia conforme:

  • tipo de região;

  • forma de execução;

  • ambiente IMS;

  • linguagem;

  • procedures da empresa.

O módulo executável também precisa ser chamado em conjunto com o PSB adequado.

Isso significa que a execução depende de:

Load module
PSB
PCBs
DBDs
Ambiente IMS

O load sozinho não representa toda a aplicação.


28. Linkedição de programas Adabas

Programas COBOL que acessam Adabas precisam das interfaces correspondentes.

Durante a linkedição, módulos de comunicação e bibliotecas fornecidas pelo ambiente podem ser incluídos ou referenciados.

Na execução, o programa utilizará essas interfaces para se comunicar com o Adabas Nucleus.

Assim como nos demais subsistemas:

Programa COBOL + interface especializada = acesso ao serviço

29. Procedures catalogadas

Em muitas empresas, o programador não escreve manualmente o JCL completo de compilação e linkedição.

Ele utiliza uma procedure catalogada.

Exemplo:

//COMPILA EXEC PROC=COBOLCL

Ou:

//COMPILA EXEC PROC=COB2CL

Ou:

//COMPILA EXEC PROC=COBCICS

A procedure pode esconder:

  • tradução;

  • pré-compilação;

  • compilação;

  • linkedição;

  • BIND;

  • bibliotecas;

  • opções;

  • datasets temporários;

  • controles corporativos.

O Padawan vê uma única linha.

Por trás dela podem existir dezenas de etapas.


30. O que é uma procedure catalogada?

Uma procedure catalogada é um conjunto reutilizável de instruções JCL armazenado em uma biblioteca de procedures.

Exemplo conceitual:

SYS1.PROCLIB
EMPRESA.PROCLIB

Dentro dela:

COBOLCL
COBDB2
COBCICS
COBIMS

A procedure permite padronizar o processo.

Benefícios:

  • evita duplicação;

  • centraliza opções;

  • facilita manutenção;

  • reduz erros;

  • garante bibliotecas corretas;

  • padroniza retorno;

  • integra ferramentas corporativas.

Porém, também pode esconder detalhes.

Por isso, o iniciante deve aprender a abrir e analisar a procedure.


31. Parâmetros simbólicos

Procedures podem utilizar parâmetros.

Exemplo conceitual:

//COMPILA EXEC COBOLCL,
//             MEMBER=PGMCLI01,
//             SRCLIB=EMPRESA.SISTEMA.COBOL,
//             LOADLIB=EMPRESA.SISTEMA.LOADLIB

Dentro da procedure, podem existir símbolos como:

&MEMBER
&SRCLIB
&LOADLIB

Quando o job é submetido, esses símbolos são substituídos.

Isso permite utilizar a mesma procedure para vários programas.


32. Compilação local, pipeline e ferramentas modernas

Nem todo processo moderno é iniciado manualmente por JCL.

Empresas podem utilizar:

  • IBM Developer for z/OS;

  • IBM Z Open Editor;

  • VS Code;

  • Git;

  • Jenkins;

  • IBM Dependency Based Build;

  • zBuilder;

  • UrbanCode Deploy;

  • Endevor;

  • ISPW;

  • ferramentas internas;

  • pipelines CI/CD.

O desenvolvedor altera o fonte e aciona um pipeline.

O pipeline pode:

  1. detectar dependências;

  2. identificar copybooks alterados;

  3. traduzir CICS;

  4. processar SQL;

  5. compilar COBOL;

  6. linkeditar;

  7. executar testes;

  8. gerar evidências;

  9. promover artefatos;

  10. implantar o load.

Mesmo com automação, os fundamentos continuam iguais.

A ferramenta não elimina as etapas.

Ela apenas as coordena.


33. Análise de impacto de copybook

Imagine que CPYCLI01 seja usado por cem programas.

Uma alteração foi realizada:

       05 CLI-LIMITE PIC S9(13)V99 COMP-3.

Antes:

       05 CLI-LIMITE PIC S9(11)V99 COMP-3.

Os programas dependentes podem precisar ser recompilados.

Uma ferramenta de build baseada em dependências pode identificar:

CPYCLI01 alterado
      ↓
PGMCLI01 afetado
PGMCLI02 afetado
PGMREL01 afetado
PGMCRD01 afetado

Esse processo evita que apenas um módulo seja recompilado enquanto outros continuam utilizando o layout antigo.


34. Return codes da compilação

Durante a compilação, o job pode terminar com códigos como:

RC=0000
RC=0004
RC=0008
RC=0012
RC=0016

Uma interpretação geral:

RC 0

Nenhum erro relevante foi encontrado.

RC 4

Foram geradas advertências.

O programa pode ter sido produzido, mas as mensagens precisam ser analisadas.

RC 8

Existem erros significativos.

Em muitos processos, a linkedição não deve continuar.

RC 12

Erros graves impediram a geração correta.

RC 16

Falha severa, problema estrutural ou impossibilidade de processamento.

Os significados exatos dependem da etapa e das mensagens.

Nunca utilize apenas o número como diagnóstico completo.


35. O perigo do RC 4

O programador pode pensar:

“RC 4 é normal.”

Às vezes, a advertência é realmente conhecida.

Mas um RC 4 pode indicar:

  • campo não utilizado;

  • conversão perigosa;

  • valor truncado;

  • incompatibilidade de tipo;

  • comportamento obsoleto;

  • opção ignorada;

  • possível erro lógico;

  • recurso que mudará em versões futuras.

Em sistemas críticos, advertências precisam ser classificadas.

O objetivo não é aceitar tudo nem rejeitar tudo.

O objetivo é compreender.


36. Return code do Binder

A linkedição também produz return code.

Problemas podem incluir:

  • referência externa não resolvida;

  • módulo ausente;

  • biblioteca indisponível;

  • símbolo duplicado;

  • erro de ponto de entrada;

  • espaço insuficiente;

  • formato incompatível;

  • opção inválida.

O Binder pode gerar o módulo mesmo com algumas advertências.

Porém, isso não significa que o executável esteja seguro.

Leia:

  • mensagens;

  • map;

  • cross-reference;

  • entry point;

  • unresolved references;

  • bibliotecas utilizadas.


37. MAP e XREF

Opções como:

MAP
XREF
LIST

podem gerar informações úteis.

MAP

Mostra o mapa do módulo.

Pode ajudar a entender:

  • seções;

  • tamanhos;

  • endereços relativos;

  • módulos incluídos;

  • organização do executável.

XREF

Mostra referências cruzadas.

Ajuda a identificar:

  • símbolos;

  • definições;

  • referências;

  • módulos que fornecem determinados nomes.

Essas informações são valiosas na investigação de problemas de linkedição.


38. Erros de compilação mais comuns

Entre os erros frequentes:

  • campo não definido;

  • palavra reservada usada incorretamente;

  • parágrafo inexistente;

  • END-IF ausente;

  • ponto final em posição incorreta;

  • copybook não encontrado;

  • PIC inválida;

  • nível hierárquico incorreto;

  • variável incompatível;

  • arquivo sem definição adequada;

  • SQL ou CICS não processado.

Exemplo:

           MOVE WS-VALOR TO WS-CAMPO-INEXISTENTE.

O compilador identifica a referência inexistente.


39. Erros de linkedição mais comuns

Entre os erros frequentes:

  • subprograma estático ausente;

  • biblioteca não concatenada;

  • módulo com nome diferente;

  • interface de subsistema ausente;

  • símbolo externo não resolvido;

  • entrada incorreta;

  • módulo incompatível;

  • control statements incorretos.

Exemplo:

           CALL 'PGMCALC'

Mas a biblioteca possui:

PGMCAL01

O nome não corresponde.

A resolução poderá falhar.


40. Erro de compilação não é erro de execução

É importante separar as fases.

Compilação

Analisa e traduz o fonte.

Linkedição

Monta o executável.

Carga

Localiza o módulo durante a execução.

Runtime

Executa a lógica e acessa dados.

Um problema pode ocorrer em qualquer uma dessas etapas.

Exemplo:

Fonte correto
Compilação RC 0
Linkedição RC 0
Execução S806

Nesse caso, o programa foi criado, mas o sistema não o encontrou na biblioteca de execução.

Outro exemplo:

Compilação RC 0
Linkedição RC 0
Programa executado
FILE STATUS 35

O executável está correto, mas o arquivo não foi localizado ou aberto.

Diagnóstico correto começa pela identificação da fase.


41. O Language Environment

Programas COBOL modernos no z/OS normalmente executam sob o Language Environment.

O Language Environment fornece serviços comuns para linguagens como:

  • COBOL;

  • PL/I;

  • C;

  • C++.

Ele participa de:

  • inicialização;

  • gerenciamento de memória;

  • parâmetros;

  • tratamento de condições;

  • mensagens;

  • datas;

  • conversões;

  • finalização;

  • dumps;

  • interoperabilidade.

Durante a linkedição e execução, o programa pode depender de componentes do Language Environment.

Mensagens iniciadas por:

CEE

frequentemente estão relacionadas a esse ambiente.


42. RENT e programas reentrantes

Programas online, especialmente CICS, costumam precisar ser reentrantes.

Um programa reentrante pode ser compartilhado com segurança por várias tasks, desde que não modifique indevidamente áreas comuns de código ou dados.

A opção:

RENT

está associada à geração de código reentrante.

Isso é importante porque o CICS pode atender milhares de transações concorrentes.

O código pode ser compartilhado, enquanto cada task possui suas áreas de trabalho apropriadas.

Um programa não reentrante pode causar:

  • corrupção de dados;

  • interferência entre usuários;

  • resultados imprevisíveis;

  • falhas de integridade.


43. O perigo de armazenar estado no lugar errado

Imagine um programa CICS que mantém dados mutáveis em uma área compartilhada de forma incorreta.

Duas tasks podem executar o mesmo módulo simultaneamente.

A task A altera uma informação.

A task B enxerga ou sobrescreve essa mesma informação.

O resultado pode ser uma mistura de dados entre transações.

Por isso, programas online utilizam estruturas como:

  • COMMAREA;

  • channels e containers;

  • working-storage gerenciado adequadamente;

  • áreas fornecidas pelo CICS;

  • TSQ;

  • contextos transacionais.

A reentrância não é apenas uma opção técnica.

É uma garantia de convivência segura entre múltiplas execuções.


44. Versionamento do load

Em ambientes corporativos, o load module precisa ser controlado.

Perguntas importantes:

  • Qual fonte gerou o load?

  • Qual versão do copybook foi usada?

  • Qual compilador foi utilizado?

  • Quais opções foram aplicadas?

  • Qual pipeline gerou o módulo?

  • Qual commit corresponde ao executável?

  • Qual package Db2 foi associado?

  • Quando o load foi implantado?

  • Quem aprovou a promoção?

Sem rastreabilidade, o executável vira uma caixa-preta.


45. Programa compilado não significa programa testado

Uma compilação com RC 0 prova apenas que o compilador conseguiu processar o fonte.

Ela não prova que:

  • a regra de negócio está correta;

  • os dados foram tratados corretamente;

  • o SQL possui bom desempenho;

  • o arquivo está definido corretamente;

  • a transação CICS funciona;

  • o programa IMS utiliza o segmento correto;

  • o código Adabas trata todos os retornos;

  • o módulo não causa abend;

  • o programa atende ao requisito.

Compilação é uma etapa de validação técnica.

Teste é outra disciplina.


46. Um fluxo moderno de build

Um pipeline moderno pode executar:

Checkout do fonte
       ↓
Análise de dependências
       ↓
Expansão e localização de copybooks
       ↓
Tradução CICS
       ↓
Processamento Db2
       ↓
Compilação COBOL
       ↓
Linkedição
       ↓
BIND package
       ↓
Testes unitários
       ↓
Análise de qualidade
       ↓
Empacotamento
       ↓
Implantação

Esse fluxo parece moderno, mas continua baseado nos mesmos fundamentos utilizados há décadas.

O que mudou foi o nível de automação.


47. Exemplo completo do caminho até o load

Imagine o programa:

PGMCLI01

Ele utiliza:

CPYCLI01
EXEC CICS
EXEC SQL
CALL PGMVALID

O processo poderá ser:

1. Ler PGMCLI01
2. Localizar CPYCLI01
3. Traduzir EXEC CICS
4. Processar EXEC SQL
5. Gerar DBRM
6. Compilar o fonte preparado
7. Gerar objeto PGMCLI01
8. Localizar PGMVALID
9. Incluir interfaces CICS e Db2
10. Executar o Binder
11. Gravar PGMCLI01 na LOADLIB
12. Executar BIND do DBRM
13. Criar package Db2

Ao final:

EMPRESA.SISTEMA.LOADLIB(PGMCLI01)

e:

Package Db2 de PGMCLI01

estarão prontos para a próxima fase.


48. Checklist do Programador COBOL Padawan

Antes de declarar que o programa está pronto, verifique:

  • O fonte correto foi compilado?

  • Os copybooks corretos foram utilizados?

  • A biblioteca de copybooks estava na ordem certa?

  • Houve tradução CICS?

  • O SQL foi processado?

  • O DBRM foi gerado?

  • O package foi criado?

  • O compilador terminou com qual RC?

  • Existem warnings?

  • O Binder resolveu todas as referências?

  • O load foi gravado na biblioteca correta?

  • As chamadas são estáticas ou dinâmicas?

  • Os módulos chamados estão disponíveis?

  • A versão do load corresponde ao fonte?

  • Os testes foram executados?

  • A implantação utilizará a mesma load library?

Esse checklist evita muitos problemas que parecem misteriosos.


49. O grande mapa mental da Parte III

Podemos resumir toda a transformação:

Fonte preparado
      ↓
Compilador COBOL
      ↓
Validação
      ↓
Geração de instruções
      ↓
Código objeto
      ↓
Binder
      ↓
Resolução de referências
      ↓
Inclusão de módulos
      ↓
Definição do ponto de entrada
      ↓
Load module ou program object
      ↓
Load library

Em paralelo, quando houver Db2:

DBRM
  ↓
BIND
  ↓
Package

50. Uma analogia com uma fábrica

Imagine uma fábrica de automóveis.

O código-fonte é o projeto do veículo.

Os copybooks são padrões de componentes:

  • medidas;

  • conectores;

  • peças;

  • encaixes.

O compilador transforma o projeto em peças reais.

Ele produz:

  • motor;

  • chassis;

  • painel;

  • sistemas de controle.

Entretanto, as peças ainda estão separadas.

O Binder é a linha de montagem.

Ele reúne:

  • objeto principal;

  • módulos externos;

  • interfaces;

  • componentes;

  • pontos de entrada.

O resultado é o veículo montado.

A load library é o pátio onde os veículos prontos ficam armazenados.

Porém, o carro ainda não saiu do pátio.

Ele ainda precisa ser localizado, ligado e colocado na estrada.

Essa será a missão do próximo capítulo.


51. Conselhos do Mestre Bellacosa

Nunca trate a compilação como um botão misterioso.

Abra as listagens.

Leia as mensagens.

Entenda a procedure.

Descubra:

  • qual compilador foi utilizado;

  • quais opções foram aplicadas;

  • quais bibliotecas foram concatenadas;

  • quais copybooks foram encontrados;

  • quais módulos foram incluídos;

  • onde o objeto foi gravado;

  • onde o load foi criado;

  • quais referências foram resolvidas;

  • quais warnings foram emitidos.

O profissional que entende o processo de build investiga problemas com muito mais precisão.

Ele não diz apenas:

“A compilação falhou.”

Ele diz:

“O pré-processamento terminou corretamente, mas o Binder não resolveu o módulo estático porque a biblioteca de interfaces não estava na concatenação de SYSLIB.”

Esse é o tipo de compreensão que transforma um Padawan em especialista.


Conclusão

A compilação é o processo que transforma o código-fonte COBOL em código objeto.

Durante essa etapa, o compilador verifica sintaxe, campos, tipos de dados, referências, estruturas, opções e dependências.

O código objeto já contém instruções de máquina, mas ainda pode possuir referências externas.

Por isso, ele precisa passar pelo Binder.

A linkedição combina o objeto com módulos, interfaces e rotinas necessárias, resolvendo referências e criando um módulo executável.

Esse resultado é armazenado em uma load library.

Também aprendemos que chamadas podem ser estáticas ou dinâmicas.

Chamadas estáticas são resolvidas durante a linkedição.

Chamadas dinâmicas são localizadas durante a execução.

Vimos ainda que CICS, Db2, IMS e Adabas podem exigir interfaces específicas, e que o programa Db2 precisa coordenar dois artefatos fundamentais:

Load module
Package Db2

Ao final dessa etapa, o programa finalmente existe como executável.

Mas ele ainda está parado dentro de uma biblioteca.

Ele não abriu arquivos.

Não leu registros.

Não consultou tabelas.

Não consumiu CPU.

Não produziu relatórios.

A última etapa da jornada está prestes a começar.

No próximo capítulo

Na Parte IV — Da Load Library à CPU, vamos acompanhar o módulo durante a execução.

Veremos passo a passo:

  • como o JCL solicita a execução;

  • como a STEPLIB localiza o programa;

  • como QSAM e VSAM são conectados por DDNAME;

  • como o JES2 recebe e organiza o job;

  • o que é spool;

  • como o initiator inicia o processamento;

  • como o loader coloca o programa na memória;

  • como WLM e dispatcher participam;

  • como a CPU executa as instruções;

  • por que tempo de CPU é diferente de tempo decorrido;

  • como programas CICS, Db2, IMS e Adabas executam no ambiente real.

Prepare a quarta xícara de café.

O programa já nasceu, foi traduzido, compilado e linkedidado.

Agora chegou o momento de fazê-lo trabalhar.

“O Padawan acredita que a compilação cria o programa. O especialista sabe que a compilação cria as peças, a linkedição monta a máquina e a execução provará se toda a engenharia realmente funciona.”