| Bellacosa Mainframe e a section e paragraph no cobol |
☕ Um Café no Bellacosa Mainframe
SECTION e PARAGRAPH no COBOL sem Mistérios
Como um Programador COBOL Padawan Aprende a Organizar seu Código como um Oficial da Frota Estelar
"A diferença entre um programa que apenas funciona e um programa que sobrevive por décadas está na sua organização."
Introdução — A Primeira Missão do Padawan COBOL
Imagine que você acaba de chegar à USS Enterprise.
O Capitão pede para localizar um problema em um sistema de navegação criado há 35 anos.
Você abre o código.
São 18.000 linhas de COBOL.
Não existe um comentário.
Não existe uma SECTION.
Não existe um PERFORM.
Apenas um gigantesco fluxo de GO TO.
Você pensa:
"Quem escreveu isso?"
A resposta normalmente é:
"Alguém extremamente inteligente...
...
...
em 1984."
Bem-vindo ao mundo real do Mainframe.
Uma das primeiras lições que um programador COBOL aprende é que escrever código é relativamente fácil.
O difícil é escrever código que outra pessoa consiga entender vinte anos depois.
É exatamente aí que entram os conceitos de PARAGRAPH e SECTION.
Eles existem desde os primórdios da linguagem e continuam presentes até hoje, mesmo em programas escritos para IBM z17, COBOL 6.5 e aplicações modernas integradas com APIs REST.
E curiosamente, muita gente usa os dois sem realmente entender por que eles existem.
Hoje vamos viajar até a origem desse conceito.
A origem histórica
Para entender SECTION precisamos voltar aos anos 60.
Naquela época:
memória custava uma fortuna;
CPU era extremamente cara;
cartões perfurados eram comuns;
manutenção era muito mais importante que desenvolvimento.
A equipe que criou o COBOL queria que programas fossem parecidos com documentos administrativos.
Por isso surgiram divisões naturais:
IDENTIFICATION DIVISION
ENVIRONMENT DIVISION
DATA DIVISION
PROCEDURE DIVISION
Mas logo perceberam um problema.
A PROCEDURE DIVISION podia crescer para milhares de linhas.
Era necessário organizá-la.
Assim nasceram:
Paragraphs
Sections
Inspirados em capítulos e subtítulos de documentos.
Ou seja:
Documento
↓
Capítulo
↓
Subcapítulo
↓
Parágrafo
Exatamente como um livro.
O que é um Paragraph?
Um paragraph é simplesmente um bloco de instruções identificado por um nome.
Exemplo:
CALCULA-TOTAL.
ADD VALOR TO TOTAL.
COMPUTE IMPOSTO = TOTAL * 0.15.
EXIT.
O nome termina com ponto.
Depois vêm os comandos.
Pode ser chamado assim:
PERFORM CALCULA-TOTAL
Muito simples.
O que é uma SECTION?
Uma SECTION é um agrupador de paragraphs.
Exemplo
CALCULO SECTION.
CALCULA-TOTAL.
...
CALCULA-IMPOSTO.
...
VALIDACOES SECTION.
VALIDA-CPF.
...
VALIDA-DATA.
...
Ou seja
Section
↓
Paragraph
↓
Comandos
É uma organização hierárquica.
Visualizando
PROCEDURE DIVISION
MAIN SECTION
INICIO
PROCESSA
FINALIZA
LEITURA SECTION
LE-DADOS
LE-CLIENTE
CALCULOS SECTION
SOMA
DESCONTO
GRAVACAO SECTION
ESCREVE
É praticamente uma árvore.
Por que isso foi criado?
Porque programas COBOL começaram a ficar enormes.
Muito antes da orientação a objetos.
Muito antes de módulos.
Muito antes de classes.
A SECTION funcionava como um "módulo lógico".
Como funciona internamente?
Quando fazemos
PERFORM CALCULA-TOTAL
O runtime:
guarda o endereço atual
↓
salta
↓
executa
↓
volta
Semelhante a uma chamada de função.
Quando fazemos
PERFORM CALCULO
e CALCULO é uma SECTION...
Ele executa TODOS os paragraphs daquela section.
Exemplo
CALCULO SECTION.
SOMA.
...
IMPOSTO.
...
DESCONTO.
Resultado
SOMA
↓
IMPOSTO
↓
DESCONTO
Tudo automaticamente.
Este detalhe pega muitos iniciantes
Imagine
VALIDACAO SECTION.
VALIDA-A.
...
VALIDA-B.
...
VALIDA-C.
...
Se fizer
PERFORM VALIDACAO
Executará
A
↓
B
↓
C
Mesmo que você só queira A.
Então por que existem paragraphs?
Porque podemos chamar apenas um deles.
PERFORM VALIDA-B
Executa somente aquele.
O famoso EXIT
Quase todo mundo vê isso
EXIT.
e pensa
"isso encerra o paragraph."
Na verdade...
Não exatamente.
EXIT é praticamente um "não faça nada".
Uma instrução nula.
Ela existe para marcar explicitamente um ponto de saída.
Exemplo
CALCULA.
ADD 1 TO TOTAL.
EXIT.
O runtime simplesmente passa por ela.
Então por que usar?
Porque melhora a legibilidade.
Especialmente quando existem PERFORM THRU.
EXIT SECTION
Existe também
EXIT SECTION
Muito mais moderno.
Ele encerra imediatamente a section.
EXIT PARAGRAPH
Também existe.
EXIT PARAGRAPH
Ele retorna imediatamente daquele paragraph.
Muito mais claro.
Antigamente
Antes dessas instruções modernas era comum encontrar
GO TO FIM-ROTINA.
Hoje isso é considerado má prática.
GO TO versus PERFORM
Imagine
A
↓
GO TO C
↓
B
↓
GO TO D
↓
C
↓
GO TO A
Parece um prato de espaguete.
Daí surgiu o termo
Spaghetti Code.
PERFORM resolveu boa parte desse problema.
Curiosidade
Nos anos 70 havia programas COBOL com mais de:
300 paragraphs
100 sections
40 mil linhas
E muitos ainda funcionam hoje.
Performance
Uma pergunta muito comum.
"Section é mais lenta?"
Resposta:
Praticamente não.
O compilador moderno otimiza quase tudo.
A diferença costuma ser insignificante.
Onde realmente existe custo?
PERFORM
↓
retorno
↓
pilha
↓
controle
Mas isso é extremamente pequeno.
Na prática
Legibilidade vale infinitamente mais.
PERFORM THRU
Exemplo
PERFORM A THRU C
Executa
A
↓
B
↓
C
Muito usado antigamente.
Hoje muitos times evitam.
Por quê?
Porque se alguém inserir
B2
no meio...
O comportamento muda.
Sem ninguém perceber.
Truque interessante
Sections permitem criar fases.
INICIALIZACAO
PROCESSAMENTO
RELATORIOS
FINALIZACAO
Cada uma possui seus próprios paragraphs.
Muito organizado.
Outro truque
Usar prefixos.
1000-INICIO
1100-LE-DADOS
1200-PROCESSA
1300-GRAVA
9000-FIM
Muito comum em bancos.
Por quê?
Porque facilita localizar no editor.
Outro padrão clássico
A000
A100
A200
B000
B100
Também extremamente comum.
Cuidados
Nunca misture assuntos.
Ruim
CLIENTE
↓
GRAVA ARQUIVO
↓
FAZ SQL
↓
ENVIA MQ
↓
CALCULA IMPOSTO
Bom
CLIENTE SECTION
↓
DB2 SECTION
↓
MQ SECTION
↓
CALCULO SECTION
Outro cuidado
Não faça Sections gigantes.
Ruim
PROCESSA SECTION
3500 linhas
Bom
LEITURA
VALIDACAO
NEGOCIO
DB2
LOG
MQ
FINAL
Quantos paragraphs?
Não existe regra.
Mas normalmente:
5
10
20
é confortável.
Deve existir apenas uma MAIN?
Quase sempre sim.
Exemplo
MAIN.
PERFORM INICIALIZA
PERFORM PROCESSA
PERFORM FINALIZA
STOP RUN
A leitura fica excelente.
Curiosidade histórica
Muitos compiladores antigos geravam código praticamente na mesma ordem dos paragraphs.
Hoje isso mudou completamente.
O compilador reorganiza diversas instruções.
O compilador pode ignorar Sections?
Em muitos casos sim.
Principalmente quando faz otimizações.
Ele pode inline routines.
Eliminar saltos.
Fundir blocos.
O que IBM recomenda?
Hoje a IBM incentiva:
✔ PERFORM
✔ EXIT PARAGRAPH
✔ EXIT SECTION
✔ evitar GO TO
✔ evitar ALTER
✔ modularização
✔ nomes claros
Um exemplo elegante
PROCEDURE DIVISION.
MAIN.
PERFORM INICIALIZA
PERFORM PROCESSA-PEDIDOS
PERFORM GERA-RELATORIO
PERFORM FINALIZA
GOBACK.
Depois
PROCESSA-PEDIDOS SECTION.
LE-DADOS.
VALIDA-DADOS.
ATUALIZA-DB2.
ENVIA-MQ.
EXIT.
A leitura fica praticamente uma documentação.
Quando NÃO usar Sections?
Existem equipes modernas que preferem apenas paragraphs.
Por quê?
Porque:
PERFORM paragraph
é suficiente.
Especialmente em programas pequenos.
Quando usar Sections?
Em sistemas grandes.
Com dezenas de módulos lógicos.
Principalmente:
Bancos
Seguradoras
Governo
Telecom
ERP
Easter Egg Mainframe ☕
Existe uma brincadeira antiga entre programadores veteranos.
Se um programa possui:
GO TO para todos os lados
ALTER
PERFORM THRU cruzando o programa inteiro
sem SECTION
sem comentários
ele recebe um apelido carinhoso:
"Programa Teletransporte."
Você nunca sabe exatamente onde está.
Assim como um oficial preso em um teletransporte defeituoso da Frota Estelar.
Analogia com a USS Enterprise
Imagine a Enterprise.
Ela possui setores.
Engenharia
Ponte
Enfermaria
Hangar
Laboratórios
Cada setor possui equipes.
Na Engenharia:
Reator
Motores
Dilithium
Warp
Isso é exatamente uma SECTION contendo diversos PARAGRAPHS.
Ninguém colocaria o controle do motor Warp dentro da enfermaria.
Da mesma forma, um programa COBOL bem projetado separa responsabilidades em áreas distintas, facilitando a manutenção e reduzindo o risco de alterações acidentais.
Boas práticas para o Padawan COBOL
Ao longo de décadas de evolução do COBOL, algumas práticas se mostraram consistentes em equipes de alta maturidade:
Mantenha uma MAIN pequena, que apenas orquestre o fluxo principal.
Agrupe rotinas relacionadas em SECTIONs com responsabilidade única.
Dê nomes descritivos aos PARAGRAPHs, usando verbos que indiquem claramente sua função, como
VALIDA-CLIENTE,CALCULA-TOTALouGRAVA-HISTORICO.Prefira PERFORM a GO TO para manter o fluxo previsível.
Utilize EXIT PARAGRAPH e EXIT SECTION quando desejar uma saída explícita e fácil de entender.
Evite PERFORM THRU em novos desenvolvimentos, pois pequenas alterações podem modificar o comportamento sem chamar atenção.
Procure manter cada paragraph relativamente curto. Se ele começa a fazer muitas coisas diferentes, provavelmente merece ser dividido.
Separe regras de negócio, acesso a banco, manipulação de arquivos e integração com outros sistemas em blocos distintos.
Comente o motivo das decisões mais complexas, e não apenas o que o código faz.
Pontos para Fixar
✔ Paragraph é uma rotina identificada por um nome.
✔ Section é um agrupamento de paragraphs relacionados.
✔ PERFORM paragraph executa apenas aquele bloco.
✔ PERFORM section executa todos os paragraphs pertencentes àquela section, em sequência.
✔ EXIT. é uma instrução nula usada tradicionalmente como marcador de fim.
✔ EXIT PARAGRAPH e EXIT SECTION tornam o fluxo de saída mais explícito e legível.
✔ O ganho de organização quase sempre supera qualquer preocupação com desempenho.
✔ O compilador Enterprise COBOL moderno realiza diversas otimizações, tornando diferenças de performance entre uma boa organização em sections e paragraphs praticamente irrelevantes na maioria das aplicações.
✔ Código legível reduz tempo de manutenção, facilita revisões e diminui a probabilidade de defeitos em sistemas que frequentemente permanecem em produção por décadas.
Conclusão — Organizando a Ponte de Comando
No universo de Jornada nas Estrelas, a USS Enterprise não funciona porque possui apenas motores potentes. Ela funciona porque cada setor conhece sua responsabilidade, cada oficial sabe quando agir e a cadeia de comando é clara.
Um programa COBOL de qualidade segue exatamente essa filosofia.
As SECTIONs representam os grandes departamentos da nave. Os PARAGRAPHs são as equipes especializadas que executam cada missão. O PERFORM atua como a ordem do capitão, chamando apenas a rotina necessária no momento certo. Já o EXIT PARAGRAPH e o EXIT SECTION funcionam como um retorno organizado ao posto de comando, sem desvios inesperados.
Muitos sistemas críticos escritos há mais de quarenta anos continuam processando milhões de transações diárias justamente porque foram estruturados com disciplina. A tecnologia evoluiu, o compilador ficou mais inteligente, surgiram otimizações, integração com APIs, DevOps e inteligência artificial, mas um princípio permaneceu praticamente inalterado desde o nascimento do COBOL: um código bem organizado é um código que atravessa gerações.
Como diria o Sr. Spock, adaptando sua lógica ao mundo do IBM Z:
"A elegância de um programa não está na quantidade de instruções, mas na clareza com que cada uma cumpre seu propósito."
E esse talvez seja o maior aprendizado para todo Programador COBOL Padawan: escrever para o computador é fácil; escrever para os próximos cinquenta anos de manutenção é a verdadeira arte do Mainframe.