O que há de novo no IBM Enterprise COBOL for z/OS?

Em junho de 2025 a IBM lançou a versão 6.5 do compilador IBM Enterprise COBOL for z/OS. Neste artigo, vou comentar alguns dos novos recursos e aprimoramentos que essa nova versão traz em comparação com as versões anteriores.

Suporte a tipos definidos pelo usuário

Um tipo definido pelo usuário é um item de grupo ou item elementar declarado com a cláusula TYPEDEF e pode ser usado para criar um ou mais itens de dados (chamados instâncias de tipo), cujas estruturas são iguais àquela definida para o tipo. As instâncias de tipo são criadas pela cláusula TYPE.

Por exemplo, para definir e instanciar um tipo elementar podemos escrever o seguinte trecho de código:

* definicao do tipo elementar
01 TE-NR-CNPJ TYPEDEF PIC 9(018).

* Definicao das instancias do tipo elementar
 01 CLIENTE.
     03 CLI-NR-CNPJ    TYPE TE-NR-CNPJ.
     03 CLI-NM-CLIENTE PIC X(060).

 01 VENDA.
     03 VDA-DT-VENDA   PIC 9(008).
     03 VDA-NR-CNPJ    TYPE TE-NR-CNPJ.
     03 VDA-VR-VENDA   PIC 9(009)V9(002).

Também é possível definir um tipo grupo:

* definicao do tipo grupo
 01 TG-NOTA-FISCAL  TYPEDEF.
     03 NUMERO      PIC 9(006).
     03 CLIENTE     PIC 9(006).
     03 DT-EMISSAO  PIC 9(008).
     03 VR-TOTAL    PIC 9(009)V9(002).

* definicao das instancias do tipo grupo
 01 NOTA-FISCAL-VALIDA    TYPE TG-NOTA-FISCAL.
 01 NOTA-FISCAL-CANCELADA TYPE TG-NOTA-FISCAL.
...
 PROCEDURE DIVISION.
    DISPLAY "NUMERO DA NOTA CANCELADA" NUMERO OF NOTA-FISCAL-CANCELADA.

Qualificação do nome de índices

Agora um nome de índice pode ser qualificado com o nome da tabela interna ou itens de grupo dos quais a tabela faz parte. Isso ajuda bastante quando o índice aparece em um tipo definido pelo usuário.

Suporte a qualificação de nível mais alto ou mais baixo

Os itens de dados em uma hierarquia agora podem ser qualificados com o novo operador ‘::’. O modo de qualifação anterior, usando os operadores ‘OF’ ou ‘IN’  continua existindo, como se pode ver no código abaixo:

01 CLIENTE.
    03 ENDERECO.
        05 LOGRADOURO PIC X(040).
        05 BAIRRO PIC X(020).
...
PROCEDURE DIVISION.
    MOVE SPACES TO BAIRRO OF ENDERECO OF CLIENTE
    MOVE SPACES TO CLIENTE::ENDERECO::BAIRRO

Suporte a VSAMDB

Datasets VSAMDB oferecem capacidade de armazenar e recursos documentos JSON através de comandos de acesso ao VSAM do próprio COBOL. De forma bem resumida, um documento JSON é tratado pelo COBOL como um “registro” do VSAMDB, e pode ser gerado tanto pelo comando JSON GENERATE (que gera o JSON a partir de um item de grupo) quanto pelo comando STRING, que é mais trabalhoso mas permite mais controle.

Nova subopção para SMARTBIN

SMARTBIN é um parâmetro que pede ao compilador gerar metadados adicionais no módulo de carga. Esses metadados são depois usados pelo ABO (IBM Automatic Binary Optimizer) para otimizar o código para versões mais recentes de hardware, sem necessidade de recompilar o código fonte original no futuro.

Os metadados adicionais são armazenados em um segmento NOLOAD, o que significa que não são carregados em memória em tempo de execução, mas ocupam espaço em disco. O tamanho do módulo de carga pode duplicar ou triplicar.

Agora na versão 6.5, SMARTBIN tem duas opções:

  • NAMES: Avisa ao compilador para gerar os metadados com os nomes de dados definidos no programa. Isso permite que além do ABO, o programa possa ser analisado pelo IBM WatsonX Code Assistant for Z, para análise e otimização de performance.
  • NONAMES: Gera os metadados sem os nomes de dados definidos no programa. O módulo de carga continua sendo otimizado pelo ABO, mas ocupa menos espaço em disco.

Aprimoramento da função intrínseca ULENGTH

A função ULENGTH calcula o número de caracteres de uma variável preenchida com conteúdo UTF-8 ou UTF-16. Agora existem dois novos argumentos opcionais nessa função que permite estabelecer a posição inicial e a quantidade de caracteres de uma substring dentro dessa variável.

Por exemplo, o código abaixo está preenchendo a variável TEST-STRING com os caracteres…

Z/OS®!

IDENTIFICATION DIVISION.
PROGRAM-ID. UTESTE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 TEST-STRING PIC U BYTE-LENGTH 12.
01 CARACTERES  PIC 9(9) BINARY.
PROCEDURE DIVISION.
    MOVE UX"5A2F4F53C2AE21" TO TEST-STRING
    MOVE ULENGTH(TEST-STRING) TO CARACTERES
    DISPLAY CARACTERES
    STOP RUN.
    

…mostraria 6, embora o caracter ® ocupe dois bytes (X”C2AE”).

Se usarmos os dois novos argumentos em ULENGTH, por exemplo…


MOVE ULENGTH(TEST-STRING, 5, 2) TO CARACTERES

…o programa mostraria 2, mesmo com ® ocupando dois bytes.

Aprimoramento da instrução JSON GENERATE

A instrução JSON GENERATE agora conta com uma cláusula opcional chamada COUNT BYTES para contagem direta dos bytes gerados no documento JSON. Esse recurso evita a necessidade de código para contagem de caracteres e melhor o desempenho do programa em tempo de execução.

Por exemplo, o código abaixo transforma o item de grupo MENSAGEM em DOCX no formato JSON, guardando a quantidade de caracteres gerados na variável TAMX:


01 DOCX       PIC X(1000).
01 TAMX       PIC 9(0004).
01 MENSAGEM.
    03 CAMPO1 PIC X(0001).
    03 CAMPO2 PIC X(0050).
    03 CAMPO3 PIC 9(0002).
...
MOVE "Y" TO CAMPO1
MOVE "CONTEUDO" TO CAMPO2
MOVE 34 TO CAMPO3
JSON GENERATE DOCX FROM MENSAGEM COUNT BYTES TAMX
DISPLAY DOCX
DISPLAY TAMX

Ele mostraria os seguintes valores:


{ “MENSAGEM” : { “CAMPO1” : "Y", “CAMPO2” : "CONTEUDO", "CAMPO3" : 34 } }
0073

Novas diretivas ARCH(15) e TUNE(15)

ARCH(15) define um conjunto maior de instruções que o compilador pode usar para aproveitar instruções exclusivas dos processadores z16 e z17. Da mesma forma, TUNE(15) define que o compilador deve otimizar o escalonamento de instruções para os novos processadores.

Parâmetros OPTIONAL

Parâmetros declarados na cláusula PROCEDURE DIVISION USING (…) dos subprogramas agora podem ser marcados com a cláusula OPTIONAL. Uma nova classe de teste chamada OMITTED pode ser usada para confirmar se determinado parâmetro foi mencionado ou não no CALL que chamou o subprograma.

Por exemplo:


IDENTIFICATION DIVISION.
PROGRAM-ID. SUBPROG.

DATA DIVISION.
LINKAGE SECTION.
01 LK-PAR-OBRIGATORIO PIC X(010).
01 LK-PAR-OPCIONAL    PIC X(020).

PROCEDURE DIVISION USING LK-PAR-OBRIGATORIO, OPTIONAL LK-PAR-OPCIONAL.
    DISPLAY "PARAMETRO OBRIGATORIO: " LK-PAR-OBRIGATORIO
    IF LK-PAR-OPCIONAL IS OMITTED
        DISPLAY "PARAMETRO OPCIONAL NAO FOI INFORMADO"
    ELSE
        DISPLAY "PARAMETRO OPCIONAL: " LK-PAR-OPCIONAL
    END-IF
    GOBACK.

Melhoria na nomenclatura de DLLs

Ao usar o utilitário CJBUILD (IGYCJBLD) para gerar uma DLL, o nome da DLL não é mais prefixado automaticamente com os caracteres LIB. Com isso agora o programador pode usar os 8 caracteres completos para nomear a DLL em um arquivo particionado.

Conclusão

Essa nova versão do compilador parece ter sido lançada para aproveitar ao máximo a arquitetura do novo mainframe z17. Além disso, os novos recursos permitem o aprimoramento da integração dos sistemas existentes com outras plataformas, como dispositivos móveis, web e núvem, com suporte nativo para JSON, XML e Java, e aceleração de IA.

Se quiser saber mais sobre o compilador IBM Enterprise COBOL for z/OS v6.5, clique aqui.

Para ver um resumo do que mudou nos principais compiladores da IBM, clique aqui.