☕ 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

Mostrar mensagens com a etiqueta IBM Z. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta IBM Z. Mostrar todas as mensagens

quarta-feira, 11 de novembro de 2026

🦖 MIKE COWLISHAW E O DINOSSAURO QUE APRENDEU A AUTOMATIZAR O MAINFRAME: REXX, A LINGUAGEM NASCIDA ÀS 3 DA MADRUGADA QUE CONQUISTOU O z/OS!

 

Bellacosa Mainframe e uma revisão do rexx

☕ UM CAFÉ NO BELLACOSA MAINFRAME

🦖 MIKE COWLISHAW E O DINOSSAURO QUE APRENDEU A AUTOMATIZAR O MAINFRAME: REXX, A LINGUAGEM NASCIDA ÀS 3 DA MADRUGADA QUE CONQUISTOU O z/OS!

De uma ideia concebida em 1979 aos ambientes IBM Z de 2026: sob a ótica de Mike Cowlishaw, vamos descobrir como uma linguagem criada para simplificar a programação se transformou numa poderosa ferramenta de automação. Uma jornada por COBOL, JCL, TSO, ISPF, EXECIO, Data Stack, LINKMVS, SYSREXX, DevOps e os perigos silenciosos de um script que funciona perfeitamente — até chegar à produção.

Bellacosa Mainframe — Arqueologia da Computação, IBM Z, COBOL, REXX, Automação e os Mistérios da Tecnologia



🎬 Prólogo — 03h17: o homem que acordou com uma linguagem de programação na cabeça

Inglaterra, 20 de março de 1979.

Enquanto boa parte do mundo dormia, um engenheiro da IBM acordava com uma ideia que mudaria discretamente a história da programação.

Seu nome era Mike Cowlishaw.

Naquela época, os computadores pessoais ainda estavam conquistando espaço, os mainframes dominavam o processamento corporativo e escrever programas exigia familiaridade com linguagens, comandos e convenções nem sempre intuitivas.

Cowlishaw enxergava um problema que muitos especialistas pareciam aceitar como inevitável: por que as linguagens de programação precisavam impor tantas dificuldades aos seus usuários?

Por que transformar tarefas simples em exercícios de memorização de símbolos e regras?

Segundo o relato histórico preservado pela Rexx Language Association, naquele dia ele despertou por volta das três da madrugada com uma visão clara do que pretendia desenvolver. Ao final do dia, já havia compartilhado uma especificação inicial para receber comentários.

Era o nascimento do REXX.

Décadas depois, em novembro de 2026, imaginemos o mesmo Mike Cowlishaw entrando num moderno centro de processamento IBM Z.

Diante dele, monitores exibem jobs executando no JES2, aplicações COBOL processam informações bancárias, operadores investigam mensagens pelo SDSF e desenvolvedores utilizam ferramentas modernas de automação.

Em uma tela, aparece um programa:

/* REXX */
say 'Bom dia, Mainframe!'

Cowlishaw sorri.

A linguagem criada para tornar a programação mais acessível continua viva.

Mas ele encontra algo ainda mais interessante.

Aquele pequeno programa agora pode fazer parte de sistemas que consultam datasets, executam comandos, monitoram processos e integram aplicações escritas em diferentes linguagens.

O pequeno script cresceu.

E o dinossauro aprendeu a automatizar seu próprio castelo.

Esta cena é uma dramatização literária. A história do nascimento do REXX e os princípios de Cowlishaw são documentados; o encontro imaginário em 2026 não aconteceu.



🧠 Capítulo I — Quem é Mike Cowlishaw e por que devemos estudar sua filosofia?

Mike Cowlishaw é um cientista da computação britânico conhecido por seu trabalho no desenvolvimento do REXX e por contribuições posteriores ao processamento decimal em computadores.

No final dos anos 1970, ele trabalhava no laboratório da IBM em Hursley, na Inglaterra.

Sua preocupação não era simplesmente criar mais uma linguagem.

Ele buscava uma ferramenta que pudesse ser compreendida por profissionais de informática e também por usuários que não fossem programadores especializados.

O nome REXX representa REstructured eXtended eXecutor.

O projeto recebeu contribuições e comentários de usuários durante seu desenvolvimento. Essa característica é fundamental para compreender sua filosofia.

Em vez de criar uma linguagem pensando exclusivamente na facilidade de implementação do interpretador, Cowlishaw procurou observar as necessidades de quem realmente escreveria os programas.

Seu artigo The Design of the REXX Language, publicado no IBM Systems Journal em 1984, explica justamente essa preocupação com simplicidade, legibilidade e utilização prática.

O REXX foi apresentado publicamente em 1981, durante o SHARE 56, em Houston. Em 1983, passou a integrar oficialmente o ambiente VM/SP da IBM.

E aqui encontramos nossa primeira grande curiosidade.

🥚 Easter egg nº 1 — O REXX quase teve outro nome!

O projeto foi originalmente chamado REX, de Reformed EXecutor.

Segundo o histórico publicado pela IBM, o segundo X foi acrescentado para evitar problemas relacionados a marcas registradas.

Uma pequena alteração no nome ajudou a construir uma identidade que sobreviveria durante décadas.

A primeira lição de Cowlishaw é extraordinariamente atual:

Uma tecnologia não precisa ser difícil de compreender para ser poderosa.

E isso vale tanto para um estudante de COBOL em 2026 quanto para um programador que utilizava VM/CMS em 1983.



🖥️ Capítulo II — O castelo IBM Z: onde COBOL, JCL e REXX trabalham juntos

Imagine um enorme castelo tecnológico.

Dentro dele, milhares de programas COBOL processam pagamentos, atualizam saldos, consultam contratos, calculam juros e movimentam informações empresariais.

O COBOL representa os trabalhadores especializados, responsáveis pelas regras de negócio.

O JCL organiza o processamento batch, indicando programas, datasets, parâmetros e recursos necessários.

O JES2 recebe e gerencia os trabalhos submetidos.

O Db2 e o VSAM armazenam informações fundamentais.

O RACF controla identidades e permissões.

E o REXX?

O REXX atua como um assistente extremamente versátil.

Ele não precisa substituir os especialistas.

Sua função pode ser coordenar atividades, verificar condições, consultar resultados e eliminar procedimentos manuais repetitivos.

Considere uma operação noturna com cinco etapas:

  1. Verificar se o dataset de entrada está disponível.

  2. Validar os parâmetros do processamento.

  3. Executar ou preparar as operações autorizadas.

  4. Consultar resultados e códigos de retorno.

  5. Registrar o estado final para análise operacional.

Um operador poderia realizar parte dessas atividades manualmente.

Mas, quando as mesmas verificações precisam acontecer diariamente, surge uma oportunidade de automação.

É aqui que REXX se destaca.

Na apresentação APPDEV2, encontramos uma frase que resume essa relação:

"REXX não substitui COBOL. Ele substitui o humano apertando tecla."

A frase é uma metáfora, mas transmite uma distinção importante.

COBOL continua sendo especialmente adequado para a implementação de regras empresariais. REXX oferece uma maneira prática de automatizar diversas operações ao redor dessas aplicações.

Um não precisa eliminar o outro.

Em muitos ambientes, os dois trabalham melhor juntos.



📜 Capítulo III — Aprendendo REXX: o primeiro programa de um futuro Mestre Jedi

Vamos começar do zero.

Quem conhece COBOL perceberá imediatamente uma diferença.

No COBOL, normalmente declaramos variáveis e estruturas em seções específicas. No REXX, podemos trabalhar com variáveis de forma muito mais direta.

Nosso primeiro programa será:

/* REXX */
say 'Bem-vindo ao Bellacosa Mainframe!'

A primeira linha é um comentário.

A instrução SAY exibe uma mensagem.

Pronto!

Agora vamos introduzir uma variável:

/* REXX */
nome = 'Mike Cowlishaw'
ano = 1979

say nome
say 'Ano de nascimento do REXX:' ano

Resultado esperado:

Mike Cowlishaw
Ano de nascimento do REXX: 1979

Observe que não precisamos definir antecipadamente um campo PIC X(30) ou PIC 9(4).

Entretanto, essa flexibilidade traz responsabilidades.

Em COBOL, a definição de dados ajuda a organizar as informações. No REXX, o programador precisa estabelecer regras claras para os valores que suas variáveis podem receber.

Nosso primeiro processamento repetitivo

/* REXX */
do i = 1 to 5
  say 'Executando rotina numero' i
end

Resultado:

Executando rotina numero 1
Executando rotina numero 2
Executando rotina numero 3
Executando rotina numero 4
Executando rotina numero 5

O DO executa o bloco repetidamente.

O END encerra o bloco.

Para um iniciante, essa estrutura é fácil de compreender.

Mas vamos avançar.

/* REXX */
parse arg cliente

if cliente = '' then do
  say 'ERRO: cliente nao informado'
  exit 8
end

say 'Processando cliente:' cliente
exit 0

O comando PARSE ARG permite receber argumentos.

O código de retorno 8 indica, por convenção definida nesse exemplo, que houve uma falha de validação.

O código zero indica conclusão normal.

Dica de produção: não utilize códigos de retorno apenas como números decorativos. Documente seu significado, pois eles poderão influenciar decisões em JCL e ferramentas de automação.


🧩 Capítulo IV — Compound Variables: os arrays que não são exatamente arrays

Aqui começa uma das partes mais interessantes do REXX.

Imagine que precisamos armazenar informações de três clientes.

Podemos escrever:

/* REXX */
cliente.1 = 'ANA'
cliente.2 = 'BRUNO'
cliente.3 = 'CARLA'
cliente.0 = 3

do i = 1 to cliente.0
  say cliente.i
end

O resultado será:

ANA
BRUNO
CARLA

Para quem conhece arrays, parece um vetor convencional.

Mas existe uma diferença conceitual.

Em REXX, cliente.1, cliente.2 e cliente.3 são variáveis compostas.

A parte anterior ao ponto é chamada stem. A parte posterior pode ser construída dinamicamente.

Isso permite criar estruturas flexíveis, inclusive utilizando chaves textuais.

/* REXX */
cidade.ITATIBA = 'SAO PAULO'
cidade.LISBOA = 'PORTUGAL'
cidade.YORK = 'INGLATERRA'

say cidade.YORK

Entretanto, o funcionamento das caudas das variáveis compostas depende das regras de avaliação do REXX, que devem ser compreendidas antes de utilizar essas estruturas em aplicações complexas.

O perigoso valor padrão

Observe:

/* REXX */
saldo. = 0
saldo.123 = 500

say saldo.123
say saldo.999

Resultado:

500
0

O valor de saldo.999 não significa que uma conta com esse identificador foi encontrada.

Ele aparece porque estabelecemos zero como valor padrão para o stem.

Agora imagine uma aplicação bancária.

Uma conta com saldo zero existe.

Uma conta inexistente não existe.

Um saldo ainda não consultado é desconhecido.

São três situações diferentes.

Se nosso programa tratar todas como equivalentes, teremos um problema de lógica empresarial.

🥚 Easter egg nº 2 — O fantasma mora na variável que você não inicializou

A apresentação APPDEV2 alerta para um problema clássico: variáveis compostas podem conservar informações de operações anteriores.

Imagine carregar uma lista com cem clientes e, depois, carregar outra com apenas dez.

Se não houver limpeza adequada, elementos da primeira operação poderão permanecer na estrutura.

Para evitar resultados residuais, podemos usar:

drop cliente.

Também devemos validar se determinada variável foi inicializada.

/* REXX */
drop saldo.
saldo.123 = 500

if symbol('SALDO.999') = 'VAR' then
  say 'Variavel definida'
else
  say 'Variavel nao definida'

SYMBOL() é útil, mas não substitui a validação empresarial da existência do registro.

Lição de Cowlishaw aplicada à produção: simplicidade sintática não elimina a necessidade de compreender profundamente o comportamento dos dados.


📚 Capítulo V — Data Stack: a pilha que pode salvar ou sabotar sua automação

Imagine uma pequena agência dos correios.

As mensagens chegam, são armazenadas e posteriormente retiradas para processamento.

Essa é uma analogia útil para entender a Data Stack do REXX.

Duas instruções merecem atenção:

QUEUE adiciona informações ao final da fila.

PUSH coloca informações no início.

Considere:

/* REXX */
queue 'CLIENTE A'
queue 'CLIENTE B'
push 'URGENTE'

parse pull mensagem1
parse pull mensagem2
parse pull mensagem3

say mensagem1
say mensagem2
say mensagem3

A saída será:

URGENTE
CLIENTE A
CLIENTE B

Aqui encontramos duas estruturas clássicas de computação.

FIFO — First In, First Out: o primeiro elemento inserido é o primeiro a sair.

LIFO — Last In, First Out: o último elemento inserido é o primeiro a sair.

A Data Stack permite organizar fluxos temporários de informações, mas ela não é equivalente a um stem.

A pilha pertence ao contexto de execução e pode ser compartilhada por diferentes operações.

Um stem, por outro lado, é uma estrutura de variáveis submetida às regras de escopo do programa.

O perigo da stack suja

Imagine um exec que coloca vinte mensagens na stack, mas consome apenas quinze.

Sob determinadas condições, as cinco mensagens restantes podem interferir em operações posteriores.

A apresentação APPDEV2 resume o risco:

"Stack é compartilhada. Stem é sua."

É uma boa regra didática, embora existam mecanismos de compartilhamento e exposição de variáveis que exigem atenção.

Como isolar uma pilha temporária?

/* REXX */
call newstack

queue 'TAREFA001'
queue 'TAREFA002'

do while queued() > 0
  parse pull tarefa
  say 'Executando:' tarefa
end

call delstack

NEWSTACK estabelece uma nova pilha.

DELSTACK elimina essa pilha e retorna ao contexto anterior.

Dica: em uma aplicação real, estruture também o tratamento de erros para assegurar que os recursos temporários sejam liberados mesmo diante de falhas.


💾 Capítulo VI — EXECIO: quando o REXX abre as portas dos datasets

Agora entramos no território clássico do mainframe.

O mundo IBM Z trabalha intensamente com datasets.

Para um iniciante em COBOL, acessar um arquivo frequentemente significa aprender SELECT, FD, OPEN, READ, WRITE e CLOSE.

O REXX possui uma alternativa poderosa no ambiente TSO/E: EXECIO.

Esse comando permite operações de leitura e escrita de registros em datasets compatíveis.

Passo 1 — Preparar o arquivo

Imagine um dataset sequencial denominado:

APPDEV2.DADOS.CLIENTES

Com os seguintes registros:

00001;ANA;1000
00002;BRUNO;2500
00003;CARLA;750

Passo 2 — Alocar o dataset

No ambiente TSO/E, podemos usar:

address tso

"ALLOC FI(ENTRADA) DA('APPDEV2.DADOS.CLIENTES') SHR"

ALLOC associa um dataset a um nome lógico, neste caso ENTRADA.

Passo 3 — Ler os registros

drop rec.

"EXECIO * DISKR ENTRADA (STEM rec. FINIS"
leituraRC = rc

DISKR realiza leitura.

STEM rec. armazena os registros em variáveis compostas.

FINIS encerra a utilização do arquivo nessa operação.

RC informa o resultado do comando.

Quando a leitura é concluída normalmente, rec.0 contém a quantidade de registros carregados.

Passo 4 — Percorrer os dados

do i = 1 to rec.0
  parse var rec.i codigo ';' nome ';' saldo
  say codigo nome saldo
end

O comando PARSE VAR permite separar os campos utilizando o ponto e vírgula como delimitador.

Passo 5 — Liberar o dataset

"FREE FI(ENTRADA)"

Naturalmente, precisamos verificar o código de retorno da alocação antes de executar a leitura e também validar o resultado da operação.

O que significa FINIS?

Uma dúvida frequente é imaginar que basta terminar a execução do programa para que o dataset tenha sido corretamente tratado.

A documentação IBM explica que alguns recursos podem ser liberados automaticamente ao final de determinados ambientes de execução.

Entretanto, recomenda explicitamente fechar os datasets quando não forem mais necessários.

Essa é uma excelente prática de programação defensiva.

🥚 Easter egg nº 3 — O número de registros não controla automaticamente o DISKW *

Ao escrever registros com EXECIO, podemos usar uma quantidade explícita:

"EXECIO" rec.0 "DISKW SAIDA (STEM rec. FINIS"

Ou o asterisco:

"EXECIO * DISKW SAIDA (STEM rec. FINIS"

Mas existe um detalhe: na escrita a partir de um stem, o asterisco não significa simplesmente utilizar o valor de rec.0.

O processamento pode continuar até encontrar uma variável não inicializada ou um registro nulo, conforme as regras documentadas.

Por isso, quando conhecemos a quantidade exata de registros, frequentemente é mais seguro indicá-la explicitamente.

Outra limitação importante: não devemos presumir que EXECIO oferece acesso direto a todas as organizações de datasets.

Para VSAM, especialmente arquivos indexados, devem ser consideradas interfaces apropriadas.


🚂 Capítulo VII — IKJEFT01 contra IRXJCL: dois caminhos para executar REXX em batch

Uma rotina que funciona perfeitamente no terminal pode falhar quando executada em batch.

Por quê?

Porque o ambiente importa.

A apresentação APPDEV2 destaca duas alternativas de execução.

IKJEFT01 executa comandos TSO/E em background.

IRXJCL permite executar REXX em um ambiente que não oferece automaticamente os mesmos serviços de uma sessão TSO/E.

Essa diferença afeta os comandos disponíveis e as dependências do programa.

Exemplo de JCL com IKJEFT01

//REXXJOB  JOB (ACCT),'REXX TESTE',
//             CLASS=A,MSGCLASS=X
//STEP01   EXEC PGM=IKJEFT01,DYNAMNBR=30
//SYSEXEC  DD DSN=APPDEV2.REXX.EXEC,DISP=SHR
//SYSTSPRT DD SYSOUT=*
//SYSTSIN  DD *
  %TESTE
/*

O job executa o membro TESTE localizado na biblioteca informada em SYSEXEC.

Os parâmetros do JOB e os nomes de datasets precisam ser adaptados ao ambiente de cada organização.

E por que não utilizar sempre IRXJCL?

Porque a escolha depende das necessidades do programa.

Um exec que utiliza comandos TSO/E pode exigir um ambiente diferente de outro que executa apenas lógica REXX e serviços disponíveis em MVS.

Não existe um mecanismo universalmente superior.

Existe o mecanismo adequado à aplicação.

O inimigo invisível: PULL em batch

Veja este código:

say 'Digite o numero do cliente:'
pull cliente

Em um terminal interativo, alguém pode fornecer a informação.

Em batch, porém, a origem dos dados depende da stack e do fluxo de entrada disponibilizado.

O resultado pode ser completamente diferente daquilo que o programador imaginou.

É preferível receber informações explicitamente:

parse arg cliente

if cliente = '' then do
  say 'ERRO: parametro ausente'
  exit 8
end

A automação precisa saber exatamente o que fazer sem depender de uma pessoa diante da tela.


🔗 Capítulo VIII — LINK, LINKMVS e LINKPGM: quando REXX conversa com COBOL

Aqui encontramos uma das partes mais sofisticadas do material.

Imagine que uma empresa possua um programa COBOL escrito em 1995.

Esse programa calcula uma regra financeira utilizada há décadas.

Você precisa automatizar sua utilização, mas não deseja reescrever a lógica.

Seria possível chamar diretamente esse programa a partir de REXX?

Dependendo da interface, sim.

O z/OS oferece ambientes como LINK, LINKMVS e LINKPGM.

Entretanto, eles não representam simplesmente três nomes diferentes para a mesma funcionalidade.

A principal dificuldade está na convenção de passagem de parâmetros.

Alguns módulos esperam receber uma cadeia de caracteres.

Outros esperam uma lista de endereços.

Existem ainda diferenças relacionadas aos comprimentos dos parâmetros e à possibilidade de modificar informações fornecidas pelo chamador.

Um exemplo conceitual de integração:

/* REXX */
cliente = '00000123'

address linkpgm 'CONSULTA cliente'

say 'Retorno:' rc

Nesse exemplo, CONSULTA seria um módulo hipotético preparado para receber parâmetros pela interface correspondente.

Não basta possuir um programa COBOL compilado para garantir que qualquer uma dessas chamadas funcione.

É preciso verificar sua convenção de entrada, o layout de parâmetros, as exigências de runtime e as características do módulo.

Uma recomendação para iniciantes

Antes de integrar um programa COBOL a REXX:

  1. Identifique o módulo que será chamado.

  2. Consulte sua documentação de interface.

  3. Verifique os parâmetros esperados.

  4. Confirme a compatibilidade com o ambiente de chamada.

  5. Teste entradas válidas e inválidas.

  6. Examine os códigos de retorno.

  7. Documente o comportamento em caso de falha.

Esse processo é menos espetacular do que simplesmente escrever um comando LINK.

Mas é justamente ele que permite construir integrações confiáveis.


⚙️ Capítulo IX — REXX compilado: colocar um motor maior não conserta um carro quebrado

Uma dúvida inevitável surge quando os programas começam a crescer.

Se REXX é interpretado, por que não compilar tudo?

A IBM oferece tecnologia para compilar programas REXX.

A compilação pode melhorar o desempenho em determinadas circunstâncias, principalmente reduzindo parte do trabalho necessário para interpretar expressões e instruções.

Mas ela não transforma automaticamente um programa ruim em um programa eficiente.

Imagine um exec que demora cem segundos.

Durante vinte segundos, ele executa lógica REXX.

Nos oitenta segundos restantes, aguarda operações de entrada e saída.

Se a compilação reduzir o tempo da lógica pela metade, o processamento passará de cem para noventa segundos.

A redução total será de apenas dez por cento.

Nada desprezível.

Mas muito diferente da expectativa de executar tudo duas vezes mais rapidamente.

Por isso, antes de compilar, precisamos medir.

A curiosidade das opções SLINE, ALT, CONDENSE e XREF

A apresentação menciona essas opções em sua seção de REXX compilado.

É importante compreender que, no contexto do IBM Compiler for REXX, elas dizem respeito à compilação, representação e informações associadas ao programa.

Não devem ser confundidas com comandos genéricos de processamento de arquivos.

O significado de cada opção precisa ser consultado na documentação da versão do compilador utilizada.

Essa distinção é valiosa porque evita ensinar uma nomenclatura equivocada ao iniciante.

Regra de ouro: primeiro melhore o algoritmo, depois investigue as possibilidades de compilação.


🚨 Capítulo X — ADDRESS CONSOLE: o momento em que o script encontra a operação do z/OS

Até agora, nosso REXX leu variáveis, percorreu estruturas e acessou datasets.

Mas o z/OS possui outro universo.

O universo dos comandos operacionais.

É nele que encontramos mensagens de sistema, informações de recursos, respostas de subsistemas e procedimentos executados por operadores.

Determinados ambientes REXX permitem interagir com comandos de console, desde que as autorizações e as condições técnicas sejam atendidas.

Isso abre possibilidades para ferramentas de monitoramento.

Imagine um exec que verifica se um recurso operacional está respondendo normalmente.

Ele emite uma consulta autorizada, aguarda a resposta, interpreta o resultado e registra a situação.

Mas surge um problema.

E se vários comandos estiverem sendo executados simultaneamente?

Como identificar a resposta correspondente a cada solicitação?

Uma das ferramentas envolvidas nessa situação é o CART — Command and Response Token.

O token ajuda a correlacionar comandos e mensagens de resposta.

Funções como GETMSG podem ser utilizadas para recuperação das mensagens em contextos apropriados.

É uma ideia semelhante à utilização de identificadores de correlação em sistemas distribuídos modernos.

🥚 Easter egg nº 4 — O console também precisa de identificadores

Muita gente associa identificadores de correlação exclusivamente a microsserviços, APIs e computação em nuvem.

Entretanto, a necessidade de associar solicitações às suas respostas também aparece na operação tradicional de mainframes.

A tecnologia muda.

O problema fundamental permanece.

E essa é uma das razões pelas quais estudar IBM Z ajuda a compreender arquiteturas modernas.


🛡️ Capítulo XI — SYSREXX: o poder exige responsabilidade

Chegamos ao nível mais avançado de nossa jornada.

System REXX permite executar programas em ambientes específicos do z/OS, fora do modelo tradicional de uma sessão interativa TSO/E.

Entre suas possibilidades estão a emissão de comandos de sistema e a recuperação de informações para processamento automatizado.

A IBM documenta dois ambientes importantes:

TSO=YES

TSO=NO

A distinção afeta os serviços disponíveis, a integração com TSO/E e as características de execução.

No ambiente System REXX encontramos funções como:

AXRCMD: utilizada para trabalhar com comandos de sistema e respectivas respostas.

AXRWTO: permite emitir mensagens por meio dos serviços correspondentes.

AXRWAIT: oferece mecanismos de espera controlada.

Essas ferramentas permitem construir assistentes operacionais, diagnósticos e rotinas de apoio ao operador.

Mas surge uma pergunta essencial.

Se um exec possui capacidade de interagir com funções sensíveis do sistema, quem controla o que ele pode fazer?

A resposta envolve segurança, autorizações, bibliotecas confiáveis e governança.

O RACF e os demais mecanismos de controle do z/OS desempenham papéis fundamentais.

Não basta que um programa execute corretamente.

Ele precisa executar somente aquilo que está autorizado a fazer.

Uma automação com privilégios excessivos pode se transformar em um risco operacional significativo.

O princípio do menor privilégio

Imagine um programa cuja única função seja consultar determinado recurso.

Ele não deveria receber permissões amplas para alterar configurações críticas, encerrar subsistemas ou modificar informações desnecessárias à consulta.

A simplicidade desejada por Cowlishaw precisa caminhar ao lado da responsabilidade exigida pela operação moderna.

Facilitar a programação não significa facilitar operações perigosas.


🧪 Capítulo XII — Mão na massa: nosso primeiro monitor de indicadores em REXX

Vamos reunir alguns conhecimentos em um projeto prático.

Nosso objetivo será criar um programa simples que leia informações de um dataset e identifique valores superiores a um limite estabelecido.

Imagine o arquivo:

APPDEV2.DADOS.HEALTH

Conteúdo:

CPU;65
MEMORIA;72
FILAS;91
IO;40

Esses valores são indicadores didáticos, não medições reais do sistema.

Passo 1 — Definir o limite

limite = 85

Passo 2 — Ler os registros

/* REXX */
address tso
drop dados.

"ALLOC FI(HCIN) DA('APPDEV2.DADOS.HEALTH') SHR"
if rc <> 0 then exit 12

"EXECIO * DISKR HCIN (STEM dados. FINIS"
leituraRC = rc

"FREE FI(HCIN)"

if leituraRC <> 0 then exit 12

Passo 3 — Verificar cada indicador

alertas = 0

do i = 1 to dados.0
  parse var dados.i indicador ';' valor

  if \datatype(valor,'W') then do
    say 'ERRO: valor invalido'
    exit 12
  end

  if valor < 0 | valor > 100 then do
    say 'ERRO: fora da escala'
    exit 12
  end

  if valor > limite then do
    say 'ALERTA:' indicador valor
    alertas = alertas + 1
  end
  else
    say 'OK:' indicador valor
end

if alertas > 0 then exit 4
exit 0

Passo 4 — Interpretar o resultado

Para os dados apresentados, esperamos:

OK: CPU 65
OK: MEMORIA 72
ALERTA: FILAS 91
OK: IO 40

O retorno será 4, indicando que pelo menos um indicador ultrapassou o limite.

Observe o que acabamos de construir.

Nosso programa possui:

  • Leitura de dataset.

  • Variáveis compostas.

  • Laço de repetição.

  • Validação de dados.

  • Lógica condicional.

  • Código de retorno.

  • Identificação de anomalias.

É um pequeno laboratório, mas contém os fundamentos de uma automação real.

Naturalmente, antes de utilizar essa ideia em produção, precisaríamos acrescentar tratamento completo de falhas, validação do formato dos registros, definição de limites por indicador, registros de auditoria e testes com entradas problemáticas.

Uma evolução interessante

Imagine substituir o dataset simulado por informações coletadas através de serviços autorizados do ambiente.

Poderíamos construir um monitor que identificasse condições operacionais e produzisse alertas.

A próxima etapa seria encaminhar os resultados para uma ferramenta de observabilidade.

E, posteriormente, integrar os registros a sistemas analíticos.

A partir daí, nossa automação começaria a participar de um ecossistema de operação inteligente.


🤖 Capítulo XIII — REXX, DevOps e inteligência artificial: a surpreendente modernidade de uma linguagem de 1979

É curioso imaginar que uma linguagem concebida antes da popularização dos computadores pessoais possa continuar relevante num mundo dominado por APIs, Git, automação e inteligência artificial.

Mas a explicação está na natureza do problema que REXX resolve.

Empresas continuam precisando coordenar processos.

Continuam precisando validar entradas.

Continuam precisando interpretar resultados.

Continuam precisando automatizar operações.

A inteligência artificial pode ajudar a explicar código, gerar testes, documentar rotinas e identificar padrões suspeitos.

Mas o modelo de IA não substitui automaticamente a necessidade de interfaces corretas, permissões apropriadas e validação empresarial.

Imagine um assistente inteligente encarregado de analisar uma rotina REXX.

Ele pode sugerir melhorias, identificar um RC ignorado ou observar que determinado dataset não foi corretamente fechado.

Entretanto, antes de aceitar qualquer modificação, será necessário confirmar que a alteração preserva o comportamento esperado.

Essa é uma das razões pelas quais conhecer profundamente REXX, COBOL e JCL continua importante.

A inteligência artificial pode acelerar o trabalho.

Mas a compreensão técnica permite verificar se o trabalho foi realizado corretamente.

Uma arquitetura possível

Um fluxo moderno pode utilizar:

Git para versionamento.

Uma pipeline CI/CD para testes e validações.

Zowe para integração com serviços do IBM Z.

JCL para processamentos batch.

COBOL para regras empresariais.

REXX para operações especializadas de automação.

RACF para controles de autorização.

E ferramentas de observabilidade para acompanhamento dos resultados.

Cada componente possui uma responsabilidade.

O segredo está na integração disciplinada.


🦖 Capítulo XIV — Dez erros que transformam um script REXX num pesadelo de produção

Depois de explorar os fundamentos, precisamos discutir as armadilhas.

1. Ignorar o RC. Um comando pode falhar sem que o restante do programa seja interrompido automaticamente.

2. Não inicializar estruturas. Variáveis residuais podem produzir resultados inesperados.

3. Confundir stem com array convencional. As regras de variáveis compostas precisam ser compreendidas.

4. Deixar a Data Stack contaminada. Informações pendentes podem interferir em operações posteriores.

5. Esquecer o FINIS. Recursos de I/O precisam ser gerenciados corretamente.

6. Presumir que EXECIO funciona com qualquer dataset. A organização e a interface de acesso importam.

7. Utilizar entrada interativa sem planejamento em batch. A ausência de um terminal altera as condições de execução.

8. Escolher LINK, LINKMVS ou LINKPGM sem compreender os parâmetros. A incompatibilidade de interfaces pode provocar falhas graves.

9. Compilar um programa sem medir seu desempenho. O ganho pode ser pequeno ou irrelevante para o problema real.

10. Automatizar comandos privilegiados sem controles adequados. Quanto maior a autoridade de um programa, maior a responsabilidade sobre sua segurança.

O que todos esses problemas possuem em comum?

Eles revelam a diferença entre conhecer a sintaxe de uma linguagem e compreender o ambiente em que ela funciona.


🏆 Capítulo XV — A trilha do Mestre Jedi do REXX

Se eu estivesse organizando uma formação de REXX para um iniciante em COBOL, dividiria o aprendizado em cinco estágios.

Primeiro estágio — Padawan da linguagem

Aprender SAY, PARSE, IF, DO, SELECT, PROCEDURE, funções e variáveis compostas.

O objetivo é escrever pequenos programas que possam ser compreendidos, testados e modificados.

Segundo estágio — Guardião dos datasets

Aprender EXECIO, Data Stack, tratamento de registros, validação de entradas e fechamento de recursos.

O objetivo é construir utilitários que trabalhem com dados sem comprometer sua integridade.

Terceiro estágio — Cavaleiro do batch

Aprender JCL, IKJEFT01, IRXJCL, parâmetros, DDs, RC e análise de resultados no SDSF.

O objetivo é executar programas de maneira reproduzível, sem dependência de interação humana.

Quarto estágio — Especialista em integração

Estudar LINK, LINKMVS, LINKPGM, interfaces COBOL, módulos carregáveis e convenções de parâmetros.

O objetivo é conectar componentes sem precisar reescrever sistemas que já executam regras empresariais confiáveis.

Quinto estágio — Mestre Jedi da produção

Estudar System REXX, console, autorizações, logs, auditoria, recuperação, controle de mudanças e automação operacional.

O objetivo é compreender não apenas como executar uma operação, mas também seus riscos e consequências.

Essa progressão acompanha a filosofia central da apresentação APPDEV2: sair do pequeno script e avançar, com responsabilidade, para a automação do z/OS.


🔍 Capítulo XVI — O que Mike Cowlishaw nos ensinaria sobre programação em 2026?

Não podemos atribuir a Cowlishaw opiniões que ele não expressou sobre todos os desafios atuais.

Mas podemos refletir sobre os princípios documentados de sua linguagem.

REXX foi desenvolvido com atenção especial à experiência dos usuários.

Sua sintaxe procurava ser legível e coerente.

A linguagem deveria ajudar a resolver problemas reais, em vez de transformar cada atividade numa batalha contra a notação.

Esses princípios continuam extraordinariamente relevantes.

Em 2026, um iniciante pode pedir a uma inteligência artificial que escreva cinquenta linhas de REXX.

Mas isso não garante que ele compreenda o programa.

A IA pode gerar código que parece correto, mas utiliza um serviço indisponível no ambiente de execução.

Pode interpretar incorretamente um código de retorno.

Pode produzir uma chamada incompatível com a interface de um módulo COBOL.

Pode esquecer de liberar recursos.

Por isso, existe uma diferença fundamental entre gerar código e compreender sistemas.

O futuro não pertence apenas a quem consegue produzir programas mais rapidamente. Pertence também a quem consegue demonstrar que esses programas funcionam corretamente, com segurança e dentro das regras do negócio.

Essa reflexão está perfeitamente alinhada à filosofia de uma linguagem que nasceu procurando facilitar a compreensão humana.


🎬 Epílogo — 03h17: o criador do REXX encontrou o futuro dentro de um mainframe

Voltemos ao nosso centro de processamento imaginário.

São 03h17.

Um job termina com RC zero.

Uma rotina verifica a existência de um dataset.

Outra analisa registros de controle.

Um monitor identifica uma condição incomum e registra um alerta.

Uma aplicação COBOL continua executando suas regras empresariais.

E um pequeno programa REXX reúne informações que antes exigiam diversas operações manuais.

Mike Cowlishaw observa a cena.

A linguagem que nasceu de uma ideia simples agora participa de uma infraestrutura tecnológica que movimenta instituições financeiras, empresas e serviços essenciais.

Mas talvez o aspecto mais interessante não seja sua longevidade.

É o fato de que sua filosofia original continua fazendo sentido.

Uma linguagem pode ser acessível sem ser limitada.

Pode ser simples sem ser superficial.

Pode ter décadas de existência e continuar resolvendo problemas modernos.

Em um mundo fascinado pelas novidades, o REXX lembra que inovação nem sempre significa abandonar o passado.

Às vezes, significa descobrir novas possibilidades numa ferramenta que já estava diante de nossos olhos.

E quando o último monitor apaga sua mensagem de processamento, uma frase permanece na tela:

"O verdadeiro Mestre Jedi do Mainframe não é aquele que conhece todos os comandos. É aquele que entende as consequências de cada comando que executa."

O pequeno dinossauro sorri.

O REXX continua vivo.

E sua próxima aventura acaba de começar.


📚 Referências e material de aprofundamento

  • Mike F. Cowlishaw — The Design of the REXX Language, IBM Systems Journal, 1984.

  • IBM — z/OS TSO/E REXX User's Guide.

  • IBM — z/OS TSO/E REXX Reference.

  • IBM — System REXX e documentação de serviços de console.

  • IBM — Compiler for REXX on IBM Z.

  • Rexx Language Association — História da linguagem REXX.

  • APPDEV2 — REXX Mainframe: Do Script ao Motor de Automação z/OS, novembro de 2026.

  • Bellacosa Mainframe — Artigos sobre REXX.

  • GitHub — REXX MiniCurso: scripts e exercícios práticos.

Bellacosa Mainframe — Porque compreender o passado da computação é uma das melhores maneiras de construir seu futuro.

terça-feira, 10 de novembro de 2026

🚨 DIJKSTRA CONTRA A CRISE DO COBOL: O HOMEM QUE DECLAROU GUERRA AO GOTO VOLTA PARA JULGAR A INTELIGÊNCIA ARTIFICIAL!

 

Bellacosa Mainframe e a guerra ao Goto e uma visão da IA

☕ UM CAFÉ NO BELLACOSA MAINFRAME

🚨 DIJKSTRA CONTRA A CRISE DO COBOL: O HOMEM QUE DECLAROU GUERRA AO GOTO VOLTA PARA JULGAR A INTELIGÊNCIA ARTIFICIAL!

Em 1968, Edsger W. Dijkstra desafiou os programadores a abandonarem o código desestruturado. Em 2026, a inteligência artificial promete traduzir sistemas COBOL que movimentam bilhões. Mas quem garante que o programa traduzido continua correto? Uma investigação sobre 67 anos de COBOL, programação estruturada, IBM Z e o perigo de entregar a lógica bancária às máquinas sem compreender o que elas fazem.

Bellacosa Mainframe — Arqueologia da Computação, COBOL, IBM Z, Inteligência Artificial e os Mistérios da Engenharia de Software.



🎬 Prólogo — 03h17: o fantasma de Dijkstra apareceu no CPD

São três horas e dezessete minutos da madrugada.

Em algum lugar do planeta, um mainframe IBM Z continua trabalhando.

No seu interior, milhares de programas COBOL executam cálculos financeiros, atualizam registros, processam pagamentos e alimentam sistemas que não podem simplesmente parar.

Numa das salas do Centro de Processamento de Dados, um jovem programador observa uma mensagem recém-produzida por uma inteligência artificial:

MIGRAÇÃO COBOL PARA JAVA CONCLUÍDA COM SUCESSO.

O programa original possui 18.432 linhas.

A versão produzida pela IA contém 7.216.

O processo levou poucos minutos.

O jovem sorri.

— Acabamos de modernizar quarenta anos de tecnologia!

De repente, uma voz surge atrás dele.

— Modernizar? Interessante. E como você demonstrou que o novo programa está correto?

O rapaz se vira.

Diante de um terminal 3270 está um senhor de óculos, expressão severa e uma folha de papel coberta de símbolos matemáticos.

— Quem é o senhor?

— Meu nome é Edsger W. Dijkstra.

— O famoso inimigo do GOTO?

— Prefiro pensar que sou amigo dos programas que podemos compreender.

Dijkstra aponta para o relatório da inteligência artificial.

— Quantos testes foram executados?

— Quatrocentos e vinte.

— E quantas possibilidades de comportamento existem?

Silêncio.

— O sistema possui registros redefinidos? Campos decimais compactados? Transações concorrentes? Processos batch? Regras de arredondamento? Dependências externas?

— Sim...

— Então por que você acredita que quatrocentos e vinte testes demonstram a equivalência de quarenta anos de regras empresariais?

O jovem olha novamente para a tela.

Pela primeira vez naquela madrugada, a palavra SUCESSO parece assustadora.

Nota: este prólogo é uma dramatização fictícia. Dijkstra faleceu em 2002. Suas intervenções neste artigo são reconstruções literárias inspiradas em suas ideias, não declarações históricas.



🧠 Capítulo I — Quem foi Edsger W. Dijkstra, o homem que queria ensinar computadores a obedecer à razão?

Edsger Wybe Dijkstra nasceu em 11 de maio de 1930, em Roterdã, nos Países Baixos.

Estudou matemática e física, tornando-se um dos pioneiros da ciência da computação numa época em que programar computadores ainda parecia uma atividade experimental.

Naqueles primeiros anos, computadores eram caros, difíceis de operar e muito limitados.

A memória era pequena. O processamento era lento. Os programadores precisavam administrar cuidadosamente cada recurso.

Mas Dijkstra percebeu algo extraordinário.

O maior obstáculo ao desenvolvimento de software complexo não seria apenas a velocidade dos computadores.

Seria a incapacidade humana de compreender sistemas excessivamente complicados.

Essa percepção atravessaria toda a sua carreira.

Entre suas contribuições mais conhecidas estão:

  • O algoritmo de Dijkstra para encontrar caminhos de custo mínimo em grafos.

  • Trabalhos fundamentais sobre programação estruturada.

  • O desenvolvimento do conceito de semáforos para sincronização de processos.

  • Estudos sobre concorrência, exclusão mútua e deadlocks.

  • Métodos de raciocínio matemático sobre a correção dos programas.

  • Contribuições à programação baseada em invariantes e condições formais.

Em 1972, recebeu o Prêmio Turing da ACM, uma das maiores distinções da computação.

Dijkstra não acreditava que a engenharia de software pudesse evoluir indefinidamente apenas escrevendo mais instruções e corrigindo defeitos posteriormente.

Para ele, construir um programa significava desenvolver um raciocínio cujo comportamento pudesse ser compreendido e justificado.

Essa perspectiva é especialmente importante no mundo de 2026.

Porque, quando uma inteligência artificial produz milhares de linhas de código em segundos, o problema humano deixa de ser somente escrever instruções.

Passa a ser compreender, controlar e validar o resultado.

🔎 Curiosidade: Dijkstra não foi apenas o homem do GOTO

Muitos estudantes conhecem Dijkstra exclusivamente por sua crítica ao comando GOTO.

Isso é como estudar Albert Einstein e acreditar que sua contribuição científica foi apenas escrever uma equação famosa.

Dijkstra ajudou a estabelecer fundamentos de engenharia para programas concorrentes e algoritmos.

Suas ideias continuam relevantes em bancos de dados, sistemas operacionais, redes, computação distribuída e ambientes transacionais.

Inclusive no IBM Z.



📜 Capítulo II — 1959: nasce o COBOL, a linguagem que se recusou a desaparecer

Nossa aventura precisa voltar a 1959.

Os computadores empresariais estavam começando a transformar organizações.

Bancos, seguradoras, governos e grandes empresas precisavam automatizar atividades administrativas.

Folhas de pagamento, faturamento, estoques, contabilidade e registros financeiros exigiam processamento confiável.

A maioria das linguagens de programação disponíveis estava fortemente associada às características técnicas dos computadores.

Surgia, então, um desafio.

Era necessário desenvolver uma linguagem mais apropriada ao processamento empresarial, capaz de representar registros, valores monetários e operações administrativas de maneira relativamente legível.

Assim nasceu o COBOL, sigla para Common Business-Oriented Language.

Sua origem está associada ao comitê CODASYL e ao trabalho de diversos pioneiros. Grace Hopper teve influência importante por seus trabalhos anteriores sobre linguagens comerciais, embora não tenha sido a única criadora do COBOL.

A proposta era ambiciosa.

Permitir que programas empresariais fossem escritos numa linguagem menos dependente de uma máquina específica.

Veja um exemplo simples:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. HELLO.

       PROCEDURE DIVISION.
           DISPLAY "BELLACOSA MAINFRAME"
           GOBACK.

Mesmo uma pessoa sem experiência em programação consegue perceber que o programa exibirá uma mensagem.

Essa legibilidade aproximada da língua inglesa foi uma das características marcantes do COBOL.

Mas a facilidade aparente de ler instruções não elimina a complexidade de compreender um sistema inteiro.

E foi justamente nesse ponto que Dijkstra teria uma crítica profunda a oferecer.



⚔️ Capítulo III — 1968: Dijkstra declara guerra ao GOTO

Em março de 1968, Dijkstra publicou uma carta na revista Communications of the ACM que se tornaria histórica:

Go To Statement Considered Harmful.

Em português: O comando GOTO considerado prejudicial.

Seu argumento não era simplesmente uma preferência estética.

Ele examinava a relação entre a estrutura textual de um programa e a capacidade humana de acompanhar seu comportamento durante a execução.

Considere este exemplo didático de COBOL com saltos desnecessários:

       PROCEDURE DIVISION.
       INICIO.
           MOVE 100 TO WS-VALOR
           GO TO CALCULO.

       FINAL.
           GOBACK.

       CALCULO.
           COMPUTE WS-VALOR =
               WS-VALOR * 2
           GO TO FINAL.

Um programa pequeno como esse é fácil de acompanhar.

Mas imagine milhares de parágrafos, centenas de saltos e condições capazes de alterar a ordem de execução.

O programador precisaria construir mentalmente um mapa de todas as rotas possíveis.

Agora considere a mesma ideia organizada de maneira estruturada:

       PROCEDURE DIVISION.
           MOVE 100 TO WS-VALOR

           PERFORM CALCULO

           GOBACK.

       CALCULO.
           COMPUTE WS-VALOR =
               WS-VALOR * 2.

O código agora apresenta uma sequência mais evidente.

Existe um fluxo principal e uma rotina chamada explicitamente.

A diferença parece pequena.

Entretanto, em sistemas grandes, estruturas previsíveis ajudam a reduzir a quantidade de caminhos de execução que o programador precisa compreender simultaneamente.

📚 O que significa programação estruturada?

A programação estruturada organiza algoritmos principalmente por três mecanismos fundamentais:

Sequência: executar instruções numa ordem determinada.

Seleção: escolher caminhos por meio de condições, como IF e EVALUATE.

Repetição: executar operações repetidamente por meio de estruturas como PERFORM UNTIL.

Esses mecanismos permitem construir programas complexos sem depender de saltos arbitrários entre diferentes regiões do código.

Isso não significa que todo programa estruturado esteja correto.

Significa que sua organização facilita o raciocínio sobre o comportamento.

🥚 Easter egg histórico

Existe uma ironia maravilhosa envolvendo o artigo de 1968.

O título original proposto por Dijkstra era A Case against the GO TO Statement.

Foi o editor Niklaus Wirth quem alterou o título para Go To Statement Considered Harmful.

Décadas depois, Dijkstra relatou essa história no documento EWD1308.

A expressão Considered Harmful acabaria se tornando um dos modelos de títulos mais imitados na história da informática.

Eis uma proposta de título que provavelmente caberia perfeitamente em 2026:

Blind AI Code Generation Considered Harmful.

Ou, em português:

Geração cega de código por inteligência artificial considerada prejudicial.

Não é um artigo real de Dijkstra, mas resume uma crítica que podemos construir a partir de seus princípios.


💣 Capítulo IV — A surpresa: Dijkstra também atacou o COBOL!

Aqui encontramos um detalhe histórico que seria desonesto esconder.

Dijkstra não era exatamente um admirador da linguagem COBOL.

Em 1975, no texto How do we tell truths that might hurt?, ele fez uma crítica extraordinariamente severa ao ensino e ao uso da linguagem.

Sua formulação chegou a classificar o ensino de COBOL como algo que deveria ser tratado como uma infração criminosa.

A declaração era deliberadamente provocativa.

Dijkstra criticava várias linguagens que, na sua avaliação, dificultavam o desenvolvimento de bons hábitos intelectuais de programação.

Isso inclui também críticas a BASIC, PL/I e APL.

Portanto, apresentar Dijkstra como defensor histórico do COBOL seria incorreto.

Mas existe algo muito interessante nessa oposição.

Podemos utilizar os princípios de Dijkstra para melhorar programas COBOL, mesmo que ele próprio rejeitasse a linguagem.

A crítica histórica também precisa ser colocada em seu contexto.

O COBOL de 1975 não representa todas as possibilidades dos compiladores e padrões modernos.

A linguagem evoluiu. Ganhou recursos estruturados, novas funcionalidades, integração com bancos de dados, orientação a objetos em determinados ambientes e ferramentas de desenvolvimento mais sofisticadas.

Dijkstra provavelmente continuaria exigente quanto à qualidade do raciocínio envolvido.

E essa exigência é exatamente o que torna sua filosofia útil para discutir a atual crise dos sistemas legados.


🏦 Capítulo V — 2026: a crise do COBOL invade os bancos

No dia 8 de novembro de 2026, o Canaltech publicou uma reportagem sobre a chamada crise do COBOL e o papel da inteligência artificial na modernização de sistemas.

O problema envolve três fenômenos interligados.

Primeiro, organizações continuam dependendo de aplicações desenvolvidas durante décadas.

Segundo, muitos profissionais responsáveis por sua construção e manutenção estão se aposentando.

Terceiro, parte considerável do conhecimento empresarial está incorporada ao próprio código, sem documentação suficientemente atualizada.

Imagine um sistema de financiamento criado em 1988.

Originalmente, sua função era calcular prestações, registrar pagamentos e produzir demonstrativos.

Durante os anos seguintes, recebeu modificações para atender diferentes produtos, mudanças tributárias, procedimentos regulatórios e exigências operacionais.

Em 2026, talvez o programa original ainda esteja executando sua função.

O problema é que ninguém consegue explicar completamente por que ele contém determinadas condições.

Uma variável chamada WS-FATOR-ANTIGO pode guardar uma regra empresarial importante.

Um parágrafo denominado AJUSTE-1997 pode representar uma exceção contratual que permanece válida para determinados clientes.

Um processamento noturno pode depender da ordem exata em que três arquivos são atualizados.

O conhecimento existe.

Mas está distribuído pelo sistema.

E essa é uma forma particularmente perigosa de dependência tecnológica.

📊 A crise não é apenas falta de programadores COBOL

O levantamento de modernização de mainframes da Kyndryl, publicado em 2025, aponta dificuldades relevantes de contratação e capacitação.

Entretanto, modernizar não exige somente conhecer sintaxe COBOL.

Exige compreender bancos de dados, segurança, integração, aplicações distribuídas, operações e arquitetura empresarial.

A falta de especialistas capazes de integrar tecnologias tradicionais com ferramentas modernas pode ser tão importante quanto a escassez de programadores da linguagem original.

A crise, portanto, é também uma crise de transferência de conhecimento.


🤖 Capítulo VI — Outubro de 2026: a inteligência artificial aprende a traduzir COBOL

Em 19 de outubro de 2026, a OpenAI divulgou resultados de pesquisas envolvendo linguagens de programação com menor disponibilidade pública de código e documentação, incluindo COBOL, Fortran e Visual Basic.

Uma das avaliações investigou a capacidade de migrar programas COBOL para linguagens como Java, Python, C++, Kotlin e Rust.

Os resultados foram impressionantes.

No benchmark específico de migração COBOL, o GPT-5.6 Sol obteve 5,4% de precisão em baixo esforço de raciocínio.

O GPT-6.1 Sol alcançou 86,6% nas mesmas condições gerais de esforço e chegou a 97,9% com maior esforço de raciocínio.

Isso demonstra uma evolução importante na capacidade dos modelos de lidar com programas em linguagens historicamente menos representadas nos materiais utilizados para treinamento.

Mas existe uma distinção essencial.

Um benchmark de migração não equivale à migração certificada de um sistema bancário inteiro.

Um sistema real pode reunir COBOL, JCL, CICS, Db2, IMS, VSAM, RACF, filas MQ, interfaces externas e procedimentos operacionais.

O comportamento depende de muito mais do que uma sequência de instruções.

Dijkstra provavelmente faria a pergunta fundamental:

Como sabemos que o comportamento do programa resultante corresponde àquilo que foi especificado?

Essa é a questão que separa uma demonstração tecnológica de um processo seguro de engenharia.


💰 Capítulo VII — O centavo que colocou a inteligência artificial no banco dos réus

Vamos construir nosso primeiro laboratório.

Você é um programador COBOL iniciante trabalhando no processamento de uma taxa bancária.

A empresa utiliza uma taxa de 2,5% aplicada sobre R$ 100,60.

O programa original contém:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. TAXABANCO.

       DATA DIVISION.
       WORKING-STORAGE SECTION.

       01 WS-VALOR      PIC 9(5)V99.
       01 WS-TAXA       PIC 9V999.
       01 WS-RESULTADO  PIC 9(5)V99.

       PROCEDURE DIVISION.

           MOVE 100.60 TO WS-VALOR
           MOVE 0.025 TO WS-TAXA

           COMPUTE WS-RESULTADO =
               WS-VALOR * WS-TAXA

           DISPLAY WS-RESULTADO

           GOBACK.

Vamos compreender cada etapa.

IDENTIFICATION DIVISION identifica o programa.

DATA DIVISION contém as definições de dados.

WORKING-STORAGE SECTION declara variáveis utilizadas durante a execução.

PIC 9(5)V99 representa cinco dígitos inteiros e dois decimais. O V é uma posição decimal implícita, não um caractere armazenado.

COMPUTE realiza uma operação aritmética.

DISPLAY apresenta o resultado.

GOBACK encerra a execução do programa principal e retorna o controle ao ambiente chamador.

O cálculo matemático produz:

100,60 × 0,025 = 2,515

Mas o campo de destino aceita somente duas casas decimais.

Sem ROUNDED, o resultado armazenado será 2,51.

Agora imagine que uma IA converta o programa para Java e utilize um arredondamento convencional para duas casas decimais.

A nova versão pode produzir 2,52.

Os dois programas compilam.

Os dois executam.

Os dois parecem corretos.

Mas são diferentes.

Uma diferença de apenas R$ 0,01, repetida em um milhão de operações que produzam divergência no mesmo sentido, representa R$ 10.000.

É uma situação hipotética, naturalmente. Na prática, diferenças podem ocorrer nos dois sentidos.

Entretanto, o exemplo revela por que preservar o comportamento é fundamental.

🔧 Como corrigir o exemplo?

Depende da regra empresarial.

Se a especificação exigir arredondamento ao centavo segundo a regra suportada pelo compilador, podemos utilizar:

           COMPUTE WS-RESULTADO ROUNDED =
               WS-VALOR * WS-TAXA

Nesse caso, para os valores apresentados, o resultado será 2,52.

Entretanto, acrescentar ROUNDED a um programa existente não é apenas uma melhoria estética.

É uma mudança funcional.

Pode alterar resultados financeiros, conciliações e registros históricos.

Dica Bellacosa: nunca altere uma regra aritmética em produção porque a nova implementação parece matematicamente mais elegante. Confirme antes a especificação empresarial.


🧮 Capítulo VIII — Dijkstra apresenta seu maior argumento: programas precisam de propriedades verificáveis

Um dos fundamentos da abordagem de Dijkstra é a necessidade de raciocinar sobre o comportamento dos programas.

Considere uma rotina que transfere dinheiro de uma conta para outra.

Antes da operação, temos:

Conta A: R$ 1.000

Conta B: R$ 500

Total: R$ 1.500

Agora vamos transferir R$ 200 da conta A para a conta B.

O resultado esperado é:

Conta A: R$ 800

Conta B: R$ 700

Total: R$ 1.500

Observe que uma propriedade permanece verdadeira.

A soma dos saldos não mudou.

Podemos expressar isso matematicamente:

Saldo A + Saldo B = constante

Essa propriedade é um exemplo de invariante.

Um invariante é uma condição que deve permanecer verdadeira durante determinadas etapas ou ao final de uma operação, conforme sua especificação.

Em uma transferência bancária simples entre duas contas, a conservação do valor transferido é uma propriedade importante.

Contudo, sistemas reais também precisam considerar tarifas, tributos, lançamentos contábeis, reversões e outras movimentações.

Por isso, os invariantes precisam ser definidos de acordo com o domínio empresarial.

💻 Laboratório: transferência bancária em COBOL

O exemplo abaixo é exclusivamente didático e não implementa uma transação bancária real.

       IDENTIFICATION DIVISION.
       PROGRAM-ID. TRANSFER.

       DATA DIVISION.
       WORKING-STORAGE SECTION.

       01 WS-CONTA-A    PIC S9(7)V99 COMP-3.
       01 WS-CONTA-B    PIC S9(7)V99 COMP-3.
       01 WS-VALOR      PIC S9(7)V99 COMP-3.
       01 WS-TOTAL-INI  PIC S9(9)V99 COMP-3.
       01 WS-TOTAL-FIM  PIC S9(9)V99 COMP-3.

       PROCEDURE DIVISION.

           MOVE 1000 TO WS-CONTA-A
           MOVE 500 TO WS-CONTA-B
           MOVE 200 TO WS-VALOR

           COMPUTE WS-TOTAL-INI =
               WS-CONTA-A + WS-CONTA-B

           IF WS-VALOR > ZERO AND
              WS-CONTA-A >= WS-VALOR

               SUBTRACT WS-VALOR
                   FROM WS-CONTA-A

               ADD WS-VALOR
                   TO WS-CONTA-B
           ELSE
               DISPLAY "TRANSFERENCIA INVALIDA"
           END-IF

           COMPUTE WS-TOTAL-FIM =
               WS-CONTA-A + WS-CONTA-B

           IF WS-TOTAL-INI = WS-TOTAL-FIM
               DISPLAY "INVARIANTE PRESERVADO"
           ELSE
               DISPLAY "ERRO DE CONSISTENCIA"
           END-IF

           GOBACK.

O que aprendemos?

Primeiro, declaramos os valores monetários usando COMP-3, uma representação decimal compactada comum em aplicações COBOL empresariais.

Depois, calculamos a soma dos saldos antes da operação.

Verificamos se o valor da transferência é positivo e se existe saldo suficiente.

Executamos débito e crédito.

Finalmente, comparamos os totais.

Mas atenção: essa verificação não demonstra que o programa está totalmente correto.

Por exemplo, ela não verifica se cada saldo individual corresponde exatamente ao esperado.

Também não trata persistência em banco de dados, concorrência, falhas intermediárias ou rollback.

Uma aplicação bancária real exige mecanismos transacionais apropriados.

Ainda assim, o exercício apresenta uma ideia importante.

Podemos verificar propriedades do programa, em vez de observar apenas algumas saídas isoladas.

Essa é uma conexão direta entre o pensamento de Dijkstra e a modernização de software com inteligência artificial.


🕵️ Capítulo IX — O mistério dos 360 dias: um erro que talvez seja uma regra bancária

Imagine que uma IA encontre o seguinte trecho:

           COMPUTE WS-JUROS =
              (WS-SALDO * WS-TAXA * WS-DIAS)
               / 360

A IA poderia perguntar:

Por que o programa utiliza 360 dias se o ano normalmente possui 365?

Um programador sem experiência financeira talvez respondesse:

— É um erro antigo. Vamos corrigir.

Dijkstra provavelmente interromperia a discussão.

Antes de corrigir, precisamos saber o que o programa deveria fazer.

A utilização de uma base anual de 360 dias pode corresponder a uma convenção financeira contratual.

A base 365 também existe, assim como diferentes convenções de contagem de dias.

Isso significa que o divisor correto depende do produto e de sua especificação.

Agora imagine que o sistema tenha milhões de contratos antigos.

Modificar 360 para 365 pode alterar valores que deveriam continuar obedecendo às condições originalmente acordadas.

O código pode estar feio.

Pode estar mal documentado.

Pode ser antigo.

Mas isso não significa que sua lógica esteja incorreta.

💡 A grande lição

Existem pelo menos três perguntas diferentes:

O programa faz aquilo que foi programado para fazer?

O programa faz aquilo que a especificação exige?

A especificação ainda representa corretamente a necessidade empresarial?

Uma IA pode ajudar a responder à primeira pergunta.

Pode auxiliar muito na investigação da segunda.

Mas a terceira exige conhecimento do negócio, documentação, responsabilidade e decisões humanas.


🏰 Capítulo X — O castelo IBM Z: por que o COBOL não vive sozinho?

Imagine um castelo medieval.

O programador COBOL trabalha na sala principal.

Mas o castelo possui muralhas, arquivos, mensageiros, guardas e depósitos.

Algo semelhante acontece no mainframe.

O COBOL representa parte da lógica da aplicação.

O CICS administra ambientes de processamento transacional.

O Db2 oferece recursos de banco de dados relacional.

O VSAM gerencia determinadas organizações de arquivos e métodos de acesso.

O JCL descreve trabalhos batch e recursos necessários à execução.

O JES2 participa do gerenciamento e processamento de jobs.

O RACF fornece recursos de identificação, autenticação, controle de acesso e auditoria.

O IBM MQ permite comunicação assíncrona entre aplicações.

E ferramentas como Zowe, VS Code e z/OS Connect ajudam a integrar esse ambiente com práticas e plataformas modernas.

Um programa COBOL pode depender de vários desses componentes simultaneamente.

Por isso, migrar seu código-fonte não significa migrar toda a aplicação.

Considere um programa que recebe uma transação pelo CICS, consulta tabelas Db2, atualiza um arquivo VSAM e envia uma mensagem MQ.

Se uma IA converter o COBOL para Python, ainda precisaremos decidir como preservar:

  • Os limites transacionais.

  • O tratamento de falhas.

  • O controle de concorrência.

  • A recuperação de operações interrompidas.

  • As autorizações de acesso.

  • As integrações externas.

  • Os formatos e a integridade dos dados.

  • Os requisitos de disponibilidade e desempenho.

O desafio é arquitetural.

Dijkstra, que estudou profundamente problemas de concorrência, sincronização e correção, seria um excelente guia intelectual para investigar essas dependências.


🧪 Capítulo XI — Passo a passo: como um iniciante pode investigar COBOL com inteligência artificial

Chegou a hora de construir um método prático.

Vamos imaginar que você acaba de entrar numa equipe responsável por manter aplicações COBOL.

Seu primeiro trabalho consiste em compreender um programa desconhecido.

Passo 1 — Não comece pedindo uma tradução

A primeira reação pode ser copiar o programa e solicitar:

Converta tudo para Python.

Resista à tentação.

Comece identificando o problema que o software resolve.

Pergunte quais dados ele recebe, quais regras aplica, quais arquivos modifica e quais resultados produz.

A tradução será muito mais segura quando houver compreensão prévia.

Passo 2 — Separe as divisões do COBOL

Procure compreender:

IDENTIFICATION DIVISION: identidade do programa.

ENVIRONMENT DIVISION: definições relacionadas ao ambiente e aos recursos externos.

DATA DIVISION: estruturas de dados.

PROCEDURE DIVISION: lógica executável.

Nem todos os programas apresentam exatamente a mesma organização, mas essas divisões constituem uma base excelente para o aprendizado.

Passo 3 — Investigue os tipos de dados

Observe especialmente:

PIC 9: campos numéricos.

PIC X: campos alfanuméricos.

COMP-3: armazenamento decimal compactado.

COMP e COMP-5: representações binárias com particularidades que dependem do ambiente.

REDEFINES: diferentes interpretações de uma mesma área de armazenamento.

OCCURS: repetição de estruturas.

Esses recursos frequentemente determinam como a aplicação representa dados externos e calcula resultados.

Passo 4 — Identifique dependências

Pesquise instruções como:

CALL

COPY

EXEC SQL

EXEC CICS

READ

WRITE

REWRITE

START

Essas instruções podem revelar relações com outros programas, copybooks, bancos de dados, arquivos e serviços transacionais.

Passo 5 — Solicite explicações com evidências

Um prompt útil seria:

Analise este programa COBOL sem modificar seu conteúdo. Identifique entradas, saídas, regras de negócio, dependências, tipos de dados, cálculos e possíveis riscos. Separe os fatos observados das hipóteses. Para cada conclusão, indique o trecho do código que a sustenta. Quando houver informação insuficiente, declare a incerteza.

Esse último requisito é muito importante.

Inteligências artificiais podem apresentar interpretações plausíveis que não correspondem ao verdadeiro propósito empresarial do código.

Passo 6 — Construa testes de caracterização

Um teste de caracterização registra o comportamento existente de um sistema.

Ele ajuda a descobrir como a aplicação funciona antes da alteração.

Inclua valores normais, situações extremas, números negativos, limites de campos, condições de erro e formatos inesperados.

Documente também quais comportamentos precisam ser preservados e quais defeitos conhecidos devem ser corrigidos.

Passo 7 — Compare versões

Execute o programa original e a versão modificada utilizando entradas controladas.

Compare resultados, formatos, códigos de erro e efeitos colaterais.

Quando houver divergência, investigue sua origem.

Nunca considere que a implementação nova está automaticamente correta porque utiliza uma linguagem mais recente.

Passo 8 — Só então considere a modernização

Após compreender e testar o comportamento, avalie se é melhor:

Manter e otimizar o COBOL.

Refatorar componentes internos.

Expor serviços por APIs.

Substituir módulos específicos.

Ou realizar uma migração maior.

A decisão deve considerar riscos, custos e benefícios reais.


🧰 Capítulo XII — As ferramentas modernas que Dijkstra encontraria no mainframe

Em 2026, o desenvolvimento COBOL pode utilizar recursos muito diferentes daqueles encontrados nos terminais dos anos 1970 e 1980.

Ambientes modernos permitem integração com editores, repositórios de código, pipelines e ferramentas de análise.

O Visual Studio Code, com extensões apropriadas, pode ser utilizado para editar COBOL e interagir com recursos do z/OS.

O Zowe facilita diversas formas de acesso e automação.

O Git permite controlar versões, comparar alterações e organizar o desenvolvimento colaborativo.

Ferramentas de compilação, testes e integração contínua ajudam a produzir evidências de qualidade.

O IBM watsonx Code Assistant for Z oferece recursos voltados à compreensão, explicação, geração, refatoração e transformação de código, conforme a versão e os componentes disponíveis.

Essas tecnologias podem reduzir atividades repetitivas.

Mas nenhuma delas elimina a necessidade de engenharia.

Uma ferramenta capaz de produzir código rapidamente não demonstra, por si só, que o código está correto.

A automação precisa ser acompanhada de critérios verificáveis.

E aqui existe uma ligação fundamental com a filosofia de Dijkstra.

A qualidade de um programa não deve ser medida apenas pela facilidade com que ele foi escrito.

Precisamos considerar sua clareza, suas propriedades e a capacidade de demonstrar que atende às exigências estabelecidas.


🔐 Capítulo XIII — Quando a IA recebe acesso ao código bancário: surge um novo perigo

Até agora discutimos erros de lógica.

Mas existe outro problema.

Para analisar um sistema COBOL empresarial, uma inteligência artificial pode precisar acessar código-fonte, documentação, configurações e informações operacionais.

Esses materiais podem conter detalhes sensíveis.

Imagine um agente de IA conectado a um repositório de aplicações financeiras.

Ele recebe autorização para consultar programas.

Depois, ganha acesso a pipelines de desenvolvimento.

Em seguida, alguém permite que modifique arquivos e execute tarefas automaticamente.

De repente, uma ferramenta originalmente utilizada para explicar código possui capacidades de alterar componentes críticos.

Isso exige governança.

As boas práticas incluem controle de privilégios, segregação de funções, rastreabilidade de alterações, avaliação de ferramentas, revisão humana e mecanismos de aprovação.

Credenciais e dados pessoais não devem ser enviados indiscriminadamente para serviços externos.

Ambientes de testes também precisam ser separados dos ambientes produtivos.

Dijkstra não estudou os modelos de linguagem atuais, mas sua preocupação com sistemas complexos e comportamentos controláveis fornece um excelente ponto de partida para essa discussão.

Quanto maior a autonomia concedida ao agente, maior a necessidade de verificar suas ações e limitar seus efeitos.


⏳ Capítulo XIV — 2030: o futuro pertence ao programador COBOL ou ao fiscal da inteligência artificial?

Vamos imaginar o mercado de trabalho daqui a alguns anos.

Em uma organização, existem milhares de programas COBOL.

Boa parte deles foi desenvolvida antes do nascimento dos profissionais mais jovens da equipe.

Agora, agentes de IA conseguem explicar rotinas, localizar dependências, produzir documentação e sugerir transformações.

Isso pode reduzir a quantidade de trabalho manual exigida em determinadas tarefas.

Mas também pode aumentar a capacidade de profissionais experientes de cuidar de aplicações maiores.

O mercado poderá valorizar novas combinações de competências.

O programador COBOL tradicional compreende a linguagem e o ambiente.

O engenheiro de modernização compreende o sistema, suas dependências e as alternativas arquiteturais.

O especialista em validação compreende como estabelecer requisitos e demonstrar propriedades importantes.

O profissional que combina essas habilidades com o uso responsável da IA poderá assumir funções particularmente relevantes.

Entretanto, não devemos transformar essa possibilidade numa promessa de estabilidade profissional garantida.

A automação pode alterar a demanda por determinadas atividades e mudar a forma de contratação das empresas.

O melhor caminho para quem está começando é construir fundamentos sólidos e desenvolver competências complementares.

Aprender COBOL não precisa significar ignorar Python, Java, APIs, Git ou inteligência artificial.

Da mesma forma, aprender IA não deveria significar abandonar o estudo de algoritmos, estruturas de dados e engenharia de software.

📚 O currículo que eu recomendaria para um aprendiz

Comece compreendendo variáveis, condições, repetição e arquivos em COBOL.

Depois avance para JCL, TSO/ISPF e execução de programas no z/OS.

Estude Db2, CICS e VSAM para compreender como aplicações empresariais armazenam e movimentam dados.

Aprenda testes, depuração, documentação e controle de versões.

Finalmente, explore integração por APIs e uso de IA para apoiar análise e desenvolvimento.

Durante todo o processo, faça uma pergunta inspirada por Dijkstra:

Como posso demonstrar que este programa está fazendo aquilo que deveria fazer?

Essa pergunta vale mais do que decorar centenas de instruções.


🥚 Capítulo XV — Cinco curiosidades que Dijkstra deixou para os arqueólogos do software

1. O algoritmo de Dijkstra não nasceu para encontrar rotas de GPS

Seu famoso algoritmo de caminhos mínimos antecede os sistemas modernos de navegação.

A ideia é encontrar caminhos de custo mínimo em grafos com pesos não negativos.

Hoje, conceitos semelhantes aparecem em redes, logística, transportes e planejamento.

2. Dijkstra trabalhou com os fundamentos da concorrência

Muito antes dos atuais sistemas distribuídos, ele investigou problemas de sincronização, exclusão mútua e coordenação de processos.

Esses temas são fundamentais para compreender por que aplicações transacionais precisam controlar corretamente operações simultâneas.

3. Ele não gostava de complexidade desnecessária

A programação estruturada não elimina toda a complexidade.

Mas pode organizar melhor o raciocínio e reduzir a dificuldade de acompanhar o fluxo de execução.

É uma lição que continua válida para software produzido por humanos ou por IA.

4. Ele realmente criticou o COBOL

Essa é talvez a maior ironia de nossa investigação.

Estamos utilizando as ideias de um crítico da linguagem para ensinar como construir programas COBOL melhores.

Não existe contradição obrigatória nisso.

Boas ideias científicas podem ser aplicadas em contextos que seus autores não apreciavam.

5. O maior perigo da IA pode ser tornar fácil demais produzir código

Durante décadas, escrever programas exigia tempo e esforço consideráveis.

Agora, produzir código pode ser muito mais rápido.

Mas a rapidez de geração não reduz automaticamente a dificuldade de compreender o comportamento.

Talvez estejamos entrando numa época em que escrever software se torna progressivamente mais barato, enquanto demonstrar sua correção permanece um dos grandes desafios da engenharia.


⚖️ Capítulo XVI — O julgamento final: COBOL, inteligência artificial e o legado de Dijkstra

Voltamos ao Centro de Processamento de Dados.

São quatro horas e cinquenta e dois minutos.

O jovem programador ainda observa a migração realizada pela inteligência artificial.

Na primeira tentativa, o sistema havia informado sucesso.

Agora, depois de uma investigação mais cuidadosa, surgiram diferenças importantes.

Alguns valores decimais foram arredondados de maneira diferente.

Um campo redefinido não foi interpretado corretamente.

Um fluxo de exceção não recebeu tratamento equivalente.

Uma rotina utilizava um calendário financeiro que não estava documentado.

O jovem compreende que o código produzido pela IA pode representar um excelente ponto de partida.

Mas ainda não é suficiente para substituir o sistema original em produção.

Ele prepara novos testes.

Consulta a documentação.

Conversa com os especialistas de negócio.

Investiga dependências.

E começa a construir uma justificativa técnica para cada alteração.

O visitante observa em silêncio.

— Professor, então o problema não é a inteligência artificial?

Na nossa dramatização, Dijkstra responde:

— O problema é acreditar que produzir instruções equivale a compreender um programa.

O jovem olha novamente para o terminal.

Durante quase sete décadas, os computadores ficaram mais rápidos.

As linguagens evoluíram.

Os sistemas operacionais se transformaram.

A capacidade de armazenamento cresceu em proporções extraordinárias.

E agora as máquinas conseguem produzir programas com uma velocidade que os pioneiros da computação dificilmente imaginariam.

Mas uma pergunta permanece.

Como sabemos que o programa está correto?

Essa pergunta existia antes do COBOL.

Continuou importante durante a expansão dos mainframes.

Sobreviveu à revolução dos computadores pessoais.

Acompanhou a chegada da internet e da computação em nuvem.

E continua fundamental na era da inteligência artificial.


☕ Epílogo — O COBOL não precisa ser salvo da idade. Precisa ser protegido da incompreensão.

A crise do COBOL é frequentemente apresentada como uma disputa entre tecnologias antigas e modernas.

Mas essa interpretação é superficial.

Não estamos simplesmente diante de uma linguagem de 1959 tentando sobreviver em 2026.

Estamos diante de décadas de conhecimento empresarial incorporado a sistemas que continuam executando funções críticas.

A inteligência artificial oferece ferramentas extraordinárias para investigar, explicar, documentar, testar e transformar essas aplicações.

Entretanto, também introduz novos riscos quando resultados aparentemente convincentes são aceitos sem verificação suficiente.

A filosofia de Edsger W. Dijkstra nos ajuda a compreender essa diferença.

A engenharia de software não pode depender exclusivamente da confiança no autor do programa.

E isso vale quando o autor é um programador de 1986, um engenheiro de 2026 ou um agente de inteligência artificial.

É preciso compreender o problema.

Definir o comportamento esperado.

Organizar o raciocínio.

Identificar propriedades importantes.

Construir evidências de correção.

E assumir responsabilidade pelas mudanças.

Talvez o futuro do COBOL não seja determinado por quantas linhas de código uma inteligência artificial consegue traduzir por minuto.

Talvez seja determinado pela nossa capacidade de preservar corretamente os processos empresariais que essas linhas representam.

Porque uma máquina pode escrever um milhão de instruções. Mas ainda precisamos saber se são as instruções certas.

E, no universo Bellacosa Mainframe, essa é a diferença entre simplesmente programar e compreender o que se está construindo.


📚 Referências e leituras recomendadas

  • André Lourenti Magalhães, Canaltech. O que é a chamada Crise do COBOL e como a IA pode ajudar a resolver? — 8 de novembro de 2026.

  • OpenAI. Advancing coding in low-resource programming languages — 19 de outubro de 2026.

  • Edsger W. Dijkstra. Go To Statement Considered Harmful. Communications of the ACM — março de 1968.

  • Edsger W. Dijkstra. How do we tell truths that might hurt? — EWD498, 1975.

  • Edsger W. Dijkstra. What led to Notes on Structured Programming — EWD1308, 2001.

  • IBM Documentation. Enterprise COBOL for z/OS.

  • IBM Documentation. watsonx Code Assistant for Z.

  • Kyndryl. State of Mainframe Modernization Report 2025.

Bellacosa Mainframe — Onde os programas antigos contam suas histórias, a inteligência artificial encontra novos desafios e o conhecimento continua sendo o recurso mais importante de todos.

Fim da investigação. O mainframe continua trabalhando.

segunda-feira, 9 de novembro de 2026

📚 FAIRY TAIL: LEVY McGARDEN DECIFRA O FEITIÇO SECRETO DA IBM — COMO ACELERAR UM COBOL DE 30 ANOS SEM ALTERAR UMA LINHA DO CÓDIGO!


☕ UM CAFÉ NO BELLACOSA MAINFRAME

📚 FAIRY TAIL: LEVY McGARDEN DECIFRA O FEITIÇO SECRETO DA IBM — COMO ACELERAR UM COBOL DE 30 ANOS SEM ALTERAR UMA LINHA DO CÓDIGO!

Bellacosa Mainframe — Arqueologia da Computação, COBOL, IBM Z, Inteligência Artificial e os Mistérios da Tecnologia

Uma aventura sob a tutela de Levy McGarden, de Fairy Tail, para descobrir por que modernizar um sistema não significa necessariamente reescrevê-lo.



🎬 Prólogo — 03h17: um livro de 1995 começou a brilhar no CPD

Magnolia estava silenciosa.

Na sede da guilda Fairy Tail, quase todos dormiam. Natsu Dragneel provavelmente sonhava com alguma batalha envolvendo dragões. Happy sonhava com peixes. Lucy Heartfilia tentava encontrar alguns minutos de tranquilidade.

Mas Levy McGarden continuava acordada.

Sobre sua mesa havia um livro muito diferente dos grimórios encontrados nas antigas bibliotecas de Fiore.

A capa estava desbotada.

O título dizia:

ENTERPRISE COBOL — SISTEMA DE FATURAMENTO — 1995

Levy ajeitou a faixa nos cabelos azuis e começou a examinar as páginas.

       IDENTIFICATION DIVISION.
       PROGRAM-ID. FATURA95.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 WS-VALOR PIC 9(9)V99 COMP-3.
       01 WS-TAXA  PIC 9V9999 COMP-3.
       01 WS-TOTAL PIC 9(9)V99 COMP-3.

       PROCEDURE DIVISION.
           MOVE 15000 TO WS-VALOR
           MOVE 0.0250 TO WS-TAXA

           COMPUTE WS-TOTAL =
               WS-VALOR * WS-TAXA

           DISPLAY WS-TOTAL
           GOBACK.

— Que linguagem interessante! — exclamou.

Levy estava acostumada a decifrar inscrições antigas, símbolos mágicos e alfabetos desaparecidos. Entretanto, aquele código apresentava uma peculiaridade.

Não parecia uma língua morta.

Muito pelo contrário.

Segundo a documentação que acompanhava o livro, programas semelhantes ainda processavam operações em bancos, seguradoras, indústrias e grandes organizações.

Gajeel Redfox apareceu na porta.

— Ei, baixinha! Por que está lendo esse negócio antigo?

— Porque descobri algo extraordinário, Gajeel! Um programa pode ter trinta anos e continuar executando perfeitamente.

— E daí?

Levy mostrou uma segunda página.

Nela aparecia uma expressão misteriosa:

IBM COBOL Elevate for z/OS — Accelerate

Abaixo, uma frase em alemão:

COBOL schneller. Sourcecode unverändert.

Em português:

COBOL mais rápido. Código-fonte inalterado.

Gajeel franziu a testa.

— Quer dizer que podemos deixar o programa mais forte sem mudar suas palavras?

Levy sorriu.

— Exatamente. E vamos descobrir como isso funciona.

Naquela madrugada começava uma das investigações mais curiosas da história da guilda.



📖 Capítulo I — Quem é Levy McGarden e por que ela é a professora ideal para ensinar COBOL?

Levy McGarden é uma personagem criada por Hiro Mashima para o universo de Fairy Tail, mangá iniciado em 2006.

Integrante da guilda Fairy Tail e do grupo Shadow Gear, Levy não costuma resolver seus desafios apenas por meio de força física.

Sua principal especialidade é o conhecimento.

Ela estuda idiomas, interpreta textos antigos, investiga documentos e utiliza uma forma de magia conhecida como Solid Script, capaz de materializar palavras e produzir efeitos mágicos.

É uma escolha particularmente interessante para acompanhar nossa investigação.

Porque um programa de computador também começa como linguagem escrita.

Um programador utiliza palavras, regras e estruturas para representar instruções.

Entretanto, diferentemente da magia de Levy, um computador não compreende diretamente a intenção humana.

Ele precisa de um processo de tradução.

No COBOL, esse processo envolve o compilador.

Imagine que Levy escreva a palavra:

FIRE

Em seu universo, a magia pode transformar a palavra em uma manifestação de fogo.

Agora imagine um programador COBOL escrevendo:

       ADD 100 TO WS-SALDO.

O computador não executa literalmente as letras ADD, TO e WS-SALDO.

O compilador analisa a instrução e gera uma representação executável adequada à arquitetura de destino.

A relação é semelhante apenas como metáfora: nos dois casos, existe uma linguagem cuja interpretação produz um resultado.

Mas, na computação, esse resultado depende de regras formais, tipos de dados, arquitetura de processadores e instruções de máquina.

Primeira lição de Levy: compreender a linguagem é o primeiro passo para compreender o sistema.

E, no caso do COBOL, muitas decisões importantes acontecem depois que o programador termina de escrever o fonte.



🖥️ Capítulo II — 1959: o nascimento de uma linguagem que se recusou a desaparecer

Levy abriu um segundo livro.

Na primeira página havia uma data:

1959.

Foi naquele ano que surgiu o esforço de padronização que originaria o COBOL, sigla de Common Business-Oriented Language.

Naquela época, computadores eram equipamentos enormes, caros e utilizados principalmente por governos, universidades e grandes organizações.

Os sistemas empresariais precisavam processar folhas de pagamento, contas, registros contábeis, estoques e operações financeiras.

O problema era que os computadores eram muito diferentes entre si.

Uma aplicação escrita para determinada máquina frequentemente precisava passar por adaptações significativas para executar em outra.

O COBOL foi concebido com uma preocupação importante: permitir que as regras de processamento de negócios fossem expressas de maneira relativamente próxima da linguagem humana, com forte orientação a dados e registros.

Por isso encontramos construções como:

       IF WS-SALDO > WS-LIMITE
           DISPLAY "LIMITE EXCEDIDO"
       END-IF.

Mesmo alguém que nunca estudou COBOL consegue perceber parte da intenção.

Se o saldo ultrapassar o limite, exiba uma mensagem.

Mas Levy encontrou outra característica essencial.

O COBOL não foi desenvolvido apenas para produzir resultados rapidamente.

Ele também deveria representar regras empresariais com precisão.

Em sistemas financeiros, pequenas diferenças podem ser inaceitáveis.

Uma alteração indevida no arredondamento de juros, por exemplo, pode provocar divergências quando aplicada a milhões de contratos.

Por isso, programas antigos podem carregar conhecimentos valiosos que não estão documentados em nenhum outro lugar.

Uma linha de código pode representar uma exigência legal.

Um cálculo pode reproduzir uma convenção financeira.

Uma validação aparentemente desnecessária pode ter sido introduzida após um incidente ocorrido décadas atrás.

Levy percebeu o perigo.

— Gajeel, imagine encontrar um grimório com trezentos anos de conhecimento. Você arrancaria suas páginas apenas porque a capa ficou velha?

— Claro que não!

— Então por que algumas empresas imaginam que modernizar COBOL significa necessariamente reescrever tudo?

A pergunta nos leva ao próximo capítulo.



🏰 Capítulo III — IBM Z: o castelo onde vivem os programas antigos

Em nossa aventura, a guilda encontra uma instalação tecnológica tão impressionante quanto qualquer fortaleza de Fiore.

No centro da sala existe um sistema IBM Z.

Os mainframes IBM são computadores empresariais projetados para executar cargas de trabalho críticas, com recursos de disponibilidade, segurança, virtualização e processamento de transações.

Eles são utilizados em diferentes setores, incluindo serviços financeiros, seguros e administração pública.

Mas existe uma confusão muito comum entre iniciantes:

Mainframe não é sinônimo de COBOL.

O mainframe é a plataforma computacional.

O COBOL é uma das linguagens utilizadas para construir aplicações.

O z/OS é um sistema operacional para IBM Z.

E há muitos outros componentes importantes nesse universo:

  • JCL: define e controla a execução de trabalhos batch.

  • CICS: fornece infraestrutura para processamento transacional.

  • Db2: sistema gerenciador de banco de dados relacional.

  • VSAM: método de acesso e organização de conjuntos de dados.

  • RACF: componente de controle de acesso e segurança.

  • SDSF: interface para acompanhar jobs, filas, mensagens e execução.

  • SMF e RMF: fontes importantes para analisar utilização de recursos e desempenho.

Levy fez uma anotação:

Um programa COBOL não existe isoladamente. Ele faz parte de um ecossistema.

Isso será importante ao estudar o IBM COBOL Elevate.

Porque nem todo problema de desempenho de uma aplicação COBOL é provocado pelo código gerado pelo compilador.

Um programa pode estar esperando um banco de dados.

Pode estar lendo arquivos excessivamente.

Pode sofrer contenção de recursos.

Ou pode executar um algoritmo pouco eficiente.

Antes de tentar melhorar o desempenho, precisamos descobrir onde está o verdadeiro problema.


⚡ Capítulo IV — O feitiço Accelerate: otimizar o executável sem recompilar o código-fonte

Levy encontrou o primeiro grande segredo da investigação.

Um programa COBOL possui diferentes representações ao longo de seu processo de construção.

Inicialmente temos o código-fonte, escrito pelo programador.

Em seguida, o compilador traduz as instruções e produz código objeto.

O processo de linkedição reúne componentes e cria um artefato executável, como um load module ou program object.

É esse artefato que o ambiente de execução utiliza.

Para entender a diferença, imagine uma receita de pão.

O código-fonte é a receita escrita.

A compilação corresponde, de maneira simplificada, ao processo de transformar as instruções em algo executável.

O módulo resultante é o produto preparado para utilização.

A analogia tem limites, mas ajuda a compreender a separação entre fonte e executável.

Agora considere um programa compilado muitos anos atrás.

Seu compilador produziu instruções adequadas à tecnologia disponível naquela época.

Entretanto, processadores IBM Z mais recentes podem oferecer possibilidades adicionais de execução eficiente.

O Accelerate, componente do IBM COBOL Elevate for z/OS, foi apresentado pela IBM para identificar e otimizar aplicações COBOL elegíveis no nível binário, sem exigir alterações no código-fonte nem uma recompilação convencional.

Isso significa que a ferramenta trabalha sobre o programa executável existente.

O ponto é especialmente interessante quando uma empresa possui sistemas antigos e deseja melhorar seu desempenho antes de iniciar uma migração completa de compilador.

Exemplo didático

Imagine um programa chamado FATURA95.

A aplicação foi compilada com uma geração antiga de compilador e executa milhões de operações.

O arquivo-fonte permanece:

FATURA95.cbl

O ambiente também possui o módulo executável correspondente.

Com uma ferramenta de otimização binária, um módulo elegível pode ser analisado e transformado em uma versão executável otimizada.

O fonte original permanece intacto.

Levy fez uma comparação com sua magia Solid Script.

— É como melhorar a eficiência de um feitiço já preparado sem alterar as palavras do grimório!

Mas existe uma advertência importante.

O Accelerate não deve ser descrito como uma ferramenta capaz de reinventar automaticamente qualquer algoritmo empresarial.

A documentação pública de apresentação do produto não detalha exaustivamente todas as transformações internas realizadas em cada programa.

Também não existe garantia universal de ganho.

A compatibilidade, o comportamento funcional e os resultados de desempenho precisam ser validados.

Segunda lição de Levy: preservar o código-fonte não elimina a necessidade de testar o executável otimizado.


🔍 Capítulo V — O ancestral do feitiço: IBM Automatic Binary Optimizer

Ao continuar pesquisando, Levy fez uma descoberta inesperada.

A IBM já trabalhava com otimização binária antes de 2026.

Uma tecnologia importante nessa história é o IBM Automatic Binary Optimizer for z/OS, frequentemente chamado de ABO.

Ele foi desenvolvido para permitir que determinados programas COBOL compilados anteriormente fossem otimizados sem exigir acesso ao código-fonte.

Isso é particularmente relevante em ambientes empresariais antigos.

Imagine uma instituição que preserva o executável de uma aplicação, mas perdeu parte dos arquivos-fonte originais.

Tal situação representa um problema sério de manutenção.

A organização pode conseguir continuar executando o módulo, mas modificar sua lógica torna-se muito mais difícil.

A otimização binária oferece um caminho para melhorar determinados aspectos do executável sem reconstruir imediatamente toda a aplicação.

Entretanto, Levy percebeu um detalhe fundamental:

Otimização binária não equivale à recuperação do código-fonte perdido.

O problema da manutenção continua existindo.

Da mesma forma, a otimização não substitui a necessidade de documentação, controle de versões, testes e planejamento de continuidade operacional.

A novidade do COBOL Elevate está em reunir diferentes abordagens de modernização em uma proposta integrada.


🧙 Capítulo VI — Upgrade: quando o compilador também precisa evoluir

Levy abriu um terceiro grimório.

A capa dizia:

Enterprise COBOL 6

O componente Upgrade do COBOL Elevate procura auxiliar organizações que precisam atualizar suas aplicações para gerações modernas do compilador Enterprise COBOL.

Diferentemente do Accelerate, aqui estamos falando de uma migração que envolve o código-fonte, o processo de compilação e possíveis adaptações.

E por que isso pode ser complicado?

Porque uma aplicação desenvolvida décadas atrás pode depender de opções de compilação, representações de dados e comportamentos históricos.

O perigo dos dados numéricos inválidos

Considere:

       01 WS-IDADE PIC 9(3).

O programador declarou um campo numérico de três posições.

O sistema espera valores como:

018

052

067

Mas imagine que, por um problema em uma interface antiga, o campo receba bytes que representem:

12A

Agora temos dados incompatíveis com a declaração numérica.

Se o programa executar operações aritméticas ou comparações sobre esse conteúdo, o comportamento pode depender de vários fatores, incluindo formato de dados e opções de compilação.

Ao migrar de compilador, certas diferenças podem expor problemas que anteriormente passavam despercebidos.

A solução correta é investigar o dado inválido e o comportamento esperado, não simplesmente presumir que o novo compilador esteja errado.

Onde entra a inteligência artificial?

Segundo a IBM, o Upgrade oferece recursos de avaliação e assistência à remediação, incluindo suporte orientado por IA em etapas da modernização.

Isso pode ajudar equipes a identificar incompatibilidades, compreender alterações necessárias e acelerar o trabalho de migração.

Mas a validação humana permanece indispensável.

Uma sugestão tecnicamente plausível pode alterar uma regra empresarial histórica.

Levy entendeu imediatamente.

— Uma palavra de magia pode estar escrita corretamente e ainda produzir o efeito errado se não conhecermos sua finalidade!

Terceira lição de Levy: atualizar o compilador é um projeto de compatibilidade e governança, não apenas uma operação técnica.


📊 Capítulo VII — Performance Insights: descobrir onde a magia está desperdiçando energia

Até agora investigamos o executável e o compilador.

Mas existe um terceiro problema.

E se o próprio algoritmo for ineficiente?

Imagine este exemplo didático:

       PERFORM VARYING WS-I FROM 1 BY 1
           UNTIL WS-I > 10000

           PERFORM VARYING WS-J FROM 1 BY 1
               UNTIL WS-J > 10000

               IF CLIENTE-ID(WS-I) =
                  PEDIDO-ID(WS-J)
                   ADD 1 TO WS-TOTAL
               END-IF

           END-PERFORM

       END-PERFORM.

O programa percorre uma tabela de dez mil clientes.

Para cada cliente, percorre dez mil pedidos.

Isso pode resultar em:

10.000 × 10.000 = 100 milhões de comparações.

Levy ficou horrorizada.

— Cem milhões? Mas por que não organizar os registros antes?

Essa é exatamente a pergunta que um especialista em desempenho deve fazer.

Dependendo das características dos dados, podemos empregar algoritmos mais eficientes, técnicas de ordenação, pesquisas indexadas ou operações apropriadas no banco de dados.

Uma alternativa poderia ser ordenar dois conjuntos de registros por uma mesma chave e percorrê-los de maneira coordenada.

Em condições adequadas, isso reduz enormemente o número de comparações.

Entretanto, implementar tal estratégia exige considerar duplicidades, integridade dos dados e regras de associação.

O Performance Insights foi concebido para apoiar esse tipo de investigação por meio de análise estática, dinâmica e informações de execução, associando oportunidades de melhoria a trechos do programa.

É importante compreender a diferença:

O Accelerate procura melhorar o código executável elegível.

O Performance Insights ajuda a identificar problemas de desempenho cuja solução pode exigir alterações na aplicação.

Nem toda recomendação necessariamente envolve reescrever o programa inteiro.

Às vezes, uma alteração localizada pode produzir ganhos significativos.

Quarta lição de Levy: antes de modificar milhares de linhas, descubra quais realmente precisam de atenção.


💰 Capítulo VIII — A armadilha dos 86%: desempenho não é uma única medida

A imagem que iniciou nossa investigação apresenta um exemplo:

Antes: 2.100 transações por segundo.

Depois: 3.900 transações por segundo.

Isso representa um aumento aproximado de 85,7% no throughput.

É um número expressivo.

Mas Levy encontrou uma armadilha.

A imagem não demonstra, por si só, que esses valores tenham sido medidos em um benchmark oficial do produto.

Devemos considerá-los ilustrativos, a menos que sua origem experimental seja documentada.

Além disso, diferentes métricas respondem a perguntas diferentes.

CPU time representa o tempo de processador consumido.

Elapsed time representa o tempo total entre o início e o término de uma execução.

Throughput representa a quantidade de trabalho concluída por unidade de tempo.

Response time representa o tempo necessário para responder a determinada solicitação ou transação.

Imagine que um job consuma 1.000 segundos de CPU e leve 30 minutos para terminar.

Depois de uma otimização, ele passa a consumir 800 segundos de CPU.

Obtivemos uma redução de 20% no consumo de CPU.

Mas o job pode continuar levando quase 30 minutos se a maior parte do tempo for gasta esperando operações de entrada e saída ou recursos externos.

Por outro lado, reduzir CPU pode liberar capacidade importante em um ambiente com alta concorrência.

E quanto custa essa economia?

Depende.

No mainframe, o custo real está relacionado ao modelo de contratação, licenciamento, capacidade e características da utilização.

Não seria correto calcular automaticamente uma economia financeira de 20% apenas porque determinado programa passou a utilizar 20% menos CPU.

A redução pode gerar benefícios operacionais mesmo quando não altera imediatamente a fatura.

Por exemplo, pode ampliar a capacidade disponível para outras cargas de trabalho.

Levy anotou no quadro:

Medir primeiro. Interpretar depois. Decidir por último.


🏦 Capítulo IX — Outubro de 2026: Accelerate chega a um território importante do CICS

Uma das informações mais interessantes da documentação recente do produto aparece na atualização associada à APAR PH73532 e à PTF UO09993, de outubro de 2026.

A IBM documentou a ampliação do suporte às tarefas Identify e Optimize para aplicações COBOL executadas sob CICS.

Isso merece atenção.

O CICS Transaction Server é utilizado para processamento de transações empresariais e integrações com aplicações.

Imagine uma aplicação bancária em que o cliente consulta o saldo de sua conta.

Uma representação simplificada do caminho seria:

Terminal ou aplicação cliente

↓

CICS Transaction Server

↓

Programa COBOL

↓

Db2 ou VSAM

↓

Resposta ao usuário

Se parte significativa do consumo de CPU estiver dentro de um módulo COBOL elegível, uma otimização binária poderá representar uma oportunidade.

Mas não devemos confundir essa possibilidade com uma melhoria universal de todas as transações CICS.

Uma transação pode depender muito mais de consultas Db2, comunicação de rede ou contenção de recursos do que do processamento interno do módulo COBOL.

A otimização não corrige automaticamente todos esses gargalos.

Levy fez outra observação:

— Melhorar a espada de Gajeel não resolve o problema se ele estiver esperando a porta da fortaleza abrir!

A metáfora é adequada.

Para melhorar um sistema, precisamos identificar o recurso que realmente limita o desempenho.


🧪 Capítulo X — Laboratório da Levy: como investigar um programa COBOL passo a passo

Chegou a hora de transformar a teoria em um exercício prático.

Vamos imaginar uma empresa que possui um programa chamado FECHAM01, responsável por parte de seu fechamento diário.

Passo 1 — Descobrir o que o programa faz

Antes de qualquer otimização, precisamos compreender sua finalidade.

O programa lê arquivos?

Consulta Db2?

Atualiza registros?

Gera relatórios?

Executa rotinas de cálculo?

Tem requisitos especiais de arredondamento?

A primeira missão do iniciante é produzir um pequeno mapa funcional.

Passo 2 — Identificar o ambiente

Registre a versão do z/OS, as características do ambiente IBM Z, as versões de runtime relevantes e, quando possível, as informações sobre o compilador original.

Também é importante conhecer as bibliotecas de carga, dependências e procedimentos de execução.

O inventário evita decisões baseadas em suposições.

Passo 3 — Obter uma linha de base

Execute o programa em condições controladas.

Registre o consumo de CPU, o tempo total, os volumes processados e os resultados produzidos.

Para jobs batch, ferramentas e informações obtidas a partir do SDSF e de registros SMF podem ajudar nessa atividade.

O objetivo é estabelecer uma referência confiável.

Sem ela, não saberemos se houve melhoria.

Passo 4 — Investigar os candidatos à otimização

Em uma instalação licenciada e configurada do COBOL Elevate, consulte a documentação correspondente à versão e aos níveis de manutenção aplicados.

Utilize os procedimentos oficiais do Accelerate para identificar módulos elegíveis.

Não devemos presumir que qualquer load module possa ser otimizado.

A elegibilidade precisa ser verificada.

Passo 5 — Preservar os artefatos originais

Antes de qualquer transformação, preserve cópias controladas dos módulos originais.

Documente a versão anterior e a nova versão.

Mantenha um procedimento de rollback.

Isso é particularmente importante em aplicações críticas.

Passo 6 — Executar a otimização em ambiente apropriado

A transformação deve seguir os comandos e procedimentos documentados pela IBM para a instalação específica.

Não é recomendável improvisar parâmetros de ferramentas corporativas.

O resultado precisa permanecer identificado e separado dos artefatos de produção até a conclusão dos testes.

Passo 7 — Comparar os resultados funcionais

Aqui começa a parte mais importante.

O programa otimizado precisa produzir os mesmos resultados empresariais esperados.

Compare arquivos de saída, totais financeiros, registros atualizados e códigos de retorno.

Inclua valores extremos, dados históricos e situações de erro.

Um ganho de desempenho que altera indevidamente o resultado contábil não é uma melhoria aceitável.

Passo 8 — Medir novamente

Execute cargas equivalentes e compare resultados.

Procure controlar variações de volume, concorrência, cache e condições do ambiente.

Um único teste pode produzir conclusões enganosas.

Sempre que possível, execute múltiplas medições e compare a variabilidade.

Passo 9 — Avaliar o ganho econômico

Uma melhoria de CPU pode justificar a otimização.

Mas também precisamos considerar testes, operação, licenciamento, manutenção e riscos.

A decisão deve incluir todos esses fatores.

Passo 10 — Documentar e ensinar

Levy considera este passo indispensável.

Registre o que foi feito, por que foi feito, quais resultados foram obtidos e como reproduzir o processo.

A documentação evita que a próxima geração precise redescobrir tudo.


🗃️ Capítulo XI — Um primeiro exemplo de JCL para quem nunca trabalhou num mainframe

Levy encontrou outro documento e começou a sorrir.

— Gajeel, você conhece JCL?

— Isso é alguma guilda rival?

— Não! É Job Control Language!

No ambiente z/OS, JCL é utilizado para descrever trabalhos batch e os recursos necessários para sua execução.

Considere esta estrutura simplificada:

//LEVYJOB  JOB (ACCT),'LEVY TESTE',
//             CLASS=A,MSGCLASS=X
//STEP01   EXEC PGM=FECHAM01
//STEPLIB  DD DSN=LAB.COBOL.LOAD,DISP=SHR
//ENTRADA  DD DSN=LAB.TESTE.ENTRADA,DISP=SHR
//SAIDA    DD DSN=LAB.TESTE.SAIDA,
//            DISP=SHR
//SYSOUT   DD SYSOUT=*

Vamos interpretar as instruções.

JOB identifica o trabalho e fornece parâmetros de execução.

EXEC PGM=FECHAM01 solicita a execução do programa indicado.

STEPLIB informa uma biblioteca onde o sistema poderá procurar o módulo executável.

ENTRADA e SAIDA são nomes DD utilizados para associar conjuntos de dados aos recursos esperados pelo programa.

SYSOUT direciona uma saída para a infraestrutura de spool.

Esse exemplo pressupõe que os datasets e o programa já existam e que o conteúdo da DD SAIDA possa ser utilizado dessa maneira.

É apenas um modelo didático; os parâmetros devem ser adaptados ao ambiente.

E uma observação essencial:

Esse JCL não realiza otimização binária.

Ele demonstra como um programa pode ser executado em um ambiente de laboratório.

O Accelerate possui seus próprios procedimentos documentados.

A distinção é importante para evitar que iniciantes confundam execução de um programa com transformação de seu executável.


🐉 Capítulo XII — Gajeel pergunta: por que não reescrever tudo em Java?

Gajeel estava perdendo a paciência.

— Levy, se esse programa tem trinta anos, por que não escrever outro?

Levy fechou o livro.

— Porque um programa empresarial é muito mais do que suas linhas de código.

Imagine uma aplicação bancária desenvolvida durante décadas.

Ela pode conter regras de juros, tarifas, impostos, exceções, integração com sistemas externos e condições particulares de contratos antigos.

Mesmo quando o código é compreensível, reproduzir exatamente seu comportamento pode ser difícil.

Uma reescrita exige descobrir todas as regras, inclusive aquelas que não foram documentadas.

Também é necessário reconstruir integrações, executar testes extensos, migrar dados e preparar procedimentos de recuperação.

Isso pode ser justificável em determinadas situações.

Mas não deve ser considerado automaticamente a melhor alternativa.

A modernização de sistemas pode envolver diferentes estratégias:

Preservar e otimizar.

Atualizar o compilador.

Refatorar módulos específicos.

Expor funcionalidades por APIs.

Substituir partes do sistema.

Ou realizar uma reescrita completa quando a análise justificar o investimento.

O erro é escolher a solução antes de compreender o problema.

Levy encontrou uma frase que parecia perfeita para o quadro da guilda:

A idade de um programa não determina, sozinha, seu valor tecnológico.


🧠 Capítulo XIII — Inteligência artificial: uma nova aprendiz na biblioteca da Levy

No universo de Fairy Tail, Levy consegue interpretar inscrições que muitos outros personagens não compreendem.

No universo corporativo, ferramentas de inteligência artificial podem ajudar a analisar programas antigos, explicar estruturas e apoiar investigações técnicas.

Imagine um arquivo COBOL com vinte mil linhas.

Um desenvolvedor recém-contratado precisa compreender suas divisões, variáveis, parágrafos e integrações.

A IA pode oferecer explicações iniciais, identificar referências a campos e apoiar a documentação.

Também pode ajudar a investigar padrões conhecidos durante uma migração de compilador.

Mas existe um risco importante.

Modelos de IA podem produzir interpretações incorretas, inclusive com aparência de segurança.

Por isso, suas sugestões precisam ser verificadas contra o código, os dados, a documentação e os requisitos empresariais.

O mistério dos 360 dias

Considere:

       COMPUTE WS-JUROS =
           WS-CAPITAL *
           WS-TAXA *
           WS-DIAS / 360.

Um assistente de IA poderia sugerir utilizar 365 dias porque esse é o número de dias de um ano civil comum.

Mas será que isso estaria correto?

Não necessariamente.

Em finanças existem diferentes convenções de contagem de dias, aplicáveis conforme o produto e o contrato.

O divisor 360 pode fazer parte da regra de cálculo.

Alterá-lo sem compreender sua origem pode produzir resultados incorretos.

Essa é uma das grandes lições da modernização assistida por inteligência artificial.

Compreender o texto de um programa não significa automaticamente compreender sua intenção empresarial.

Levy seria uma excelente professora justamente porque não se limita a reconhecer símbolos.

Ela procura entender o contexto de cada inscrição.


🧩 Capítulo XIV — Easter eggs: cinco segredos escondidos nesta aventura

Easter egg 1 — A magia Solid Script e o código-fonte

A magia de Levy utiliza palavras que produzem efeitos.

No COBOL, as instruções também produzem efeitos, mas somente após sua interpretação pelo compilador e execução na plataforma.

A semelhança é uma metáfora sobre linguagens formais.

Easter egg 2 — O tesouro que ninguém queria abrir

Um programa antigo pode conter regras empresariais valiosas que sobreviveram aos próprios criadores.

O desafio da arqueologia de software é recuperar e preservar esse conhecimento.

Easter egg 3 — O dragão invisível

O verdadeiro inimigo do desempenho nem sempre aparece no código-fonte.

Pode estar em uma consulta SQL, numa espera por I/O, em contenção de recursos ou em um algoritmo inadequado.

Easter egg 4 — O livro que funciona sem o autor

Um módulo compilado pode continuar funcionando mesmo quando os desenvolvedores originais já deixaram a organização.

Mas isso não significa que o sistema seja facilmente modificável.

Executabilidade e manutenibilidade são propriedades diferentes.

Easter egg 5 — O feitiço que não pode errar um centavo

Um sistema financeiro pode executar milhões de cálculos corretamente durante décadas.

Ao modernizá-lo, precisamos preservar os resultados esperados.

O desempenho é importante, mas a integridade da informação é indispensável.


📚 Capítulo XV — Dez dicas de Levy para quem está começando em COBOL

1. Aprenda a estrutura da linguagem. Comece pelas divisões, variáveis, instruções de movimentação, condições e repetições.

2. Entenda os tipos de dados. Estude PIC, COMP, COMP-3, campos numéricos editados e suas representações.

3. Aprenda JCL. Sem ele, você terá dificuldade para compreender muitos processamentos batch no z/OS.

4. Explore TSO/ISPF. Conhecer bibliotecas, membros e edição de datasets é parte importante da rotina de mainframe.

5. Aprenda SDSF. Saber consultar a execução de um job é essencial para diagnosticar falhas.

6. Estude Db2 e VSAM. Muitos programas COBOL dependem diretamente dessas tecnologias.

7. Conheça o compilador. Investigue mensagens, opções de compilação e diferenças entre gerações.

8. Não confunda desempenho com consumo de CPU. Uma aplicação pode ser limitada por vários recursos.

9. Teste antes de otimizar e depois de otimizar. Sem uma linha de base e testes comparáveis, você não consegue demonstrar melhorias com segurança.

10. Preserve o conhecimento empresarial. Documente regras, exceções e decisões. Um bom programador não é apenas alguém que escreve código, mas alguém que compreende o sistema.


🌍 Capítulo XVI — O impacto cultural: por que COBOL continua provocando debates?

Existe uma curiosidade histórica interessante.

Durante décadas, sucessivas gerações de profissionais anunciaram que linguagens antigas desapareceriam diante de novas tecnologias.

Surgiram linguagens estruturadas, orientação a objetos, aplicações web, serviços distribuídos, computação em nuvem e inteligência artificial generativa.

Entretanto, muitas organizações continuaram utilizando aplicações COBOL.

A explicação não está apenas na dificuldade de substituir sistemas.

Em muitos casos, essas aplicações cumprem funções empresariais importantes e apresentam comportamento conhecido, integração consolidada e histórico de operação.

Isso não significa que sejam perfeitas.

Sistemas antigos podem enfrentar problemas reais de manutenção, documentação, dependências, recrutamento e evolução arquitetural.

Mas também não significa que devam ser descartados apenas por sua idade.

O COBOL Elevate representa uma resposta a esse dilema: melhorar partes do ambiente existente sem tratar a reescrita como única estratégia possível.

Para o profissional iniciante, essa realidade representa uma oportunidade de desenvolver conhecimentos que combinam programação, arquitetura, operações e entendimento de negócios.

Não basta conhecer sintaxe.

É necessário compreender como o sistema funciona como um todo.


🏁 Epílogo — 05h42: Levy termina a leitura do grimório

A madrugada havia terminado.

A luz do amanhecer atravessava as janelas da guilda Fairy Tail.

Levy fechou o livro de 1995.

Gajeel, que havia acompanhado a investigação, olhou para a última página.

— Então conseguimos deixar o programa mais rápido sem alterar sua magia?

Levy respondeu com cuidado.

— Em determinadas condições, sim. Mas primeiro precisamos descobrir se ele é elegível, medir o desempenho e comprovar que o resultado continua correto.

— E se o problema estiver na maneira como o programa foi escrito?

— Então teremos que investigar o código-fonte.

— E se o compilador estiver ultrapassado?

— Podemos planejar uma atualização.

— E se não soubermos por que determinada regra existe?

Levy sorriu.

— Então precisaremos estudar sua história.

A resposta parecia resumir tudo o que haviam aprendido.

O IBM COBOL Elevate oferece três abordagens complementares: otimização binária com Accelerate, atualização assistida de compiladores com Upgrade e investigação de oportunidades de desempenho com Performance Insights.

Nenhuma delas elimina a necessidade de conhecer o ambiente, preservar as regras empresariais e validar os resultados.

Mas juntas representam uma maneira muito interessante de pensar a evolução dos sistemas.

Levy escreveu a última frase no quadro:

O verdadeiro poder de uma linguagem não está apenas nas palavras que conseguimos modificar, mas também no conhecimento que conseguimos preservar.

E, em algum lugar de um CPD, um programa COBOL criado em 1995 continuava executando.

Talvez ainda tivesse muitas décadas de trabalho pela frente.

Porque o futuro da computação nem sempre começa com um programa novo. Às vezes começa quando finalmente aprendemos a compreender o antigo.


📚 Referências e leituras complementares

Bellacosa Mainframe — Arqueologia da Computação, COBOL, IBM Z, Inteligência Artificial e as histórias escondidas nos sistemas que nunca pararam de funcionar.

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