☕ Um Café no Bellacosa Mainframe
Gostou do conteúdo? Ajude a manter o café quente, o COBOL compilando e o mainframe acordado. 😄
☕ Pague um café ao Bellacosa

Translate

sábado, 22 de janeiro de 2022

Da Compilação à Execução de um Programa COBOL - Parte I

 

Bellacosa Mainframe e a compilação COBOL

☕ Um Café no Bellacosa Mainframe

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


PARTE I — O Nascimento do Programa COBOL

Do código-fonte aos copybooks: entendendo o que realmente acontece antes da compilação

Introdução

Todo programa COBOL começa como uma ideia de negócio.

Pode ser o cálculo dos juros de um financiamento, a atualização do saldo de uma conta, o processamento de uma folha de pagamento ou a leitura de milhões de registros durante a madrugada.

O programador transforma essa regra em código-fonte:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. PGMCLI01.

       DATA DIVISION.
       WORKING-STORAGE SECTION.

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

       PROCEDURE DIVISION.
           DISPLAY 'INICIO DO PROGRAMA'
           MOVE 'PADAWAN COBOL' TO WS-NOME
           MOVE 25 TO WS-IDADE
           DISPLAY WS-NOME
           DISPLAY WS-IDADE
           STOP RUN.

Para o iniciante, o programa parece pronto.

Mas a CPU do IBM Z não entende diretamente comandos como MOVE, DISPLAY, READ, PERFORM ou COMPUTE.

O código ainda precisará atravessar uma verdadeira linha de montagem industrial antes de se transformar em algo executável.

Nesta primeira parte, conheceremos o código-fonte, os copybooks e os elementos que formam a matéria-prima de uma aplicação COBOL.


1. O código-fonte COBOL

O código-fonte normalmente fica armazenado em uma biblioteca particionada, como um PDS ou PDSE.

Exemplo:

EMPRESA.SISTEMA.COBOL

Dentro dessa biblioteca existem membros:

PGMCLI01
PGMCLI02
PGMREL01
PGMCALC

Cada membro pode representar um programa.

Assim:

EMPRESA.SISTEMA.COBOL(PGMCLI01)

significa que PGMCLI01 é um membro da biblioteca de fontes.

O código-fonte é legível para seres humanos, mas ainda não está em linguagem de máquina.

Podemos comparar o fonte com uma receita.

A receita explica:

  • quais ingredientes serão usados;

  • quais operações deverão ser realizadas;

  • em que ordem;

  • quais decisões precisam ser tomadas;

  • qual resultado deverá ser produzido.

Porém, possuir uma receita não significa que o prato já esteja pronto.


2. O que é um copybook?

O copybook é um fragmento reutilizável de código COBOL.

Ele pode conter:

  • layouts de registros;

  • áreas de comunicação;

  • estruturas de arquivos;

  • campos utilizados por vários programas;

  • códigos de retorno;

  • estruturas de mensagens;

  • dados recebidos de outros sistemas;

  • definições de tabelas;

  • áreas utilizadas por CICS, Db2, IMS ou Adabas.

Imagine que vários programas utilizem o mesmo registro de cliente:

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

Em vez de repetir essa estrutura em cinquenta programas, ela pode ser gravada em:

EMPRESA.SISTEMA.COPYLIB(CPYCLI01)

No programa COBOL, basta escrever:

       COPY CPYCLI01.

Durante o processamento do fonte, o conteúdo do copybook é incluído logicamente naquele ponto.

O compilador passa a enxergar:

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

O copybook não é normalmente um programa separado.

Ele também não se transforma sozinho em um módulo executável.

Sua função principal é fornecer código reutilizável.


3. COPY não é CALL

Essa diferença é fundamental.

Quando escrevemos:

       COPY CPYCLI01.

estamos incluindo um trecho de código durante a preparação ou compilação.

Quando escrevemos:

       CALL 'PGMCALC' USING WS-DADOS.

estamos solicitando a execução de outro módulo.

Podemos resumir assim:

COPY → inclusão de fonte
CALL → chamada de programa

O copybook passa a fazer parte do programa compilado.

O programa chamado continua sendo uma unidade executável separada, especialmente quando a chamada é dinâmica.


4. COPY REPLACING

O COBOL permite substituir textos durante a inclusão de um copybook.

Exemplo:

       COPY CPYCLI01
           REPLACING ==CLI-== BY ==TITULAR-==.

Se o copybook possuir:

       05 CLI-NOME PIC X(40).

o programa poderá receber:

       05 TITULAR-NOME PIC X(40).

Isso permite reutilizar uma mesma estrutura com prefixos diferentes.

Porém, o uso excessivo de REPLACING pode tornar o programa mais difícil de ler.

No mainframe corporativo, legibilidade é uma forma de segurança.

Um código pode funcionar durante vinte anos. Durante esse período, dezenas de profissionais poderão precisar mantê-lo.


5. O copybook como contrato

Imagine que dois programas compartilhem uma área de comunicação:

       01  AREA-CLIENTE.
           05 CLI-CODIGO        PIC 9(09).
           05 CLI-SALDO         PIC S9(11)V99 COMP-3.

O programa principal envia essa área:

           CALL 'PGMCALC'
                USING AREA-CLIENTE.

O programa chamado precisa interpretar exatamente o mesmo layout.

Se alguém alterar o campo:

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

mas recompilar apenas um dos programas, os dois módulos poderão enxergar a memória de maneiras diferentes.

O resultado pode ser:

  • dados deslocados;

  • valores incorretos;

  • erro numérico;

  • corrupção de informações;

  • abends;

  • falhas silenciosas.

Por isso, um copybook não é somente um conjunto de campos.

Ele é um contrato entre programas.

Alterá-lo exige análise de impacto.


6. Onde o compilador procura os copybooks?

No JCL de compilação, as bibliotecas de copybooks costumam ser indicadas por meio de DD statements como SYSLIB.

Exemplo conceitual:

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

Pode haver mais de uma biblioteca:

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

A ordem dessas bibliotecas pode ser importante.

Se dois copybooks tiverem o mesmo nome, o primeiro localizado poderá ser utilizado.

É por isso que a configuração da compilação precisa ser controlada.


7. Um programa pode depender de muitos componentes

Mesmo antes de ser compilado, um fonte COBOL pode depender de:

Código-fonte
Copybooks
Layouts de arquivos
Áreas de comunicação
Definições de mensagens
SQL embutido
Comandos CICS
Interfaces IMS
Interfaces Adabas
Opções do compilador

Isso explica por que não basta copiar apenas o fonte de um ambiente para outro.

O programa também depende do ecossistema ao redor dele.


8. O primeiro mapa mental

Nesta etapa, temos:

Regra de negócio
       ↓
Código-fonte COBOL
       ↓
Copybooks e estruturas reutilizadas
       ↓
Fonte completo para processamento

Ainda não existe um executável.

Existe apenas uma descrição estruturada do que o sistema deverá fazer.


Bellacosa Maifnrame e o fluxo da compilacao cobol

Conclusão da Parte I

O programa COBOL nasce como fonte, geralmente dentro de uma biblioteca PDS ou PDSE.

Os copybooks fornecem estruturas reutilizáveis e funcionam como contratos entre programas, arquivos e subsistemas.

Porém, a CPU ainda não consegue executar esse material.

Antes da compilação, alguns programas precisam passar por tradutores e pré-compiladores especializados.

Comandos como:

EXEC CICS
EXEC SQL

não pertencem diretamente à linguagem COBOL.

Eles precisam ser transformados antes que o compilador possa fazer seu trabalho.

No próximo capítulo

Na Parte II, entraremos no território dos comandos CICS, SQL Db2, chamadas IMS e interfaces Adabas.

Veremos por que um programa pode precisar ser traduzido ou pré-processado antes da compilação e entenderemos o papel de cada subsistema nessa grande linha de montagem.


PARTE II — CICS, Db2, IMS e Adabas

Os tradutores, pré-compiladores e interfaces que preparam o COBOL para os subsistemas corporativos

Introdução

Na primeira parte, vimos que o programa COBOL nasce como código-fonte e pode reutilizar estruturas armazenadas em copybooks.

Agora surge uma nova pergunta:

O compilador COBOL consegue entender tudo o que aparece dentro de um programa corporativo?

A resposta é não.

Comandos como:

           EXEC CICS
                SEND TEXT
           END-EXEC.

ou:

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

não são comandos COBOL tradicionais.

Eles pertencem a outros ambientes.

Por isso, o programa precisa ser preparado para que o compilador consiga processá-lo.


1. Programas COBOL com CICS

O CICS é um monitor de processamento de transações.

Ele controla:

  • transações;

  • terminais;

  • programas;

  • filas;

  • arquivos;

  • comunicação;

  • segurança;

  • recuperação;

  • sincronização;

  • recursos compartilhados.

Um programa pode solicitar serviços ao CICS:

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

O compilador COBOL não sabe, por conta própria, como executar um EXEC CICS READ.

Antes da compilação, esse comando precisa ser traduzido.


2. O tradutor CICS

O fluxo conceitual é:

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

O tradutor transforma o comando CICS em estruturas e chamadas compatíveis com o compilador.

Historicamente, essa tradução era executada como uma etapa separada.

Em ambientes modernos, pode existir integração com o compilador por meio de opções específicas.

Mesmo quando a ferramenta esconde essa etapa, o conceito permanece.

O comando CICS precisa ser interpretado e convertido.


3. EXEC CICS é uma macro?

No cotidiano, muitos profissionais chamam comandos EXEC CICS de macros.

Essa expressão pode ser compreendida informalmente, mas tecnicamente é melhor dizer que são comandos CICS embutidos no programa COBOL.

Exemplo:

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

O programa não chama diretamente todas as rotinas internas necessárias.

Ele pede ao CICS que execute o serviço.

O CICS verifica o programa, controla a task, acompanha recursos e devolve o controle ao chamador.


4. Programas COBOL com Db2

Um programa pode possuir SQL embutido:

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

O compilador COBOL também não entende diretamente o SQL.

Esse programa precisa passar por um pré-compilador Db2 ou por um coprocessador SQL integrado.

O fluxo clássico é:

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

O fonte modificado seguirá para o compilador.

O DBRM seguirá para o processo de BIND do Db2.


5. O que é DBRM?

DBRM significa Database Request Module.

Ele contém informações sobre os comandos SQL encontrados no programa.

Exemplo de sequência:

EXEC SQL
   ↓
DBRM
   ↓
BIND PACKAGE
   ↓
Package Db2

Durante o BIND, o Db2 pode analisar:

  • tabelas;

  • índices;

  • estatísticas;

  • caminhos de acesso;

  • isolamento;

  • autorizações;

  • parâmetros de execução;

  • versões do package.

O programa COBOL Db2 possui, portanto, duas trilhas.

Trilha do programa

Fonte → compilação → linkedição → executável

Trilha do SQL

SQL → DBRM → BIND → package

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

O package contém a preparação necessária para execução das instruções SQL.


6. O BIND do Db2 não é a linkedição

Essa confusão é comum.

O Binder do z/OS cria o módulo executável.

O BIND PACKAGE do Db2 prepara os comandos SQL.

São processos diferentes.

Binder z/OS → cria executável
BIND Db2    → cria package SQL

Um programa pode estar corretamente compilado e linkedidado, mas falhar porque seu package Db2 não existe ou está inválido.


7. SQLCA e host variables

Programas Db2 costumam utilizar a SQLCA:

           EXEC SQL
                INCLUDE SQLCA
           END-EXEC.

Depois de executar um SQL, o programa pode verificar:

           IF SQLCODE = 0
               DISPLAY 'COMANDO EXECUTADO'
           ELSE
               DISPLAY 'ERRO SQL: ' SQLCODE
           END-IF.

Campos COBOL usados pelo SQL são chamados de host variables:

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

Os dois-pontos identificam campos pertencentes ao programa COBOL.


8. CICS e Db2 no mesmo programa

É comum encontrar:

           EXEC CICS
                RECEIVE ...
           END-EXEC

           EXEC SQL
                SELECT ...
           END-EXEC.

Esse programa pode passar por:

Tradução CICS
      ↓
Processamento Db2
      ↓
Compilação COBOL
      ↓
Linkedição
      ↓
BIND do package

A ordem técnica pode variar conforme as ferramentas utilizadas.

O importante é compreender que existem diferentes processadores preparando o fonte.


9. COBOL com IMS

O IMS é uma plataforma composta por dois grandes universos:

  • IMS Database Manager;

  • IMS Transaction Manager.

Um programa pode acessar um banco hierárquico por meio de chamadas DL/I.

Exemplo conceitual:

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

Algumas funções comuns são:

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

O programa não abre diretamente o banco IMS como um arquivo sequencial.

Ele envia uma solicitação ao IMS.


10. DBD, PSB e PCB

O ambiente IMS utiliza estruturas importantes.

DBD

Database Description.

Descreve a estrutura do banco.

PSB

Program Specification Block.

Descreve quais recursos um programa pode utilizar.

PCB

Program Communication Block.

Representa a visão de comunicação entre o programa e os bancos ou mensagens.

O módulo COBOL precisa executar em um ambiente no qual essas definições estejam disponíveis.


11. IMS Transaction Manager

No IMS TM, uma mensagem pode iniciar uma transação.

Fluxo simplificado:

Terminal, API ou sistema
          ↓
Fila de mensagens
          ↓
Transação IMS
          ↓
Programa COBOL
          ↓
Banco IMS, Db2 ou outros recursos
          ↓
Mensagem de resposta

O programa COBOL processa a regra de negócio.

O IMS controla a transação, a mensagem e o ambiente operacional.


12. COBOL com Adabas

O Adabas é um sistema de gerenciamento de banco de dados associado à Software AG.

Embora seja muito utilizado com Natural, programas COBOL também podem acessar dados Adabas.

O acesso pode envolver:

  • control blocks;

  • format buffers;

  • record buffers;

  • search buffers;

  • value buffers;

  • interfaces de chamada;

  • módulos de comunicação.

Fluxo conceitual:

Programa COBOL
      ↓
Interface Adabas
      ↓
Adabas Nucleus
      ↓
Arquivos Adabas

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

Durante a linkedição, o programa pode precisar das interfaces fornecidas para comunicação com o ambiente Adabas.


13. O princípio comum dos subsistemas

CICS, Db2, IMS e Adabas possuem arquiteturas diferentes.

Entretanto, existe uma ideia comum:

O programa COBOL não executa tudo sozinho.

Ele solicita serviços a componentes especializados.

COBOL → regra de negócio
CICS  → transações
Db2   → banco relacional
IMS   → banco hierárquico e mensagens
Adabas → gerenciamento de dados

Essa separação torna os sistemas mais controlados e escaláveis.


Conclusão da Parte II

Antes de chegar ao compilador, um programa pode precisar ser traduzido ou pré-processado.

O CICS traduz seus comandos embutidos.

O Db2 processa o SQL e produz um DBRM.

O IMS fornece interfaces DL/I e estruturas de controle.

O Adabas oferece seus próprios blocos e módulos de comunicação.

Depois dessa preparação, o fonte finalmente estará pronto para ser transformado em código objeto.

No próximo capítulo

Na Parte III, veremos o coração técnico do processo:

  • compilação;

  • código objeto;

  • linkedição;

  • Binder;

  • chamadas estáticas e dinâmicas;

  • load modules;

  • load libraries.

É nesse momento que o código começa verdadeiramente a se transformar em um programa executável.


PARTE III — Compilação, Linkedição e Load Library

Como o fonte COBOL se transforma em um módulo executável no IBM Z

Introdução

Depois que copybooks foram incluídos e comandos CICS ou SQL foram devidamente preparados, o programa está pronto para entrar na linha de montagem principal.

Agora o compilador COBOL analisará o fonte e produzirá código objeto.

Em seguida, o Binder reunirá esse objeto com interfaces e módulos necessários, criando o executável.

Essa é a etapa em que o programa deixa de ser apenas texto e começa a se aproximar da linguagem compreendida pelo processador.


1. O que é compilação?

Compilar significa transformar o código-fonte COBOL em código objeto.

Fluxo básico:

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

O compilador analisa:

  • sintaxe;

  • campos;

  • tipos de dados;

  • tamanhos;

  • parágrafos;

  • referências;

  • operações aritméticas;

  • arquivos;

  • opções de otimização;

  • compatibilidade entre comandos.

Considere:

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

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

O compilador transforma essa lógica em instruções compatíveis com a arquitetura IBM Z.


2. O código objeto já é executável?

Nem sempre.

O objeto pode possuir referências externas ainda não resolvidas.

Exemplo:

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

O compilador reconhece que existe uma chamada para VALIDCPF.

Porém, o módulo ainda pode precisar ser localizado ou incluído no processo de linkedição.

É nesse ponto que entra o Binder.


3. O que é linkedição?

Linkedição é o processo de combinar código objeto com outros componentes necessários para criar um módulo executável.

Código objeto
     +
Rotinas externas
     +
Interfaces
     +
Módulos de runtime
     ↓
Módulo executável

Em ambientes atuais, a ferramenta utilizada é chamada de Binder.

Em documentações mais antigas, você poderá encontrar:

  • Linkage Editor;

  • Link-Editor;

  • linkage edition;

  • linkedição;

  • edição de ligação.


4. O Binder

O Binder pode receber:

  • objetos produzidos pelo compilador;

  • módulos estáticos;

  • interfaces CICS;

  • interfaces Db2;

  • interfaces IMS;

  • interfaces Adabas;

  • rotinas de linguagem;

  • pontos de entrada;

  • bibliotecas de módulos reutilizáveis.

O resultado será armazenado em uma biblioteca executável.

Exemplo:

EMPRESA.SISTEMA.LOADLIB(PGMCLI01)

O membro PGMCLI01 já não contém COBOL legível.

Ele contém um módulo preparado para ser carregado e executado.


5. Load module e program object

Durante muitos anos, o termo mais comum foi load module.

Com bibliotecas e formatos mais modernos, também existe o conceito de program object.

No cotidiano, muitos profissionais continuam utilizando expressões como:

  • load;

  • módulo de carga;

  • executável;

  • membro da loadlib.

O conceito fundamental é o mesmo:

Trata-se do artefato que o sistema poderá localizar, carregar na memória e executar.


6. Exemplo de JCL de compilação

Uma etapa conceitual de compilação poderia ser:

//COMPILE  EXEC PGM=IGYCRCTL
//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))

O compilador lê o fonte em SYSIN.

Os copybooks são encontrados por meio de SYSLIB.

O objeto é gravado temporariamente em SYSLIN.

A listagem do compilador segue para SYSPRINT.


7. Exemplo de linkedição

A etapa seguinte poderia ser:

//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 SYSLIN.

O executável é gravado por SYSLMOD.

A saída de diagnóstico segue para SYSPRINT.


8. Procedures catalogadas

Em muitas empresas, o programador não escreve todas essas etapas.

Ele utiliza uma procedure:

//COMPILA EXEC PROC=COBOLCL

Ou:

//COMPILA EXEC PROC=COBDB2

Ou ainda:

//COMPILA EXEC PROC=COBCICS

A procedure pode esconder:

  • compilação;

  • tradução;

  • pré-compilação;

  • linkedição;

  • bind Db2;

  • bibliotecas;

  • parâmetros;

  • controles corporativos.

Não existe mágica.

Existe automação.


9. Bibliotecas utilizadas

Um projeto pode possuir:

EMPRESA.SISTEMA.COBOL
EMPRESA.SISTEMA.COPYLIB
EMPRESA.SISTEMA.DBRMLIB
EMPRESA.SISTEMA.OBJLIB
EMPRESA.SISTEMA.LOADLIB
EMPRESA.SISTEMA.JCL

COBOL

Fontes.

COPYLIB

Copybooks.

DBRMLIB

DBRMs dos programas Db2.

OBJLIB

Objetos compilados, quando armazenados.

LOADLIB

Executáveis.

JCL

Jobs de compilação e execução.

Os nomes variam entre empresas.

O importante é compreender a função de cada biblioteca.


10. Chamadas estáticas

Uma chamada estática é resolvida durante a linkedição.

O módulo chamado é incorporado ou ligado ao executável.

Vantagens:

  • resolução antecipada;

  • menor dependência de localização em runtime;

  • maior controle sobre a versão incorporada.

Desvantagens:

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

  • executável pode ficar maior;

  • atualização pode afetar vários módulos.


11. Chamadas dinâmicas

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

Exemplo:

           CALL WS-NOME-PROGRAMA
                USING AREA-DADOS.

Ou, conforme opções e codificação:

           CALL 'PGMCALC'
                USING AREA-DADOS.

Vantagens:

  • possibilidade de atualizar o subprograma separadamente;

  • maior reutilização;

  • executável chamador pode ser menor.

Desvantagens:

  • o módulo precisa estar disponível em runtime;

  • uma biblioteca incorreta pode causar programa não encontrado;

  • versões incompatíveis podem gerar erros.


12. Return codes da compilação

Códigos comuns podem incluir:

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

Uma interpretação geral:

RC 0

Compilação concluída sem erros relevantes.

RC 4

Advertências.

RC 8

Erros importantes.

RC 12 ou superior

Falhas graves.

Porém, nunca analise apenas o número.

Leia a listagem do compilador.

Uma advertência ignorada hoje pode se transformar em um problema de produção amanhã.


13. Erro de compilação e erro de linkedição

Erro de compilação

Pode envolver:

  • sintaxe inválida;

  • campo não definido;

  • parágrafo inexistente;

  • conflito de tipos;

  • copybook não encontrado;

  • instrução incorreta.

Erro de linkedição

Pode envolver:

  • símbolo externo não resolvido;

  • módulo ausente;

  • biblioteca não encontrada;

  • interface incompatível;

  • ponto de entrada inválido;

  • erro na criação do executável.

Identificar a fase correta evita investigações aleatórias.


14. O grande fluxo até a loadlib

Podemos resumir:

Fonte COBOL
      ↓
Copybooks
      ↓
Tradução CICS, quando necessária
      ↓
Pré-compilação Db2, quando necessária
      ↓
Compilador COBOL
      ↓
Código objeto
      ↓
Binder
      ↓
Load module ou program object
      ↓
LOADLIB

Nesse momento, finalmente existe um executável.

Porém, ele ainda não está rodando.

Para isso, precisará ser encontrado, carregado, associado aos arquivos e entregue ao sistema operacional.


Conclusão da Parte III

A compilação transforma o fonte em código objeto.

A linkedição reúne objetos, interfaces e dependências para criar o módulo executável.

Esse módulo é armazenado em uma load library.

Mas a jornada ainda não terminou.

Um executável parado dentro de uma biblioteca não realiza nenhum trabalho.

Ele precisa ser iniciado por um job batch, uma transação CICS, uma região IMS ou outro mecanismo de execução.

No próximo capítulo

Na Parte IV, acompanharemos o módulo executável durante a execução.

Veremos:

  • JCL;

  • QSAM;

  • VSAM;

  • JES2;

  • spool;

  • initiator;

  • loader;

  • memória;

  • WLM;

  • dispatcher;

  • CPU.

Finalmente descobriremos como o programa sai da load library e começa a processar dados reais.


PARTE IV — Da Load Library à CPU

JCL, QSAM, VSAM, JES2, spool, memória e execução no IBM Z

Introdução

O programa foi escrito.

Os copybooks foram encontrados.

Os comandos CICS e SQL foram preparados.

O fonte foi compilado.

O objeto foi linkedidado.

O executável foi gravado em uma load library.

Agora chegou o momento da verdade:

Como esse módulo começa a executar?

Nesta última parte, acompanharemos o programa desde a submissão do JCL até sua chegada à CPU.

Também veremos como arquivos QSAM e VSAM são associados ao programa e qual é o verdadeiro papel do JES2.


1. JCL de execução

Um programa batch pode ser chamado assim:

//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:

//STEP01 EXEC PGM=PGMCLI01

solicita a execução do programa.

A STEPLIB indica uma biblioteca na qual o sistema poderá procurar o módulo.


2. Como o programa é localizado?

O z/OS procura o módulo nas bibliotecas disponíveis no ambiente.

Podem participar:

  • TASKLIB;

  • STEPLIB;

  • JOBLIB;

  • LNKLST;

  • bibliotecas do sistema;

  • bibliotecas configuradas por CICS ou IMS.

Em batch, a STEPLIB é muito comum:

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

Se PGMCLI01 não estiver disponível, pode ocorrer um erro de módulo não encontrado, frequentemente associado ao abend S806.

O código COBOL pode estar perfeito.

O problema pode ser apenas uma biblioteca incorreta.


3. QSAM

QSAM significa Queued Sequential Access Method.

Ele é utilizado para arquivos sequenciais.

No COBOL:

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

Na PROCEDURE DIVISION:

           OPEN INPUT ARQ-CLIENTES

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

           CLOSE ARQ-CLIENTES.

4. O contrato entre COBOL e JCL

O programa utiliza:

ASSIGN TO CLIENTES

O JCL fornece:

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

A ligação é:

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

O programa não precisa conter o nome completo do dataset.

Isso permite executar o mesmo módulo com arquivos diferentes em:

  • desenvolvimento;

  • testes;

  • homologação;

  • produção.


5. Um erro comum de DDNAME

Se o programa espera:

ASSIGN TO CLIENTES

mas o JCL possui:

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

a associação poderá falhar.

O dataset existe.

O programa existe.

O erro está no contrato entre COBOL e JCL.

Essa é uma lição importante:

Nem todo erro de execução é um erro de programação.


6. VSAM

VSAM significa Virtual Storage Access Method.

Entre suas organizações estão:

  • KSDS;

  • ESDS;

  • RRDS;

  • LDS;

  • VRRDS.

Um KSDS pode ser definido no COBOL assim:

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

Uma leitura direta:

           MOVE WS-CODIGO-PESQUISA
             TO REG-CODIGO

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

No JCL:

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

7. FILE STATUS

O FILE STATUS ajuda o programa a compreender o resultado de uma operação.

Exemplos conhecidos:

00 → operação concluída
10 → fim do arquivo sequencial
22 → possível chave duplicada
23 → registro não encontrado
35 → problema de abertura ou arquivo ausente

A interpretação exata deve considerar o contexto e a documentação.

O compilador não consegue prever esses erros.

Eles dependem dos dados e do ambiente de execução.


8. QSAM e VSAM não ficam dentro da loadlib

A load library contém o executável.

Os datasets permanecem separados.

LOADLIB
  └── PGMCLI01

QSAM
  └── registros sequenciais

VSAM
  └── registros organizados por chave

Durante a execução, o JCL conecta o programa aos dados.

Essa separação permite grande flexibilidade operacional.


9. O que o JES2 faz?

JES2 significa Job Entry Subsystem 2.

Ele gerencia a entrada, a fila e a saída dos jobs.

Fluxo simplificado:

SUBMIT do JCL
      ↓
JES2 recebe o job
      ↓
Job entra no spool
      ↓
Classe e prioridade são avaliadas
      ↓
Job aguarda execução
      ↓
Initiator seleciona o job
      ↓
Steps são executados
      ↓
Saídas voltam ao spool
      ↓
Usuário consulta no SDSF

O JES2 não compila o COBOL.

Ele também não executa diretamente as instruções na CPU.

Sua função é organizar e administrar o fluxo dos jobs.


10. O spool

O spool é uma área em disco usada para armazenar entrada e saída.

No SDSF, podemos encontrar:

JESMSGLG
JESJCL
JESYSMSG
SYSPRINT
SYSOUT
SYSUDUMP
CEEDUMP

Essas saídas ajudam a analisar:

  • JCL;

  • mensagens do sistema;

  • return codes;

  • listagens;

  • relatórios;

  • dumps;

  • abends;

  • mensagens do Language Environment.


11. O initiator

O initiator seleciona jobs elegíveis para execução.

Ele considera elementos como:

  • classe;

  • disponibilidade;

  • configuração;

  • recursos;

  • prioridade;

  • regras operacionais.

Quando o job é selecionado, cada step precisa ser preparado.

Para:

//STEP01 EXEC PGM=PGMCLI01

o sistema deverá:

  1. interpretar o step;

  2. alocar os DD statements;

  3. localizar o módulo;

  4. preparar o ambiente;

  5. carregar o programa;

  6. entregar o controle;

  7. acompanhar a execução;

  8. registrar o retorno;

  9. liberar os recursos.


12. O loader e a memória

O módulo é localizado em uma biblioteca.

Em seguida, o sistema o carrega no ambiente de memória apropriado.

O programa passa a contar com:

  • código executável;

  • áreas de trabalho;

  • runtime COBOL;

  • Language Environment;

  • buffers;

  • bibliotecas;

  • recursos alocados.

O Language Environment auxilia em:

  • inicialização;

  • armazenamento;

  • parâmetros;

  • tratamento de condições;

  • dumps;

  • finalização;

  • comunicação entre linguagens.


13. O programa chega à CPU

A CPU não entende COBOL.

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

O programa é representado por unidades de trabalho que podem receber tempo de processador.

O dispatcher do z/OS distribui a capacidade entre tarefas elegíveis.

O Workload Manager ajuda a orientar prioridades e objetivos de serviço.

Podem participar dessa decisão:

  • importância;

  • service class;

  • metas de desempenho;

  • dispatching priority;

  • disponibilidade de processadores;

  • estado da tarefa.


14. O programa não fica sempre na CPU

Considere uma leitura:

           READ ARQ-CLIENTES.

A operação pode depender de:

  • QSAM ou VSAM;

  • buffers;

  • canais;

  • controladores;

  • discos;

  • cache;

  • sistema de armazenamento.

Enquanto aguarda uma operação de entrada e saída, o programa pode deixar de utilizar a CPU.

Outra tarefa poderá executar nesse período.

Por isso:

Tempo de CPU ≠ tempo total decorrido

Um job pode levar dez minutos e utilizar uma fração desse tempo em CPU.

O restante pode ser espera por:

  • arquivos;

  • Db2;

  • IMS;

  • Adabas;

  • locks;

  • filas;

  • MQ;

  • rede;

  • entrada e saída.


15. Execução CICS

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

A região CICS já está ativa.

Quando uma transação é solicitada:

  1. o CICS reconhece o código da transação;

  2. verifica segurança;

  3. localiza o programa;

  4. cria uma task;

  5. carrega o módulo, se necessário;

  6. entrega o controle;

  7. atende comandos EXEC CICS;

  8. controla recursos;

  9. finaliza a task.

O JES2 participa da inicialização da região CICS, mas não trata cada transação como um job batch separado.


16. Execução Db2

Durante a execução de um programa Db2:

  1. o módulo COBOL é carregado;

  2. a interface Db2 é acionada;

  3. o package é localizado;

  4. o SQL é executado;

  5. tabelas e índices são acessados;

  6. os resultados retornam às host variables;

  7. a SQLCA informa o resultado.

O load module e o package precisam estar compatíveis.


17. Execução IMS e Adabas

No IMS, o programa executa dentro de uma região adequada e utiliza PSBs, PCBs e serviços DL/I.

No Adabas, o programa envia solicitações para o Nucleus por meio das interfaces disponíveis.

Nos dois casos, a CPU executa o código COBOL, enquanto os subsistemas especializados gerenciam os dados e transações.


18. O fluxo completo

Agora podemos visualizar toda a jornada:

Fonte COBOL
      ↓
Copybooks
      ↓
Tradução CICS
      ↓
Pré-compilação Db2
      ↓
Compilação
      ↓
Código objeto
      ↓
Linkedição
      ↓
Load module
      ↓
LOADLIB
      ↓
JCL ou transação
      ↓
JES2 e spool
      ↓
Initiator
      ↓
Loader
      ↓
Memória
      ↓
Dispatcher e WLM
      ↓
CPU
      ↓
QSAM, VSAM, Db2, IMS, Adabas ou CICS
      ↓
Resultado

Conclusão da Parte IV

O programa COBOL não simplesmente “roda”.

Ele é:

  • escrito;

  • preparado;

  • compilado;

  • linkedidado;

  • armazenado;

  • localizado;

  • carregado;

  • despachado;

  • executado;

  • monitorado.

O JES2 administra a entrada e a saída dos jobs.

O initiator inicia o processamento.

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

O z/OS administra recursos.

O WLM ajuda a orientar prioridades.

O dispatcher entrega tempo de processador.

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

QSAM, VSAM, CICS, Db2, IMS e Adabas fornecem serviços especializados.

O iniciante enxerga apenas um programa.

O especialista enxerga uma cadeia completa de engenharia.


Palavra final do Mestre Bellacosa

Quando alguém disser:

“É só compilar e executar”,

lembre-se de tudo o que existe por trás desse simples comando.

No IBM Z, o programa precisa atravessar uma arquitetura construída para processar milhões de transações com segurança, disponibilidade, controle e previsibilidade.

O Padawan acredita que a jornada termina quando escreve o último STOP RUN.

O especialista sabe que, naquele momento, a verdadeira jornada está apenas começando.

“O COBOL descreve a regra. O compilador constrói o caminho. O Binder reúne as peças. O z/OS prepara o terreno. E a CPU transforma décadas de conhecimento de negócio em processamento real.”

Laboratório Forense Bellacosa Mainframe

CSI z/OS: Da Compilação à Execução de um Programa COBOL

Cinco arquivos de evidências revelam como o código-fonte COBOL atravessa copybooks, CICS, Db2, IMS, compilação, Binder, load library, JCL, JES2, memória e CPU até produzir um resultado no IBM Z.

CASO: COBOL-2022-EXEC EVIDÊNCIAS: 05 ARTIGOS AMBIENTE: IBM Z / z/OS STATUS: ARQUIVO ABERTO

Esta investigação técnica apresenta o ciclo completo de um programa COBOL no mainframe IBM Z. A série explica o nascimento do código-fonte, o uso de copybooks, a preparação de comandos CICS e SQL, a geração de código objeto, a atuação do Binder, o armazenamento em load libraries e a execução por JCL, JES2, loader, Language Environment, dispatcher e CPU. Selecione uma evidência abaixo para ler o artigo correspondente dentro do visualizador.

Evidência selecionada Parte I — Código-fonte, bibliotecas e copybooks
Processando evidência digital...

Laudo preliminar: o nascimento do programa

A primeira parte acompanha a transformação da regra de negócio em código-fonte COBOL, explica o papel das bibliotecas e mostra por que copybooks funcionam como contratos de dados compartilhados entre programas.

COBOL código-fonte copybook SYSLIB IBM Z
Bellacosa Mainframe Forensic Lab · Nenhum byte é inocente até que os logs provem o contrário.

sexta-feira, 21 de janeiro de 2022

COBOL : Muito Além do PIC S9(7)V99 COMP-3

 

Bellacosa Mainframe analisa as variaveis estilo cobol

☕ Um Café no Bellacosa Mainframe

Muito Além do PIC S9(7)V99 COMP-3

O Que Todo Programador COBOL Padawan Precisa Saber Sobre a Anatomia de uma Variável, Como o IBM Z Enxerga Seus Dados e Por Que Essa Sintaxe Continua Dominando o Mundo Financeiro

"Qual é a variável mais importante do COBOL?"

A maioria dos programadores iniciantes responde algo como:

"WS-NOME."

Ou talvez:

"WS-SALARIO."

Mas essa pergunta possui uma resposta muito mais interessante.

A variável mais importante do COBOL não é uma variável específica.

É o conceito por trás de todas elas.

Uma simples declaração como esta:

05 WS-MONTANTE PIC S9(7)V99 COMP-3.

parece pequena.

São apenas alguns caracteres.

Entretanto, essa única linha descreve muito mais informações do que praticamente qualquer linguagem moderna consegue expressar de forma tão compacta.

Ela informa ao compilador:

  • onde o dado pertence;

  • qual seu significado;

  • como será armazenado;

  • como será processado pela CPU;

  • quanto espaço ocupará;

  • se aceita números negativos;

  • onde está a posição decimal;

  • como será gravado em disco;

  • como será enviado ao DB2;

  • como participará das operações matemáticas.

Em outras palavras...

Ela descreve completamente a vida daquele dado.

Hoje vamos abrir essa declaração como um engenheiro desmonta um motor Rolls-Royce.

Pegue seu café.

Vamos viajar para dentro da memória do IBM Z.


Bellacosa Mainframe e a anatomia de uma variavel

COBOL pensa diferente

Quem vem de Java, Python, C# ou JavaScript costuma enxergar uma variável assim:

double salario;

ou

salario = 1500.50

Pronto.

Acabou.

Mas o COBOL nasceu em uma época completamente diferente.

Na década de 60 memória era absurdamente cara.

Processadores eram lentos.

Discos eram pequenos.

Cada byte economizado representava milhares de dólares.

Por isso o COBOL não pergunta apenas:

"Que tipo de variável é essa?"

Ele pergunta:

"Como exatamente esse dado existirá dentro do computador?"

Essa filosofia mudou toda a arquitetura da linguagem.


Primeiro elemento: o nível

05 WS-MONTANTE ...

O número 05 não possui absolutamente nenhuma relação com tamanho.

Ele representa hierarquia.

Imagine um organograma de uma empresa.

Empresa

    Financeiro

        Contabilidade

            Funcionários

O COBOL organiza dados exatamente assim.

Exemplo:

01 CLIENTE.

   05 DADOS-PESSOAIS.

      10 NOME.

      10 CPF.

   05 DADOS-FINANCEIROS.

      10 LIMITE.

      10 SALDO.

Visualmente:

CLIENTE
│
├── DADOS-PESSOAIS
│      ├── NOME
│      └── CPF
│
└── DADOS-FINANCEIROS
       ├── LIMITE
       └── SALDO

Percebe?

O COBOL constrói verdadeiras árvores de dados.

É uma linguagem extremamente orientada à estrutura.

Muito antes de XML.

Muito antes de JSON.

Muito antes de objetos.


O nome importa muito

Observe:

WS-MONTANTE

Isso não é apenas um identificador.

É documentação.

Durante décadas milhares de desenvolvedores trabalharam simultaneamente no mesmo sistema.

Ninguém tinha IDE colorida.

Não existia autocomplete.

Então surgiram convenções.

Por exemplo:

WS-

significa:

Working-Storage

Já:

LS-

é Local Storage.

LK-

Linkage.

SQL-

variáveis utilizadas pelo DB2.

DFH-

estruturas do CICS.

Quando você vê um nome começando por WS-, imediatamente sabe onde aquela variável foi declarada.

Isso aumenta muito a legibilidade.


O verdadeiro coração da declaração

Chegamos ao famoso:

PIC

PIC significa:

Picture

Muitos imaginam que ele define apenas o tamanho.

Não.

Ele descreve a forma como o dado será representado.

É quase um DNA.

Vamos ver alguns exemplos.

Texto:

PIC X(30)

Trinta caracteres.

Somente letras:

PIC A(20)

Numérico:

PIC 9(8)

Numérico com casas decimais:

PIC 9(7)V99

Editado para impressão:

PIC $$$,$$9.99

Cada Picture possui uma finalidade diferente.


O significado do "9"

Na nossa variável aparece:

9(7)

O nove significa:

um dígito decimal.

Logo:

9

aceita:

0 até 9

Enquanto

99

aceita

00 até 99

9(7)

é apenas uma forma elegante de escrever:

9999999

Ou seja:

sete dígitos.

Nada mais.

Nada menos.


O misterioso S

Agora observe:

S9(7)

O "S" significa:

Signed.

Número com sinal.

Sem ele:

0
até

9999999

Com ele:

-9999999

até

+9999999

Mas aqui existe uma curiosidade interessante.

O sinal normalmente não ocupa um byte inteiro.

No formato COMP-3 ele é armazenado dentro do último nibble do número.

Uma solução extremamente elegante criada quando memória era um recurso precioso.


A genialidade da vírgula invisível

Agora chegamos ao personagem mais incompreendido do COBOL.

A letra:

V

A maioria dos iniciantes acredita que ela representa uma vírgula.

Na realidade...

Ela representa a posição lógica da vírgula.

A vírgula nunca é gravada.

Nunca.

Suponha:

PIC 9(5)V99

Na memória teremos:

1234567

Mas o COBOL interpreta como:

12345,67

Onde foi parar a vírgula?

Ela nunca existiu.

O compilador apenas sabe que, ao interpretar aquele número, deve considerar duas casas decimais.

Parece um detalhe.

Mas imagine milhões de registros.

Economizar um byte em cada registro significava reduzir discos inteiros.


A importância da precisão

Vamos comparar.

Python:

0.1 + 0.2

Resultado:

0.30000000000000004

Não é erro do Python.

É matemática binária.

Agora veja o COBOL usando Packed Decimal.

0.10

+

0.20

=

0.30

Sempre.

Sem aproximações.

Sem surpresas.

Sem arredondamentos inesperados.

É exatamente por isso que bancos utilizam COMP-3 há décadas.

Dinheiro exige precisão absoluta.


O que é COMP-3?

Agora chegamos ao astro da declaração.

COMP-3

Também conhecido como:

Packed Decimal.

BCD.

Decimal Empacotado.

Ao contrário do DISPLAY, onde cada dígito ocupa um byte inteiro, o COMP-3 armazena dois dígitos por byte.

Cada dígito utiliza apenas quatro bits.

Ou seja:

12

cabe em um único byte.

Muito mais eficiente.


Como o número fica na memória?

Suponha:

123456789

Em DISPLAY:

F1 F2 F3 F4 F5 F6 F7 F8 F9

Nove bytes.

No COMP-3:

12 34 56 78 9C

Cinco bytes.

O "C" representa positivo.

Se fosse negativo:

9D

Essa codificação ainda hoje é utilizada por praticamente todos os grandes bancos do planeta.


Quantos bytes essa variável ocupa?

Existe uma fórmula famosa.

(dígitos + 2) / 2

Arredondando para cima.

Nossa variável possui:

7

+

2

=

9 dígitos

Logo:

(9 + 2) / 2

=

5 bytes

Apenas cinco bytes.


Parece pouco?

Imagine um cadastro contendo:

300 milhões

de clientes.

Economizar quatro bytes por registro significa aproximadamente:

1,2 GB

Apenas em um campo.

Agora multiplique isso por centenas de campos.

Depois por milhares de tabelas.

Depois por backups.

Depois por replicações.

Agora você entende por que arquitetos de mainframe pensam diferente.


O compilador faz muito mais do que imaginamos

Quando escrevemos:

05 WS-MONTANTE PIC S9(7)V99 COMP-3.

Nós enxergamos apenas texto.

O compilador enxerga uma enorme quantidade de metadados.

Ele sabe:

✔ É numérico.

✔ É decimal.

✔ Possui sinal.

✔ Tem duas casas decimais.

✔ Ocupa cinco bytes.

✔ Pode participar de operações aritméticas.

✔ Será armazenado em Packed Decimal.

✔ É compatível com DECIMAL do DB2.

✔ Pode ser usado em comandos ADD, SUBTRACT, MULTIPLY e COMPUTE.

Tudo isso antes mesmo do programa começar a executar.


Por que DB2 gosta tanto de COMP-3?

Observe esta coluna SQL.

SALDO DECIMAL(9,2)

Em COBOL normalmente teremos:

PIC S9(7)V99 COMP-3

Os dois formatos representam exatamente o mesmo conceito.

Resultado?

Conversões mínimas.

Mais velocidade.

Menor consumo de CPU.

Menor custo operacional.


VSAM, IMS e CICS também entendem esse formato

Quando um programa COBOL grava um registro VSAM contendo COMP-3, os números são gravados exatamente nesse formato empacotado.

Quando outro programa COBOL lê esse registro, nenhuma conversão é necessária.

Tudo continua extremamente eficiente.

Por isso sistemas desenvolvidos há quarenta anos continuam rápidos até hoje.


O preço dessa eficiência

Existe um lado curioso.

Abra um arquivo contendo COMP-3 em um editor hexadecimal.

Você verá algo parecido com:

12 34 56 7C

Não parece um número.

Porque não é texto.

É uma representação física otimizada.

Por isso ferramentas modernas precisam converter esses bytes antes de exibi-los.


E quando falamos em APIs REST?

Hoje muitas aplicações COBOL conversam com Java, Python, Node.js e microsserviços.

Entretanto JSON não entende Packed Decimal.

Então ocorre uma conversão.

Internamente:

12 34 56 7C

Externamente:

{
  "saldo": 12345.67
}

É exatamente esse trabalho que tecnologias como IBM z/OS Connect, CICS Web Services e diversos frameworks de integração realizam.

Eles traduzem o universo do IBM Z para um formato compreendido pelas aplicações modernas, preservando a precisão decimal do COBOL.


Uma lição para o Programador Padawan

Talvez você esteja pensando:

"Tudo isso para declarar uma variável?"

Exatamente.

Essa é a beleza do COBOL.

Em linguagens modernas, muitas decisões ficam escondidas dentro da máquina virtual, do compilador ou da biblioteca de execução.

No COBOL, elas são explícitas.

O programador descreve com precisão quase cirúrgica como seus dados devem existir.

Essa filosofia nasceu da necessidade, mas transformou-se em uma das maiores virtudes da linguagem.

Não é por acaso que os maiores bancos, seguradoras, bolsas de valores e órgãos governamentais do mundo continuam confiando no IBM Z para processar trilhões de dólares diariamente.

Quando um PIX é liquidado, um cartão é autorizado, um financiamento é calculado ou uma aposentadoria é paga, há uma grande chance de que, em algum ponto dessa jornada, exista uma variável muito parecida com a nossa velha conhecida:

05 WS-MONTANTE PIC S9(7)V99 COMP-3.

Ela pode parecer simples.

Mas dentro dela vivem mais de seis décadas de engenharia, otimização, compatibilidade e confiabilidade.

E talvez essa seja a maior lição para todo Programador Padawan: no universo do Mainframe, uma linha de código raramente faz apenas uma coisa. Cada declaração carrega décadas de experiência acumulada, decisões arquiteturais cuidadosamente pensadas e um compromisso absoluto com precisão, desempenho e estabilidade. Aprender a "ler" uma variável COBOL é aprender a enxergar a lógica invisível que sustenta alguns dos sistemas mais críticos do planeta. Quando você dominar essa linguagem dos dados, deixará de apenas escrever programas e passará a compreender como o IBM Z realmente pensa.

quinta-feira, 20 de janeiro de 2022

Do Java ao COBOL no IBM Z : Um Guia para Quem Descobriu que o Mainframe Não é um Museu. É uma Usina de Software.

 

Bellacosa Mainframe do java ao cobol no ibm z

☕ Um Café no Bellacosa Mainframe

Do Java ao COBOL no IBM Z

Um Guia para Quem Descobriu que o Mainframe Não é um Museu. É uma Usina de Software.

"Você não está abandonando Java para aprender COBOL. Está adicionando quarenta anos de engenharia de software à sua caixa de ferramentas."

Existe uma pergunta que recebo com frequência:

"Sou desenvolvedor Java em Windows ou Linux. É muito difícil aprender COBOL no Mainframe?"

Minha resposta costuma surpreender.

Não.

Na verdade, o maior obstáculo não é aprender COBOL.

É abandonar alguns preconceitos.

Durante muitos anos criou-se a falsa ideia de que Mainframe é tecnologia antiga, difícil, cheia de telas verdes e comandos misteriosos.

Depois de alguns dias estudando IBM Z, quase todo desenvolvedor Java percebe algo interessante:

o que muda não é a programação. Muda o ambiente.

A lógica continua sendo lógica.

Algoritmos continuam sendo algoritmos.

Arquitetura continua sendo arquitetura.

Boas práticas continuam sendo boas práticas.

O IBM Z apenas resolveu muitos problemas décadas antes do restante da indústria.

Vamos fazer essa jornada juntos.


Bellacosa Mainframe e um de para entre java e cobol no zos


Primeiro: você já sabe muito mais do que imagina

Imagine um desenvolvedor Java com alguns anos de experiência.

Ele conhece:

  • orientação a objetos

  • APIs REST

  • SQL

  • Git

  • Maven ou Gradle

  • testes

  • logs

  • tratamento de exceções

  • arquitetura em camadas

  • CI/CD

Agora imagine alguém dizendo:

"Você terá que aprender COBOL do zero."

Na realidade...

não será do zero.

Será apenas uma nova linguagem.

O conhecimento de engenharia de software continua válido.


O choque cultural

A primeira diferença não é técnica.

É cultural.

No mundo Java normalmente pensamos em:

  • servidor

  • aplicação

  • container

  • microserviço

  • JVM

  • deploy

No Mainframe pensamos em:

  • sistema

  • aplicação corporativa

  • região CICS

  • Batch

  • JES2

  • Db2

  • IMS

  • filas MQ

  • datasets

Perceba uma coisa curiosa.

Os conceitos são muito parecidos.

Os nomes mudam.


Java e COBOL possuem muito mais semelhanças do que diferenças

Muita gente imagina que COBOL seja uma linguagem "primitiva".

Não é.

Ela apenas nasceu para resolver problemas diferentes.

Observe.

Java

if(saldo > valor){
    sacar();
}

COBOL

IF SALDO > VALOR
    PERFORM SACAR
END-IF

A lógica é exatamente a mesma.


Java

while(true){
   processar();
}

COBOL

PERFORM UNTIL FIM
    PERFORM PROCESSAR
END-PERFORM

Mesmo conceito.

Outra sintaxe.


Java

switch(tipo)

COBOL

EVALUATE TIPO

Outra sintaxe.

Mesmo problema.


Classes versus Programas

Java organiza tudo em classes.

COBOL organiza em programas.

No fundo ambos encapsulam responsabilidades.

Java

ClienteService

COBOL

CADCLI01

Java

PagamentoService

COBOL

PGMPAG01

A única diferença é que no Mainframe normalmente seguimos padrões rígidos de nomenclatura.


Métodos e PERFORM

No Java criamos métodos.

calcularTotal();

Em COBOL usamos parágrafos.

PERFORM CALCULAR-TOTAL

O conceito é idêntico.

Dividir problemas pequenos.


Variáveis

Java

String
int
long
double

COBOL

PIC X
PIC 9
COMP
COMP-3
COMP-5

Aqui existe uma novidade.

O COBOL descreve exatamente como o dado será armazenado.

Isso permite enorme eficiência.


Objetos versus Registros

Java

class Cliente

COBOL

01 CLIENTE.
   05 NOME.
   05 CPF.

Um registro COBOL lembra bastante um DTO.

Ou um Record.

Ou um POJO.


Banco de Dados

Java

JDBC
Hibernate
JPA

Mainframe

Embedded SQL
Db2

Exemplo Java

PreparedStatement

COBOL

EXEC SQL
SELECT ...
END-EXEC

Novamente...

Mesmo conceito.

Outra sintaxe.


Logs

Java

Log4J
SLF4J

Mainframe

DISPLAY
CEEMSG
SYSOUT
JESMSGLG

Toda aplicação precisa registrar informações.


Exceptions

Java

try
catch

COBOL

SQLCODE

RESP

FILE STATUS

RETURN CODE

No Mainframe verificamos códigos de retorno constantemente.

O tratamento é extremamente disciplinado.


Threads

Java possui múltiplas threads.

COBOL tradicional trabalha normalmente de forma sequencial.

Isso não significa menor desempenho.

O IBM Z resolve paralelismo em níveis diferentes.

Milhares de tarefas executam simultaneamente.


Garbage Collector

Java possui Garbage Collection.

COBOL normalmente trabalha com memória previamente definida.

Isso torna o consumo extremamente previsível.

É uma das razões pelas quais aplicações processam milhões de transações diariamente.


Build

Java

Maven
Gradle

Mainframe

JCL
Compilador COBOL
Binder
Link Edit

Aqui começa uma grande mudança.

No Mainframe o processo de compilação é extremamente controlado.


Git continua sendo Git

Hoje praticamente todas as empresas utilizam Git também para COBOL.

Além disso aparecem ferramentas como:

  • IBM Dependency Based Build

  • GitHub

  • GitLab

  • Jenkins

  • UrbanCode

  • Azure DevOps

Mainframe moderno também faz DevOps.


O terminal assusta... durante dois dias

Todo programador Java olha pela primeira vez para o TSO/ISPF e pensa:

"Meu Deus..."

Depois de uma semana.

"Até que é rápido."

Depois de um mês.

"Por que outras ferramentas fazem tantas animações?"

O ISPF privilegia produtividade.

Não aparência.


O que realmente precisa aprender

A linguagem COBOL representa apenas uma parte da jornada.

Na verdade eu dividiria o aprendizado em quatro pilares.


Pilar 1 — COBOL

Aprenda profundamente:

  • DATA DIVISION

  • PROCEDURE DIVISION

  • FILE SECTION

  • Working-Storage

  • Local-Storage

  • COMP

  • COMP-3

  • OCCURS

  • REDEFINES

  • PERFORM

  • EVALUATE

  • SEARCH

  • SEARCH ALL

  • STRING

  • UNSTRING

  • INSPECT

  • SORT

  • MERGE

  • Embedded SQL

  • JSON PARSE

  • JSON GENERATE

  • XML PARSE

Treine escrevendo muitos programas.

Não apenas lendo.


Pilar 2 — z/OS

Depois venha para o sistema operacional.

Aprenda:

  • datasets

  • PDS

  • PDSE

  • VSAM

  • catálogo

  • TSO

  • ISPF

  • SDSF

  • JES2

  • spool

  • JOB

  • STEP

  • PROC

  • utilities

Aqui muitos iniciantes travam.

Porque tentam aprender tudo de uma vez.

Não faça isso.

Aprenda um comando por dia.


Pilar 3 — JCL

Muitos dizem:

"O JCL é difícil."

Discordo.

Ele é apenas declarativo.

Você descreve o trabalho.

Depois o sistema executa.

Aprenda:

  • JOB

  • EXEC

  • DD

  • PROC

  • IF/THEN

  • COND

  • GDG

  • símbolos

  • parâmetros

Depois pratique.

Muito.


Pilar 4 — Ecossistema

Agora sim.

Você entra no universo IBM Z.

Aprenda gradualmente:

  • Db2

  • VSAM

  • CICS

  • MQ

  • RACF

  • REXX

  • DFSORT

  • IDCAMS

  • IEBGENER

  • IKJEFT01

  • FTP

  • Connect:Direct

  • z/OS Connect

  • APIs REST

Esse conjunto forma um desenvolvedor Mainframe completo.


Uma trilha prática de transição

Semana 1

Aprenda:

  • arquitetura IBM Z

  • conceitos de Batch

  • datasets

  • TSO

  • ISPF

Treino

  • navegar

  • editar arquivos

  • copiar membros


Semana 2

COBOL básico.

Treino

  • Hello World

  • cálculos

  • IF

  • PERFORM

  • tabelas

Escreva pelo menos vinte programas.


Semana 3

Arquivos.

Treino

  • Sequential

  • VSAM

  • leitura

  • gravação

  • atualização


Semana 4

JCL.

Compile programas.

Execute Jobs.

Leia mensagens.

Aprenda a interpretar:

  • CC 0000

  • S806

  • S0C7

  • S0C4

Esses erros serão seus professores.


Semana 5

Db2.

Treine:

  • SELECT

  • INSERT

  • UPDATE

  • DELETE

  • CURSOR


Semana 6

CICS.

Aprenda:

  • transações

  • COMMAREA

  • MAPS

  • BMS

  • SEND

  • RECEIVE


Semana 7

Utilities.

Treine:

  • SORT

  • IDCAMS

  • IEBGENER

Você economizará horas de trabalho.


Semana 8

Integração.

Crie uma aplicação completa.

Batch.

Online.

Db2.

Arquivos.

MQ.

REST.

É nesse momento que tudo faz sentido.


Como treinar de verdade

A melhor forma de aprender Mainframe não é assistir vídeos.

É resolver problemas.

Crie desafios como:

  • cadastro de clientes

  • contas bancárias

  • folha de pagamento

  • estoque

  • faturamento

  • cartões

  • PIX

  • boletos

Depois evolua.

Adicione:

  • Db2

  • VSAM

  • Batch

  • CICS

  • APIs

Cada projeto ensinará dezenas de conceitos simultaneamente.


O erro mais comum

O programador Java costuma perguntar:

"Qual framework devo aprender primeiro?"

No Mainframe a pergunta correta é:

"Como funciona o sistema?"

Quando você entende o IBM Z, aprender novas tecnologias torna-se muito mais fácil.


O que surpreende quem chega ao Mainframe

Depois de alguns meses, quase todos comentam as mesmas coisas.

  • A estabilidade impressiona.

  • O desempenho é extraordinário.

  • O consumo de recursos é mínimo.

  • O controle operacional é excelente.

  • Os logs são detalhados.

  • A segurança é levada muito a sério.

  • O ambiente é extremamente previsível.

Você começa a perceber que muitas "novidades" do mercado já existiam no Mainframe, apenas com outros nomes.


O futuro pertence aos profissionais híbridos

O mercado não procura apenas especialistas em Java ou apenas especialistas em COBOL.

Ele procura profissionais capazes de conectar os dois mundos.

Quem entende:

  • Java

  • COBOL

  • APIs

  • Db2

  • MQ

  • Cloud

  • Git

  • DevOps

  • IBM Z

possui uma combinação rara e extremamente valorizada.

A modernização das aplicações corporativas depende justamente dessa ponte entre plataformas.


A filosofia Bellacosa Mainframe

Sempre digo aos meus alunos que aprender Mainframe é semelhante ao treinamento de um Padawan.

No início tudo parece estranho: a tela 3270, o TSO, o JCL, os datasets, o COBOL com sua sintaxe descritiva. Aos poucos, porém, você percebe que cada ferramenta existe por uma razão e que décadas de evolução produziram um ambiente sólido, eficiente e incrivelmente confiável.

Não tenha pressa para decorar comandos. Entenda os conceitos. Escreva código todos os dias. Leia mensagens de erro. Compile, execute, corrija, teste novamente. Cada programa, cada JCL e cada SQL ampliam sua compreensão do ecossistema IBM Z.

Lembre-se: você não está deixando o universo Java para trás. Está expandindo seus horizontes. Um bom desenvolvedor Java já domina lógica, algoritmos, modelagem, bancos de dados e práticas modernas de desenvolvimento. Tudo isso continuará sendo útil no Mainframe.

O IBM Z precisa justamente de profissionais curiosos, capazes de unir a robustez do legado à inovação das APIs, do DevOps, da nuvem híbrida e da inteligência artificial.

E quando esse dia chegar, você descobrirá que COBOL nunca foi o destino final.

Era apenas a porta de entrada para um dos ecossistemas de computação mais sofisticados já construídos.

Bem-vindo ao IBM Z. Sua jornada como Padawan Mainframe está apenas começando.

 

Vagner Renato Bellacosa, IBM Champion e especialista em IBM Mainframe
IBM Z17 SYSTEM ONLINE
Sobre o autor

Vagner Renato Bellacosa

IBM Champion 2026 • Especialista em IBM Mainframe

Vagner Renato Bellacosa trabalha com IBM Mainframe desde 1988 , é IBM Champion e especialista em COBOL, CICS, Db2, z/OS e IBM Z. Compartilha experiências profissionais, conhecimento técnico, história da computação e práticas do universo mainframe para aproximar novas gerações das tecnologias que sustentam empresas, bancos e governos ao redor do mundo.

IBM Champion IBM Z COBOL CICS Db2 z/OS Mainframe desde 1988
GitHub LinkedIn
Inicializando conteúdo...