LIBRARY OF THE
UNIVERSITY OF ILLINOIS
AT URBANA-CHAMPAIGN
51084
ho. 293-300
cop. 2
CENTRAL CIRCULATION AND BOOKSTACKS
The person borrowing this material is re-
sponsible for its renewal or return before
the Latest Date stamped below. You may
be charged a minimum fee of $75.00 for
each non-returned or lost item.
Theft, mutilation, or defacement of library materials can be
causes for student disciplinary action. All materials owned by
the University of Illinois library are the property of the State
of Illinois and are protected by Article 16B of lllinoit Criminal
Law and Procedure.
TO RENEW, CALL (217) 333-8400.
University of Illinois Library at Urbana-Champaign
JUN2 31999
F f 6 1 AH
When renewing by phone, write new due date
below previous due date. L162
Digitized by the Internet Archive
in 2013
http://archive.org/details/tranquilarithmet296budn
January 6, 19&9
TRANQUIL ARITHMETIC
by
Paul Peter Budnik
DEPARTMENT OF COMPUTER SCIENCE
UNIVERSITY OF ILLINOIS AT URBANA-CHAMPAIGN
URBANA, ILLINOIS
Report No. 296
TRANQUIL ARITHMETIC*
by
Paul Budnik
January 6, 19^9
Department of Computer Science
University of Illinois
Urban a, Illinois 6l801
This work was supported in part by the Advanced Research Projects
Agency as administered by the Rome Air Development Center under
Contract No. US AF 30{G02)klkk and submitted in partial fulfillment
of the requirements for the degree of Master of Science in Computer
Science, February, 19&9.
iii
ACKNOWLEDGVEENT
I wish to thank Professor Kuck who originally conceived the
general form of the TRANQUIL language and its data structures, and who
contributed to TRANQUIL throughout its development, and Professor Northcote
for his assistance in our implementation of TRANQUIL. A number of appli-
cations programmers contributed ideas which aided in the development of
TRANQUIL.
Additional thanks goes to Norma Abel for implementing Boolean
expressions and doing some additional coding and for her numerous ques-
tions which have often helped to clarify things in my own mind. I am
grateful to Paul Kraska for assuming the responsibility of implementing
set expressions. I wish to thank Yoichi Muraoka and Bob Wilhelmson, my
colleagues on this project.
Finally, I would like to thank Mrs. Sharon Hardman for typing
this thesis. Her help was essential in getting the thesis finished on
time.
IV
ABSTRACT
The assignment statements allowed in Tranquil are described with
emphasis placed on writing efficient code. A description of the implemen-
tation of the assignment statement part of the compiler is given in con-
siderable detail and is likely to be of interest mainly to those who find
it necessary to correct, alter or make additions to the Tranquil Compiler.
TABLE OF CONTENTS
Page
ACKNOWLEDGMENT iii
ABSTPACT iv
LIST OF FIGURES vi
1. TRANQUIL ARITHMETIC 1
1.1 Introduction 1
1.2 Writing Efficient Tranquil 1
1.3 Set Assignment Statements 3
1.1+ Boolean Assignment Statements k
2. PASS 2 - MACHINE CODE GENERATION 5
2.1 Pass 1 Output 5
2.2 Overall Structure of Pass 2 5
2.3 Assignment Statement Compilation 8
2.k Tables Involved in Assignment Statement Analysis 11
2 . 5 Compiling Code From the Tables l6
3. OPTIMIZING SIMPLE ASSIGNMENT STATEMENTS 18
k. CONCLUSION 22
APPENDIX: A SAMPLE TRANQUIL PROGRAM 23
TRANQUIL ARITHMETIC TABLES 2k
LIST OF REFERENCES 25
VI
LIST OF FIGURES
Figure Page
1. REAL ARRAY A [**0: 7, **0:7, 0:N-1] 13
2. A set of interrelated assignment statements 19
and their tree structure.
1. TRANQUIL ARITHMETIC
1.1 Introduction
In designing a compiler for ILLIAC IV, it was necessary to
provide facilities for expressing parallel operations, with sufficient
generality to easily express almost any type of calculation. This
inevitably results in permissible constructs which cannot be efficiently
compiled for ILLIAC IV. This is not in itself bad. Most programs will
require a small number of operations that cannot be done efficiently on
ILLIAC IV. Because these operations are essential to a much longer pro-
gram which can be efficiently compiled, it is necessary that one be able
to express them in Tranquil. It is, however, important that the program-
mer be aware of what constructs do not result in efficient code so that
he only uses them when necessary. Unfortunately, in providing a suffi-
ciently general language and algorithms for compiling it, the problem
of deciding how efficiently a given statement will compile does not have
a trivial solution. For these reasons, the following discussions of
assignment statements is in large part concerned with writing efficient
code.
1.2 Writing Efficient Tranquil
The cartesian product form of SIM control forces the compiler
to make decisions about which index to vary across the PE's. The basis
of this decision is an estimate of the size and density of the sets
involved, and how well the particular type of set matches up with the
particular index of the type of array used. For example, use of any
type set on a column of an array lying in a single PE will be very
inefficient.
The comma pairwise form of SIM control allows a programmer
to specify things like picking out an arbitrary diagonal of a matrix.
For example:
FOR (I, J) SIM ([1,2, ...,100], [2,3, ...,101])
DO
B[I] <-A[I,J];
For SKEWED arrays this cannot be done efficiently. Consecutive diagonal
elements actually occur in every other PE. To collapse this set of
elements a very large number of routes are required. Similar problems
arise all the time through the use of comma linked sets, and one cannot
determine how well a given construct of this type will compile without
actually looking at the data structures and indexing involved.
Word sizes other than those occupying a full 6h bit word are
packed by putting consecutive elements in consecutive PE's and wrapping
around in the same memory address (varying PE number only) until all
usable space has been filled. This allows the mode and indexing opera-
tions to work in closely similar fashion for all types of word sizes.
The choice of storage scheme is probably the single decision
that can have the greatest ultimate effect on the overall efficiency of
the compiled program. The straight storage scheme permits efficient
access of rows or diagonals. The skewed scheme permits easy access of
rows and columns. These statements can serve as very general guides as
to what type we should declare a given array.
1.3 Set Assignment Statements
The set assignment statement allows one to define the contents
of some set in terms of an expression involving other sets. The operands
in a set expression can be any type of set, but the operator determines
the type of the resulting set. The standard set operations like union
intersection and relative complement yield MONOSETs. The two operators
CONCAT and DELETE yield GENSETs.
The two operators " , " and X form sets of higher dimension then
their operands. They correspond to the ", " and X used in SIM control
statements.
R = [1, 2, 3, k, 5]
S = [2, k, 6, 8, 10]
T = [6, k, 6, 5, 6, 71
U = [100, 1+0, 0, 13]
R UNION U is [0, 1, 2, 3, U, 5, 13, hO, 100]
R CONCAT S is [l, 2, 3, k, 5, 2, k, 6, 8, 10]
T COMPL R is [6, 7]
T DELETE R is [6, 6, 6, 7]
[1, 2, 3, h], [2, k, 6, 8] is [[1, 2], [2, l+], [3, 6], [h, 8]]
[1, 2] X [3, k] is [[1, 3], [1, !*], [2, 3], [2, h]]
[1, 2] x [3, h] , [5, 6] is [[1, 3, 53, [1, h, 6], [2, 3, 5], [2, k, 6]]
Most of the set operations are fairly efficient on ILLIAC IV
provided the sets are large enough to make use of a substantial percentage
of the PE's. The one exception is when a conversion from a MONOSET to
a GENSET is required [l].
1.4 Boolean Assignment Statements
The standard ALGOL like boolean expressions are allowed in
TRANQUIL. Boolean arrays are not allowed, since sets serve the same
function more efficiently. Logical operators are also allowed in arith-
metic expressions, thus providing full word logical operations.
2. PASS 2 - MACHINE CODE GENERATION
2.1 Pass 1 Output
Pass 1 consists of a table driven parser [2] with scanner and
a large switch branching to semantic actions which are transferred to at
various points in the parse. The semantic actions construct tables and
output a file of intermediate language code, which is a special repre-
sentation of the original program that will be compiled into machine
code by Pass 2. The format of this intermediate language code is l6
bit words, the first four bits of which contain a table number and the
remaining 12 contain an address in the table. Table is the operator
table. Entries in all other tables are considered to be operands.
Ordinarily, special symbols and arithmetic and other operators are mapped
into intermediate language operators and identifiers and literals are
mapped into operands.
2.2 Overall Structure of Pass 2
In designing an overall structure for Pass 2, the basic
considerations were to make it flexible, highly segmented, and reasonably
easy to change. The concept of actions for semantic analysis, used in
Pass 1, was carried over to Pass 2. Each intermediate language operator
is provided with a specific action in Pass 2. Actions are also provided
for each type of operand. All these actions are contained in a procedure
called EXEC2.
BRANCH ON TABLE FIELD OF IL ENTRY
- operator
Branch on operator number
Branch on context sometimes
1 - identifier
| Branch on context
2 - literal
Branch on identifier type
| Branch on context
3 - string
k - dope
Branch on context
| Branch on context
The intermediate language code is read sequentially through
a function called NEXTILWORD. Ordinarily, this is done at the head of
EXEC2 by the assignment statement NXTILWRD := NEXTILWORD. The table
field of NXTILWRD is then used in a case statement. In the case of
operators, table 0, another case statement branches on the operator
number. (This is actually done by two nested levels of case statements.)
A method is provided for executing different actions for the
same operator or operand, based on the context in which the operator or
operand appears. This feature was designed to be quite general. EXEC2
has one argument: CONTEXT. Upon entry to EXEC2, the procedure CHANGE
(CONTEXT) is called. This procedure is simply a case statement which
allows an arbitrary number of variables to be set as a function of the
value of CONTEXT. These variables are used in case statements to select
which action is to be executed. As an example, identifiers can occur in
an assignment statement either in subscript expressions or as ordinary
operands. In the intermediate language, identifiers occurring in sub-
script expressions are bracketed by the operators: SUBSCRIPTEDPRIMARY
and ENDOFSUBSCRIPTLIST. Thus the action for subscripted primary calls
EXEC2(SUBSCRIFTEDPRIMARYC0NTEXT). The action for ENDOFSUBSCRIPTLIST
must exit from EXEC2. This is done by transferring to label EXIT. Then,
back in the action for SUBSCRIPTEDPRIMARY we must restore the context.
This is done by the define RESTORECONTEXT.
Although normally words from the ILCODE file are read at the
head of EXEC2, this is not necessarily always the case. NEXTILWORD can
be called from inside an action. Often, when this is done, NEXTILWORD
6
is called until some operator or operand not in a special set is
encountered. If it is necessary to execute the action for this IL code
word, this can be done by transferring to the label THISIL instead of
NEXTIL, provided that the IL word is stored in the variable NXTILWRD.
One can accomplish the same thing in calling EXEC2 by setting the boolean
variable NOTSAMEOPERATOR to FALSE before calling EXEC2.
2.3 Assignment Statement Compilation
The use of sets, the notion of SIM , the number of different
types of arithmetic and storage schemes, combined with the need to com-
pile efficient code for a parallel machine necessitate a substantial
analysis of each assignment statement. We now consider this analysis
as it is carried out in Pass 2 of the compiler.
The analysis is effected in several passes over the postfix
intermediate language. Consider the second assignment statement in the
example in Appendix A:
A[I, K] <-A[l + 1, K] + B[I, K]j
Before we even begin to generate code a decision must be made as to which
index is to be processed simultaneously (i.e., across the PE's) and which
is to be done sequentially. The first pass over the intermediate language
determines this and also copies the intermediate language into a table to
be used for future passes. When a set linked* identifier is entered in
We say that I is set linked to II in a statement like FOR (i) SIM (II) DO.
the table, additional information provided by the set definition or
declaration is also entered. In the case of I, which is linked via SIM
control to II, the set is known exactly and precise information from the
set definition is entered in the table. For K the compiler makes an
estimate of the size and density of the set based on the upper bounds
given in the declaration of KK.
In general, when operations are performed on pairs of subscripts
or pairs of subscripted arrays, information about the interaction between
these subscripts must be generated. For example, in the case of the sub-
script expression I + 1 in the example above, the addition of 1 in no way
alters the size, density, or type of the set. Thus, the information pro-
vided for I will be recopied with the + operand.
After the subscript expression has been processed, a check is
made to see how well the type of set resulting from the index expression
will work with the particular dimension of the set involved. In the
example, there are only two dimensional skewed arrays in which either
columns or rows can be easily accessed in parallel. If one of the arrays
were straight, then at this point it would be discovered that no set will
work well for the column index, because each column is stored in a single
PE. This information plus information about the set density, set size,
and the array size are all combined to compute a probable efficiency;
i.e., the number of PE's that will probably be on if this index were
varied simultaneously. Of course, it is easy to think up cases in which
the estimate will be totally wrong, but in most practical cases encoun-
tered, the estimate is reasonable. A table of these probable efficiencies
10
is generated for each set. If the set appears in different subscripts,
then on the second occurrence the new estimate is set to the minimum of
the previous and present estimates.
When the end of the assignment statement is reached, the table
of probable efficiencies is sorted and the result of this determines the
order in which the indicies will vary. In the example K will be the
index chosen to vary across the PE's because the set II is known to be
small (6 elements) and the declaration of KK holds the probability of it
being fairly large. Now an outer loop must be compiled to generate sequen-
tially the elements of II. Finally, the remainder of the statement is
compiled. The effect of the code that is compiled for the example assign-
ment statement follows.
One local data buffer location is set aside as an index to the
mode words of KK. Four more locations are set aside for the base addres-
ses of the subblocks of the arrays A and B. The first mode word for KK
is loaded and the leading ones detector is used to set the first value
of K. This value, plus the base address of A, plus 1, plus the indexed
set 0, 1, 2, ..., 63 in the PE index registers is used to access the
first column of A. In a similar manner the address for the first row
of B is fetched, loaded into RGR and a route left one PE is performed.
The addition is executed and the first mode word for KK is used to store
the result in A. Now the same process is repeated for the next subblock
of A, except that the mode pattern for KK must be ended with a word having
36 l's followed by 28 0's, because the second subblock of A is only 36
11
words wide. Additional complications, such as pairwise SIM control
specification, small subarrays, and SIM blocks add to the complexity,
but not to the substance, of the algorithm outlined above.
2.k Tables Involved in Assignment Statement Analysis
The different types of data structures, indexing and arithmetic
make the process of analyzing an assignment statement fairly complex.
The initial analysis is done by constructing a number of interlinked
tables. These are used to do some final analysis and ultimately compile
code.
The structure of these tables is complicated and not terribly
interesting. What follows is a detailed description of them for the
purpose of those who find it necessary to work with them directly.
A number of processes involved in assignment statement analysis
is iterative; i.e., require an unspecified number of passes over parts
of the assignment statement. For this and other reasons the H for an
assignment statement is stored in an array called ARITHSTACK. Entries
are made in ARITHSTACK via the macros PUSH and OPRPUSH. These provide
the facility for accessing the last two operands by stacking up pointers
in the top of ARITHSTACK. Thus, there are two pointers associated with
ARITHSTACK. One points to the next free location from the bottom of the
stack (ARITHSTACKPTR) and the other points to the next free location from
the top of the stack (PTRARITHSTACKPTR) . It is always possible to access
the last two operators in ARITHSTACK while it is being built. They are:
12
ARITHSTACK [MITHSTACK[PTRARITHSTACKPTR] ]
and ARITHSTACK [ARITHSTACK[PTRARITHSTACKPTR+1]] .
(Macros are provided for obtaining the two operands.)
This is necessary "because, when an arithmetic operator (like +) is
encountered, information must be generated which is a function of its
two operands.
In the cartesian product form of SIM control, each index set
is ordinarily varied independently; i.e., one index set will vary across
the PE's and others will form nested loops. In the comma [3] form of
SIM control, two index sets vary together or elements of both are used
together across the PE's. A similar thing happens with small subarrays.
Say we have 8 subarrays, 8 X N each stored across the PE's. (See Figure
1.) We wish to use more than 8 PE's at a time; therefore, we must use
all indicies for both the first and second subscript at once, and the
indicies can be thought of as varying together.
In compiling code for an assignment statement, after it has
been decided in which order to vary the index sets involved, code must
be produced to separate the elements of the sets, or to provide for their
availability in the PE's. Once the elements of some sets are available,
it is desirable to compute any subexpression involving only these vari-
ables in the outermost loop. To do this efficiently, we keep track of
all occurrences of set linked variables and link together those variables
which must be varied together.
13
W en
PM VO
W CM
Ph m
WOO
PM
Pm
Ph
w o
Pn
c—
o
vo
o
t-
m
o
o
H
O
C—
o
H
o
O
co
H
m
o
H
t—
o
erf
O
cO
•
•
•
•
•
•
o
H
H
H
O
CO
O
cO
O
H
o
O
•
o
CO
O
CO
H
I
<3
PS
S-i
zs
w
•H
CO
ps
a)
11+
Three tables are provided specifically for the purpose of
analyzing the structure of sets within an assignment statement. LHSTAB
contains one entry for each group of sets that must be used together.
LHSSETTAB contains link lists of the members in each of these groups.
RANGTAB contains link lists of the value of SETREL [5] for those groups
of sets which must be treated as a unit. This is only necessary for
small subarrays as previously described. These tables are set up when
the IL code is first entered in ARITHSTACK. RANGTAB is initialized to 0.
Whenever a set linked variable is encountered, if the corresponding value
of SETREL is N, then the N-th element of RANGTAB is tested. If the result
is 0, then there have been no other occurrences of this set or other sets
that must be varied with it, and a new link list in LHSSETTAB must be set
up for this set as well as a new entry in LHSTAB. If it is nonzero, then
there already exists a list of references to sets which must be varied
with this set. RANGTABLHSLNK field of RANGTAB points to the element in
LHSTAB for this group of sets. The field LHSSETLK in LHSTAB points to
the element in LHSSETTAB that is the end of the list of sets. The new
entry in LHSSETTAB which points to the occurrence of the set linked vari-
able in ARITHSTACK is patched into the list with all pointers appropriately
updated.
In forming these tables, information is entered in ARITHSTACK
which provides some indication of how efficient it is for each occurrence
of a set or a variable linked to it to vary that set across the PE's.
This information consists of an estimate of the size of the set up to
the number of PE's and its density. Whenever an operator has as one or
15
both of its operands a set linked variable, the results of that operation
on the particular sets involved generates new efficiency ratings which
are stored with the operator in ARITHSTACK. For example, take:
FOR (I, J) SIM ([1,2,. ..,100] X [1,2,. ..,50]);
A[I,J] «- B[3 X I, J];
Assume we are working in one quadrant, and both A and B are skewed arrays,
The intermediate language code for this assignment statement will be:
SUBSCRIPTEDLEFTHANDSIDE
A
I
ENDOFSUBSCRIPT
J
ENDOFSUBSCRIPT
ENDOFSUBSCRIPTLIST
SUBSCRIPTEDPRIMARY
B
3
I
x
ENDOFSUBSCRIPT
J
ENDOFSUBSCRIPT
ENDOFSUBSCRIPTLIST
ENDOFARITHASSI GNMENT
16
When the second occurrence of I is entered in ARITHSTACK, a
size of 6U will be entered and a density of 1. When the multiply sign
is entered in ARITHSTACK, it will be given a set size of 6k and a set
density of one-third. When the end of subscript operator is encountered,
it is considered as operating on B and the result of the multiply expres-
sion and uses information about the array and the information stored with
the multiply operator to update the rating in LHSTAB that gives the effi-
ciency of doing that particular set group across the PE's. The ultimate
result of this analysis, for our example, will be to vary J across the
PE's.
2.5 Compiling Code From the Tables
The above mentioned tables are all built up by EXEC2 while
interpreting the intermediate language for a single assignment statement.
No code is generated during this process. The next step is to sort
LHSTAB by the efficiency ratings. We wish to vary the least efficient
sets in the outer loops and to compute all subexpressions in the outer-
most loop possible. The sort of LHSTAB provides the information neces-
sary to achieve the former objective and LHSSETTAB and AP.ITHSTACK allow
us to achieve the latter. For each entry in ARITHSTACK, three fields
are provided. One field points to the operator operating on this entry.
The other two fields point to the two operands of an operator and are
for operands. The compilation consists of N + 1 stages, where N is the
number of independent groups of sets; i.e., the number of entries in
LHSTAB. Each stage consists of two passes over part of ARITHSTACK.
17
A procedure called GETNEXT selects sequentially those elements of
ARITHSTACK which can be compiled, given what loops have already been set
up; i.e., what indicies are available. In our earlier example, as soon
as values of I are available, we can compute 3X1. The first pass of
each stage determines optimal PE register usage, and the second pass
finally generates code for all subexpressions that can be computed at
this stage. The N -t- 1st stage completes the compilation of the statement,
18
3. OPTIMIZING SIMPLE ASSIGNMENT STATEMENTS
It is clearly impossible to efficiently compile a single short
assignment statement for ILLIAC IV, but it is conceivable that a large
number of simple assignment statements could be integrated into a fairly
efficient ILLIAC IV program. Incorporating such a feature into a compiler
presents two basic problems. The first is an algorithm for efficiently
integrating a large number of interrelated assignment statements.
Ordinarily the simple assignment statements will be scattered throughout
the program. Also, many of the sequential calculations that are prime
targets for an integration scheme are likely to be embedded as subexpres-
sions in assignment statements containing SIM controlled variables.
Filtering out and gathering together these candidates for the integration
scheme constitutes the second problem.
Figure 2 contains a set of assignment statements and their
associated tree. No node on this tree can be calculated until all nodes
on subbranches have been calculated. The method of computing such a tree
on ILLIAC IV involves first mapping assignment statements into PE's, in
a more or less arbitrary manner. The assignment statements are restricted
to a small number of operations like addition, subtraction, multiplication
and division. ILLIAC IV can only perform one of these operations at a
time. A count of the number of PE's that can take advantage of each of
these operations is made and that operation which will be executed by
the most PE's is the one that code is compiled for. Then the PE counts
for all operations are revised and the process continues until all
19
A «- B +■ C X D
E «- L + B - C
F «- G + H X I
K *- A + E + F
Figure 2. A set of interrelated assignment statements
and their tree structure.
20
calculations have been performed. A similar algorithm is used to do
routing to bring the results computed in one PE to the PE's where they
are needed. This algorithm is invoked whenever the number of PE's eli-
gible for any operation falls below a certain limit.
The problem of gathering together assignment statements for
processing by this method is many faceted. What is desired is a rearange-
ment of the program where simple assignment statements, simple subexpres-
sions, and simple expressions generated by the compiler, like address
calculation, have been brought together at several collection points.
To rearrange code in this manner requires an extensive analysis of the
overall program to determine what subexpression and statements can be
moved, and how far.
This analysis is carried out at the intermediate language level.
The collection points are determined to be at the beginning of blocks,
subexpressions are moved as physically high up in the code as possible,
except that they are not moved past a block head unless they can be moved
to the head of an outer block. The method produces a number of bonuses.
Calculations inside loops tend to be moved outside when logically per-
missible. Thus, it is profitable to move nonsimple subexpressions also.
Further, duplicate subexpressions can easily be eliminated because they
tend to gather at the same point. Finally, for each block a record is
made of what variables are nondynamic within that block. Thus, in Pass
2, any expressions generated using these variables can be added to the
collection of subexpressions at the beginning of the appropriate block.
At the head of this block, a transfer to the end of the block is compiled,
21
and when all code in the body of the block has been generated, the
complete collection of assignment statements is compiled followed by a
transfer back to the beginning of the block.
22
k. CONCLUSION
The problem of generating efficient code for ILLIAC IV from
a high level language similar to ALGOL requires considerably more analy-
sis of each assignment statement than is necessary for conventional
machines. Predictions about the overall efficiency of the resulting
code are more difficult to make. Nonetheless, algorithms have been
devised which work reasonably well on a very large and general class of
problems, and these should allow a programmer to write reasonable code
with a minimal knowledge of ILLIAC IV and the details of TPANQUIL.
23
APPENDIX: A SAMPLE TRANQUIL PROGPAM
BEGIN
REAL SKEWED ARRAY A, B[0:100, 0:100];
INCSET JJ;
MONOSET 11(1) [27:6], KK(1) [100:100];
INTEGER I, J, K;
II - [2, 10, 13, 15, 81, 2*0;
JJ - [2, k, ..., 98];
FOR (I) SEQ (II) DO
BEGIN FOR (J) SIM (jj) DO
KK - SET (J:A[I,J] < B[J,I]);
FOR (K) SIM (KK) DO
A[I,K] *- A[l + 1,K] + B[I,K + 1]
END ;
FOR (I,K) SIM (II X KK) DO
A[I,K] «-A[l + 1,K] + B[I,K + 1]
END
TRANQUIL ARITHMETIC TABLES
2k
Jiidifl jz se
_i ii/i i»< l/> UJ >- _l ¥
JIl/>(t-
w?
►-
X
4
+
z
s
01UJH- < OCE
inujt- KUJ
25
LIST OF REFERENCES
[l] Wilhelmson, Robert Bernard, "Control Statement Syntax and Semantics
of a Language for Parallel Processors," M. S. Thesis in
Computer Science, Section 2.2. k, p. 20, January 19^9.
[2] Trout, Robert, "A BNF Like Language for the Descriptor of Syntax
Directed Compilers," M. S. Thesis in Computer Science,
January 19^9 •
[3] Wilhelmson, Robert Bernard, "Control Statement Syntax and Semantics
of a Language for Parallel Processors," M. S. Thesis in
Computer Science, Section 3.3.6, p. 60, January 1969.
[k] Muraoka, Yoichi, "Storage Allocation Algorithms in the Tranquil
Compiler," M. S. Thesis in Computer Science, p. 32,
January 1969.
[5] Wilhelmson, Robert Bernard, "Control Statement Syntax and Semantics
of a Language for Parallel Processors, " M. S. Thesis in
Computer Science, Section 3.3-5, p. 59, January 1969.
UNCLASSIFIED
Security Classification
DOCUMENT CONTROL DATA R&D
(Security claeelllcatlon ot title, body of abstract and Indawrnt annotation must be entered when the overall report Is clateltled
1. ORIGINATING ACTIVITY (Corporate author)
Department of Computer Science
University of Illinois
Urbana, Illinois 6l801
ami REPORT SECURITY C I. * Jjl F I C A TIOC
UNCLASSIFIED
2b. CROUP
3 REPORT TITLE
TRANQUIL ARITHMETIC
4. DESCRIPTIVE NOTES ( Type ot report ltd Ineluaire dates)
Research Report
5 AUTHOR(S) (Flrmt name, middle Initial, Imat name)
Paul Peter Budnik
». REPORT DATE
January 6, 19&9
7*. TOTAL NO. OP PACES
29
76. NO. OF REFS
M. CONTRACT OR GRANT NO.
U6-26-15-305
b. PROJECT NO.
USAF 30(602)klkk
•a. ORIGINATOR'S REPORT NUMBERtS)
DCS Report No. 296
•b. OTHER REPORT NOISI (Any other number* that may be aeelgned
Ihle report)
10. DISTRIBUTION STATEMENT
Qualified requesters may obtain copies of this report from DCS.
11. SUPPLEMENTARY NOTES
12. SPONSORING MILITARY ACTIVITY
Rome Air Development Center
Griffiss Air Force Base
Rome, New York 13M+O
13. ABSTRACT
The assignment statements allowed in Tranquil are described with
emphasis placed on writing efficient code. A description of the implemen-
tation of the assignment statement part of the compiler is given in con-
siderable detail and is likely to be of interest mainly to those who find
it necessary to correct, alter or make additions to the Tranquil Compiler.
3D ,?~..t473
UNCLASSIFIED
Security Classification
UNCLASSIFIED
Security Classification
KEY WO ROS
Tranquil Arithmetic
Set Assignment Statements
Boolean Assignment Statements
ROLE *T
ROUE WT
UNCLASSIFIED
Security Classification
; %