Annotation of 43BSDReno/share/doc/ps1/04.pascal/puman2.n, revision 1.1.1.1

1.1       root        1: .\" Copyright (c) 1980 Regents of the University of California.
                      2: .\" All rights reserved.  The Berkeley software License Agreement
                      3: .\" specifies the terms and conditions for redistribution.
                      4: .\"
                      5: .\"    @(#)puman2.n    6.2 (Berkeley) 5/7/86
                      6: .\"
                      7: .if !\n(xx \{\
                      8: .so tmac.p \}
                      9: 'if n 'ND
                     10: .nr H1 1
                     11: .NH
                     12: Basic UNIX Pascal
                     13: .PP
                     14: The following sections
                     15: explain the basics of using
                     16: .UP .
                     17: In examples here we use the text editor
                     18: .I ex 
                     19: (1).
                     20: Users of the text editor
                     21: .I ed
                     22: should have little trouble following these examples,
                     23: as
                     24: .I ex
                     25: is similar to
                     26: .I ed .
                     27: We use
                     28: .I ex
                     29: because it
                     30: allows us to make clearer examples.\(dg
                     31: .FS
                     32: \(dg Users with \s-2CRT\s0 terminals should find the editor
                     33: .I vi
                     34: more pleasant to use;
                     35: we do not show its use here because its display oriented nature
                     36: makes it difficult to illustrate.
                     37: .FE
                     38: The new
                     39: .UX
                     40: user will find it helpful to read one of the text editor documents
                     41: described in section 1.4 before continuing with this section.
                     42: .NH 2
                     43: A first program
                     44: .PP
                     45: To prepare a program for
                     46: .UP
                     47: we first need to have an account on
                     48: .UX
                     49: and to `login'
                     50: to the system on this account.
                     51: These procedures are described in the documents
                     52: .I "Communicating with UNIX" 
                     53: and
                     54: .I "UNIX for Beginners".
                     55: .PP
                     56: Once we are logged in we need to choose a name for our program;
                     57: let us call it `first' as this is the first example.
                     58: We must also choose a name for the file in which the program will be stored.
                     59: The
                     60: .UP
                     61: system requires that programs reside in files which have names ending with
                     62: the sequence `.p' so we will call our file `first.p'.
                     63: .PP
                     64: A sample editing session to create this file would begin:
                     65: .LS
                     66: % \*bex first.p\fR
                     67: "first.p" [New file]
                     68: :
                     69: .LE
                     70: We didn't expect the file to exist, so the error diagnostic doesn't
                     71: bother us.
                     72: The editor now knows the name of the file we are creating.
                     73: The `:' prompt indicates that it is ready for command input.
                     74: We can add the text for our program using the `append'
                     75: command as follows.
                     76: .LS
                     77: :\*bappend\fR
                     78: .B
                     79: program first(output)
                     80: begin
                     81:        writeln('Hello, world!')
                     82: end.
                     83: \&.
                     84: .R
                     85: :
                     86: .LE
                     87: The line containing the single `\*b.\fR' character here indicated
                     88: the end of the appended text.
                     89: The `:' prompt indicates that
                     90: .I ex
                     91: is ready for another command.
                     92: As the editor operates in a temporary work space we must now store the contents
                     93: of this work space in the file `first.p'
                     94: so we can use the Pascal 
                     95: translator and executor
                     96: .IX
                     97: on it.
                     98: .LS
                     99: :\*bwrite\fR
                    100: "first.p" [New file] 4 lines, 59 characters
                    101: :\*bquit\fR
                    102: % 
                    103: .LE
                    104: We wrote out the file from the edit buffer here with the
                    105: `write'
                    106: command, and
                    107: .I ex
                    108: indicated the number of lines and characters written.
                    109: We then quit the editor, and now have a prompt from the shell.\(dd
                    110: .FS
                    111: \(dd Our examples here assume you are using
                    112: .I csh.
                    113: .FE
                    114: .KS
                    115: .PP
                    116: We are ready to try
                    117: to translate and execute our program.
                    118: .DS
                    119: .tr '\(aa^\(ua
                    120: % \*bpix first.p\fR
                    121: .so firstout
                    122: .tr ''^^
                    123: %
                    124: .DE
                    125: .KE
                    126: .PP
                    127: The translator first printed a syntax error diagnostic.
                    128: The number 2 here indicates that the rest of the line is an image
                    129: of the second line of our program.
                    130: The translator is saying that it expected to find a `;' before the
                    131: keyword
                    132: .B begin
                    133: on this line.
                    134: If we look at the Pascal syntax charts in the Jensen-Wirth
                    135: .I "User Manual" ,
                    136: or at some of the sample programs therein, we will see that
                    137: we have omitted the terminating `;' of the
                    138: .B program 
                    139: statement on the first
                    140: line of our program.
                    141: .PP
                    142: One other thing to notice about the error diagnostic is the letter `e'
                    143: at the beginning.
                    144: It stands for `error',
                    145: indicating that our input was not legal Pascal.
                    146: The fact that it is an `e' rather than an `E'
                    147: indicates that the translator managed to recover from this error well
                    148: enough that generation of code and execution could take place.
                    149: Execution is possible whenever no fatal `E' errors
                    150: occur during translation.
                    151: The other classes of diagnostics are `w' warnings,
                    152: which do not necessarily indicate errors in the program,
                    153: but point out inconsistencies which are likely to be due to program bugs,
                    154: and `s' standard-Pascal violations.\*(dg
                    155: .FS
                    156: \*(dgThe standard Pascal warnings occur only when the associated
                    157: .B s
                    158: translator option is enabled.
                    159: The
                    160: .B s
                    161: option is discussed in sections 5.1 and A.6 below.
                    162: Warning diagnostics are discussed at the end of section 3.2,
                    163: the associated
                    164: .B w
                    165: option is described in section 5.2.
                    166: .FE
                    167: .PP
                    168: After completing the translation of the program to interpretive code,
                    169: the Pascal system indicates that execution of the translated program began.
                    170: The output from the execution of the program then appeared.
                    171: At program termination, the Pascal runtime system indicated the
                    172: number of statements executed, and the amount of cpu time
                    173: used, with the resolution of the latter being 1/60'th of a second.
                    174: .PP
                    175: Let us now fix the error in the program and translate it to a permanent
                    176: object code file
                    177: .I obj
                    178: using
                    179: .PI .
                    180: The program
                    181: .PI
                    182: translates Pascal programs but stores the object code instead of executing it\*(dd.
                    183: .FS
                    184: \*(ddThis script indicates some other useful approaches to debugging
                    185: Pascal programs.
                    186: As in
                    187: .I ed
                    188: we can shorten commands in
                    189: .I ex
                    190: to an initial prefix of the command name as we did
                    191: with the
                    192: .I substitute
                    193: command here.
                    194: We have also used the `!' shell escape command here to execute other
                    195: commands with a shell without leaving the editor.
                    196: .FE
                    197: .LS
                    198: % \*bex first.p\fR
                    199: "first.p" 4 lines, 59 characters
                    200: :\*b1 print\fR
                    201: program first(output)
                    202: :\*bs/$/;\fR
                    203: program first(output);
                    204: :\*bwrite\fR
                    205: "first.p" 4 lines, 60 characters
                    206: :\*bquit\fR
                    207: % \*bpi first.p\fR
                    208: %
                    209: .LE
                    210: If we now use the
                    211: .UX
                    212: .I ls
                    213: list files command we can see what files we have:
                    214: .LS
                    215: % \*bls\fR
                    216: first.p
                    217: obj
                    218: %
                    219: .LE
                    220: The file `obj' here contains the Pascal interpreter code.
                    221: We can execute this by typing:
                    222: .LS
                    223: % \*bpx obj\fR
                    224: .so firstobjout
                    225: %
                    226: .LE
                    227: Alternatively, the command:
                    228: .LS
                    229: % \*bobj\fR
                    230: .LE
                    231: will have the same effect.
                    232: Some examples of different ways to execute the program follow.
                    233: .LS
                    234: % \*bpx\fR
                    235: .so firstobjout
                    236: % \*bpi -p first.p\fR
                    237: % \*bpx obj\fR
                    238: .so firstobjout2
                    239: % \*bpix -p first.p\fR
                    240: .so firstobjout2
                    241: %
                    242: .LE
                    243: .PP
                    244: Note that
                    245: .I px
                    246: will assume that `obj' is the file we wish to execute
                    247: if we don't tell it otherwise.
                    248: The last two translations use the
                    249: .B \-p
                    250: no-post-mortem option to eliminate
                    251: execution statistics and
                    252: `Execution begins'
                    253: and
                    254: `Execution terminated'
                    255: messages.
                    256: See section 5.2 for more details.
                    257: If we now look at the files in our directory we will see:
                    258: .LS
                    259: % \*bls\fR
                    260: first.p
                    261: obj
                    262: %
                    263: .LE
                    264: We can give our object program a name other than `obj' by using the move
                    265: command
                    266: .I mv
                    267: (1).
                    268: Thus to name our program `hello':
                    269: .LS
                    270: % \*bmv obj hello\fR
                    271: % \*bhello\fR
                    272: Hello, world!
                    273: % \*bls\fR
                    274: first.p
                    275: hello
                    276: %
                    277: .LE
                    278: Finally we can get rid of the Pascal object code by using the
                    279: .I rm
                    280: (1) remove file command, e.g.:
                    281: .LS
                    282: % \*brm hello\fR
                    283: % \*bls\fR
                    284: first.p
                    285: %
                    286: .LE
                    287: .PP
                    288: For small programs which are being developed
                    289: .IX
                    290: tends to be more convenient to use than
                    291: .PI
                    292: and
                    293: .X .
                    294: Except for absence of the
                    295: .I obj
                    296: file after a
                    297: .IX
                    298: run,
                    299: a
                    300: .IX
                    301: command is equivalent to a
                    302: .PI
                    303: command followed by a
                    304: .X
                    305: command.
                    306: For larger programs,
                    307: where a number of runs testing different parts of the program are
                    308: to be made,
                    309: .PI
                    310: is useful as this
                    311: .I obj
                    312: file can be executed any desired number of times.
                    313: .. >>> INSERT SECTION FOR PC <<<
                    314: .NH 2
                    315: A larger program
                    316: .PP
                    317: Suppose that we have used the editor to put a larger program
                    318: in the file `bigger.p'.
                    319: We can list this program with line numbers by using the program
                    320: .I cat -n
                    321: i.e.:
                    322: .LS
                    323: % \*bcat -n bigger.p\fR
                    324: .so bigger3.p
                    325: %
                    326: .LE
                    327: This program is similar to program 4.9 on page 30 of the
                    328: Jensen-Wirth
                    329: .I "User Manual" .
                    330: A number of problems have been introduced into this example for
                    331: pedagogical reasons.
                    332: .br
                    333: .PP
                    334: If we attempt to translate and execute the program using
                    335: .IX
                    336: we get the following response:
                    337: .LS
                    338: % \*bpix bigger.p\fR
                    339: .so bigout1
                    340: %
                    341: .LE
                    342: .PP
                    343: Since there were fatal `E' errors in our program,
                    344: no code was generated and execution was necessarily suppressed.
                    345: One thing which would be useful at this point is a listing of the
                    346: program with the error messages.
                    347: We can get this by using the command:
                    348: .LS
                    349: % \*bpi -l bigger.p\fR
                    350: .LE
                    351: There is no point in using
                    352: .IX
                    353: here, since we know there are fatal errors in the program.
                    354: This command will produce the output at our terminal.
                    355: If we are at a terminal which does not produce a hard copy
                    356: we may wish to print this
                    357: listing off-line on a line printer.
                    358: We can do this with the command:
                    359: .LS
                    360: % \*bpi -l bigger.p | lpr\fR
                    361: .LE
                    362: .PP
                    363: In the next few sections we will illustrate various aspects of the
                    364: Berkeley
                    365: Pascal system by correcting this program.
                    366: .NH 2
                    367: Correcting the first errors
                    368: .PP
                    369: Most of the errors which occurred in this program were
                    370: .I syntactic
                    371: errors, those in the format and structure of the program rather than
                    372: its content.
                    373: Syntax errors are flagged by printing the offending line, and then a line
                    374: which flags the location at which an error was detected.
                    375: The flag line also gives an explanation
                    376: stating either a possible cause of the error,
                    377: a simple action which can be taken to recover from the error so
                    378: as to be able to continue the analysis,
                    379: a symbol which was expected at the point of error,
                    380: or an indication that the input was `malformed'.
                    381: In the last case, the recovery may skip ahead in the input
                    382: to a point where analysis of the program can continue.
                    383: .PP
                    384: In this example,
                    385: the first error diagnostic indicates that the translator detected
                    386: a comment within a comment.
                    387: While this is not considered an error in `standard'
                    388: Pascal, it usually corresponds to an error in the program which
                    389: is being translated.
                    390: In this case, we have accidentally omitted the trailing `*)' of the comment
                    391: on line 8.
                    392: We can begin an editor session to correct this problem by doing:
                    393: .LS
                    394: % \*bex bigger.p\fR
                    395: "bigger.p" 24 lines, 512 characters
                    396: :\*b8s/$/ *)\fR
                    397:         s = 32;       (* 32 character width for interval [x, x+1] *)
                    398: :
                    399: .LE
                    400: .PP
                    401: The second diagnostic, given after line 16,
                    402: indicates that the keyword
                    403: .B do
                    404: was expected before the keyword
                    405: .B begin
                    406: in the
                    407: .B for
                    408: statement.
                    409: If we examine the
                    410: .I statement
                    411: syntax chart on page 118 of the
                    412: Jensen-Wirth
                    413: .I "User Manual"
                    414: we will discover that
                    415: .B do
                    416: is a necessary part of the
                    417: .B for
                    418: statement.
                    419: Similarly, we could have referred to section C.3 of the
                    420: Jensen-Wirth
                    421: .I "User Manual"
                    422: to learn about the
                    423: .B for
                    424: statement and gotten the same information there.
                    425: It is often useful to refer to these syntax charts and to the
                    426: relevant sections of this book.
                    427: .PP
                    428: We can correct this problem by first scanning for the keyword
                    429: .B for
                    430: in the file and then substituting the keyword
                    431: .B do
                    432: to appear in front of the keyword
                    433: .B begin
                    434: there.
                    435: Thus:
                    436: .LS
                    437: :\*b/for\fR
                    438:        for i := 0 to lim begin
                    439: :\*bs/begin/do &\fR
                    440:        for i := 0 to lim do begin
                    441: :
                    442: .LE
                    443: The next error in the program is easy to pinpoint.
                    444: On line 18, we didn't hit the shift key and got a `9'
                    445: instead of a `)'.
                    446: The translator diagnosed that `x9'
                    447: was an undefined variable and, later,
                    448: that a `)' was missing in the statement.
                    449: It should be stressed that
                    450: .PI
                    451: is not suggesting that you should insert a `)' before the `;'.
                    452: It is only indicating that making this change will help it to be able to
                    453: continue analyzing the program so as to be able to diagnose further
                    454: errors.
                    455: You must then determine the true cause of the error and make the
                    456: appropriate correction to the source text.
                    457: .PP
                    458: This error also illustrates the fact that one error in the input may lead
                    459: to multiple error diagnostics.
                    460: .I Pi
                    461: attempts
                    462: to give only one diagnostic for each error,
                    463: but single errors in the input sometimes appear to be more than
                    464: one error.
                    465: It is also the case that
                    466: .PI
                    467: may not detect an error when it occurs, but may detect it later in
                    468: the input.
                    469: This would have happened
                    470: in this example if we had typed `x' instead of `x9'.
                    471: .PP
                    472: The translator next detected, on line 19, that the function
                    473: .I Round
                    474: and the variable
                    475: .I h
                    476: were undefined.
                    477: It does not know about
                    478: .I Round
                    479: because
                    480: .UP
                    481: normally distinguishes between upper and lower case.\*(dg
                    482: .FS
                    483: \*(dgIn ``standard'' Pascal no distinction is made based on case.
                    484: .FE
                    485: On
                    486: .UX
                    487: lower-case is preferred\*(dd,
                    488: .FS
                    489: \*(ddOne good reason for using lower-case is that it is easier to type.
                    490: .FE
                    491: and all keywords and built-in
                    492: .B procedure
                    493: and
                    494: .B function
                    495: names are composed of lower-case letters,
                    496: just as they are in the Jensen-Wirth
                    497: .I "Pascal Report" .
                    498: Thus we need to use the function
                    499: .I round
                    500: here.
                    501: As far as
                    502: .I h
                    503: is concerned,
                    504: we can see why it is undefined if we look back to line 9
                    505: and note that its definition was lost in the non-terminated
                    506: comment.
                    507: This diagnostic need not, therefore, concern us.
                    508: .PP
                    509: The next error which occurred in the program caused the translator
                    510: to insert a `;' before the statement calling
                    511: .I writeln
                    512: on line 23.
                    513: If we examine the program around the point of error we will see
                    514: that the actual error is that the keyword
                    515: .B until
                    516: and an associated expression have been omitted here.
                    517: Note that the diagnostic from the translator does not indicate the actual
                    518: error, and is somewhat misleading.
                    519: The translator made the correction which seemed to be most plausible.
                    520: As the omission of a `;' character is a common mistake,
                    521: the translator chose to indicate this as a possible fix here.
                    522: It later detected that the keyword
                    523: .B until
                    524: was missing, but not until it saw the keyword
                    525: .B end
                    526: on line 24.
                    527: The combination of these diagnostics indicate to us the true problem.
                    528: .PP
                    529: The final syntactic error message indicates that the translator needed an
                    530: .B end
                    531: keyword to match the
                    532: .B begin 
                    533: at line 15.
                    534: Since the
                    535: .B end
                    536: at line 24 is supposed to match this
                    537: .B begin ,
                    538: we can infer that another
                    539: .B begin
                    540: must have been mismatched, and have matched this
                    541: .B end .
                    542: Thus we see that we need an
                    543: .B end
                    544: to match the
                    545: .B begin
                    546: at line 16,
                    547: and to appear before the final
                    548: .B end .
                    549: We can make these corrections:
                    550: .LS
                    551: :\*b/x9/s//x)\fR
                    552:                 y := exp(-x) * sin(i * x);
                    553: :\*b+s/Round/round\fR
                    554:                 n := round(s * y) + h;
                    555: :\*b/write\fR
                    556:                         write(' ');
                    557: :\*b/\fR
                    558:                 writeln('*')
                    559: :\*binsert\fR
                    560:                 \*buntil n = 0;\fR
                    561: \&\*b.\fR
                    562: :\*b$\fR
                    563: end.
                    564: :\*binsert\fR
                    565:         \*bend\fR
                    566: \&\*b.\fR
                    567: :
                    568: .LE
                    569: .PP
                    570: At the end of each
                    571: .B procedure
                    572: or
                    573: .B function
                    574: and the end of the
                    575: .B program
                    576: the translator summarizes references to undefined variables
                    577: and improper usages of variables.
                    578: It also gives
                    579: warnings about potential errors.
                    580: In our program, the summary errors do not indicate any further problems
                    581: but the warning that
                    582: .I c
                    583: is unused is somewhat suspicious.
                    584: Examining the program we see that the constant was intended
                    585: to be used in the expression which is an argument to
                    586: .I sin ,
                    587: so we can correct this expression, and translate the program.
                    588: We have now made a correction for each diagnosed error
                    589: in our program.
                    590: .LS
                    591: :\*b?i ?s//c /\fR
                    592:                y := exp(-x) * sin(c * x);
                    593: :\*bwrite\fR
                    594: "bigger.p" 26 lines, 538 characters
                    595: :\*bquit\fR
                    596: % \*bpi bigger.p\fR
                    597: %
                    598: .LE
                    599: It should be noted that the translator suppresses warning
                    600: diagnostics for a particular
                    601: .B procedure ,
                    602: .B function
                    603: or the main
                    604: .B program
                    605: when it finds severe syntax errors in that part of the source
                    606: text.
                    607: This is to prevent possibly confusing and
                    608: incorrect warning diagnostics from being produced.
                    609: Thus these warning diagnostics may not appear in a program with
                    610: bad syntax errors until these errors are corrected.
                    611: .KS
                    612: .PP
                    613: We are now ready to execute our program for the first
                    614: time.
                    615: We will do so in the next section after giving a listing
                    616: of the corrected program for reference purposes.
                    617: .LS
                    618: % \*bcat -n bigger.p\fR
                    619: .so bigger6.p
                    620: %
                    621: .LE
                    622: .NH 2
                    623: Executing the second example
                    624: .PP
                    625: We are now ready to execute the second example.
                    626: The following output was produced by our first run.
                    627: .LS
                    628: % \*bpx\fR
                    629: .so bigout2
                    630: %
                    631: .LE
                    632: Here the interpreter is presenting us with a runtime error diagnostic.
                    633: It detected a `division by zero' at line 17.
                    634: Examining line 17, we see that we have written
                    635: the statement `x := d / i' instead of `x := d * i'.
                    636: We can correct this and rerun the program:
                    637: .LS
                    638: % \*bex bigger.p\fR
                    639: "bigger.p" 26 lines, 538 characters
                    640: :\*b17\fR
                    641:         x := d / i
                    642: :\*bs'/'*\fR
                    643:         x := d * i
                    644: :\*bwrite\fR
                    645: "bigger.p" 26 lines, 538 characters
                    646: :\*bq\fR
                    647: % \*bpix bigger.p\fR
                    648: .so bigout3
                    649: %
                    650: .LE
                    651: .KS
                    652: .PP
                    653: This appears to be the output we wanted.
                    654: We could now save the output in a file if we wished by using the shell
                    655: to redirect the output:
                    656: .LS
                    657: % \*bpx > graph\fR
                    658: .LE
                    659: .KE
                    660: We can use
                    661: .I cat
                    662: (1) to see the contents of the file graph.
                    663: We can also make a listing of the graph on the line printer without
                    664: putting it into a file, e.g.
                    665: .LS
                    666: % \*bpx | lpr\fR
                    667: .so bigout4
                    668: %
                    669: .LE
                    670: Note here that the statistics lines came out on our terminal.
                    671: The statistics line comes out on the diagnostic output (unit 2.)
                    672: There are two ways to get rid of the statistics line.
                    673: We can redirect the statistics message to the printer using the
                    674: syntax `|\|&' to the shell rather than `|', i.e.:
                    675: .LS
                    676: % \*bpx |\|& lpr\fR
                    677: %
                    678: .LE
                    679: or we can translate the program with the
                    680: .B p
                    681: option disabled on the command line as we did above.
                    682: This will disable all post-mortem dumping including the statistics line,
                    683: thus:
                    684: .LS
                    685: % \*bpi -p bigger.p\fR
                    686: % \*bpx | lpr\fR
                    687: %
                    688: .LE
                    689: This option also disables the statement limit which normally guards
                    690: against infinite looping.
                    691: You should not use it until your program is debugged.
                    692: Also if
                    693: .B p
                    694: is specified and an error occurs, you will
                    695: not get run time diagnostic information to help you
                    696: determine what the problem is.
                    697: .NH 2
                    698: Formatting the program listing
                    699: .PP
                    700: It is possible to use special lines within the source text of a program
                    701: to format the program listing.
                    702: An empty line (one with no characters on it) corresponds to a
                    703: `space' macro in an assembler, leaving a completely blank line
                    704: without a line number.
                    705: A line containing only a control-l (form-feed) character
                    706: will cause a page eject in the listing with the corresponding line number
                    707: suppressed.
                    708: This corresponds to an `eject' pseudo-instruction.
                    709: See also section 5.2 for details on the
                    710: .B n
                    711: and
                    712: .B i
                    713: options of
                    714: .PI .
                    715: .NH 2
                    716: Execution profiling
                    717: .PP
                    718: An execution profile consists of a structured listing of (all or part of)
                    719: a program with information about the number of times each statement in
                    720: the program was executed for a particular run of the program.
                    721: These profiles can be used for several purposes.
                    722: In a program which was abnormally terminated due to excessive looping
                    723: or recursion or by a program fault, the counts can facilitate location
                    724: of the error.
                    725: Zero counts mark portions of the program which were not executed;
                    726: during the early debugging stages they should prompt new test data or
                    727: a re-examination of the program logic.
                    728: The profile is perhaps most valuable, however, in drawing
                    729: attention to the (typically small)
                    730: portions of the program that dominate execution time.
                    731: This information can be used for source level optimization.
                    732: .SH
                    733: An example
                    734: .PP
                    735: A prime number is a number which is divisible only by itself and the
                    736: number one.
                    737: The program
                    738: .I primes ,
                    739: written by Niklaus Wirth,
                    740: determines the first few prime numbers.
                    741: In translating the program we have specified the
                    742: .B z
                    743: option to
                    744: .IX .
                    745: This option causes the translator to generate counters and count instructions
                    746: sufficient in number to determine the number of times each statement in the
                    747: program was executed.\*(dg
                    748: .FS
                    749: \*(dgThe counts
                    750: are completely accurate only in the absence of runtime errors and nonlocal
                    751: .B goto
                    752: statements.
                    753: This is not generally a problem, however, as in structured programs
                    754: nonlocal
                    755: .B goto
                    756: statements occur infrequently,
                    757: and counts are incorrect after abnormal termination only when the
                    758: .I "upward look"
                    759: described below to get a count passes a suspended call point.
                    760: .FE
                    761: When execution of the program completes, either normally or abnormally,
                    762: this count data is written to the file
                    763: .I pmon.out
                    764: in the current directory.\*(dd
                    765: .FS
                    766: \*(dd\c
                    767: .I Pmon.out
                    768: has a name similar to
                    769: .I mon.out
                    770: the monitor file produced by the profiling facility of the C compiler
                    771: .I cc
                    772: (1).
                    773: See
                    774: .I prof
                    775: (1) for a discussion of the C compiler profiling facilities.
                    776: .FE
                    777: It is then possible to prepare an execution profile by giving
                    778: .XP
                    779: the name of the file associated with this data, as was done in the following
                    780: example.
                    781: .LS
                    782: % \*bpix -l -z primes.p\fR
                    783: .so primeout1
                    784: %
                    785: .LE
                    786: .SH
                    787: Discussion
                    788: .PP
                    789: The header lines of the outputs of
                    790: .IX
                    791: and
                    792: .XP
                    793: in this example indicate the version of the translator and execution
                    794: profiler in use at the time this example was prepared.
                    795: The time given with the file name (also on the header line)
                    796: indicates the time of last modification of the program source file.
                    797: This time serves to
                    798: .I "version stamp"
                    799: the input program.
                    800: .I Pxp
                    801: also indicates the time at which the profile data was gathered.
                    802: .LS
                    803: % \*bpxp -z primes.p\fR
                    804: .so primeout2
                    805: %
                    806: .LE
                    807: .KE
                    808: .PP
                    809: To determine the number of times a statement was executed,
                    810: one looks to the left of the statement and finds the corresponding
                    811: vertical bar `|'.
                    812: If this vertical bar is labelled with a count then that count gives the 
                    813: number of times the statement was executed.
                    814: If the bar is not labelled, we look up in the listing to find the first
                    815: `|' which directly above the original one which has a count and that
                    816: is the answer.
                    817: Thus, in our example,
                    818: .I k
                    819: was incremented 157 times on line 18,
                    820: while the
                    821: .I write
                    822: procedure call on line 24 was executed 48 times as given by the count
                    823: on the
                    824: .B repeat .
                    825: .PP
                    826: More information on
                    827: .I pxp
                    828: can be found in its manual section
                    829: .XP
                    830: (1)
                    831: and in sections 5.4, 5.5 and 5.10.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.