Translate

Mostrar mensagens com a etiqueta compilação COBOL. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta compilação COBOL. 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.”

 

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.”

quinta-feira, 24 de fevereiro de 2022

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

 

Bellacosa Mainframe e a compilação cobol parte II

☕ Um Café no Bellacosa Mainframe

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

CICS, Db2, IMS e Adabas: O que Acontece com o Código Antes de o Compilador Entrar em Cena

Introdução

Na primeira parte desta jornada, conhecemos o nascimento de um programa COBOL.

Vimos que tudo começa com o código-fonte armazenado em uma biblioteca, geralmente um PDS ou PDSE, e que os copybooks funcionam como contratos reutilizáveis entre programas, arquivos, mensagens e sistemas.

Também descobrimos uma diferença essencial:

COPY inclui código-fonte.
CALL executa outro módulo.

Porém, quando abrimos um programa corporativo real, especialmente em um banco, seguradora, indústria ou grande empresa, encontramos instruções que parecem COBOL, mas que não pertencem diretamente à linguagem.

Por exemplo:

           EXEC CICS
                READ FILE('CLIENTE')
                INTO(REGISTRO-CLIENTE)
                RIDFLD(WS-CHAVE)
           END-EXEC.

Ou:

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

Também podemos encontrar chamadas como:

           CALL 'CBLTDLI'
                USING GU-FUNCTION
                      PCB-MASK
                      AREA-SEGMENTO
                      SSA-CLIENTE.

Ou estruturas utilizadas na comunicação com Adabas.

O Programador COBOL Padawan olha para tudo isso e pode imaginar que o compilador entende todos esses comandos naturalmente.

Mas não é exatamente assim.

Antes que o compilador COBOL possa transformar o fonte em código objeto, outros componentes precisam preparar partes específicas do programa.

É como uma grande cozinha corporativa.

O compilador é o chef principal, mas alguns ingredientes precisam ser preparados por especialistas antes de chegar à bancada.

Nesta segunda parte, vamos entender:

  • o papel do tradutor CICS;

  • como o Db2 processa comandos EXEC SQL;

  • o que é um DBRM;

  • por que o BIND do Db2 não é linkedição;

  • como programas COBOL acessam IMS;

  • como ocorre a comunicação com Adabas;

  • o que todas essas tecnologias possuem em comum.

Prepare o café, abra o ISPF e venha descobrir o que realmente acontece com o código antes da compilação.


1. Nem tudo o que aparece no programa é COBOL puro

COBOL possui instruções próprias, como:

MOVE
ADD
SUBTRACT
MULTIPLY
DIVIDE
COMPUTE
IF
EVALUATE
PERFORM
READ
WRITE
REWRITE
DELETE
OPEN
CLOSE
CALL

Essas instruções fazem parte da linguagem e podem ser analisadas diretamente pelo compilador.

Porém, comandos como:

EXEC CICS
EXEC SQL

pertencem a ambientes externos.

Eles foram incorporados ao fonte por meio de uma sintaxe padronizada, mas precisam ser interpretados por componentes especializados.

Uma representação simples seria:

Programa COBOL
   ├── comandos COBOL
   ├── comandos CICS
   ├── comandos SQL
   ├── chamadas IMS
   └── interfaces Adabas

O compilador entende plenamente a primeira parte.

As demais exigem preparação, tradução, bibliotecas ou interfaces específicas.


2. O que é o CICS?

CICS significa Customer Information Control System.

Na prática, ele é uma plataforma de processamento de transações online.

Quando um cliente consulta o saldo, realiza uma transferência, altera um endereço ou solicita uma segunda via de documento, existe uma grande possibilidade de algum componente CICS estar envolvido em ambientes tradicionais IBM Z.

O CICS gerencia elementos como:

  • transações;

  • programas;

  • terminais;

  • sessões;

  • arquivos;

  • filas;

  • segurança;

  • recuperação;

  • sincronização;

  • comunicação entre sistemas;

  • controle de recursos;

  • integração com Db2, MQ e outras tecnologias.

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

O CICS controla o ambiente transacional em que essa regra será executada.

Imagine uma transação chamada:

C001

Ela pode estar associada ao programa:

PGMCLI01

Quando o usuário informa C001, o CICS localiza o programa, cria uma task, verifica segurança, entrega o controle e acompanha sua execução.


3. Os comandos EXEC CICS

Um programa pode utilizar comandos como:

           EXEC CICS
                RECEIVE MAP('MAPCLI')
                        MAPSET('SETCLI')
                        INTO(AREA-MAPA)
           END-EXEC.

Esse comando solicita o recebimento dos dados de uma tela.

Outro exemplo:

           EXEC CICS
                SEND MAP('MAPCLI')
                     MAPSET('SETCLI')
                     FROM(AREA-MAPA)
                     ERASE
           END-EXEC.

Nesse caso, o programa solicita o envio de um mapa para o terminal.

Também podemos encontrar:

           EXEC CICS
                READ FILE('ARQCLI')
                     INTO(REGISTRO-CLIENTE)
                     RIDFLD(WS-CODIGO)
                     RESP(WS-RESP)
           END-EXEC.

Ou:

           EXEC CICS
                LINK PROGRAM('PGM002')
                     COMMAREA(AREA-COMUNICACAO)
                     LENGTH(WS-TAMANHO)
           END-EXEC.

Esses comandos parecem fazer parte do COBOL porque estão misturados ao código.

Entretanto, o compilador COBOL puro não sabe implementar operações como:

  • enviar uma tela;

  • ler um arquivo controlado pelo CICS;

  • iniciar outra transação;

  • acessar uma fila temporária;

  • chamar outro programa por meio do CICS;

  • devolver o controle ao monitor transacional.

Por isso, entra em cena o tradutor CICS.


4. O tradutor CICS

O tradutor CICS analisa os comandos:

EXEC CICS
...
END-EXEC

e os transforma em estruturas que o compilador COBOL consegue processar.

O fluxo conceitual é:

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

O tradutor não executa a transação.

Ele apenas prepara o fonte.

Imagine o seguinte comando:

           EXEC CICS
                WRITEQ TS
                QUEUE('TEMP001')
                FROM(WS-DADOS)
                LENGTH(WS-TAMANHO)
           END-EXEC.

O tradutor converte essa instrução em uma sequência de chamadas e estruturas internas utilizadas pela interface do CICS.

Depois dessa tradução, o compilador enxerga COBOL válido.

Durante a execução, o programa chama os serviços CICS correspondentes.


5. EXEC CICS é uma macro?

No cotidiano do mainframe, alguns profissionais chamam os comandos EXEC CICS de macros.

Essa forma de falar é compreensível, mas pode gerar confusão.

Uma macro, em outros contextos, costuma ser um trecho expandido diretamente durante a montagem ou compilação.

O comando EXEC CICS é melhor compreendido como uma instrução embutida que precisa ser traduzida por um processador específico.

Portanto, tecnicamente, é mais correto dizer:

EXEC CICS é um comando CICS embutido no programa COBOL.

A distinção pode parecer pequena, mas ajuda o iniciante a compreender que existe uma etapa especializada antes da compilação.


6. CICS controla o recurso, não o programa COBOL

Considere:

           EXEC CICS
                READ FILE('CLIENTES')
                     INTO(REG-CLIENTE)
                     RIDFLD(WS-CODIGO)
                     RESP(WS-RESP)
           END-EXEC.

O programa não abre diretamente o arquivo físico.

Ele pede ao CICS que realize a leitura.

O CICS pode cuidar de:

  • localização do recurso;

  • compartilhamento;

  • segurança;

  • recuperação;

  • bloqueios;

  • integridade;

  • controle transacional;

  • resposta de erro.

O programa recebe o resultado e continua a regra de negócio.

Esse modelo é poderoso porque separa responsabilidades.

Programa COBOL → lógica de negócio
CICS          → controle transacional

7. O que é o Db2?

Db2 é o sistema gerenciador de banco de dados relacional da IBM amplamente utilizado no IBM Z.

Ele organiza informações em:

  • tabelas;

  • colunas;

  • linhas;

  • índices;

  • views;

  • tablespaces;

  • databases;

  • schemas;

  • packages;

  • plans;

  • collections.

O COBOL pode acessar dados Db2 por meio de SQL embutido.

Exemplo:

           EXEC SQL
                SELECT NOME,
                       SALDO
                  INTO :WS-NOME,
                       :WS-SALDO
                  FROM CLIENTES
                 WHERE CODIGO = :WS-CODIGO
           END-EXEC.

Esse SQL está inserido dentro do fonte COBOL.

Porém, ele não pertence diretamente à linguagem COBOL.

Assim como ocorre com o CICS, o SQL precisa ser processado antes da compilação.


8. O pré-compilador Db2

Historicamente, programas COBOL com SQL passavam pelo pré-compilador Db2.

O fluxo clássico é:

Fonte COBOL com EXEC SQL
              ↓
Pré-compilador Db2
              ↓
Fonte COBOL modificado
              +
             DBRM

O pré-compilador realiza duas tarefas importantes.

Primeiro, ele substitui ou prepara os comandos SQL no fonte para que o compilador COBOL possa processá-los.

Segundo, ele gera o DBRM.

Em ambientes modernos, pode ser utilizado um coprocessador SQL integrado ao compilador.

Para o iniciante, o conceito fundamental permanece:

O SQL precisa ser analisado por uma tecnologia Db2 antes ou durante a compilação COBOL.


9. O que é o DBRM?

DBRM significa Database Request Module.

Ele contém informações extraídas dos comandos SQL presentes no programa.

Considere:

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

O Db2 precisa conhecer essa instrução para preparar sua execução.

O DBRM representa as requisições SQL encontradas no programa.

Posteriormente, ele será utilizado em uma operação de BIND.

O fluxo é:

Programa com SQL
       ↓
DBRM
       ↓
BIND PACKAGE
       ↓
Package Db2

O package contém a preparação necessária para que o Db2 execute as instruções SQL.


10. O BIND do Db2

O BIND do Db2 transforma o DBRM em um package executável pelo subsistema.

Durante esse processo, o Db2 pode avaliar:

  • existência das tabelas;

  • existência das colunas;

  • existência dos índices;

  • autorizações;

  • estatísticas;

  • opções de isolamento;

  • caminhos de acesso;

  • versões;

  • collections;

  • parâmetros de execução.

O Db2 decide como determinada instrução poderá ser executada.

Por exemplo:

SELECT NOME
FROM CLIENTES
WHERE CODIGO = ?

O Db2 poderá utilizar:

  • um índice;

  • uma varredura de tabela;

  • um índice composto;

  • uma combinação de acessos;

  • alguma estratégia definida pelo otimizador.

O programa COBOL informa o que deseja.

O Db2 decide como localizar os dados.


11. BIND Db2 não é linkedição

Este é um dos pontos mais importantes deste capítulo.

No mainframe, a palavra “bind” pode aparecer em contextos diferentes.

Existe o Binder do z/OS, responsável pela criação do módulo executável.

E existe o BIND do Db2, responsável pela preparação do SQL.

Binder z/OS → cria load module ou program object
BIND Db2    → cria package

Portanto:

Compilação + linkedição ≠ BIND Db2

Um programa pode estar perfeitamente compilado e linkedidado, mas falhar porque:

  • o package não existe;

  • o package está inválido;

  • a collection está incorreta;

  • o usuário não possui autorização;

  • os objetos Db2 foram alterados;

  • a versão do package não corresponde ao programa.


12. As duas trilhas de um programa Db2

Um programa COBOL com Db2 segue duas trilhas paralelas.

Trilha COBOL

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

Trilha Db2

EXEC SQL
  ↓
DBRM
  ↓
BIND
  ↓
Package

Na execução, as duas trilhas se encontram.

O módulo executável inicia a lógica COBOL.

Quando chega a um comando SQL, ele aciona a interface Db2, que utiliza o package correspondente.

O load module sozinho não é suficiente.

O package sozinho também não é suficiente.

Eles trabalham em conjunto.


13. Host variables

Campos COBOL utilizados dentro de instruções SQL são chamados de host variables.

Exemplo:

       01  WS-CODIGO            PIC 9(09).
       01  WS-NOME              PIC X(40).

No SQL:

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

Os dois-pontos indicam que os campos pertencem ao programa COBOL.

Sem essa indicação, o Db2 poderia interpretar o nome como uma coluna ou outro elemento SQL.

As host variables formam a ponte entre:

Memória COBOL ↔ Db2

14. A SQLCA

SQLCA significa SQL Communication Area.

Ela contém informações sobre a execução do último comando SQL.

Sua inclusão pode ser feita assim:

           EXEC SQL
                INCLUDE SQLCA
           END-EXEC.

Depois de uma instrução SQL, o programa pode testar:

           EVALUATE SQLCODE
               WHEN 0
                   DISPLAY 'OPERACAO REALIZADA'
               WHEN 100
                   DISPLAY 'REGISTRO NAO ENCONTRADO'
               WHEN OTHER
                   DISPLAY 'ERRO SQL: ' SQLCODE
           END-EVALUATE.

O SQLCODE é um dos campos mais conhecidos.

Alguns resultados comuns são:

SQLCODE 0    → sucesso
SQLCODE 100  → nenhuma linha encontrada
SQLCODE negativo → erro
SQLCODE positivo → aviso ou situação específica

O programa precisa tratar esses resultados.

Ignorar o SQLCODE é como atravessar uma rodovia sem olhar os sinais.


15. Indicadores de nulo

No Db2, uma coluna pode aceitar valor nulo.

COBOL, porém, trabalha com campos que possuem conteúdo físico.

Para representar um nulo, é comum utilizar uma variável indicadora.

Exemplo:

       01  WS-TELEFONE          PIC X(15).
       01  WS-IND-TELEFONE      PIC S9(04) COMP.

No SQL:

           EXEC SQL
                SELECT TELEFONE
                  INTO :WS-TELEFONE
                       :WS-IND-TELEFONE
                  FROM CLIENTES
                 WHERE CODIGO = :WS-CODIGO
           END-EXEC.

Se o indicador retornar valor negativo, a coluna estava nula.

Sem o indicador adequado, o programa pode receber erros ao tentar trabalhar com valores nulos.


16. Um programa CICS com Db2

Em sistemas online, é comum encontrar CICS e Db2 dentro do mesmo programa.

Exemplo:

           EXEC CICS
                RECEIVE MAP('MAPCLI')
                        MAPSET('SETCLI')
                        INTO(AREA-MAPA)
           END-EXEC.

           MOVE MAP-CODIGO TO WS-CODIGO.

           EXEC SQL
                SELECT NOME,
                       SALDO
                  INTO :WS-NOME,
                       :WS-SALDO
                  FROM CLIENTES
                 WHERE CODIGO = :WS-CODIGO
           END-EXEC.

           EXEC CICS
                SEND MAP('MAPCLI')
                     MAPSET('SETCLI')
                     FROM(AREA-MAPA)
           END-EXEC.

Nesse caso, o programa utiliza:

  • CICS para controlar a transação e a tela;

  • Db2 para acessar os dados;

  • COBOL para executar a regra de negócio.

O fluxo pode envolver:

Fonte com CICS e SQL
          ↓
Tradução CICS
          ↓
Processamento Db2
          ↓
Compilação COBOL
          ↓
Linkedição
          ↓
BIND do package Db2

A sequência exata pode variar conforme as ferramentas e versões.

Mas todos esses elementos precisam ser preparados.


17. O que é IMS?

IMS significa Information Management System.

É uma plataforma histórica e extremamente importante no ecossistema IBM Z.

Ela pode ser dividida em duas grandes áreas:

IMS DB → gerenciamento de banco de dados hierárquico
IMS TM → gerenciamento de transações e mensagens

Um banco IMS não organiza os dados exatamente como uma tabela relacional.

Ele utiliza uma estrutura hierárquica baseada em segmentos.

Podemos imaginar:

CLIENTE
   ├── CONTA
   │      ├── MOVIMENTO
   │      └── CARTAO
   └── ENDERECO

O segmento CLIENTE pode ser o pai.

CONTA e ENDERECO podem ser filhos.

MOVIMENTO pode ser filho de CONTA.

Essa estrutura lembra uma árvore.


18. Chamadas DL/I

Programas COBOL acessam IMS por meio da interface DL/I.

DL/I significa Data Language/I.

Uma chamada conceitual pode ser:

           CALL 'CBLTDLI'
                USING GU-FUNCTION
                      PCB-MASK
                      SEGMENTO-CLIENTE
                      SSA-CLIENTE.

A função GU significa Get Unique.

Ela solicita a localização de um segmento específico.

Outras funções comuns incluem:

GU    Get Unique
GN    Get Next
GNP   Get Next Within Parent
GHU   Get Hold Unique
GHN   Get Hold Next
ISRT  Insert
REPL  Replace
DLET  Delete

O programa envia uma solicitação ao IMS.

O IMS navega pela estrutura hierárquica e retorna o segmento solicitado.


19. O PCB no IMS

PCB significa Program Communication Block.

Ele representa a comunicação entre o programa e um banco ou fila de mensagens IMS.

Após uma chamada DL/I, o programa pode verificar campos da PCB para descobrir:

  • status da operação;

  • nome do segmento;

  • nível hierárquico;

  • informações de processamento;

  • resultado da chamada.

É semelhante ao papel do FILE STATUS em arquivos ou do SQLCODE no Db2.

Cada tecnologia possui sua maneira de informar ao programa o resultado da operação.

QSAM/VSAM → FILE STATUS
Db2       → SQLCODE e SQLSTATE
IMS       → status da PCB
CICS      → RESP e RESP2
Adabas    → response code

Um bom programador não ignora nenhum desses retornos.


20. O que são DBD e PSB?

O ambiente IMS utiliza definições importantes.

DBD

DBD significa Database Description.

Ele descreve a estrutura do banco IMS:

  • segmentos;

  • relacionamentos;

  • campos-chave;

  • organização;

  • métodos de acesso;

  • características físicas e lógicas.

PSB

PSB significa Program Specification Block.

Ele define quais recursos um programa pode acessar e como poderá acessá-los.

O PSB pode conter PCBs para:

  • bancos IMS;

  • filas de mensagens;

  • outros recursos.

Podemos imaginar:

DBD → descreve o banco
PSB → descreve a visão do programa
PCB → interface usada durante a execução

21. IMS Transaction Manager

O IMS TM controla transações baseadas em mensagens.

Um fluxo simplificado pode ser:

Terminal, API ou outro sistema
             ↓
Mensagem de entrada
             ↓
Fila IMS
             ↓
Código de transação
             ↓
Programa COBOL
             ↓
Processamento
             ↓
Mensagem de saída

O programa pode receber a mensagem por meio de uma PCB de entrada e produzir uma resposta.

Assim como o CICS, o IMS controla o ambiente transacional.

Mas sua arquitetura, seus conceitos e sua forma de programação são diferentes.


22. Regiões IMS

Programas IMS podem executar em diferentes tipos de regiões.

Entre elas:

  • MPP;

  • BMP;

  • batch DL/I;

  • regiões utilitárias;

  • ambientes controlados pelo IMS.

MPP

Message Processing Program.

Processa mensagens e transações IMS.

BMP

Batch Message Processing.

Executa processamento batch com acesso controlado a bancos IMS e, em certos casos, filas.

O programa COBOL continua sendo compilado e linkedidado.

Porém, sua execução depende do ambiente IMS e das definições corretas.


23. O que é Adabas?

Adabas é um sistema de gerenciamento de banco de dados criado pela Software AG.

Ele se tornou muito conhecido em ambientes que utilizam Natural, mas também pode ser acessado por programas COBOL.

O Adabas possui uma arquitetura própria e utiliza componentes como:

  • Nucleus;

  • arquivos Adabas;

  • control blocks;

  • buffers;

  • interfaces de chamada;

  • códigos de resposta.

O Nucleus é o componente central que processa as solicitações.

Uma representação simplificada seria:

Programa COBOL
      ↓
Interface Adabas
      ↓
Adabas Nucleus
      ↓
Arquivo Adabas

24. Control Block e buffers Adabas

Um programa pode utilizar um control block para informar:

  • comando;

  • arquivo;

  • identificadores;

  • opções;

  • códigos de resposta;

  • informações de navegação;

  • parâmetros da operação.

Também podem existir buffers como:

Format Buffer

Define os campos que serão lidos ou atualizados.

Record Buffer

Recebe ou envia os dados do registro.

Search Buffer

Descreve os critérios de pesquisa.

Value Buffer

Contém os valores utilizados na pesquisa.

ISN Buffer

Pode armazenar números internos de sequência de registros.

Essas estruturas são fornecidas à interface Adabas durante a chamada.


25. Response Code Adabas

Após uma operação, o programa precisa verificar o código de resposta.

Um retorno de sucesso indica que a solicitação foi processada.

Outros códigos podem indicar:

  • registro não encontrado;

  • arquivo indisponível;

  • comando inválido;

  • conflito;

  • erro de formato;

  • problema de segurança;

  • falha de comunicação;

  • inconsistência de parâmetros.

Assim como no Db2, IMS, CICS ou VSAM, nunca se deve presumir que uma operação foi bem-sucedida sem verificar o retorno.


26. Natural e Adabas

Muitos iniciantes associam Adabas exclusivamente à linguagem Natural.

Essa associação existe porque as duas tecnologias são frequentemente utilizadas juntas.

Porém:

Natural é uma linguagem e ambiente de desenvolvimento.
Adabas é um sistema gerenciador de banco de dados.

Um programa COBOL também pode acessar Adabas por meio de interfaces apropriadas.

Da mesma forma, um programa Natural pode acessar outros recursos.

Não confunda a linguagem com o banco de dados.


27. O padrão comum entre CICS, Db2, IMS e Adabas

Apesar das diferenças, existe um padrão arquitetural comum.

O programa COBOL não controla diretamente toda a infraestrutura.

Ele solicita serviços.

COBOL → descreve a regra de negócio
CICS  → controla a transação
Db2   → gerencia dados relacionais
IMS   → gerencia dados hierárquicos e mensagens
Adabas → gerencia dados em sua arquitetura

Cada ambiente fornece:

  • interfaces;

  • comandos;

  • códigos de retorno;

  • controle de recursos;

  • segurança;

  • recuperação;

  • mecanismos de diagnóstico.

O programa COBOL deve respeitar os contratos de cada um.


28. O código de retorno é parte da lógica

Considere um programador que escreve:

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

           DISPLAY 'OPERACAO REALIZADA'.

Esse programa exibe sucesso sem verificar o SQLCODE.

Se a conta não existir, o programa poderá informar uma operação que não aconteceu.

O correto seria:

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

           EVALUATE SQLCODE
               WHEN 0
                   DISPLAY 'OPERACAO REALIZADA'
               WHEN 100
                   DISPLAY 'CONTA NAO ENCONTRADA'
               WHEN OTHER
                   DISPLAY 'ERRO DB2: ' SQLCODE
           END-EVALUATE.

O mesmo princípio vale para:

RESP CICS
FILE STATUS
PCB IMS
Response Code Adabas

No mainframe, tratar retorno não é uma recomendação opcional.

É parte da regra de negócio.


29. O perigo das opções implícitas

Alguns comandos utilizam tratamento automático de erro.

No CICS, por exemplo, certos erros podem transferir o controle para mecanismos padrão caso o programa não utilize opções como:

RESP
RESP2
NOHANDLE
HANDLE CONDITION

Em programas modernos, é comum preferir tratamento explícito por RESP e RESP2.

Exemplo:

           EXEC CICS
                READ FILE('ARQCLI')
                     INTO(REG-CLIENTE)
                     RIDFLD(WS-CODIGO)
                     RESP(WS-RESP)
                     RESP2(WS-RESP2)
           END-EXEC.

           EVALUATE WS-RESP
               WHEN DFHRESP(NORMAL)
                   CONTINUE
               WHEN DFHRESP(NOTFND)
                   DISPLAY 'CLIENTE NAO ENCONTRADO'
               WHEN OTHER
                   DISPLAY 'ERRO CICS: ' WS-RESP
           END-EVALUATE.

O objetivo é impedir que falhas sejam tratadas de forma inesperada.


30. Copybooks especializados

Esses ambientes também utilizam copybooks.

No CICS, podem existir:

  • layouts de COMMAREA;

  • mapas BMS;

  • estruturas de mensagens;

  • áreas de resposta;

  • contratos entre programas.

No Db2, podem existir:

  • DCLGENs;

  • estruturas de tabelas;

  • SQLCA;

  • áreas de entrada e saída.

No IMS:

  • layouts de segmentos;

  • PCBs;

  • SSAs;

  • áreas de mensagens.

No Adabas:

  • control blocks;

  • buffers;

  • layouts de registros;

  • constantes e códigos.

Portanto, o copybook apresentado na primeira parte continua sendo fundamental.

Ele liga o programa às interfaces dos subsistemas.


31. DCLGEN no Db2

DCLGEN significa Declarations Generator.

Ele pode gerar estruturas COBOL compatíveis com colunas de uma tabela Db2.

Exemplo conceitual:

       01  DCLCLIENTES.
           10 CLIENTE-CODIGO     PIC S9(9) COMP.
           10 CLIENTE-NOME       PIC X(40).
           10 CLIENTE-SALDO      PIC S9(11)V99 COMP-3.

O programa inclui essa estrutura por meio de um copybook ou processo equivalente.

Isso reduz a possibilidade de divergência entre os campos COBOL e as definições do banco.

Porém, a geração não elimina a necessidade de análise.

Tipos, precisão, nulos e conversões precisam ser compreendidos.


32. O programa ainda não é executável

Depois da tradução CICS, do processamento SQL e da preparação das interfaces IMS ou Adabas, o programa ainda não está pronto para executar.

Neste momento, temos algo semelhante a:

Fonte COBOL preparado
Copybooks expandidos ou localizados
Comandos CICS traduzidos
Comandos SQL processados
DBRM gerado
Interfaces disponíveis

O próximo passo será a compilação.

O compilador transformará o fonte em código objeto.

Depois, o Binder realizará a linkedição.

Somente então surgirá o módulo executável.


33. O fluxo completo desta etapa

Podemos representar a Parte II assim:

Fonte COBOL
     ↓
Identificação de comandos externos
     ↓
EXEC CICS → tradução CICS
     ↓
EXEC SQL → pré-compilação ou coprocessamento Db2
     ↓
Geração do DBRM
     ↓
Chamadas IMS → preparação das interfaces DL/I
     ↓
Chamadas Adabas → uso de control blocks e buffers
     ↓
Fonte preparado para compilação

Em paralelo:

DBRM
  ↓
BIND Db2
  ↓
Package

34. Erros típicos antes da compilação

Nesta fase, podem ocorrer problemas como:

CICS

  • comando EXEC CICS inválido;

  • opção incompatível;

  • copybook CICS ausente;

  • tamanho incorreto de COMMAREA;

  • referência a campo inexistente;

  • estrutura de mapa incorreta.

Db2

  • host variable não declarada;

  • SQLCA ausente;

  • sintaxe SQL inválida;

  • DCLGEN incompatível;

  • indicador de nulo inexistente;

  • DBRM não gerado.

IMS

  • PCB incompatível;

  • SSA incorreta;

  • função DL/I inválida;

  • layout de segmento divergente;

  • ordem incorreta dos parâmetros.

Adabas

  • control block incorreto;

  • buffer incompatível;

  • código de comando inválido;

  • tamanho inconsistente;

  • interface ausente.

O segredo é identificar em qual tecnologia o erro está ocorrendo.


35. O Padawan pergunta: quem executa primeiro?

A resposta depende do programa.

Um programa COBOL batch simples pode seguir diretamente para o compilador.

Um programa CICS pode precisar de tradução.

Um programa Db2 precisa de processamento SQL.

Um programa CICS Db2 precisa dos dois.

Um programa IMS ou Adabas precisa das interfaces corretas durante compilação, linkedição e execução.

Portanto:

Não existe um único fluxo universal.

Existe um fluxo-base que recebe etapas adicionais conforme as tecnologias utilizadas.


36. O verdadeiro papel do COBOL

O COBOL continua sendo o centro da regra de negócio.

Exemplo:

           IF WS-SALDO >= WS-VALOR
               PERFORM DEBITAR-CONTA
               PERFORM REGISTRAR-MOVIMENTO
           ELSE
               MOVE 'SALDO INSUFICIENTE'
                 TO WS-MENSAGEM
           END-IF.

Porém, as operações internas podem utilizar vários subsistemas.

DEBITAR-CONTA        → Db2
REGISTRAR-MOVIMENTO  → IMS
ENVIAR-MENSAGEM      → CICS ou MQ
CONSULTAR-CADASTRO   → Adabas

O COBOL orquestra a regra.

Os subsistemas fornecem capacidades especializadas.


37. Uma analogia com uma missão espacial

Imagine uma nave espacial.

O programa COBOL é o comandante da missão.

Ele decide:

  • qual objetivo deve ser atingido;

  • qual operação deve ser realizada;

  • o que fazer em caso de falha;

  • quando continuar;

  • quando interromper.

O CICS é o centro de controle de missões online.

O Db2 é o banco de dados científico organizado em tabelas.

O IMS é o sistema hierárquico de navegação e mensagens.

O Adabas é outro repositório especializado de dados.

O tradutor CICS e o pré-compilador Db2 são intérpretes que transformam os comandos do comandante em instruções compreensíveis por cada sistema.

O compilador, que veremos no próximo capítulo, será o engenheiro que converterá toda a missão em instruções executáveis pela máquina.


38. Conselhos do Mestre Bellacosa

Ao trabalhar com programas que utilizam CICS, Db2, IMS ou Adabas, sempre pergunte:

  • Quais processadores precisam preparar o fonte?

  • Existe tradução CICS?

  • Existe pré-compilação ou coprocessador Db2?

  • O DBRM foi gerado?

  • O package correto foi criado?

  • O programa utiliza a versão certa do DCLGEN?

  • As host variables estão compatíveis?

  • O SQLCODE está sendo tratado?

  • O RESP CICS está sendo validado?

  • A PCB IMS corresponde ao PSB utilizado?

  • Os códigos de resposta Adabas são verificados?

  • Os copybooks estão na versão correta?

  • O ambiente de compilação utiliza as bibliotecas corretas?

  • O processo automatizado esconde quais etapas?

Essas perguntas transformam um iniciante em um profissional que entende arquitetura.


Conclusão

Um programa COBOL corporativo pode conter muito mais do que instruções COBOL tradicionais.

Comandos EXEC CICS precisam ser traduzidos para que o compilador possa processá-los.

Comandos EXEC SQL precisam ser analisados pelo pré-compilador ou coprocessador Db2, gerando um fonte preparado e um DBRM.

O DBRM será utilizado no BIND para criação de um package.

No IMS, o programa utiliza chamadas DL/I, PCBs, PSBs, DBDs e layouts hierárquicos.

No Adabas, o acesso ocorre por meio de interfaces, control blocks, buffers e códigos de resposta.

Apesar das diferenças, todos esses ambientes compartilham o mesmo princípio:

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

O CICS controla transações.

O Db2 gerencia dados relacionais.

O IMS processa bancos hierárquicos e mensagens.

O Adabas administra dados por meio de sua própria arquitetura.

E o COBOL permanece no centro, coordenando decisões, cálculos, validações e fluxos empresariais.

Mas ainda falta uma etapa fundamental.

Até agora, o código foi apenas preparado.

Ele ainda não se tornou um módulo executável.

No próximo capítulo

Na Parte III — Compilação, Linkedição e Load Library, entraremos no coração da transformação.

Veremos passo a passo:

  • como o compilador analisa o programa;

  • como o fonte se transforma em código objeto;

  • por que o objeto ainda não é o executável final;

  • como funciona o Binder;

  • o que são chamadas estáticas e dinâmicas;

  • como nasce um load module;

  • onde o executável é armazenado;

  • como interpretar return codes e listagens.

Se nesta parte conhecemos os tradutores que preparam a mensagem, no próximo capítulo conheceremos a fábrica que transforma palavras em instruções de máquina.

Prepare outra xícara de café.

A verdadeira transformação do programa COBOL está prestes a começar.

“O Padawan enxerga CICS, Db2, IMS e Adabas como comandos misturados ao COBOL. O especialista enxerga contratos entre arquiteturas, cada uma responsável por uma parte essencial do processamento corporativo.”