The initial release of FORTRAN for the IBM 704 contained 32 statements, including:
The
Below is a part of the 1957 paper, "The FORTRAN Automatic Coding System" by Backus et al., with this snippet on the FREQUENCY statement and its use in a compile-time Monte Carlo simulation of the run-time to optimise the code generated. Quoting …
DIMENSIONandEQUIVALENCEstatements- Assignment statements
- Three-way arithmetic
IFstatement, which passed control to one of three locations in the program depending on whether or not the result of the arithmetic statement was positive, zero, or negative IFstatements for checking exceptions (ACCUMULATOR OVERFLOW,QUOTIENT OVERFLOW, andDIVIDE CHECK); andIFstatements for manipulating sense switches and sense lightsGOTO, computedGOTO,ASSIGN, and assignedGOTODOloops- Formatted I/O:
FORMAT,READ,READ INPUT TAPE,WRITE,WRITE OUTPUT TAPE,PRINT, andPUNCH - Unformatted I/O:
READ TAPE,READ DRUM,WRITE TAPE, andWRITE DRUM - Other I/O:
END FILE,REWIND, andBACKSPACE PAUSE,STOP, andCONTINUEFREQUENCYstatement (for providing optimization hints to the compiler).
IF statement was similar to a three-way
branch instruction on the IBM 704. However, the 704 branch instructions
all contained only one destination address (e.g., TZE — Transfer AC
Zero, TNZ — Transfer AC Not Zero, TPL — Transfer AC Plus, TMI — Transfer
AC Minus). The machine (and its successors in the 700/7000 series) did have a three-way skip instruction (CAS — Compare AC with Storage), but using this instruction to implement the IF
would consume 4 instruction words, require the constant Zero in a word
of storage, and take 3 machine cycles to execute; using the Transfer
instructions to implement the IF could be done in 1 to 3
instruction words, required no constants in storage, and take 1 to 3
machine cycles to execute. An optimizing compiler like FORTRAN would
most likely select the more compact and usually faster Transfers instead
of the Compare (use of Transfers also allowed the FREQUENCY statement to optimize IFs,
which could not be done using the Compare). Also the Compare considered
−0 and +0 to be different values while the Transfer Zero and Transfer
Not Zero considered them to be the same.The
FREQUENCY statement in FORTRAN was used originally
and optionally to give branch probabilities for the three branch cases
of the Arithmetic IF statement to bias the way code was generated and
order of the basic blocks of code generated, in the global optimisation
sense, were arranged in memory for optimality. The first FORTRAN
compiler used this weighting to do a Monte Carlo simulation
of the run-time generated code at compile time. It was very
sophisticated for its time. This technique is documented in the original
article in 1957 on the first FORTRAN compiler implementation by J.
Backus et al. Many years later, the FREQUENCY statement had
no effect on the code, and was treated as a comment statement, since
the compilers no longer did this kind of compile-time simulation.Below is a part of the 1957 paper, "The FORTRAN Automatic Coding System" by Backus et al., with this snippet on the FREQUENCY statement and its use in a compile-time Monte Carlo simulation of the run-time to optimise the code generated. Quoting …
The fundamental unit of program is the basic block; a basic block is a stretch of program which has a single entry point and a single exit point. The purpose of section 4 is to prepare for section 5 a table of predecessors (PRED table) which enumerates the basic blocks and lists for every basic block each of the basic blocks which can be its immediate predecessor in flow, together with the absolute frequency of each such basic block link. This table is obtained by an actual "execution" of the program in Monte-Carlo fashion, in which the outcome of conditional transfers arising out of IF-type statements and computed GO TO'S is determined by a random number generator suitably weighted according to whatever FREQUENCY statements have been provided.
No comments:
Post a Comment