![]() |
![]() HP OpenVMS Systemsask the wizard |
![]() |
The Question is: I've supplied two program examples which were compiled under DEC-BASIC ver 1.3 When I compile the first program, I only see the informational message if the optimizer is off. When I compile the second program, I only see the informational message when the optimizer is on. Is this normal? Neil Rieck Bell Canada (Kitchener, Ontario) Example #1 $ type pos_demo.bas 1000 option type=explicit map(abc) string dev_name$ = 8 ! fixed length string dev_name$ = "LTA9999" if pos(dev_name$,":",1%)>0% then dev_name$ = dev_name$ +":" ! the problem !~~~ dev_name$ = edit$(dev_name$128%) +":" x the fix end if print dev_name$ end $ bas/optim=level=0/warn=all pos_demo dev_name$ = dev_name$ +":" %BASIC-I-EXPNOTRES, expression does not contribute to result at line number 5 in file DKB0:[NEIL]POS_DEMO.BAS;4 $ bas/optim=level=1/warn=all pos_demo $ ! no informational Example #2 $ type logic_demo.bas 1000 option type=explicit declare long rc% ! rc% = sys$qiow(bla...) !~~~ if (rc% and 1%) <> 1% then <-- what was intended if rc% and 1% <> 1% then print "error: ";rc% end if end $ bas/optim=level=0/warn=all logic_demo ! no informational $ bas/optim=level=1/warn=all logic_demo if rc% and 1% <> 1% then %BASIC-I-UNREACH, code can never be executed at label at line number 5 in file DKB0:[NEIL]LOGIC_DEMO.BAS;2 The Answer is : This behavior -- due to the way that the GEM code generation back-end operates -- has been around for some time, and also occurs in V1.2. The first example does initially appear odd, but the second example looks quite reasonable -- as for the latter case, it takes a higher level of optimization to see that the logical condition is always FALSE and thus the PRINT statement can never be executed. To understand the first example, note that dev_name$ is a fixed length string, so that catenating something to the end of it will not change its value. At the lowest level of optimization GEM is able to detect that the statement will have no effect and so it puts out the message. With higher levels of optimization, the optimizer simple discards the unneed operation and produces the correct result similar to the optimization of arithmetic expressions (eg: y = x + 0). Note that because many of the arithmetic expressions are actually simplified by the compiler front-end before the GEM code optimizer is invoked, no message is output.
|