Tópicos em PL/I do Buga
Achei um documento com algumas anotações que fiz quando de uma entrevista e eu nunca tinha traballhado com PL/I
Free format – Colunas da 2 a 72
Compilador – PLIXC
Compila e Link – PLIXCL
Compila, Lionka e Executa – PLIXCLG
O PGM que compila é o ibmzpli, o link suponho ser o IEWL mesmo, e estou correto!
Labels, indentificadores e outros só podem ter no máximo 31 caracteres
Arquivos 8 caracteres (tipo padrôn do mainframe)
Comentários começam com /* e terminam com */ nao admite grupo
Variaveis são declaradas com DECLARE ou DCL
Exemplo de programinha (le 5 notas e da a media)
AVERAGE: PROCEDURE OPTION (MAIN);
GET LIST (A,B,C,D,E);
SUM=A+B+C+D+E;
AVERAGE_GRADE=SUM/5;
PUT LIST (‘AVERAGE GRADE IS’, AVERAGE_GRADE);
END AVERAGE;
Pra rodar usar um JCL normalzao com os dados A..E entrando via SYSIN
Variáveis
DCL Xpto REAL BINARY FIXED COMPLEX DECIMAL FLOAT
Se nao tiver o “tamanho”vai 10 no inteiro e 0 na fração
DECLARE PERCENTAGE FIXED DECIMAL; /* vai ser (10,0) DECLARE CEBOL FIXED DECIMAL (5,2);
DECLARE BINARIO FIXED BINARY (31,0);
DECLARE CEBOLA CHARACTER (10); DECLARE CEBOLA PICTURE ‘(10)X`;
DECLARE OLHA_O_BIT BIT(5); Valores possiveis para BIT ‘01011’, (5)’10’B , ‘’B (nulo), ‘1’B
INITIAL OU init -> inicializa a variavel
Structures:
DECLARE 1 COUNTA; -> NAO PODE INICIALIZAR ESSE 2 PRIMEIRO FIXED BIN(15) INITIAL (0); 2 SEGUNDO FIXED BIN(15); 2 TERCEIRO (5) FIXED BIN(15) INITIAL (5(1)); 🡪 tABELa !
DEFINED ou DEF -> Tipo REDEFINICAo DO COBOL, mas é mais que isso.
DECLARE ZONE CHARACTER (10) DEFINED (ZIP) POSITION (4);
Ao referenciar ZIP vou acessar a posicao 4 da variavel ZONE.
Programa dois
AUDIT: PROC OPTION(MAIN Deu preguica de copiar o programa 2.
Multi-Level Structures
DECLARE 1 PAYROLL, 2 NAME, 3 LAST CHARACTER (60) VARYING, 3 FIRST CHARACTER (60) VARYING, 2 SALARY FIXED DECIMAL (7,2);
No máximo 255 niveis
PAYROLL.NAME.LAST = ‘ROBERTO’
BY NAME – MOVE COM NOME IGUAL (tipo o move corr – eu acho) LIKE – declarar string 1 igual a string 2
DCL FOLHA_DE_PAGAMENTO LIKE PAYROLL;
SAIDA = ENTRADA, BY NAME; -> Move os campos com nome iguais
Operator
De conta – sem novidades + - / * **
Lógicos ^ XOR ou NOT |: OR
Igualdade e otros... ^< (not less)
– Data Type
Em expressoes os dados sao convertidos pro de maior significancia
Tipo um FIXED DEC e um FLOAT DEC o resultado da em float.
– Expression
IF A > B THEN DO;
...
END;
SELECT ;
WHEN [any/all];
[OTHERWISE/OTHER];
END;
DO WHILE (A < B);
…
END;
DO UNTIL -> fAZ NO MINIMO UMA VEZ
DO NOTHING - > cONTINUE
GOTO ROLA;
ROLA:
PROGRAMA DE NUMEROS PRIMOS EM PL/I
PRIMES: PROC OPTIONS (MAIN);
DCL DIVISOR FIXED DEC (3,0);
DCL MAY_BE_PRIME BIT(1);
DCL NO BIT(1) INIT (‘0’B);
DCL TEST# FIZED DEC(3,0);
DCL YES BIT(1) INIT (‘1’B);
DCL MODE BUILTIN; /* SABE-SE LA O QUE SEJA ISSO */
/* NUCLEUS */
CALL INITIALIZATION;
DO WHILE ( TEST# < 101);
CALL PRIME_TEST;
TEST# = TEST# -2;
END;
INITIALIZATION: PROC;
PUT LIST (‘PRIMOS DE 0 A 100’);
PUT SKIP (2) LIST(001); PUT SKIP LIST(002);
TEST# = -3;
END INITIALIZATION:
PRIME TEST: PROC;
DIVISOR =3;
MAY_BE_PRIME = YES;
DO WHILE (DIVISOR < TEST# & MAY_BE_PRIME);
IF MOD (TEST#,DIVISOR) = 0 THEN
MAY_BE_PRIME = NO;
ELSE
DIVISOR = DIVISOR +2;
END;
IF MAY_BE_PRIME THEN
PUT SKIPE LIST (TEST#);
END PRIME_TEST;
END PRIMES;
BITWISE OPERATORS
&, |, !, &:, ^ INFIX, |:, ^- PREFIX
Procedure é um bloco de codigo que realiza determinada tarefa
Função é um bloco de codigo que realiza determinada tarefa e retorna algo
Argumento é o valor passado como parametro pra uma funcao ou procedure
Parametro é o valor recebido.
EXEMPLO DE EXTERNAL
WINDUP: PROCEDURE;
DECLARE PITCH EXTERNAL ENTRY (CHARACTERS (15)
VARYING, FIXED BINARY (7));
CALL PITCH (PLAYER_NAME, NUMBER_OF_OUTS);
Exemplo de ENTRY
MAINPR: PROC OPTIONS (MAIN);
DCL ADD3 ENTRY (FIXED DEC (7,2), FIXED DEC(7,2),
FIXED DEC(7,2);
DCL X,Y,Z FLOAT DEC(6);
GET LIST (X,Y,Z);
CALL ADD3(X,Y,Z);
ADD3: PROCEDURE (A,B,C);
DCL A,B,C FIXED DEC (7,2);
C = A + B + C;
END ADD3;
END MAINFR;
OUTRO EXEMPLO
ADDER: PROCEDURE (X,Y) RETURNS (FLOAD);
DECLARE (X,Y) FLOAT;
RETURN (X+Y);
END;
pRA USAR PODE ROLAR ASSIM:
TOTAL = ADDER (5,6)... TOTAL FICA COM 11
Arquivos
Sequencial ou seql
DECLARE INFILE FILE SEQUENTIAL INPUT;
Input/output – ambos é UPDATE
Read, write, rewrite
END-file 🡪 on, signal, revert.
Environment -> declare, open e close
Pictures em variáveis ‘4(9)’é a mesma coisa que ‘9999’
Tabelas
DIM – Tamanho da tabela LBOUND – Limite Inferior HBOUND – Limite superior SUM / PROD – Soma e produto de todos os elementos
Operações com BIT --------------------
NOT ^ DECLARE (A,B) BIT (4);
A = ‘0011’B;
B= ^A
B vale 1100 (INVERTE se era 0 vira 1, e 1 vira 0)
AND & (esse simbolo & isso chama ampersand em ingles) --- DECLARE (A,B,C) BIT (4); A = ‘0011’B; B = ‘1111’B; C = A & B;
C vale 0011 (compara se for 1 nos 2 sai 1 na saida)
OR | ------
DECLARE (A,B,C) BIT (4); A = ‘0011’B; B = ‘1111’B; C = A | B;
C vale 1111 (compara e se qualquer um for 1 a saida é 1)
XOR ^ -----
DECLARE (A,B,C) BIT (4); A = ‘0011’B; B = ‘1011’B; C = A ^ B;
C vale 1000 (só fica com 1 se for diferente)
AND THEN &: (testa o primeiro e o segundo só se o primeiro for verdadeiro) Retorna 1 se os dois forem verdadeiros, 0 outros casos
OR ELSE |: (testa o primeiro e o segundo só se o primeiro for falso) Retorna 1 se os dois forem verdadeiros, 0 outros casos
ALIGNED – controls storage boundary of bit-string
1 é true, 0 é false
Conversao de data type -----------------------
DECIMAL -> “fracao” em base 10
BINARY -> Numeros em Base 2
CHARACTER ->
PICTURE OR PIC -> DEFINE DECIMAL OU CHARACTERS
Muito phoda as contas, tipo 3.32 1,31 vezes e outras
Compound Statments (IF, ON, WHEN, OTHERWISE)
Funções intrinsecas
BIT, HIGH, MPSTR, TRANSLATE, BOOL, INDEX, REPEAT, UNSPEC, VERIFY, CHAR, LENGTH, STRING, GRAPHIC,LOW, SUBSTRING
Matemáticas
ABS, DECIMAL, IMAG, PRECISION, ADD, DIVIDE, MAX, REAL, BINARY, FIXED, MIN, ROUND, CEIL, FLOAT, MOD, SIGN, COMPLEX, FLOOR, MULTIPLY, TRUNC, CONJUG
Data
DATE () yymmdd TIME () hhmmssxx (xx hundreds of seconds)
POINTER -------
DCL POINTER_NAME POINTER INIT(NULL);
Alocando:
DCL P POINTER;
DCL STRING CHAR (20) BASED (P);
ALLOCATE STR;
OU
DCL P POINTER;
DCL STD CHAR(20);
P = ADDR(STR);
O endereço de STR esta disponivel no ponteiro P. Mas a diferenca entre BASED e ALLOCATE é que só no comando
P -> STR
Que vai poder acessar os dados (isso é, eu acho)
Last updated