segunda-feira, 4 de maio de 2009

REXX no z/OS: Guia Completo com História, Dicas e Curiosidades

 

Bellacosa Mainframe apresenta IBM Mainframe REXX

REXX no z/OS: Guia Completo com História, Dicas e Curiosidades



1. Introdução ao REXX

REXX, sigla para REstructured eXtended eXecutor, é uma linguagem de programação de alto nível criada por Mike Cowlishaw, da IBM, na década de 1980.
Diferente de linguagens tradicionais como C, COBOL e PL/I, REXX é interpretada, de fácil leitura e sem tipagem explícita. Todos os dados são tratados como strings, e o sistema decide quando fazer conversão para números.

💡 Curiosidade: Apesar de muitos acharem que o nome veio do cachorro de Cowlishaw, isso é um mito urbano do Mainframe.

REXX se espalhou por todos os principais ambientes IBM: z/OS, z/VM, z/VSE, IBM i, AIX, e até ferramentas modernas IBM. Por isso, é considerada uma linguagem universal no ecossistema IBM.


2. Variáveis e Literais

  • Variáveis não são case sensitive. Ou seja, var, VAR ou Var são a mesma variável.

  • REXX não exige declaração de tipo e nem comprimento específico, embora existam limites definidos pelo sistema.

  • Literals (strings constantes) podem ser colocadas entre aspas simples '...' ou duplas "...", sem diferença funcional.

💡 Dica: Sempre use aspas quando o conteúdo tiver espaços ou caracteres especiais.


3. Funções e Subrotinas

  • Subrotinas (CALL) não precisam retornar valores. Elas executam ações e podem usar RETURN apenas para voltar ao ponto de chamada.

  • Funções são chamadas para produzir valores, mas nem todas podem ser usadas como subrotinas.

  • Ponto de atenção: Não confunda subrotinas com funções – tentar chamar algumas funções como CALL pode gerar erro.


4. Entrada de Dados

Existem três fontes principais:

  1. Command Line / Argumentos:

    • Usados para passar parâmetros para o exec.

    • Sintaxe:

      PARSE ARG nome idade
    • Ex.: %‘meuexec’ JOAO 30

  2. Stack (Data Stack):

    • Mecanismo central de entrada em REXX.

    • Comandos:

      PULL var /* Lê do topo da stack */ PARSE PULL a b c /* Lê e divide em variáveis */
    • Pode receber dados de QUEUE, PUSH ou teclado (quando stack está vazia).

  3. Keyboard (Interativo):

    • Se a stack estiver vazia, PULL lê do teclado no ambiente interativo (TSO/E).

💡 Dica: PARSE PULL é como um canivete suíço: lê e separa os dados ao mesmo tempo.
Exemplo avançado:

QUEUE "ABC-123-XYZ" PARSE PULL a "-" b "-" c SAY a b c /* Resultado: ABC 123 XYZ */

5. Manipulação de Arquivos

  • EXECIO funciona com:

    • Sequential datasets

    • PDS / PDSE members

  • Não funciona diretamente com VSAM.

    • Para VSAM, use:

      • ISPF Data Set Services (ISRSUPC, ISRSDSN)

      • Chamada de utilitários MVS (ex.: IDCAMS)

💡 Exemplo simples de leitura de VSAM via ISPF:

ADDRESS ISPEXEC "LIBDEF MYLIB DATASET ID('MY.VSAM.DATASET')" "READ DSNAME(MY.VSAM.DATASET) OUTDATA(myArray)"

6. Comando LINEOUT()

  • Escreve linha a linha, não permite random access.

  • Sempre escreve na ordem sequencial do arquivo ou data set.

💡 Dica: Para manipular arquivos VSAM de forma controlada, combine ISPF services e arrays REXX.


7. Stack e PULL

  • PULL remove registros do topo da stack.

  • Alguns materiais citam acesso ao “fundo da stack”, mas na prática, o topo é a forma padrão de leitura.

  • QUEUE e PUSH permitem inserir dados na stack de forma controlada.


8. Execução e Ambiente

  • System REXX execs rodam em:

    • Console (z/OS)

    • Batch (JCL / MVS)

    • Programas via REXX Macro Interface

Não rodam diretamente em TSO/E como System exec.

  • Host command environment depende do contexto:

    • TSO/EADDRESS TSO

    • BatchADDRESS MVS

    • ISPFADDRESS ISPEXEC

💡 Dica de ouro: Nunca presuma que TSO é o padrão universal. Cada address space tem seu ambiente próprio.


9. ISPF e Serviços REXX

  • ISPF fornece serviços avançados (ISPEXEC) para criar:

    • Macros de edição

    • Manipulação de datasets

    • Painéis interativos

  • ⚠️ ISPF é principalmente para online, não para batch (a menos que configurado explicitamente).

💡 Easter Egg: Você pode escrever comandos de edição personalizados diretamente em REXX, algo que programadores z/OS amam usar para automatizar tarefas repetitivas.


10. Indentação e Compilação

  • REXX ignora indentação, tanto no interpretador quanto no compilador.

  • Compilação é opcional – você pode rodar execs diretamente no interpretador.


11. Curiosidades e Fatos Divertidos

  • Mike Cowlishaw nunca nomeou REXX após seu cachorro – é apenas uma lenda urbana.

  • REXX é usado em automação de Mainframe desde os anos 80.

  • É comum combinar REXX + ISPF + JCL + batch jobs para criar soluções totalmente automáticas em produção.


12. Resumo de Comandos Essenciais

Comando / FunçãoUso
PARSE ARGLer argumentos passados na linha de comando
PULL / PARSE PULLLer registros da stack
QUEUE / PUSHInserir dados na stack
EXECIOLer/escrever sequential e PDS/PDSE
LINEOUT()Escrever linhas sequenciais em arquivos
ISPEXEC servicesTrabalhar com VSAM, painéis e macros ISPF
ADDRESSDefinir host command environment

13. Pontos de Atenção para Mainframe

  • Nunca confunda funções com subrotinas.

  • Stack é sequencial, não aleatória.

  • EXECIO não acessa VSAM diretamente.

  • ISPF serviços são para online, não para batch.

  • Indentação é estética, não funcional.

  • Variáveis não têm tipagem, mas cuidado com operações numéricas implícitas.


14. Exemplo Final Integrado

/* REXX Example: Stack + Parsing + File Write */ QUEUE "JOAO 30 SAO_PAULO" PARSE PULL nome idade cidade SAY "Nome:" nome ", Idade:" idade ", Cidade:" cidade /* Write to a sequential file */ EXECIO 1 LINEOUT ("Nome:" nome) DATASET("USER.SEQ.DATA") STEM file. WAIT

Combina stack, PARSE PULL, e EXECIO.


Conclusão

REXX continua sendo uma ferramenta essencial para automação no Mainframe IBM.
Sua simplicidade, flexibilidade e integração com ISPF, TSO/E, batch e VSAM o tornam um verdadeiro canivete suíço para administradores e desenvolvedores Mainframe.

E lembre-se: não caia nos mitos – REXX não foi nomeado por um cachorro, mas por sua estrutura e poder de execução. 😉


Sem comentários:

Enviar um comentário