bbalk 1200006543 6,268 Views
Do you want to prove the depth of your PL/I knowledge to a prospective employer? Or do you want to verify the PL/I skills of a company to whom you might outsource your PL/I code?
The PL/I certification, developed jointly by IBM and representatives from PL/I companies from Europe and the US, can help with these and similar tasks.
At the IBM PL/I professional certification site you will find that there are two certification levels for PL/I: one for the general PL/I programmer in your team and a harder test for the leader of that PL/I team.
Check it out.
bbalk 1200006543 6,002 Views
If you use the TEST option and DebugTool, Enterprise PL/I will show you the source as you coded it.
So, for example, if you have code that contains an EXEC SQL statement, you will see in the debugger just that EXEC SQL statement as you coded it and not the many, many statements generated by the preprocessor and visible in the listing. This is a big plus since those generated statements will be largely meaningless to you and would certainly not be ones you should be debugging and fixing.
The same would be true if you were using the CICS or MACRO preprocessors.
However, since this is PL/I, you can have it both ways: if you do want to debug at the level of the generated code,
then you can do so by using the TEST(SEP) and LISTVIEW options.
This can be particularly useful if you are using the MACRO preprocessors to generate complex code. In that case,
the LISTVIEW(AFTERMACRO) option would let you debug at the level of the code generated by the MACRO preprocessor (with any EXEC CICS and EXEC SQL statements left unexpanded if the MACRO preprocessor preceded the CICS and SQL preprocessors).
bbalk 1200006543 5,279 Views
In PL/I conversions, BINARY rules over DECIMAL, and FLOAT, over FIXED.
This means, for example, that when an expression contains a BINARY and a DECIMAL operand, then the result will be BINARY.
Hence, for the assignment in this code
dcl a fixed bin;
dcl b float dec;
b = b + a;
there will be these conversions
a will be converted to FLOAT BIN
b will be converted to FLOAT BIN
the sum will be converted to FLOAT DEC
PL/I has always had a series of built-in functions (BINARY, DECIMAL, FIXED, and FLOAT) to help control such conversions.
But if you were to change the sample assignment above to
b = b + decimal(a);
then there will be these conversions
a will be converted to FIXED DEC
that result will be converted to FLOAT DEC
the sum will be simply assigned to FLOAT DEC
So one conversion has been eliminated, but there are still two conversions when one should suffice
The problem is that these functions allow you to specify only one attribute at a time when you would like to be able specify two
Enterprise PL/I 3.8 introduced 4 new built-in functions so you can do this:
FLOATDEC, FLOATBIN, FIXEDDEC, and FIXEDBIN
Now you can rewrite our assignment to
b = b + floatdec(a);
and not only will this code perform faster, it will be easier for someone to understand and maintain in the future.
bbalk 1200006543 5,670 Views
For many years, the only floating point representation on z/OS was hexadecimal float. This is a base 16 representation, but most of us have 10 fingers and most business applications want to perform decimal calculations.
The difference between these 2 bases leads to problems as exemplified by this code:
dcl f1 float dec(6);
dcl f2 fixed dec(5,3);
dcl f3 float dec(6);
f1 = 4;
f2 = f1 / 100e0;
put skip data( f2 );
f3 = 100 * f2;
put skip data( f3 );
This rather disconcerting result says that 100*(4/100) = 3.9 !
Similar problems exist with IEEE binary floating-point (which PL/I fully supports on z/OS).
However, IBM and Enterprise PL/I for z/OS also support the new IEEE decimal floating-point.
The accompanying hardware lets you perform float calculations as you would with your fingers: it is a true base 10 representation that exploits the speed of floating point computations as well as the availability (on z/OS) of 16 floating-point registers.
For more information about how to use decimal floating-point with PL/I, see the DFP suboption of the FLOAT compiler option.
PL/I has complex rules for how structures are mapped and for when padding is inserted.
However, it can be important to know when there is padding in a structure (for example,
if you pass that structure to a program compiled by a language, such as C or COBOL,
that may map the structure differently).
With Enterprise PL/I 4.1, if you specify the new NOPADDING suboption to the compiler's
RULES option, the compiler will issue an E-level message for any structure that contains
RULES(NOPADDING) is also useful in detecting changes that might seem innocent but could
be dangerous because of the introduction of padding. For example, there is no padding
in this structure
2 b fixed bin(31),
3 d char(1),2 f fixed bin(31);
3 e char(2),
but if the 2-byte field E were changed from CHAR(2) to FIXED BIN(15) so that the structure
2 b fixed bin(31),
3 d char(1),2 f fixed bin(31);
3 e fixed bin(15),
even though the size of E would be unchanged, the structure would now contain some padding bytes,
and the RULES(NOPADDING) option would alert you to this (and if you also specified the AGGREGATE
option, the compiler listing would show you where those padding bytes were).
bbalk 1200006543 6,372 Views
Enterprise PL/I has always supported "named constants", i.e. scalars declared with the VALUE attribute, which make your
code more maintainable than using the constants as is, but which also allow the compiler to produce much better code
than scalars declared with the INITIAL attribute.
With Enterprise 4.1 (actually even with 3.9 although it was not documented then), you can now declare named constants in
structures (as long as all the leaf elements of such a structure have the VALUE attribute and as long as the structure contains
no arrays or unions). This allows you to define namespaces of constants and allows you to convert easily a STATIC structure
that consisted of only scalars with the INITIAL attribute to a structure for which the compiler can generate much better code.
For example, if you had this structure,
1 group_rcs static,
2 ok fixed bin(31) init(0),
2 warning fixed bin(31) init(1),
2 error fixed bin(31) init(3);
you could convert it to
2 ok fixed bin(31) value(0),
2 warning fixed bin(31) value(1),
2 error fixed bin(31) value(3);
and the references to group_rcs.ok, group_rcs.warning and group_rcs.error in your code would work more efficiently
without any change.
Code that uses elements of structures with multiple REFERs can be very expensive: each reference uses one or more
costly library call to remap the structure. Many PL/I users have long known that the of multiple REFERs created a
black hole for performance.
Now, with Enterprise for z/OS 4.1, for structures where all the elements are byte-aligned, those calls will be avoided and
straightforward inline code generated (because if all elements are byte-aligned, no padding is possible and thus the
address calculations are relatively simple).
To insure all elements are byte-aligned