Translate

Mostrar mensagens com a etiqueta subprogramas. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta subprogramas. Mostrar todas as mensagens

quinta-feira, 2 de julho de 2026

Dos Cartões Perfurados ao Enterprise COBOL: A Evolução do STOP RUN e do GOBACK

 

Bellacosa Mainframe e as diferencas entre o goback e o stop run


Dos Cartões Perfurados ao Enterprise COBOL: A Evolução do STOP RUN e do GOBACK

Essa é uma excelente pergunta, e a resposta curta é:

Hoje, em projetos modernos de Enterprise COBOL para z/OS, a IBM e a maioria das empresas recomendam usar GOBACK em vez de STOP RUN. Não é apenas modismo; existem razões técnicas, arquiteturais e de reutilização do ambiente de execução (Language Environment). (IBM)

Vamos analisar como um arquiteto de Mainframe faria.


A origem do STOP RUN

Quando COBOL surgiu na década de 1960, praticamente todos os programas eram executados diretamente pelo sistema operacional.

O fluxo era simples:

JCL
 │
 ▼
Programa COBOL
 │
STOP RUN
 │
 ▼
MVS

Naquela época:

  • não existiam APIs REST;

  • não existiam aplicações reutilizáveis;

  • praticamente não existiam subprogramas complexos;

  • o programa começava e terminava.

O STOP RUN fazia exatamente isso:

"Acabei. Pode encerrar tudo."


O surgimento do GOBACK

Com o crescimento dos sistemas apareceram:

  • subprogramas

  • bibliotecas

  • módulos reutilizáveis

  • CICS

  • IMS

  • DB2

  • Language Environment (LE)

Agora um programa não era mais necessariamente o "programa principal".

Exemplo:

JCL

  MAIN01

     │

 CALL CLIENTE

     │

 CALL CALCJURO

     │

 CALL VALIDA

Imagine se CALCJURO executasse:

STOP RUN

O que aconteceria?

Toda a aplicação terminaria imediatamente.

Não apenas o módulo.

Todo o Run Unit.

É exatamente isso que a IBM documenta. STOP RUN termina toda a Run Unit; já GOBACK retorna ao chamador quando usado em um programa chamado. (IBM)


A grande diferença

STOP RUN

Programa

↓

encerra TODA a Run Unit

↓

retorna ao sistema operacional

GOBACK

Programa

↓

retorna para quem chamou

↓

continua a execução

Se o programa for o principal:

GOBACK

↓

faz praticamente o mesmo trabalho do STOP RUN

A IBM afirma isso explicitamente:

Em um programa principal, GOBACK funciona como STOP RUN. Em um subprograma, GOBACK funciona como EXIT PROGRAM. (IBM)


Exemplo prático

Programa principal

MAIN
CALL "A"

DISPLAY "FIM"

STOP RUN

Programa A

DISPLAY "A"

STOP RUN

Resultado

A

O DISPLAY "FIM"

nunca acontece.


Agora usando GOBACK

Programa A

DISPLAY "A"

GOBACK

Resultado

A

FIM

Porque voltou para o MAIN.


Então por que muitas empresas proíbem STOP RUN?

Não porque ele esteja errado.

Mas porque ele cria risco.

Imagine um programa hoje.

Batch

↓

Framework

↓

Biblioteca

↓

Serviço

↓

Seu Programa

Você nem sempre sabe quem chamou seu módulo.

Se usar

STOP RUN

você encerra toda a aplicação.

Se usar

GOBACK

o programa simplesmente devolve o controle.

Muito mais seguro.


O princípio da reutilização

Hoje escrevemos programas para serem reutilizados.

Um módulo pode ser chamado por:

  • Batch

  • CICS

  • IMS

  • API REST

  • MQ

  • Java

  • z/OS Connect

  • outro COBOL

O módulo não deve assumir que é o "dono" da aplicação.

Ele apenas faz seu trabalho.

Depois devolve o controle.

Isso é exatamente o comportamento do GOBACK.


O impacto no Language Environment (LE)

Aqui está uma das razões mais importantes.

O Enterprise COBOL roda sobre o Language Environment (LE).

O LE controla:

  • memória

  • pilha

  • heap

  • tratamento de exceções

  • inicialização

  • reutilização do runtime

Quando ocorre

STOP RUN

o LE encerra o Run Unit.

Quando ocorre

GOBACK

ele apenas retorna ao chamador.

Isso permite reutilizar o ambiente de execução em muitos cenários. (IBM)


O caso do RTEREUS

Pouca gente conhece essa opção.

Existe um parâmetro do LE chamado

RTEREUS

(Runtime Reuse)

Ele permite reutilizar o ambiente de execução COBOL.

A IBM afirma claramente:

Para obter os benefícios do RTEREUS, substitua STOP RUN por GOBACK. STOP RUN encerra o ambiente reutilizável. (IBM)

Ou seja:

STOP RUN

↓

destrói o ambiente

↓

novo ambiente precisa ser criado

Enquanto

GOBACK

↓

reutiliza o ambiente

↓

menos overhead

Performance

O ganho normalmente não é enorme em um programa isolado.

Mas imagine milhares de execuções por minuto.

1000 programas

↓

cada um recria o Runtime

↓

mais CPU

Com reutilização:

Runtime permanece ativo

↓

menos inicialização

↓

menos CPU

É exatamente por isso que grandes bancos adotam GOBACK como padrão.


E no CICS?

No CICS normalmente termina-se com

EXEC CICS RETURN

e não com

STOP RUN

porque quem controla a aplicação é o CICS.

O mesmo raciocínio vale para IMS.

O programa devolve o controle ao ambiente.

Não encerra a Run Unit.


Um exemplo interessante: DFSORT

A IBM é ainda mais direta na documentação de user exits do DFSORT:

User exits escritos em COBOL não devem usar STOP RUN. Para retornar ao DFSORT, use GOBACK. (IBM)

Ou seja,

STOP RUN

↓

encerra tudo

↓

ERRADO
GOBACK

↓

retorna ao DFSORT

↓

CORRETO

Existe recomendação oficial da IBM?

Sim.

A documentação oficial afirma que:

  • em programas principais, GOBACK tem o mesmo efeito de STOP RUN;

  • em subprogramas, GOBACK retorna ao chamador, enquanto STOP RUN termina toda a Run Unit. (IBM)

Além disso, para ambientes reutilizáveis (RTEREUS), a IBM recomenda trocar STOP RUN por GOBACK. (IBM)

Documentação oficial da IBM:

Minha recomendação para um COBOL Padawan

Se você está desenvolvendo em Enterprise COBOL moderno, adote esta regra simples:

SituaçãoRecomendação
Programa Batch principalGOBACK
Subprograma (CALL)GOBACK
Biblioteca reutilizávelGOBACK
Módulo chamado por Java, CICS, IMS ou APIsGOBACK
Novo desenvolvimentoGOBACK como padrão

Na prática, GOBACK é um superconjunto de STOP RUN: ele faz o papel de STOP RUN quando está no programa principal e o de EXIT PROGRAM quando está em um programa chamado. Isso reduz riscos, melhora a reutilização do runtime e torna o código mais flexível para arquiteturas modernas. Por esse conjunto de vantagens, a preferência atual por GOBACK é muito mais uma decisão de engenharia do que um simples modismo.

Design Patterns no COBOL Mainframe Os Padrões que os Grandes Programadores Sempre Usaram (Mesmo Antes de Eles Receberem um Nome)

 

Bellacosa Mainframe e os design pattern em cobol mainframe

☕ Um Café no Bellacosa Mainframe

Design Patterns no COBOL Mainframe

Os Padrões que os Grandes Programadores Sempre Usaram (Mesmo Antes de Eles Receberem um Nome)

"Todo programador COBOL iniciante acredita que um bom sistema nasce de um bom código. O programador experiente sabe que um bom sistema nasce de boas decisões de arquitetura."

Existe uma curiosidade fascinante na história da computação.

Quando ouvimos falar em Design Patterns, quase todo mundo lembra imediatamente do famoso livro Design Patterns: Elements of Reusable Object-Oriented Software, publicado em 1994 pelo famoso Gang of Four (GoF).

Muitos acreditam que os padrões nasceram ali.

Mas isso não é verdade.

Na realidade, os profissionais de Mainframe utilizavam padrões muito antes de eles receberem nomes elegantes.

Os sistemas bancários dos anos 70, 80 e 90 já possuíam separação de responsabilidades, reutilização de código, módulos especializados, camadas de acesso a banco, mecanismos de validação, tratamento centralizado de erros, componentes compartilhados e arquiteturas extremamente organizadas.

Eles simplesmente não chamavam isso de Pattern.

Chamavam de:

"Boa programação."

E existe um motivo simples.

Quando um sistema precisa sobreviver por 40 anos, processar bilhões de transações e nunca parar, improvisação não funciona.

É por isso que aprender Patterns em COBOL significa aprender como os grandes sistemas do mundo realmente funcionam.

Hoje vamos explorar essa jornada.

Pegue seu café.

Vamos entrar na mente dos arquitetos que construíram os sistemas que movimentam praticamente todo o dinheiro do planeta.


O que é um Pattern?

Pattern significa literalmente:

Padrão de solução.

Não é código.

Não é framework.

Não é biblioteca.

É uma maneira comprovada de resolver um problema recorrente.

Sempre que um problema aparece repetidamente, alguém encontra uma solução elegante.

Depois de milhares de aplicações, essa solução vira um padrão.


A origem dos Patterns

Antes mesmo da computação, um arquiteto chamado Christopher Alexander estudava cidades e construções.

Ele percebeu algo interessante.

As melhores cidades do mundo utilizavam soluções semelhantes para problemas semelhantes.

Uma praça.

Uma rua.

Uma entrada.

Uma janela.

Tudo seguia padrões.

Em 1977 ele publicou:

A Pattern Language.

Décadas depois, programadores perceberam:

"Software também possui problemas repetitivos."

Assim nasceram os Design Patterns modernos.


Mas... e o Mainframe?

Enquanto isso...

Em grandes bancos...

Seguradoras...

Governos...

Empresas aéreas...

Os analistas já utilizavam exatamente a mesma filosofia.

Um exemplo clássico.

Em vez de cada programa acessar DB2 diretamente...

Criava-se um módulo responsável apenas por isso.

Hoje chamaríamos isso de:

DAO Pattern.

Na época era apenas:

"O módulo que conversa com o banco."


Por que Patterns são importantes?

Imagine um hospital.

Você não quer que cada médico invente sua própria forma de operar.

Existe um procedimento.

Uma sequência.

Uma organização.

Software crítico funciona da mesma forma.

Patterns tornam sistemas:

  • previsíveis

  • fáceis de manter

  • fáceis de evoluir

  • seguros

  • reutilizáveis


Pattern 1 — Modularização

O primeiro pattern da história do Mainframe.

Um programa enorme faz tudo.

Depois de alguns anos...

Ninguém entende mais nada.

A solução?

Separar responsabilidades.

Exemplo:

Programa Principal

Validação

Regras de Negócio

DB2

Relatórios

Logs

Cada módulo possui apenas uma função.

Hoje isso parece óbvio.

Na década de 70 era revolucionário.


Como aplicar

Nunca escreva um programa de 5.000 linhas.

Pergunte:

Esta rotina pode virar um subprograma?

Se a resposta for sim...

Faça isso.


Pattern 2 — COPYBOOK Pattern

Uma das maiores invenções do COBOL.

Em vez de repetir estruturas...

Criamos COPYBOOKS.

Exemplo:

Cliente

Conta

Saldo

Endereço

CPF

Esses campos aparecem em centenas de programas.

Sem COPYBOOK...

Bastaria alterar um campo para criar centenas de inconsistências.

Com COPYBOOK...

Uma alteração.

Todos utilizam.


Boas práticas

Nunca copie estruturas manualmente.

Sempre centralize.


Pattern 3 — Validation Layer

Nunca misture validação com regra de negócio.

Errado:

Recebe CPF

Consulta DB2

Calcula juros

Valida CPF

Atualiza saldo

Tudo misturado.

Certo:

Entrada

Validação

Negócio

Persistência


Benefícios

Código mais limpo.

Testes mais simples.

Menos bugs.


Pattern 4 — Error Handler Centralizado

Um clássico absoluto.

Em vez de cada programa escrever mensagens diferentes...

Existe um módulo especializado.

Exemplo:

DISPLAY

ABEND

LOG

RETURN-CODE

Tudo passa por um componente comum.


Vantagens

Padronização.

Auditoria.

Facilidade de suporte.


Pattern 5 — File Access Layer

Em vez de cada programa abrir arquivos VSAM...

Criamos uma camada.

Programa

Arquivo Layer

VSAM

Se amanhã o arquivo virar DB2...

O programa quase não muda.


Isso é desacoplamento

A lógica de negócio não conhece detalhes físicos.

Esse conceito ficou famoso décadas depois.

No Mainframe já era realidade.


Pattern 6 — Database Access Layer

Muito comum em DB2.

Programa

Subprograma SQL

DB2

O programa não conhece SQL.

Conhece apenas serviços.

Exemplo:

Consultar Cliente

Atualizar Saldo

Inserir Conta

Excluir Registro

Muito semelhante aos Repository Patterns modernos.


Pattern 7 — Service Programs

Grandes empresas possuem centenas de programas.

Algumas regras aparecem em todos.

Cálculo de CPF.

Validação de agência.

Máscara.

Data.

Moeda.

Essas regras viram serviços.


Exemplo

CALL "CALCJURO"

CALL "VALIDCPF"

CALL "FORMATA"

CALL "DATAUTIL"

Isso reduz milhares de linhas duplicadas.


Pattern 8 — Dispatcher

Muito usado em CICS.

Um programa recebe uma operação.

Dependendo da função...

Chama outro programa.

Entrada

Dispatcher

Consulta

Inclusão

Alteração

Exclusão

Hoje chamamos isso de Command Dispatcher.


Pattern 9 — Table Driven Programming

Em vez de dezenas de IF...

Utilize tabelas.

Errado:

IF UF = SP

IF UF = RJ

IF UF = MG

...

Melhor:

Tabela de estados.

Pesquisa.

Resultado.

Menos código.

Mais manutenção.


Pattern 10 — Configuration Pattern

Nunca coloque constantes espalhadas.

Crie parâmetros.

Copybooks.

Arquivos.

Tabelas.

Isso evita recompilar programas para pequenas mudanças.


Pattern 11 — Batch Pipeline

Muito usado em processamento noturno.

Leitura

Validação

Transformação

Classificação

Carga

Cada etapa faz apenas uma coisa.

Se uma falhar...

A anterior permanece íntegra.


Pattern 12 — Restart Pattern

Um dos mais importantes.

Imagine um Batch de 8 horas.

Na hora 7 ocorre falha.

Sem Restart...

Tudo começa novamente.

Com Restart...

Continua do último checkpoint.

Essa ideia economiza milhões de dólares todos os anos.


Pattern 13 — Checkpoint Pattern

Muito usado com IMS.

A cada quantidade de registros...

Grava-se um ponto seguro.

Em caso de falha...

Retorna dali.


Pattern 14 — Logging Pattern

Nunca dependa apenas do DISPLAY.

Registre:

Programa

Data

Hora

Usuário

Arquivo

SQLCODE

Chave

Operação

Isso salva equipes inteiras durante incidentes.


Pattern 15 — Retry Pattern

DB2 indisponível?

Arquivo bloqueado?

MQ ocupado?

Em vez de falhar imediatamente...

Tente novamente algumas vezes.

Mas cuidado.

Retry infinito vira desastre.


Pattern 16 — Circuit Breaker (Modernização)

Muito usado via APIs.

Se um serviço externo está indisponível...

Pare de chamá-lo temporariamente.

Evita sobrecarga.


Pattern 17 — Adapter

Muito utilizado na modernização.

Sistema antigo

Adapter

API REST

O COBOL permanece praticamente igual.


Pattern 18 — Facade

Imagine vinte programas acessando vinte módulos.

Complicado.

Criamos uma fachada.

Programa

Facade

Serviços internos

Tudo fica mais simples.


Pattern 19 — Strategy

O cálculo muda conforme o produto.

Em vez de centenas de IF...

Criamos estratégias.

Produto A

Regra A

Produto B

Regra B

Produto C

Regra C


Pattern 20 — Template Process

Muito comum em Batch.

Todos os programas fazem:

Inicialização

Leitura

Processamento

Gravação

Fechamento

Apenas a lógica muda.

A estrutura permanece.


Como identificar quando usar um Pattern

Faça cinco perguntas:

  1. Estou repetindo código?

  2. Esse módulo possui mais de uma responsabilidade?

  3. Se mudar amanhã, quantos programas serão alterados?

  4. Consigo testar isoladamente?

  5. Outra equipe entenderia isso facilmente?

Se várias respostas forem "não"...

Provavelmente existe um Pattern melhor.


Os erros mais comuns dos iniciantes

O famoso "programa monolítico".

Tudo dentro da PROCEDURE DIVISION.

Milhares de linhas.

GO TO para todos os lados.

Variáveis globais.

DISPLAY espalhados.

SQL misturado.

Validação misturada.

Regras misturadas.

Esse tipo de programa funciona...

Até o primeiro incidente em produção.


Como evoluir como Programador COBOL

Existe uma evolução natural.

Nível 1

Aprende sintaxe.

MOVE.

IF.

PERFORM.

READ.

WRITE.


Nível 2

Aprende organização.

Seções.

Parágrafos.

COPYBOOKS.

Subprogramas.


Nível 3

Aprende Patterns.

Reutilização.

Arquitetura.

Modularização.


Nível 4

Aprende integração.

DB2.

CICS.

IMS.

MQ.

REST.

JSON.


Nível 5

Pensa como arquiteto.

Nesse ponto, você não escreve apenas programas.

Você desenha soluções.


Curiosidades

  • Muitos sistemas bancários escritos há mais de 35 anos continuam ativos porque seguiram padrões consistentes.

  • Diversos conceitos popularizados em Java, C# e outras linguagens já eram praticados em ambientes COBOL, ainda que com nomes diferentes.

  • O uso disciplinado de COPYBOOKS foi um dos fatores que permitiu manter aplicações enormes sincronizadas por décadas.

  • Grandes equipes de Mainframe costumam definir padrões internos de nomenclatura, tratamento de erros, chamadas de subprogramas e acesso a dados para reduzir riscos operacionais.


Melhores práticas para o dia a dia

  • Dê a cada programa uma responsabilidade clara.

  • Evite duplicação de lógica.

  • Centralize estruturas em COPYBOOKS.

  • Padronize mensagens de erro.

  • Isole acesso a arquivos e bancos de dados.

  • Documente interfaces de subprogramas.

  • Use nomes consistentes para programas, parágrafos e variáveis.

  • Escreva código pensando em quem fará a manutenção daqui a dez anos.

  • Prefira simplicidade à esperteza.

  • Revise continuamente seu código procurando oportunidades de extrair novos módulos reutilizáveis.


O futuro dos Patterns no Mainframe

O Mainframe moderno conversa com APIs REST, mensageria, microsserviços, Kubernetes, aplicações Java, Python e serviços em nuvem. Nesse cenário, os Patterns clássicos continuam mais relevantes do que nunca. Adapter, Facade, Retry, Circuit Breaker, Service Layer e Repository ajudam a integrar aplicações COBOL com tecnologias modernas sem sacrificar estabilidade.

O profissional que domina esses conceitos deixa de ser apenas um desenvolvedor de programas e passa a ser um engenheiro de soluções. Ele entende quando reutilizar, quando desacoplar, quando encapsular e quando simplificar. Esse conhecimento vale muito mais do que decorar comandos da linguagem.


Conclusão

Existe uma frase muito conhecida entre arquitetos de software:

"Código ruim pode funcionar. Arquitetura ruim cobra juros."

No universo IBM Z, essa cobrança aparece em horas extras, incidentes de produção, dificuldades de manutenção e projetos de modernização cada vez mais caros.

Os Patterns existem justamente para evitar esse cenário. Eles representam décadas de experiência acumulada por milhares de profissionais que enfrentaram os mesmos problemas e encontraram soluções elegantes, reutilizáveis e seguras.

Se você é um Programador COBOL Padawan, não tente memorizar todos os Patterns de uma vez. Comece pelos mais importantes: modularização, COPYBOOKS, validação, tratamento centralizado de erros, acesso a dados desacoplado e reutilização de serviços. À medida que sua experiência crescer, você perceberá que esses padrões aparecem naturalmente em praticamente todos os grandes sistemas corporativos.

Lembre-se: escrever código é uma habilidade. Escrever código que continuará funcionando e sendo compreendido daqui a vinte anos é uma arte. E essa arte é construída com disciplina, boas práticas e padrões sólidos.

No Bellacosa Mainframe, costumamos dizer que o verdadeiro poder de um Programador COBOL não está na quantidade de comandos que ele conhece, mas na qualidade das decisões que toma antes mesmo de começar a digitar a primeira linha de código.

Esse é o caminho que transforma um Padawan em um verdadeiro Mestre do Mainframe.

Se desejar, posso criar a Parte 2 com mais de 3.000 palavras, abordando 40+ Design Patterns específicos para COBOL, CICS, DB2, IMS, Batch, APIs REST, MQ e modernização no IBM Z, com exemplos completos de código COBOL para cada padrão.


quinta-feira, 14 de abril de 2022

Lógica de Programação no Mainframe : O Guia Definitivo para um Programador Padawan Entender Como Pensar em COBOL

 

Bellacosa Mainframe apresenta logica de programacao em mainframe


☕ Um Café no Bellacosa Mainframe

Lógica de Programação no Mainframe

O Guia Definitivo para um Programador Padawan Entender Como Pensar em COBOL Antes Mesmo de Escrever uma Linha de Código

"A diferença entre um programador júnior e um programador experiente raramente está na linguagem. Está na forma como ele pensa antes de começar a programar."


Introdução

Existe um mito que acompanha praticamente todo iniciante em Mainframe.

Muitos acreditam que aprender COBOL significa decorar comandos como MOVE, IF, PERFORM, READ, WRITE e COMPUTE.

Não.

Isso é parecido com decorar palavras de um idioma sem aprender a formar frases.

Programar não é escrever código.

Programar é resolver problemas.

O computador apenas executa a solução que você imaginou.

Quanto melhor for sua lógica, menor será seu código.

Quanto pior for sua lógica, maior será o desastre.

Curiosamente, essa afirmação vale ainda mais no mundo Mainframe.

Em um sistema bancário, um erro lógico pode movimentar milhões de reais para a conta errada.

Um erro de apenas um operador relacional pode impedir milhares de aposentadorias de serem pagas.

A máquina faz exatamente aquilo que você pediu.

Nunca aquilo que você queria.


Afinal, o que é lógica de programação?

Lógica é a capacidade de organizar pensamentos em uma sequência de passos capazes de resolver um problema.

Em outras palavras:

Entrada → Processamento → Saída

Todo programa do planeta funciona assim.

Sempre.

Sem exceções.

Imagine fazer café.

Entrada:

  • água

  • café

  • filtro

Processamento:

  • aquecer água

  • passar pelo pó

Saída:

  • café pronto

Um programa COBOL faz exatamente isso.

Entrada:

Arquivo de clientes

Processamento

Arquivo atualizado

Nada muda.

Apenas o problema é diferente.


O computador é extremamente inteligente...

...para fazer exatamente o que você mandar.

E extremamente burro para adivinhar.

Se você esquecer um caso específico...

Ele esquecerá também.


Exemplo

Você deseja aprovar clientes maiores de idade.

Errado:

SE IDADE > 18

O cliente com exatamente 18 anos será recusado.

O correto seria

IDADE >= 18

Esse pequeno detalhe pode causar milhares de erros.

A lógica mora justamente nesses detalhes.


O primeiro segredo dos grandes programadores

Eles passam muito mais tempo pensando do que digitando.

Um programador experiente pode gastar:

70%

pensando

20%

planejando

10%

escrevendo

Já o iniciante faz exatamente o contrário.


Antes do COBOL existe o algoritmo

Todo programa começa com uma receita.

Exemplo.

Problema:

Calcular média de um aluno.

Passos.

Receber nota 1

Receber nota 2

Somar

Dividir por 2

Mostrar resultado

Isso é um algoritmo.

COBOL vem depois.


Aprenda primeiro estas estruturas

Toda programação procedural é formada por apenas três estruturas.

Sim.

Somente três.

Todo software do mundo nasce delas.


1 — Sequência

Faça isto

Depois aquilo

Depois aquilo outro

Exemplo

Leia salário

Calcule imposto

Mostre salário líquido

Nada complicado.


2 — Seleção

Agora aparece a primeira decisão.

SE saldo > 0

então saque permitido

senão

saque negado

No COBOL isso aparece como

IF
ELSE
END-IF

A vida inteira você fará isso.


3 — Repetição

Enquanto existir trabalho...

Continue trabalhando.

PERFORM UNTIL

PERFORM VARYING

São os famosos loops.


Curiosidade

Os três pilares da programação estruturada foram formalizados por Edsger W. Dijkstra, Ole-Johan Dahl e C. A. R. Hoare na década de 1960. A ideia revolucionária era simples: qualquer programa poderia ser construído usando apenas sequência, seleção e repetição, reduzindo drasticamente o uso de GOTO e tornando o software mais confiável.


Como um programa COBOL pensa?

Imagine um funcionário de banco.

Ele chega.

Recebe documentos.

Confere informações.

Atualiza cadastro.

Emite comprovante.

Vai embora.

Um programa COBOL trabalha exatamente assim.


Entrada

READ
ACCEPT
LINKAGE

Processamento

MOVE

ADD

SUBTRACT

MULTIPLY

DIVIDE

COMPUTE

STRING

UNSTRING

Saída

DISPLAY

WRITE

REWRITE

RETURN

SEND

O cérebro do programa

A PROCEDURE DIVISION.

Ela é composta por:

Parágrafos

Sections

Sentenças

Comandos

Cada um possui sua responsabilidade.


Parágrafos

Pense em capítulos de um livro.

CALCULAR-JUROS.

VALIDAR-DADOS.

ATUALIZAR-SALDO.

Cada um resolve uma única tarefa.

Essa organização melhora leitura, manutenção e testes.


Sections

São grupos de parágrafos relacionados.

Muito usadas em programas legados e ainda presentes em diversos ambientes corporativos.

VALIDACAO SECTION

PROCESSAMENTO SECTION

FINALIZACAO SECTION

Hoje, muitos times preferem programas menores e menos dependentes de SECTION, mas você encontrará ambos os estilos no mercado.


PERFORM é seu melhor amigo

Nunca copie código.

Faça um parágrafo.

Execute quando necessário.

PERFORM VALIDAR-CLIENTE

Muito melhor que repetir cinquenta linhas.


Variáveis

Uma variável representa um espaço reservado para armazenar informações.

Exemplo

Nome

Saldo

CPF

Data

Valor

Cada variável deve representar apenas uma ideia.

Não misture responsabilidades.


Um bom nome vale ouro

Ruim

A

X

TEMP

VAR1

Bom

WS-CLIENTE-SALDO

WS-VALOR-TOTAL

WS-DATA-PAGAMENTO

Você agradecerá daqui a dez anos.

E quem der manutenção também.


Expressões

Expressões representam cálculos.

A + B

SALDO - SAQUE

JUROS * TAXA

VALOR / PARCELAS

No COBOL moderno, COMPUTE simplifica expressões complexas, tornando o código mais legível.


Expressões booleanas

São perguntas.

IDADE >= 18

SALDO > 0

CPF = CPF-INFORMADO

Resultado?

VERDADEIRO

ou

FALSO

Toda programação gira em torno dessas respostas.


Operadores importantes

Igual

Maior

Menor

Maior ou igual

Menor ou igual

Diferente

AND

OR

NOT

Eles parecem simples.

Mas definem todo o comportamento do programa.


Fluxo de execução

Imagine uma estrada.

O programa começa.

Segue em frente.

Em alguns momentos:

vira

repete

retorna

encerra

Esse caminho é chamado fluxo.

Um fluxo claro é um programa fácil de manter.


O perigo do GO TO

Nos anos 70 era comum.

Hoje deve ser evitado.

Por quê?

Porque destrói o fluxo natural.

Cria o famoso:

"espaguete"

Linhas indo para todos os lados.

Difícil testar.

Difícil entender.

Difícil manter.

Por isso:

PERFORM

END-IF

EVALUATE

substituem praticamente todos os antigos GO TO.


EVALUATE

É o "switch" do COBOL.

Muito mais elegante que dezenas de IF aninhados.

Exemplo conceitual:

Cliente Ouro

↓

desconto

Cliente Prata

↓

desconto menor

Cliente Bronze

↓

sem desconto

Código mais limpo.

Mais fácil de ler.


Loops

No Mainframe você processará arquivos enormes.

Milhares.

Milhões.

Bilhões de registros.

Você não faz:

READ

READ

READ

READ

Você faz

PERFORM UNTIL EOF

Até chegar ao fim do arquivo.


EOF

Uma das primeiras variáveis que todo programador COBOL aprende.

WS-FIM-ARQUIVO

88 EOF VALUE "S"

Quando ela muda...

O loop termina.

Quase todo processamento batch funciona assim.


Subprogramas

Grandes bancos dividem responsabilidades.

Programa principal

Chama

Subprograma

Retorna resultado

Assim nasce software reutilizável.

Em COBOL isso ocorre com CALL.


O conceito de responsabilidade única

Cada parágrafo.

Cada rotina.

Cada subprograma.

Deve fazer apenas uma coisa.

Muito bem feita.

Esse conceito, hoje conhecido como Single Responsibility Principle, já aparecia naturalmente em muitos sistemas COBOL décadas antes de se popularizar na orientação a objetos.


Como pensar antes de programar

Faça estas perguntas.

Qual é o problema?

Quais dados entram?

Quais dados saem?

Quais regras existem?

Existem exceções?

O que acontece se faltar informação?

O arquivo pode estar vazio?

Pode existir duplicidade?

O valor pode ser negativo?

Quanto mais perguntas...

Menos bugs.


A diferença entre programar e desenvolver

Programar é escrever código.

Desenvolver é resolver problemas.

Um excelente desenvolvedor pode escrever poucas linhas.

Mas resolver um problema enorme.


O Mainframe muda sua forma de pensar

Aqui você aprende que:

dados são patrimônio;

performance importa;

I/O custa caro;

cada acesso a disco deve ser pensado;

processar um milhão de registros é rotina;

estabilidade vale mais que criatividade.

Essa mentalidade acompanha você por toda a carreira, mesmo trabalhando depois com Java, Python, Go ou JavaScript.


A disciplina do COBOL

COBOL obriga você a ser organizado.

Divisões bem definidas.

Dados separados da lógica.

Nomes claros.

Fluxo explícito.

Isso forma excelentes engenheiros de software.

Não por acaso, muitos arquitetos de grandes bancos começaram suas carreiras escrevendo COBOL.


Os erros mais comuns dos iniciantes

  • Programar antes de entender o problema.

  • Criar variáveis com nomes sem significado.

  • Misturar validação, cálculo e gravação na mesma rotina.

  • Usar GO TO sem necessidade.

  • Ignorar casos de erro e exceções.

  • Esquecer o tratamento de fim de arquivo.

  • Repetir código em vez de criar parágrafos reutilizáveis.

  • Não documentar regras de negócio complexas.

  • Alterar programas sem compreender seu fluxo completo.

  • Testar apenas o "caminho feliz", esquecendo entradas inválidas e situações de borda.


Trilha de estudos para um Padawan Mainframe

Uma sequência eficiente de aprendizado é:

  1. Lógica de programação.

  2. Algoritmos e fluxogramas.

  3. Tipos de dados e variáveis.

  4. Operadores e expressões.

  5. Estruturas de decisão (IF e EVALUATE).

  6. Estruturas de repetição (PERFORM, UNTIL e VARYING).

  7. Modularização com parágrafos, SECTION e subprogramas.

  8. Arquivos sequenciais e VSAM.

  9. JCL e execução batch.

  10. CICS, Db2, APIs e integração com o mundo moderno.


Easter Egg ☕

Existe uma velha brincadeira entre programadores veteranos.

Perguntaram a um desenvolvedor COBOL:

— Quantas linguagens você conhece?

Ele respondeu:

— Muitas.

— Então por que continua usando COBOL?

O veterano sorriu:

— Porque o banco prefere que o dinheiro continue chegando na conta certa.

A piada resume uma grande verdade: linguagens vêm e vão, mas a lógica permanece. Quem domina lógica aprende qualquer linguagem com muito mais facilidade.


Curiosidade histórica

Grace Hopper, uma das pioneiras da computação e uma das maiores influências para o COBOL, costumava dizer:

"A frase mais perigosa da linguagem é: 'Sempre fizemos assim'."

Embora COBOL seja uma linguagem com mais de seis décadas, ela continua evoluindo. Hoje suporta recursos modernos como JSON, XML, UTF-8, integração com APIs REST, chamadas a serviços, tratamento avançado de dados e otimizações para arquiteturas IBM Z. O que permanece imutável não é a sintaxe, mas a lógica por trás da solução.


Conclusão

Todo programador COBOL experiente conhece centenas de comandos.

Mas isso nunca foi o diferencial.

O diferencial sempre foi saber pensar.

A lógica de programação é a verdadeira linguagem universal da computação. Ela atravessa décadas, plataformas e paradigmas. O profissional que domina sequência, seleção, repetição, modularização, fluxo de execução e organização do pensamento será capaz de trabalhar não apenas com COBOL, mas também com Java, Python, C#, JavaScript, Go ou qualquer tecnologia que surgir no futuro.

No Mainframe, essa disciplina ganha um valor ainda maior. Cada programa processa informações críticas para bancos, seguradoras, hospitais, governos e empresas que movimentam bilhões de transações diariamente. Não há espaço para improvisação: clareza, simplicidade e previsibilidade são virtudes.

Lembre-se sempre desta máxima do Bellacosa Mainframe:

"O computador não premia quem escreve mais código. Ele recompensa quem pensa melhor. Antes de aprender COBOL, aprenda a organizar suas ideias. Depois disso, a linguagem será apenas uma ferramenta nas mãos de um verdadeiro engenheiro de software."

terça-feira, 27 de fevereiro de 2007

Chamando Subprogramas em COBOL – Tipos de comandos CALL

 

Bellacosa Mainframe e o comando CALL e subprogramas em COBOL

Chamando Subprogramas em COBOL – Tipos de comandos CALL

Um dos recursos mais importantes do COBOL é a capacidade de dividir uma aplicação em vários módulos menores chamados:

Subprogramas

Isso permite reutilização de código, manutenção mais simples e melhor organização das aplicações Mainframe.


O que é um Subprograma?

É um programa COBOL que é chamado por outro programa.


Estrutura

Programa Principal
        ↓
     CALL
        ↓
   Subprograma
        ↓
     GOBACK
        ↓
Programa Principal

Exemplo Simples

Programa Principal:

CALL 'CALCULA'.

Subprograma:

IDENTIFICATION DIVISION.
PROGRAM-ID. CALCULA.

PROCEDURE DIVISION.

DISPLAY 'ENTREI NO SUBPROGRAMA'.

GOBACK.

Resultado:

ENTREI NO SUBPROGRAMA

Tipos de CALL

Existem vários tipos de chamada.


1. CALL Estático

O nome do programa é conhecido durante a compilação.

CALL 'CALCULA'

Características:

✅ Mais rápido

✅ Verificação na Linkedição

✅ Muito usado em Batch


Fluxo:

MAIN
 ↓
CALL 'CALCULA'
 ↓
CALCULA

2. CALL Dinâmico

O nome do programa está em uma variável.

01 WS-PGM PIC X(8).

MOVE 'CALCULA' TO WS-PGM.

CALL WS-PGM.

Características:

✅ Flexibilidade

✅ Escolha em tempo de execução

✅ Muito usado em frameworks


Fluxo:

WS-PGM
   ↓
CALCULA
VALIDA
CONSULTA

Exemplo

IF TIPO = 'A'

   MOVE 'CALCA' TO WS-PGM

ELSE

   MOVE 'CALCB' TO WS-PGM

END-IF

CALL WS-PGM

3. Nested Program Call

Programa interno chamando outro.

IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.

PROCEDURE DIVISION.

CALL 'SUB1'.

PROGRAM-ID. SUB1.

CALL 'SUB2'.

Fluxo:

MAIN
 ↓
SUB1
 ↓
SUB2

4. CALL Recursivo

Um programa chama ele próprio.

Necessário:

RECURSIVE PROGRAM

Exemplo:

IDENTIFICATION DIVISION.
PROGRAM-ID. FATORIAL
RECURSIVE.

Fluxo:

FATORIAL
    ↓
FATORIAL
    ↓
FATORIAL

5. CALL para Módulos LE

Chamada de rotinas do Language Environment.

Exemplo:

CALL 'CEE3ABD'

Usado para:

  • ABEND controlado

  • Datas

  • Hora

  • Serviços LE


6. CALL para Rotinas Assembler

Muito comum em Mainframe.

CALL 'ROTASM01'

Fluxo:

COBOL
 ↓
ASSEMBLER
 ↓
COBOL

7. CALL para CICS

Em CICS normalmente usamos:

EXEC CICS LINK
     PROGRAM('PROG2')
END-EXEC.

Ou

EXEC CICS XCTL
     PROGRAM('PROG2')
END-EXEC.

LINK x XCTL

LINK

Retorna ao chamador.

PROG1
 ↓
LINK
 ↓
PROG2
 ↓
Retorna

XCTL

Não retorna.

PROG1
 ↓
XCTL
 ↓
PROG2

Passagem de Parâmetros

O mais comum.


Programa Principal

CALL 'CALCULA'
USING WS-VALOR.

Subprograma

LINKAGE SECTION.

01 LK-VALOR PIC 9(5).

PROCEDURE DIVISION USING LK-VALOR.

Fluxo

MAIN
 ↓
USING
 ↓
LINKAGE

Múltiplos Parâmetros

Programa Principal:

CALL 'CALCULA'

USING

   WS-NOME
   WS-SALDO
   WS-DATA.

Subprograma:

PROCEDURE DIVISION USING

   LK-NOME
   LK-SALDO
   LK-DATA.

BY REFERENCE

Padrão do COBOL.

Passa endereço.

CALL 'PROG1'

USING BY REFERENCE WS-NOME.

Pode alterar o valor original.


BY CONTENT

Passa cópia.

CALL 'PROG1'

USING BY CONTENT WS-NOME.

Não altera a variável original.


BY VALUE

Passa valor diretamente.

Muito usado em integração com C.

CALL 'PROG1'

USING BY VALUE WS-CODIGO.

Exemplo

MOVE 100 TO WS-VALOR

CALL 'TESTE'

USING BY CONTENT WS-VALOR

Subprograma altera:

MOVE 500 TO LK-VALOR

Resultado:

WS-VALOR = 100

CANCEL

Remove programa da memória.

CANCEL 'CALCULA'

Muito usado após CALL dinâmico.


Fluxo

CALL
 ↓
Executa
 ↓
CANCEL
 ↓
Memória liberada

CALL e Load Modules

O programa chamado precisa estar:

STEPLIB
JOBLIB
LINKLIST
LPA

Erros Comuns

S806

Programa não encontrado.

S806

U4038

Erro interno.


S0C4

Parâmetro incorreto.


Boas Práticas

✅ Usar GOBACK nos subprogramas

✅ Validar parâmetros recebidos

✅ Documentar USING

✅ Evitar excesso de níveis CALL

✅ Utilizar COPYBOOK para parâmetros


Exemplo Corporativo

MAIN
 │
 ├── VALIDA
 │
 ├── CONSULTA-DB2
 │
 ├── CALCULA-JUROS
 │
 ├── GERA-ARQUIVO
 │
 └── LOG-ERRO

Cada módulo é um subprograma especializado.


Resumo Rápido

TipoCaracterística
CALL EstáticoNome fixo
CALL DinâmicoNome variável
NestedPrograma dentro de programa
RecursivoChama a si próprio
LINK CICSRetorna
XCTL CICSNão retorna
BY REFERENCEPassa endereço
BY CONTENTPassa cópia
BY VALUEPassa valor
CANCELRemove da memória

Conclusão

O comando CALL é o mecanismo que permite a modularização das aplicações COBOL. Através dele, programas podem compartilhar regras de negócio, reutilizar código e organizar grandes sistemas corporativos em componentes menores. Dominar CALL estático, dinâmico, parâmetros USING, BY REFERENCE, BY CONTENT, BY VALUE, LINK, XCTL e CANCEL é essencial para qualquer programador COBOL que deseje atuar em ambientes Mainframe modernos.

segunda-feira, 26 de fevereiro de 2007

O que é o comando GOBACK em COBOL?

 

Bellacosa Mainframe e o comando Goback em Cobol

O que é o comando GOBACK em COBOL?

O comando GOBACK é utilizado para encerrar a execução de um programa ou retornar o controle para o programa chamador.

Ele é considerado uma das instruções mais importantes do COBOL moderno e, em muitos ambientes, substitui o uso de STOP RUN.


Definição Simples

O GOBACK significa:

Volte para quem me chamou

ou, se não existir programa chamador:

Termine a execução

Sintaxe

GOBACK.

Exemplo Simples

IDENTIFICATION DIVISION.
PROGRAM-ID. TESTE.

PROCEDURE DIVISION.

DISPLAY 'OLA MUNDO'.

GOBACK.

Resultado:

OLA MUNDO

Programa finalizado.


Como Funciona?

O comportamento depende da forma como o programa foi executado.


Programa Principal

Executado por JCL:

//STEP1 EXEC PGM=PROG1

Fluxo:

JCL
 ↓
PROG1
 ↓
GOBACK
 ↓
Fim da execução

Subprograma

Programa principal:

CALL 'SUBROT1'.

Subprograma:

DISPLAY 'ENTREI'.

GOBACK.

Fluxo:

MAIN
 ↓
CALL SUBROT1
 ↓
GOBACK
 ↓
MAIN continua

Exemplo Completo

Programa Principal:

IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.

PROCEDURE DIVISION.

DISPLAY 'ANTES'.

CALL 'SUB1'.

DISPLAY 'DEPOIS'.

GOBACK.

Subprograma:

IDENTIFICATION DIVISION.
PROGRAM-ID. SUB1.

PROCEDURE DIVISION.

DISPLAY 'SUBPROGRAMA'.

GOBACK.

Saída:

ANTES
SUBPROGRAMA
DEPOIS

GOBACK x STOP RUN

Essa é a comparação mais importante.

GOBACKSTOP RUN
Retorna ao chamadorFinaliza tudo
Seguro para subprogramasPerigoso em subprogramas
Recomendado atualmenteUso tradicional
Funciona em programas chamadosEncerra toda aplicação

Exemplo Visual

GOBACK

MAIN
 ↓
SUB1
 ↓
GOBACK
 ↓
MAIN continua

STOP RUN

MAIN
 ↓
SUB1
 ↓
STOP RUN
 ↓
Tudo termina

Uso em Batch

Muito comum.

OPEN INPUT ARQCLI

PERFORM PROCESSA

CLOSE ARQCLI

GOBACK.

Uso em Subprogramas

É a principal recomendação.

CALL 'CALCULO'

CALL 'VALIDA'

GOBACK.

Uso em Programas DB2

Também é amplamente utilizado.

IF SQLCODE NOT = 0

   DISPLAY SQLCODE

   GOBACK

END-IF.

GOBACK e Return Code

Pode ser combinado com:

MOVE 8 TO RETURN-CODE.

GOBACK.

Resultado:

CC=0008

GOBACK e Language Environment

No ambiente LE (Language Environment), o GOBACK é tratado de forma inteligente.

Se existir chamador:

Retorna ao chamador

Se não existir:

Finaliza execução

EXIT PROGRAM x GOBACK

Outro comando relacionado.


EXIT PROGRAM

EXIT PROGRAM.

Retorna apenas ao chamador.


GOBACK

GOBACK.

Retorna ao chamador ou termina a aplicação.


Comparação

ComandoFunção
EXIT PROGRAMRetorna ao chamador
GOBACKRetorna ou termina
STOP RUNFinaliza tudo

Exemplo com EXIT PROGRAM

IDENTIFICATION DIVISION.
PROGRAM-ID. SUB1.

PROCEDURE DIVISION.

DISPLAY 'SUB'.

EXIT PROGRAM.

Boas Práticas

✅ Utilize GOBACK em subprogramas

✅ Utilize GOBACK em programas novos

✅ Defina RETURN-CODE quando necessário

✅ Evite STOP RUN em módulos chamados

✅ Padronize o encerramento dos programas


Erros Comuns

STOP RUN em subprograma

CALL 'SUB1'

SUB1:

STOP RUN.

Resultado:

Aplicação inteira termina

Não retornar código

GOBACK.

Sem:

MOVE 8 TO RETURN-CODE

Pode dificultar automação.


Curiosidades

1. O GOBACK foi introduzido para simplificar o retorno de programas chamados

2. É amplamente recomendado pela IBM para novos desenvolvimentos

3. Funciona perfeitamente com Language Environment (LE)

4. É um dos comandos mais encontrados em aplicações COBOL modernas

5. Em muitos padrões corporativos, STOP RUN é proibido em subprogramas


Resumo Rápido

ConceitoFunção
GOBACKRetorna ao chamador ou termina
STOP RUNFinaliza toda aplicação
EXIT PROGRAMRetorna ao chamador
CALLChama subprograma
RETURN-CODECódigo retorno
LELanguage Environment
BatchUso comum
SubprogramaComando recomendado

Conclusão

O GOBACK é o comando de encerramento mais flexível do COBOL moderno. Ele permite que um subprograma retorne ao programa chamador sem interromper toda a aplicação e, quando executado em um programa principal, encerra normalmente a execução. Por isso, é considerado a melhor prática para o desenvolvimento COBOL em ambientes z/OS, CICS, IMS e DB2.