|
|
1.1 ! root 1: .nr PO .5i ! 2: .de B ! 3: .ft B ! 4: .. ! 5: .RP ! 6: .TL ! 7: The UNIX APL Interpreter -- UCSF Version ! 8: .AU ! 9: H. Ross Harvey ! 10: .AI ! 11: UCSF Computer Graphics Laboratory ! 12: .AB ! 13: The UNIX APL interpreter is an incremental `compiler' which ! 14: employs a multi-pass translator to produce an intermediate ! 15: code. This technique is much faster ! 16: than the normal interpretive method and requires less memory. ! 17: The action of the translator is visible ! 18: in only one way: poor run-time error reporting. ! 19: The UCSF APL version features a 50K byte workspace, a simple ! 20: file access procedure, character comparisons and an extended ! 21: set of I-beams. The interpreter itself has been made much more ! 22: reliable and the error messages have been improved. ! 23: .AE ! 24: .ND ! 25: .PP ! 26: UNIX APL is a very well written package containing all the ! 27: APL 360 operators plus execute, scan, and relational character ! 28: operators. UNIX APL does not have a trace feature or a state ! 29: indicator. ! 30: .NH 1 ! 31: Major Data Structures ! 32: .NH 2 ! 33: Overview ! 34: .PP ! 35: Functions are compiled when they are first referenced; ! 36: this compiled code is then stored in memory. Data always ! 37: resides in memory, although there is a facility for ! 38: reading and write files. The source ! 39: code to the functions is maintained in the disk-saved workspaces, ! 40: in the APL temporary file, and possibly as single user files. ! 41: The generated code usually consists of single-byte values ! 42: which are indices into the array \fBexop\fR. ! 43: This array contains the addresses of functions implementing the ! 44: APL operators. A reference to a variable will be specified by the ! 45: \fBNAME\fR ! 46: operator and the two-byte address of an \fBitem\fR or \fBnlist\fR ! 47: structure. A reference to a constant will be specified by the ! 48: \fBELID\fR or \fBCONST\fR operator and an eight-byte double constant. ! 49: .NH 2 ! 50: The Item and Nlist Structures ! 51: .PP ! 52: The item and nlist structures are: ! 53: .DS ! 54: .B ! 55: struct item { struct nlist { ! 56: char rank; char use; ! 57: char type; char type; ! 58: int size; int *itemp; ! 59: int index; char *namep; ! 60: data *datap; int label; ! 61: int dim[0]; }; ! 62: }; ! 63: .R ! 64: .DE ! 65: The \fBrank\fR element is precisly the APL rank of the variable. ! 66: The \fBtype\fR element may contain one status byte. ! 67: The \fBuse\fR element contains the same information as the type ! 68: element of the item structure. \fBItemp\fR usually points to ! 69: the item structure describing a variable or function whose name ! 70: is addressed by the \fBnamep\fR element. ! 71: If the nlist structure describes a function, then itemp will ! 72: be zero until the function is referenced and compiled; if ! 73: the nlist structure describes some other type of variable, itemp ! 74: will be zero until the variable has been set. ! 75: \fBSize\fR is the total number ! 76: of elements in the vector and index is an index into the ! 77: currently selected member. \fBDatap\fR points to the actual data ! 78: and dim[] (actually dim[rank]) naturally contains the various ! 79: dimensions of the object. ! 80: Since the \fBtype\fR field ! 81: indicates important information such as whether the data ! 82: can be destroyed, it is important to understand the ! 83: meaning of the different types. ! 84: .IP DA 10 ! 85: This indicates numeric data \fInot\fR associated with ! 86: some variable. This attribute is given to data which ! 87: exists only on the stack in some way as an intermediate ! 88: value. Objects of type \fBDA\fR may be overwritten if necessary ! 89: and \fBwill\fR be deallocated if they are found on the ! 90: stack after a line is executed. ! 91: .IP LV ! 92: \fBLV\fR indicates an \fBlvalue\fR or assignable quantity. This descriptor ! 93: declares that the element is the actual data of some variable. It ! 94: can not be overwritten or de-allocated. It also specifies that ! 95: the pointed-to structure is not an item structure at all ! 96: but is in fact the nlist structure. In this case, the ! 97: \fBuse\fR member will specify the actual data type ! 98: and the \fBitemp\fR member will point to an \fBitem\fR structure. ! 99: .IP CH ! 100: This indicates character data. ! 101: .IP QD ! 102: This is the \fBquad\fR variable. A reference to a quantity of this ! 103: type will cause the appropriate processing (an expression is read ! 104: and evaluated) and result in an element of type \fBDA\fR being placed ! 105: on the stack. ! 106: .IP QQ ! 107: \fBQQ\fR refers to a quote-quad variable. A line of text is read from the ! 108: terminal and placed (as type \fBCH\fR) on the stack. ! 109: .IP IN ! 110: This is integer data. This type is not fully supported so it ! 111: works only when the next operator is expecting an integer. ! 112: .IP EL ! 113: This data type is used for data entered literally in function ! 114: calls. \fBEL\fR data is deallocated in the UCSF version. ! 115: .IP "NF MF DF" ! 116: These types specify functions which are to be called with ! 117: 0, 1 or 2 arguments. ! 118: .NH 2 ! 119: The Env Structure ! 120: .PP ! 121: The \fBenv\fR structure contains the index origin, printing ! 122: precision, terminal width, and fuzz factor associated with the ! 123: current workspace. When a saved workspace is loaded, these ! 124: parameters are restored to their state at the time the workspace ! 125: was saved. ! 126: .NH 2 ! 127: The Nlist Array ! 128: .PP ! 129: The \fBnlist\fR structure described above is found in an ! 130: array of structures which is also called \fBnlist\fR. ! 131: This array is maintained by ???????. ! 132: .NH 2 ! 133: The Labldefs Structure ! 134: .PP ! 135: The \fBlabldefs\fR structure is the start of a linked list ! 136: containing label-name/line-number pairs. This list is allocated ! 137: dynamically and is used only when a function is being compiled. ! 138: .NH 2 ! 139: The Idx Structure ! 140: .PP ! 141: The \fBidx\fR structure is used ????????. ! 142: .NH 2 ! 143: The Stack ! 144: .PP ! 145: Most operators take their source operands from the top ! 146: of the internal stack. Most operators place their ! 147: results on the top of the stack. In addition, local ! 148: variables require space on the stack at each entrance ! 149: to the function with which they are bound. ! 150: The principle objects ! 151: involved here are: ! 152: .DS ! 153: .I ! 154: struct item **sp, **stack, **staktop; ! 155: .R ! 156: .DE ! 157: The address of a memory block of size \fIsizeof(sp)*STKS\fR is ! 158: initially assigned to \fBstack\fR. The variable \fBsp\fR ! 159: points the the top of the stack. ! 160: A call to the machine-coded function \fBpush(\fIaddress\fB)\fR ! 161: will place \fIaddress\fR on top of the stack, incrementing ! 162: \fBsp\fR appropriatly. \fBStaktop\fR marks the top of the ! 163: current stack; if \fBpush(...)\fR finds that \fBsp\fR ! 164: has passed \fBstaktop\fR, a call to \fBnewstak()\fR will ! 165: allocate a new (contiguous) stack that is \fBSTKS\fR words ! 166: larger. The information on the old stack is copied to the ! 167: new one; \fBstack\fR is assigned the address of the new ! 168: stack, and the memory occupied by the old stack is freed. ! 169: .PP ! 170: The function \fBReset\fR is called when APL returns ! 171: to the top command level or when any error is detected. ! 172: \fBReset\fR frees the current stack and allocates a ! 173: new stack of size \fBSTKS\fR. This is done to ensure ! 174: the integrity of the stack in the face of errors such ! 175: as \fIWS EXCEEDED\fR or \fBINTERRUPT\fR. In addition, ! 176: recursive or deeply nested function calls ! 177: will cause a large amount of memory to be allocated to ! 178: the stack. It is considered desireable to reset the stack ! 179: to a small default value when possible. This prevents ! 180: intentional or accidental recursion from impairing ! 181: the operation of the interpreter by permanently allocating ! 182: a large block of memory.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.