Translate

sábado, 22 de julho de 2023

Subscript versus Index : Quando um Programador Descobre que o Maior Vírus Não Está no Data Center... Está em um Mito que Sobrevive Desde os Anos 1970

 

Bellacosa Mainframe apresenta tabelas cobol subscript versus index

☕ Um Café no Bellacosa Mainframe

Subscript versus Index sem Mistérios para Programadores COBOL

Quando um Programador Descobre que o Maior Vírus Não Está no Data Center... Está em um Mito que Sobrevive Desde os Anos 1970

"Em um laboratório subterrâneo, um microscópio pode revelar um organismo invisível. Em um mainframe, um dump pode revelar um erro invisível. Em ambos os casos, a sobrevivência depende de entender detalhes que quase ninguém percebe."


Introdução – Bem-vindo ao Laboratório P4 do Mainframe

Imagine que você acaba de ser contratado para trabalhar em um dos maiores bancos do planeta.

São duas da manhã.

O processamento noturno começou.

Milhões de contas serão atualizadas.

Bilhões de registros serão lidos.

A folha de pagamento nacional será recalculada.

O sistema de cartões irá consolidar compras realizadas no mundo inteiro.

Tudo parece tranquilo...

Até que um batch começa a consumir CPU muito acima do esperado.

O monitor RMF mostra utilização elevada.

O WLM começa a redistribuir prioridades.

O operador do console observa o relógio.

O gerente pergunta:

"O que mudou?"

Depois de algumas horas de investigação, alguém encontra uma rotina COBOL.

Ela percorre uma tabela centenas de milhões de vezes usando um método inadequado de acesso.

Não existe bug.

Não existe ABEND.

Não existe corrupção de dados.

Existe apenas uma pequena decisão tomada por um programador anos atrás.

Uma decisão aparentemente inocente.

Subscript ou Index?

É exatamente essa pequena diferença que vamos investigar hoje.

Assim como em The Andromeda Strain (1971), onde cientistas analisam um organismo microscópico para impedir uma catástrofe, nós vamos colocar o COBOL sob um microscópio e descobrir que existe muito mais acontecendo do que aparenta.

Vista seu jaleco.

O laboratório Bellacosa Mainframe está oficialmente aberto.


O paciente: OCCURS

Antes de falar sobre Subscript ou Index precisamos entender o verdadeiro protagonista.

01 CLIENTES.
   05 CLIENTE OCCURS 100 TIMES.
      10 CODIGO PIC 9(6).
      10 NOME   PIC X(30).

Essa estrutura cria uma tabela.

Ou seja...

Na memória teremos algo semelhante a:

CLIENTE(1)

CLIENTE(2)

CLIENTE(3)

CLIENTE(4)

...

CLIENTE(100)

Nada de mágico aconteceu.

A memória simplesmente possui cem blocos consecutivos.

A pergunta é:

Como chegar até o elemento número 57?

É aí que a investigação começa.


O primeiro suspeito: o Subscript

O Subscript é o método que praticamente todo iniciante aprende.

01 WS-I PIC 9(4).

Depois:

MOVE CLIENTE-NOME (WS-I)

Parece simples.

E realmente é.

Mas existe um detalhe invisível.

Toda vez que fazemos isso, o compilador precisa calcular onde está aquele elemento.

Imagine uma estante enorme.

Você diz:

"Quero o livro número 37."

O bibliotecário pensa:

37

menos

1

×

tamanho do livro

Só depois ele encontra a posição correta.

Em linguagem de máquina acontece algo parecido.

Base da tabela

+

(I-1)

×

Tamanho do registro

Essa conta acontece continuamente.


O segundo suspeito: o Index

Agora surge um personagem misterioso.

05 CLIENTE OCCURS 100 TIMES
   INDEXED BY IDX-CLIENTE.

Observe uma coisa.

O Index não é declarado na Working-Storage.

Ele não possui PIC.

Não possui COMP.

Não possui tamanho conhecido.

Na verdade...

Você nunca sabe como ele realmente é.

Porque ele pertence ao compilador.

É um objeto especial.


O maior mito do COBOL

Durante décadas ouvimos:

"Index é uma variável COMP."

Não.

Isso nunca foi garantido pelo padrão COBOL.

O Enterprise COBOL pode implementá-lo da maneira que desejar.

Ele normalmente utiliza deslocamentos internos.

Mas isso faz parte da implementação do compilador.

Não do programa.

Por isso não podemos fazer:

ADD 1 TO IDX

O compilador simplesmente responde:

"Não."

Quem controla o Index é ele.

Não você.


O laboratório encontra uma pista

Imagine esta tabela.

Registro

34 bytes

O elemento 2 começa exatamente após 34 bytes.

O elemento 3 começa após 68.

O elemento 4 após 102.

O Index guarda justamente esse deslocamento.

Em vez de calcular tudo novamente...

Ele já sabe onde está.

É como um GPS.

Enquanto o Subscript pergunta:

"Qual rua?"

O Index responde:

"Já estou estacionado na frente da casa."


O verdadeiro funcionamento interno

Subscript

Base

+

(I × tamanho)

Index

Base

+

Offset

Essa diferença parece pequena.

Mas em milhões de repetições...

Ela cresce.

Muito.


Então o Index sempre vence?

Não.

Aqui entra um dos maiores avanços dos compiladores modernos.

Os primeiros compiladores COBOL surgiram quando processadores eram extremamente limitados.

Multiplicar números custava caro.

Hoje...

O Enterprise COBOL 6.x é absurdamente inteligente.

Ele reconhece padrões.

Remove cálculos repetidos.

Mantém valores em registradores.

Transforma multiplicações em deslocamentos.

Faz otimizações que simplesmente não existiam nos anos 70.

Em diversas situações...

Subscript e Index acabam gerando praticamente o mesmo código de máquina.

Sim.

Você leu corretamente.


O fantasma dos anos 1970

Por que então tantos livros dizem:

"Nunca use Subscript."

Porque eles estavam certos...

Na época deles.

Era uma realidade dos compiladores antigos.

Hoje a situação mudou.

Mas o mito permaneceu vivo.

É um daqueles vírus culturais que atravessam gerações.

Assim como em The Andromeda Strain, onde o verdadeiro perigo era um organismo microscópico desconhecido, aqui o verdadeiro "vírus" é uma recomendação antiga repetida sem contexto.


SEARCH: onde o Index reina absoluto

Existe um momento em que não há discussão.

SEARCH.

SEARCH CLIENTE

Ou

SEARCH ALL CLIENTE

Esses comandos exigem Index.

Por quê?

Porque o compilador controla o deslocamento automaticamente.

Ele move o ponteiro.

Avança.

Retrocede.

Calcula posições intermediárias.

Tudo sem intervenção do programador.


SEARCH ALL e a inteligência da busca binária

Imagine uma lista com um milhão de clientes.

Uma busca sequencial faria:

1

2

3

4

5

6

...

999999

SEARCH ALL faz algo muito diferente.

500000

↓

250000

↓

375000

↓

312500

Cada comparação elimina metade da tabela.

É o famoso algoritmo Binary Search.

Complexidade:

O(log n)

Enquanto uma busca sequencial é

O(n)

A diferença entre essas duas abordagens é gigantesca quando falamos em milhões de registros.


Um detalhe que poucos conhecem

Podemos copiar índices.

SET IDX-B TO IDX-A

Isso não copia um número.

Copia o deslocamento interno.

É extremamente eficiente.


Outra curiosidade

Você consegue escrever:

DISPLAY WS-I

Mas nunca faz:

DISPLAY IDX

Porque ele não representa um número lógico.

Ele representa uma posição interna conhecida apenas pelo compilador.


O que realmente acontece no processador IBM Z?

Agora entramos na sala limpa do laboratório.

Os processadores IBM Z atuais possuem instruções extremamente sofisticadas para cálculo de endereços.

O Enterprise COBOL conhece essas instruções.

Ele utiliza registradores.

Mantém offsets.

Evita recálculos.

Explora pipelines internos do processador.

Resultado?

Muito do trabalho pesado desaparece antes mesmo do programa executar.

É uma das razões pelas quais aplicações COBOL continuam processando milhões de transações por segundo.


Comparando com C

Quem conhece C entende rapidamente.

Subscript lembra:

array[i]

O compilador faz:

base

+

i

×

sizeof(item)

Já o Index funciona como um ponteiro controlado pelo compilador.

Embora tecnicamente não seja um ponteiro exposto ao programador.


Quando usar Subscript?

Excelente escolha para:

✔ programas didáticos

✔ tabelas pequenas

✔ processamento simples

✔ manutenção fácil

✔ código mais intuitivo


Quando usar Index?

Ideal para:

✔ SEARCH

✔ SEARCH ALL

✔ tabelas enormes

✔ processamento intensivo

✔ milhões de iterações

✔ rotinas críticas


Curiosidade histórica

Nos anos 1970, CPU era um recurso precioso.

Algumas empresas alugavam tempo de processamento por minuto.

Cada instrução economizada significava dinheiro.

Não era exagero.

Era sobrevivência.

Foi nesse ambiente que a preferência por Index nasceu.

Décadas depois, muitos programadores continuam repetindo a recomendação sem conhecer sua origem.


Easter Egg Bellacosa Mainframe 🥚

Se você assistir novamente The Andromeda Strain, perceberá que praticamente toda a tensão do filme vem da investigação meticulosa.

Ninguém sai correndo.

Ninguém explode prédios.

Ninguém derrota o problema com um discurso motivacional.

Os cientistas fazem algo muito mais difícil:

Eles observam.

Coletam evidências.

Eliminam hipóteses.

É exatamente assim que trabalham os melhores analistas de performance em mainframe.

Eles não começam alterando código.

Eles analisam:

  • RMF

  • SMF

  • CPU Time

  • EXCP

  • Cache

  • WLM

  • Explain

  • Dumps

  • Estatísticas do compilador

Performance não nasce de achismos.

Nasce de evidências.


Curiosidades que poucos iniciantes conhecem

☕ O comando SET IDX UP BY 1 não soma necessariamente o valor 1. Ele ajusta o deslocamento interno para o próximo elemento da tabela, independentemente do tamanho do registro.

☕ Um OCCURS DEPENDING ON cria tabelas de tamanho variável, exigindo atenção extra ao acessar elementos.

SEARCH ALL só funciona corretamente quando a tabela está previamente ordenada pelo campo pesquisado. Muitos erros de produção surgem porque essa regra foi esquecida.

☕ O Enterprise COBOL pode eliminar cálculos redundantes durante a compilação, principalmente com níveis altos de otimização (OPTIMIZE).

☕ Em alguns casos, o gargalo não está no acesso à tabela, mas no I/O, em chamadas ao Db2, VSAM ou CICS. Otimizar Subscript versus Index sem medir o restante do programa pode não produzir ganho perceptível.


Passo a passo para escolher corretamente

  1. A tabela é pequena?
    Use Subscript. A clareza do código geralmente vale mais.

  2. Há busca frequente?
    Considere INDEXED BY e SEARCH.

  3. A tabela está ordenada?
    Aproveite SEARCH ALL para busca binária.

  4. O programa processa milhões de registros?
    Meça o desempenho antes de otimizar.

  5. O compilador moderno já resolve o problema?
    Verifique o código gerado e os relatórios de otimização antes de assumir que existe vantagem.

  6. Você está seguindo um mito ou uma evidência?
    Essa talvez seja a pergunta mais importante de todas.


Conclusão – O verdadeiro agente invisível

No fim da investigação, descobrimos que o verdadeiro inimigo não era o Subscript.

Nem o Index.

O verdadeiro agente invisível era o mito.

Durante décadas, frases como "Index sempre é mais rápido" foram repetidas como se fossem leis universais. A realidade é muito mais interessante: compiladores evoluíram, processadores IBM Z ficaram extraordinariamente eficientes e muitas otimizações passaram a acontecer automaticamente.

Isso não significa que Subscript e Index sejam iguais. Eles continuam sendo conceitos diferentes, com propósitos diferentes. O Index permanece essencial para SEARCH, SEARCH ALL e cenários de alto desempenho. O Subscript continua sendo simples, legível e perfeitamente adequado para inúmeras aplicações.

O programador COBOL que apenas memoriza regras continua preso aos manuais dos anos 1970. Já aquele que entende o funcionamento interno da linguagem, do compilador e da arquitetura IBM Z enxerga além dos mitos. Ele sabe quando confiar no compilador, quando medir desempenho e quando realmente vale a pena otimizar.

Como em The Andromeda Strain, o sucesso não pertence a quem faz mais barulho. Pertence a quem observa os detalhes invisíveis, testa hipóteses e toma decisões baseadas em evidências. No universo do mainframe, essa mentalidade é o que transforma um simples programador em um verdadeiro investigador dos sistemas críticos que sustentam bancos, governos e a economia mundial.

Sem comentários:

Enviar um comentário

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