| Bellacosa Mainframe apresenta o comp-4 e comp-5 no cobol |
☕ Um Café no Bellacosa Mainframe
COMP-4 e COMP-5 sem Mistérios para Programadores COBOL
Quando um Programador Padawan Descobre que um Número Pode Parecer Pequeno no PICTURE... Mas Ocupar um Universo Inteiro de Bits nos Bastidores
Existe um momento inevitável na formação de todo programador COBOL.
Ele aprende PIC 9(5), entende COMP-3, consegue ler um arquivo sequencial sem provocar um SOC7 e começa a acreditar que finalmente domina o reino numérico do mainframe.
Então aparece isto:
05 WS-CONTADOR PIC S9(9) COMP-4.
05 WS-CODIGO-RETORNO PIC S9(4) COMP-5.
O padawan olha para a tela verde e pergunta:
— Mestre, qual é a diferença entre COMP-4 e COMP-5?
O mestre COBOL respira fundo, olha para o teto do data center e responde:
— A diferença está em quem manda no número: o PICTURE ou o recipiente binário.
E desaparece misteriosamente para uma reunião de mudança emergencial.
Neste artigo, entraremos no interior dessas duas representações numéricas, entenderemos sua origem, formato interno, funcionamento, vantagens, riscos, opções de compilação e usos práticos. Também veremos por que dois campos aparentemente iguais podem reagir de maneira diferente ao receber o mesmo valor.
| Bellacosa Mainframe e uma visão sobre numericos comp |
1. Antes de tudo: o que significa COMP?
Em COBOL, a cláusula USAGE informa como um dado será representado internamente na memória.
Quando declaramos:
05 WS-IDADE PIC 9(3).
o uso padrão normalmente é DISPLAY. Isso significa que cada dígito é armazenado como um caractere.
O valor 123, em ambiente EBCDIC, poderá ocupar três bytes:
F1 F2 F3
Cada byte representa um caractere numérico.
Porém, computadores não realizam sua aritmética interna pensando em caracteres. O processador trabalha com bits, palavras, registradores e representações binárias.
As formas COMP, abreviação de COMPUTATIONAL, foram criadas justamente para permitir representações internas mais apropriadas ao processamento.
No universo IBM COBOL, encontramos tradicionalmente:
COMP ou COMP-4 = binário
COMP-1 = ponto flutuante de precisão simples
COMP-2 = ponto flutuante de precisão dupla
COMP-3 = decimal compactado
COMP-5 = binário nativo
No Enterprise COBOL para z/OS, BINARY, COMP e COMP-4 são sinônimos. Já COMP-5 representa o chamado native binary, ou binário nativo. (IBM)
Essa semelhança entre COMP-4 e COMP-5 é precisamente a origem de boa parte da confusão.
Ambos guardam números em formato binário.
Ambos podem ocupar 2, 4 ou 8 bytes.
Ambos podem ser usados em cálculos rápidos.
Mas eles não obedecem exatamente às mesmas regras de capacidade e truncamento.
| Bellacosa Mainframe comp-4 versus comp-5 |
2. O que é COMP-4?
COMP-4, também escrito como COMPUTATIONAL-4, é sinônimo de BINARY no COBOL da IBM.
Estas declarações têm essencialmente o mesmo significado:
05 WS-VALOR PIC S9(9) BINARY.
05 WS-VALOR PIC S9(9) COMP.
05 WS-VALOR PIC S9(9) COMP-4.
No z/OS, os dados binários são armazenados em complemento de dois, com organização big-endian. O bit de sinal operacional fica associado ao lado mais significativo da representação. (IBM)
O tamanho físico do campo depende da quantidade de dígitos declarada no PICTURE:
| Dígitos no PICTURE | Tamanho |
|---|---|
| 1 a 4 | 2 bytes |
| 5 a 9 | 4 bytes |
| 10 a 18 | 8 bytes |
Portanto:
05 WS-A PIC S9(4) COMP-4.
ocupa 2 bytes.
05 WS-B PIC S9(9) COMP-4.
ocupa 4 bytes.
05 WS-C PIC S9(18) COMP-4.
ocupa 8 bytes. (IBM)
2.1 A grande característica do COMP-4
Embora o campo seja armazenado em binário, a cláusula PICTURE continua participando de sua semântica COBOL.
Veja:
05 WS-NUMERO PIC 9(4) COMP-4.
Fisicamente, o compilador reserva 2 bytes.
Dois bytes sem sinal poderiam representar valores de:
0 até 65535
Entretanto, o PICTURE 9(4) descreve formalmente um número de quatro dígitos:
0 até 9999
Aqui começa o drama.
O recipiente físico possui capacidade maior que a capacidade decimal descrita no PICTURE.
O que acontece quando tentamos armazenar 12345?
A resposta depende da operação realizada e, principalmente, da opção de compilação TRUNC.
É por isso que COMP-4 não deve ser entendido apenas como “um inteiro de 16 bits”. Ele é um item binário COBOL cujo comportamento também pode ser influenciado pela descrição decimal do PICTURE.
3. O que é COMP-5?
COMP-5 é o formato chamado pela IBM de native binary.
Exemplo:
05 WS-RETORNO PIC S9(4) COMP-5.
Fisicamente, esse campo também ocupa 2 bytes.
A diferença fundamental é que um item COMP-5 pode utilizar toda a capacidade de seu recipiente binário, em vez de ficar limitado à magnitude sugerida pela quantidade de noves do PICTURE.
A documentação da IBM explica que os itens COMP-5 podem armazenar valores até a capacidade da representação nativa de 2, 4 ou 8 bytes. Quando um valor é movido para um COMP-5, o truncamento ocorre conforme o tamanho físico binário, e não conforme o limite decimal indicado pelo PICTURE. (IBM)
Considere:
05 WS-NUMERO PIC 9(4) COMP-5.
O PICTURE tem quatro noves, mas o campo ocupa 2 bytes sem sinal.
Assim, sua capacidade binária é:
0 até 65535
E não apenas:
0 até 9999
Para um campo com sinal:
05 WS-NUMERO PIC S9(4) COMP-5.
os 2 bytes em complemento de dois permitem:
-32768 até +32767
O campo tornou-se, na prática, um inteiro binário de 16 bits.
O PICTURE ainda existe e continua sendo importante para regras sintáticas, edição, escalas decimais e operações COBOL, mas ele não limita a magnitude armazenável da mesma forma que ocorre com um binário comum submetido às regras tradicionais de truncamento.
4. A diferença em uma frase
Podemos resumir assim:
COMP-4 é um campo binário que normalmente respeita a semântica decimal definida pelo PICTURE; COMP-5 é um campo binário que utiliza a capacidade física inteira de seus 2, 4 ou 8 bytes.
Ou, no dialeto Bellacosa Mainframe:
No
COMP-4, o gerente funcional chamadoPICTUREainda tenta controlar o orçamento. NoCOMP-5, o hardware assume a operação e utiliza todos os bits disponíveis.
5. Origem e história
O uso de representações computacionais acompanha o COBOL há décadas. Termos como COMPUTATIONAL, COMP-1, COMP-2, COMP-3 e COMP-4 surgiram em implementações históricas para representar dados em formatos adequados às arquiteturas dos computadores.
COMP-4 consolidou-se no COBOL IBM como sinônimo de BINARY.
Já COMP-5 surgiu posteriormente no COBOL de host IBM como uma forma explícita de representar um inteiro binário nativo, especialmente útil em interoperabilidade, interfaces de sistema e situações em que a capacidade completa da palavra binária deveria ser preservada.
A documentação de migração da IBM identifica COMP-5 como um tipo que foi novo no COBOL de host e as tabelas de palavras reservadas mostram COMP-5 e COMPUTATIONAL-5 como palavras reservadas a partir do COBOL for OS/390 & VM Version 2 Release 2, produto disponibilizado em 2000. (IBM)
Isso não significa que o conceito de inteiro nativo tenha nascido no ano 2000. Sistemas, linguagens e APIs já trabalhavam com inteiros binários muito antes disso.
O que aconteceu foi a formalização de uma maneira específica e explícita de declarar esse comportamento no COBOL de host IBM.
Antes disso, programadores dependiam mais fortemente de opções como NOTRUNC, comportamentos particulares de compiladores antigos ou convenções locais. Na migração para compiladores modernos, esses detalhes tornaram-se perigosos, pois códigos antigos às vezes armazenavam no campo binário valores maiores do que o PICTURE aparentemente permitia.
COMP-5 oferece uma declaração mais clara:
— Este campo não é apenas um número COBOL com representação binária. Ele é um recipiente binário nativo, e todos os seus bits importam.
6. Formato interno
6.1 Complemento de dois
Campos binários com sinal usam normalmente complemento de dois.
Em 16 bits:
0000 0000 0000 0001 = +1
0000 0000 0000 0010 = +2
0111 1111 1111 1111 = +32767
1000 0000 0000 0000 = -32768
1111 1111 1111 1111 = -1
A vantagem do complemento de dois é que o processador consegue realizar adições e subtrações com circuitos relativamente simples.
Não existe um caractere separado para o sinal. O sinal está incorporado ao próprio padrão binário.
6.2 Big-endian no IBM Z
O IBM Z utiliza organização big-endian para esses dados.
O byte mais significativo aparece primeiro.
Por exemplo, o valor decimal 1000 é hexadecimal:
03E8
Em dois bytes big-endian:
03 E8
Já em uma máquina little-endian, a memória poderia aparecer como:
E8 03
Essa diferença é importantíssima ao trocar estruturas binárias entre plataformas.
Enviar diretamente um campo binário de um mainframe para um servidor Intel sem definir corretamente formato, tamanho e ordem dos bytes é uma excelente forma de transformar o número 1000 em alguma criatura matemática não autorizada pelo Banco Central.
7. Tamanhos e faixas práticas
7.1 Campos com sinal
| PICTURE aproximado | Bytes | Faixa física do COMP-5 |
|---|---|---|
S9(1) a S9(4) | 2 | -32.768 a 32.767 |
S9(5) a S9(9) | 4 | -2.147.483.648 a 2.147.483.647 |
S9(10) a S9(18) | 8 | -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 |
7.2 Campos sem sinal
| PICTURE aproximado | Bytes | Faixa física do COMP-5 |
|---|---|---|
9(1) a 9(4) | 2 | 0 a 65.535 |
9(5) a 9(9) | 4 | 0 a 4.294.967.295 |
9(10) a 9(18) | 8 | 0 a 18.446.744.073.709.551.615 |
Versões modernas do COBOL IBM passaram a permitir que itens COMP-5 sem sinal utilizem todos os 16, 32 ou 64 bits. A IBM registra que esse suporte completo está disponível no COBOL for OS/390 & VM V2R2 e nos compiladores Enterprise COBOL posteriores. (IBM)
Contudo, existe um cuidado importante: nem toda operação COBOL, literal, função ou campo receptor conseguirá manipular confortavelmente toda a faixa de um inteiro de 64 bits sem sinal.
O campo pode possuir a capacidade física, mas o restante do programa também precisa estar preparado para ela.
Um hangar pode comportar um dragão. Isso não significa que a porta da cozinha também comporte.
8. Exemplo passo a passo
Considere o programa:
IDENTIFICATION DIVISION.
PROGRAM-ID. TESTEC45.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-COMP4-SIGNED PIC S9(4) COMP-4 VALUE ZERO.
01 WS-COMP5-SIGNED PIC S9(4) COMP-5 VALUE ZERO.
01 WS-COMP4-UNSIGNED PIC 9(4) COMP-4 VALUE ZERO.
01 WS-COMP5-UNSIGNED PIC 9(4) COMP-5 VALUE ZERO.
01 WS-VALOR-ENTRADA PIC 9(5) VALUE 30000.
01 WS-EDICAO PIC -ZZ,ZZZ,ZZ9.
PROCEDURE DIVISION.
DISPLAY 'TESTE COMP-4 E COMP-5'.
MOVE WS-VALOR-ENTRADA TO WS-COMP4-SIGNED
MOVE WS-VALOR-ENTRADA TO WS-COMP5-SIGNED
MOVE WS-COMP4-SIGNED TO WS-EDICAO
DISPLAY 'COMP-4 SIGNED : ' WS-EDICAO
MOVE WS-COMP5-SIGNED TO WS-EDICAO
DISPLAY 'COMP-5 SIGNED : ' WS-EDICAO
MOVE 60000 TO WS-COMP4-UNSIGNED
MOVE 60000 TO WS-COMP5-UNSIGNED
MOVE WS-COMP4-UNSIGNED TO WS-EDICAO
DISPLAY 'COMP-4 UNSIGNED: ' WS-EDICAO
MOVE WS-COMP5-UNSIGNED TO WS-EDICAO
DISPLAY 'COMP-5 UNSIGNED: ' WS-EDICAO
GOBACK.
Passo 1: observe o tamanho
Todos os quatro campos têm PIC 9(4) ou PIC S9(4).
Logo, todos ocupam 2 bytes.
Porém, sua interpretação não é idêntica.
Passo 2: campo com sinal
O valor 30000 cabe em um inteiro de 16 bits com sinal:
máximo = 32767
Ele também possui cinco dígitos decimais, apesar de o campo ter sido declarado como S9(4).
No COMP-5, o valor pode ser armazenado porque cabe nos 2 bytes.
No COMP-4, o comportamento poderá ser influenciado pela opção TRUNC porque o valor ultrapassa a magnitude de quatro dígitos descrita no PICTURE.
Passo 3: campo sem sinal
O valor 60000 cabe em 16 bits sem sinal:
máximo = 65535
Mas não cabe em PIC 9(4) se interpretarmos apenas a quantidade decimal de noves:
máximo decimal descrito = 9999
O COMP-5 utiliza a capacidade binária do campo e pode armazenar 60000.
O COMP-4 pode sofrer truncamento segundo a semântica COBOL e a opção de compilação utilizada.
9. O papel da opção TRUNC
A opção TRUNC é um dos pontos mais importantes para compreender campos binários no Enterprise COBOL.
As formas mais conhecidas são:
TRUNC(STD)
TRUNC(OPT)
TRUNC(BIN)
9.1 TRUNC(STD)
Procura preservar o comportamento definido pelo padrão COBOL, considerando a quantidade de dígitos do PICTURE.
Se um resultado armazenado em um campo binário ultrapassar a quantidade decimal descrita, poderá haver truncamento para aquela precisão.
Exemplo conceitual:
05 WS-NUM PIC 9(4) COMP-4.
Ao receber:
12345
o resultado poderá ser reduzido à capacidade decimal de quatro dígitos, dependendo da operação:
2345
9.2 TRUNC(OPT)
Permite otimizações, partindo da expectativa de que os valores usados pelo programa respeitam o PICTURE.
É normalmente uma boa escolha quando o código está corretamente definido e os campos não recebem valores maiores que os declarados.
Entretanto, não deve ser usado como desculpa para depender de conteúdo fora do contrato do campo.
9.3 TRUNC(BIN)
Faz com que itens binários sejam tratados de maneira mais próxima à sua capacidade física integral.
Um campo binário comum passa a se comportar, em diversos contextos, de forma semelhante a um COMP-5.
Porém, TRUNC(BIN) é uma opção global de compilação e pode gerar código adicional, afetando desempenho. A própria IBM recomenda, quando possível, manter TRUNC(OPT) e declarar especificamente como COMP-5 os campos que realmente precisam receber valores além da precisão decimal indicada no PICTURE. (IBM)
Essa é uma decisão arquitetural importante.
Compare:
TRUNC(BIN)
Pode alterar o tratamento dos itens binários do programa inteiro.
Enquanto:
05 WS-API-RETURN-CODE PIC S9(9) COMP-5.
declara explicitamente que apenas aquele campo precisa de semântica binária nativa.
É a diferença entre reforçar uma porta e transformar o prédio inteiro em um bunker.
10. Exemplo de compilação em JCL
Um JCL simplificado poderia ser:
//COBOL EXEC PGM=IGYCRCTL,
// PARM='LIB,OBJECT,LIST,MAP,XREF,OPT(2),TRUNC(OPT)'
//STEPLIB DD DISP=SHR,DSN=IGY.V6R5M0.SIGYCOMP
//SYSIN DD DISP=SHR,DSN=USER.COBOL(TESTEC45)
//SYSLIN DD DISP=SHR,DSN=&&OBJ,
// UNIT=SYSDA,SPACE=(TRK,(1,1)),
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=0)
//SYSPRINT DD SYSOUT=*
//SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT2 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT3 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT4 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT5 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT6 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT7 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
A opção relevante é:
TRUNC(OPT)
Se todos os campos binários precisassem utilizar a capacidade física integral, poderia ser usado:
TRUNC(BIN)
Entretanto, a prática recomendável é analisar o contrato dos dados.
Campos internos comuns, contadores e valores de negócio podem continuar como COMP, COMP-4 ou BINARY.
Campos provenientes de APIs, C, estruturas do sistema operacional ou interfaces externas podem ser declarados como COMP-5.
11. Onde COMP-4 costuma ser usado?
COMP-4 é útil em:
contadores;
índices auxiliares;
acumuladores inteiros;
cálculos sem casas decimais;
campos cuja faixa respeita claramente o
PICTURE;variáveis internas de desempenho;
estruturas legadas que já utilizam
COMPouBINARY.
Exemplo:
05 WS-CONTADOR-REGISTROS PIC 9(9) COMP-4 VALUE ZERO.
Incremento:
ADD 1 TO WS-CONTADOR-REGISTROS
Como o campo ocupa 4 bytes, o processador pode trabalhar eficientemente com operações binárias.
12. Onde COMP-5 costuma ser usado?
COMP-5 é especialmente útil em integração com:
programas escritos em C;
APIs do sistema operacional;
Language Environment;
CICS;
Db2;
estruturas binárias;
códigos de retorno;
tamanhos de buffers;
comprimentos;
ponteiros auxiliares;
interfaces entre linguagens;
copybooks gerados por ferramentas;
valores que utilizam toda a capacidade de 16, 32 ou 64 bits.
A documentação de interoperabilidade entre C e COBOL recomenda COMP-5 ou TRUNC(BIN) quando um parâmetro inteiro vindo de C puder conter um valor maior do que o permitido pela quantidade de dígitos do PICTURE COBOL. (IBM)
Exemplo:
01 LK-C-PARAMETERS.
05 LK-BUFFER-LENGTH PIC 9(9) COMP-5.
05 LK-RETURN-CODE PIC S9(9) COMP-5.
Em C, campos equivalentes poderiam ser:
int buffer_length;
int return_code;
O objetivo é preservar a correspondência física com o inteiro utilizado pela outra linguagem.
13. COMP-4 e COMP-5 com casas decimais
É possível declarar:
05 WS-TAXA PIC S9(5)V99 COMP-4.
ou:
05 WS-TAXA PIC S9(5)V99 COMP-5.
Não existe ponto decimal armazenado.
O V é um ponto decimal implícito.
O valor:
123.45
é armazenado internamente como o inteiro escalado:
12345
O compilador sabe que existem duas casas decimais implícitas.
Entretanto, para valores monetários, COMP-3 costuma ser mais natural, previsível e compatível com a matemática decimal de negócios.
Exemplo:
05 WS-VALOR-MONETARIO PIC S9(9)V99 COMP-3.
Valores financeiros são expressos em base decimal. Usar decimal compactado reduz certas surpresas de conversão e preserva a precisão decimal esperada.
COMP-4 e COMP-5 brilham principalmente com inteiros, contadores, comprimentos, flags numéricas e interfaces de baixo nível.
14. Vantagens do COMP-4
Uso eficiente de memória
Um PIC S9(9) DISPLAY ocupa nove bytes.
Um PIC S9(9) COMP-4 ocupa quatro bytes.
Em milhões de registros ou grandes tabelas internas, essa diferença pode ser relevante.
Aritmética eficiente
Processadores trabalham naturalmente com valores binários. Contadores e cálculos inteiros podem ser executados eficientemente.
Compatibilidade histórica
COMP, COMP-4 e BINARY aparecem em uma enorme quantidade de sistemas COBOL existentes.
Intenção clara
A declaração mostra que o campo foi criado para processamento, e não para apresentação direta.
15. Desvantagens do COMP-4
Dependência das regras de truncamento
O campo físico pode armazenar um valor, mas o PICTURE pode declarar uma capacidade decimal menor.
Influência da opção TRUNC
Uma recompilação com opções diferentes pode revelar dependências escondidas no código legado.
Não é legível diretamente
Abrir um arquivo binário em um editor de texto não mostrará os dígitos de maneira compreensível.
Portabilidade
Tamanho, endianness e comportamento podem variar entre plataformas e implementações COBOL.
Risco em interfaces
Um programa externo pode preencher todos os bits, enquanto o programa COBOL espera um valor limitado pelo PICTURE.
16. Vantagens do COMP-5
Utiliza toda a capacidade binária
É ideal quando 2, 4 ou 8 bytes devem ser tratados como um verdadeiro inteiro binário.
Excelente para interoperabilidade
Facilita o mapeamento com inteiros de C, APIs, estruturas de sistema e interfaces técnicas.
Intenção explícita
O programador que lê o código entende que aquele campo pode ultrapassar a magnitude decimal indicada pelos noves do PICTURE.
Evita o uso global de TRUNC(BIN)
É possível aplicar a semântica de binário nativo apenas aos campos necessários.
Preserva valores externos
Reduz o risco de perder dígitos de um valor recebido por interface.
17. Desvantagens do COMP-5
Pode surpreender quem confia apenas no PICTURE
Um campo declarado como:
PIC 9(4) COMP-5
pode conter 60000.
Para um iniciante, isso parece uma violação das leis naturais do COBOL.
Pode causar problemas ao mover para DISPLAY
Considere:
05 WS-NATIVO PIC 9(4) COMP-5.
05 WS-TEXTO PIC 9(4).
Se WS-NATIVO contiver 60000:
MOVE WS-NATIVO TO WS-TEXTO
o receptor possui apenas quatro posições.
O problema não estava no COMP-5. Estava no contrato inadequado do campo receptor.
Pode esconder incompatibilidades
Duas plataformas podem usar tamanhos ou ordem de bytes diferentes.
Não é a escolha padrão para dinheiro
Valores monetários e cálculos decimais normalmente ficam mais claros em COMP-3.
18. Como visualizar o conteúdo hexadecimal
Um pequeno programa pode redefinir o campo:
01 WS-BINARIO.
05 WS-VALOR PIC S9(4) COMP-5.
01 WS-BINARIO-X REDEFINES WS-BINARIO.
05 WS-BYTES PIC X(2).
Em compiladores modernos, funções intrínsecas podem ajudar:
MOVE 1000 TO WS-VALOR
DISPLAY 'VALOR: ' WS-VALOR
DISPLAY 'HEX : ' FUNCTION HEX-OF(WS-BYTES)
A representação esperada para 1000 em dois bytes big-endian é:
03E8
Para -1, em complemento de dois:
FFFF
Esse tipo de teste é excelente para compreender copybooks, dumps e integrações.
19. Cuidados ao usar REDEFINES
Nunca presuma que um campo binário pode ser interpretado como texto.
Isto:
01 WS-CAMPO.
05 WS-NUMERO PIC S9(9) COMP-5.
01 WS-TEXTO REDEFINES WS-CAMPO.
05 WS-CARACTERES PIC X(4).
não converte o número em texto.
Ele apenas oferece outra visão dos mesmos quatro bytes.
Se WS-NUMERO contém 123, WS-CARACTERES não conterá os caracteres:
"0123"
Ele conterá os bytes binários:
00 00 00 7B
REDEFINES não converte.
REDEFINES não formata.
REDEFINES não pergunta se você tem certeza.
Ele apenas remove a tampa do reator nuclear.
20. Boas práticas para o programador padawan
20.1 Escolha o tipo pela função
Use DISPLAY quando o dado for principalmente texto, entrada ou saída humana.
Use COMP-3 para dinheiro e cálculos decimais exatos.
Use COMP-4 ou BINARY para contadores e números inteiros que respeitam a faixa declarada.
Use COMP-5 para inteiros nativos e interfaces que exigem toda a capacidade binária.
20.2 Declare a faixa real quando possível
Embora isto seja permitido:
05 WS-LENGTH PIC 9(4) COMP-5.
pode ser mais claro declarar:
05 WS-LENGTH PIC 9(5) COMP-5.
se o valor esperado pode alcançar 65535.
A declaração deve comunicar a intenção humana, não apenas satisfazer o compilador.
20.3 Conheça a opção TRUNC
Nunca analise um programa com campos binários sem verificar as opções de compilação.
Procure no listing:
TRUNC(STD)
TRUNC(OPT)
TRUNC(BIN)
20.4 Não copie binário diretamente entre plataformas
Defina:
número de bytes;
presença de sinal;
ordem dos bytes;
escala decimal;
faixa permitida;
tratamento de overflow.
20.5 Use campos de edição no DISPLAY
Evite:
DISPLAY WS-COMP5
Prefira:
MOVE WS-COMP5 TO WS-EDITADO
DISPLAY WS-EDITADO
Exemplo:
05 WS-EDITADO PIC -ZZZ,ZZZ,ZZ9.
20.6 Teste os limites
Para 2 bytes com sinal, teste:
-32768
-32767
-1
0
1
32766
32767
32768
Para 2 bytes sem sinal, teste:
0
1
9999
10000
32767
32768
65535
65536
Os bugs mais interessantes não moram no valor médio.
Eles vivem na fronteira, fumando cigarro e esperando o batch de fechamento.
21. Curiosidades
COMP nem sempre significa binário em todas as plataformas
No Enterprise COBOL para z/OS, COMP é equivalente a BINARY.
Entretanto, em outras famílias e ambientes históricos, aliases podem variar. No IBM i, por exemplo, a documentação tradicional associa COMP-4 a BINARY, enquanto outros nomes computacionais podem refletir convenções específicas da plataforma. (IBM)
Portanto, nunca transporte conhecimento entre compiladores sem consultar a documentação daquele ambiente.
O PICTURE não determina sozinho o tamanho em bytes
Nos campos binários, faixas de dígitos são agrupadas:
1 a 4 dígitos = 2 bytes
5 a 9 dígitos = 4 bytes
10 a 18 dígitos = 8 bytes
Assim:
PIC 9(5) COMP-4
e:
PIC 9(9) COMP-4
ocupam ambos quatro bytes.
Um único nove pode custar dois bytes extras
Compare:
PIC 9(4) COMP-4
Dois bytes.
PIC 9(5) COMP-4
Quatro bytes.
Apenas um nove adicional fez o campo atravessar a fronteira entre halfword e fullword.
COMP-5 é comum em código gerado
Tradutores, preprocessadores e ferramentas de integração podem gerar campos COMP-5 porque precisam mapear tamanhos, comprimentos e códigos de retorno de maneira previsível.
A própria IBM informa que o coprocessador CICS usa tipos COMP-5 em situações nas quais o truncamento não deve ocorrer. (IBM)
22. Easter egg do data center
Diz a lenda que, em algum sistema bancário criado em 1997, existe a seguinte declaração:
05 WS-TAMANHO PIC 9(4) COMP.
Durante vinte anos, o campo recebeu valores menores que 9999.
Então uma modernização aumentou o buffer para 32000.
O programa continuou funcionando porque o compilador antigo, as opções históricas e os caminhos de execução permitiam que o valor sobrevivesse dentro dos 2 bytes.
Anos depois, alguém recompilou o programa com um compilador moderno e outra opção TRUNC.
O valor 32000 voltou da operação transformado em algo inesperado.
Sete reuniões foram marcadas.
Três fornecedores foram acusados.
Uma API REST foi criada sem necessidade.
Um arquiteto sugeriu Kubernetes.
Até que uma programadora júnior abriu o listing e perguntou:
— Por que este campo é PIC 9(4) se recebe 32000?
O silêncio que se seguiu foi registrado pelo SMF como consumo anormal de CPU emocional.
23. Comparação final
| Característica | COMP-4 | COMP-5 |
|---|---|---|
| Nome conceitual | Binário | Binário nativo |
| Sinônimo de BINARY | Sim | Não exatamente |
| Representação | Complemento de dois | Complemento de dois |
| Tamanhos comuns | 2, 4 ou 8 bytes | 2, 4 ou 8 bytes |
| Capacidade ligada ao PICTURE | Normalmente, sim | Capacidade física do campo |
| Influência de TRUNC | Sim | Não da mesma maneira |
| Bom para contadores | Sim | Sim |
| Bom para integração com C | Possível, com cuidados | Recomendado |
| Usa todos os bits | Depende das regras e opções | Sim |
| Clareza para valores nativos | Menor | Maior |
| Melhor escolha para dinheiro | Normalmente não | Normalmente não |
| Risco principal | Truncamento inesperado | Valor maior que o receptor espera |
24. Conclusão
COMP-4 e COMP-5 não são apenas dois nomes misteriosos encontrados em copybooks antigos.
Eles representam dois contratos diferentes entre o programa COBOL e a memória.
COMP-4, equivalente a BINARY, armazena números em formato binário, mas continua ligado à descrição decimal do PICTURE e às regras de truncamento escolhidas na compilação.
COMP-5 declara que o campo deve ser tratado como um inteiro binário nativo, utilizando toda a capacidade física de seus 2, 4 ou 8 bytes.
O padawan precisa guardar cinco ensinamentos:
COMP-4é sinônimo deBINARY.COMP-5utiliza a capacidade integral do recipiente binário.O tamanho depende da quantidade de dígitos do
PICTURE.A opção
TRUNCpode alterar o comportamento de campos binários comuns.Nunca escolha um tipo apenas porque ele “parece mais rápido”.
Escolha-o porque compreende o contrato, a origem do dado, sua faixa, seu destino e a forma como será processado.
No mainframe, um campo numérico nunca é apenas um campo numérico.
Ele é um acordo diplomático entre o COBOL, o compilador, o processador, o copybook, a plataforma externa e aquele programa de 1998 que ninguém recompila porque o último profissional que entendia o código se aposentou e agora cria orquídeas no interior de Minas Gerais.
E essa, jovem padawan, é a verdadeira diferença entre conhecer a sintaxe e compreender o sistema.
Sem comentários:
Enviar um comentário