Stack-oriented programming
Stack-oriented programming is a programming paradigm that relies on one or more stacks to manipulate data and/or pass parameters. Programming constructs in other programming languages need to be modified for use in a stack-oriented system.[1] Most stack-oriented languages operate in postfix or Reverse Polish notation: arguments or parameters for a command are listed before that command. For example, postfix notation would be written Stack-based algorithms manipulate data by popping data from and pushing data to the stack. Operators govern how the stack manipulates data. To emphasize the effect of a statement, a comment is often used showing the top of the stack before and after the statement; this is known as the stack effect diagram. Some stack-oriented languages may use multiple stacks for different purposes; for example, PostScript uses separate stacks for variables, dictionaries, procedures, some typical procedures, and control flow statements. Analysis of the language model allows expressions and programs to be interpreted simply. Stack-based algorithmsPostScript is an example of a postfix stack-based language. An expression example in this language is Stack orientation can be presented as the following conveyor belt analogy. At the end of a conveyor belt (the input), plates marked Take plate This is a very simple calculation. What if a more complex calculation is needed, such as
After processing all the input, the stack contains From this, the following can be concluded: a stack-based programming language has only one way to handle data, by taking one piece of data from atop the stack, termed popping, and putting data back atop the stack, termed pushing. Any expression that can be written conventionally, or in another programming language, can be written in postfix (or prefix) form and thus be amenable to being interpreted by a stack-oriented language. Stack manipulationSince the stack is the key means to manipulate data in a stack-oriented language, such languages often provide some sort of stack manipulation operators. Commonly provided are Stack effect diagramsAs an aid to understanding the effect of the statement, a short comment is used showing the top of the stack before and after the statement. The top of the stack is rightmost if there are multiple items. This notation is commonly used in the Forth language, where comments are enclosed in parentheses. ( before -- after )
For example, the basic Forth stack operators are described: dup ( a -- a a )
drop ( a -- )
swap ( a b -- b a )
over ( a b -- a b a )
rot ( a b c -- b c a )
The fib ( n -- n' )
It is equivalent to preconditions and postconditions in Hoare logic. Both comments may also be referenced as assertions, though not necessarily in the context of Stack-based languages. PostScript stacksPostScript and some other stack languages have other separate stacks for other purposes. Variables and dictionariesThe evaluation of different expressions has already been analysed. The implementation of variables is important for any programming language, but for stack-oriented languages, it is of special concern, as there is only one way to interact with data. The way variables are implemented in stack-oriented languages such as PostScript usually involves a separate, specialized stack which holds dictionaries of key-value pairs. To create a variable, a key (the variable name) must be created first, with which a value is then associated. In PostScript, a name data object is prefixed with a
associates with the name ProceduresA procedure in a stack-based programming language is treated as a data object in its own right. In PostScript, procedures are denoted between For example, in PostScript syntax,
represents an anonymous procedure to duplicate what is on the top of the stack and then multiply the result – a squaring procedure. Since procedures are treated as simple data objects, names with procedures can be defined. When they are retrieved, they are executed directly. Dictionaries provide a means of controlling scoping, as well as storing definitions. Since data objects are stored in the top-most dictionary, an unexpected ability arises naturally: when looking up a definition from a dictionary, the topmost dictionary is checked, then the next, and so on. If a procedure is defined that has the same name as another already defined in a different dictionary, the local one will be called. Anatomy of some typical proceduresProcedures often take arguments. They are handled by the procedure in a very specific way, different from that of other programming languages. To examine a Fibonacci number program in PostScript: /fib
{
dup dup 1 eq exch 0 eq or not
{
dup 1 sub fib
exch 2 sub fib
add
} if
} def
A recursive definition is used on the stack. The Fibonacci number function takes one argument. First, it is tested for being 1 or 0. Decomposing each of the program's key steps, reflecting the stack, assuming calculation of stack: 4 dup stack: 4 4 dup stack: 4 4 4 1 eq stack: 4 4 false exch stack: 4 false 4 0 eq stack: 4 false false or stack: 4 false not stack: 4 true Since the expression evaluates to true, the inner procedure is evaluated. stack: 4 dup stack: 4 4 1 sub stack: 4 3 fib
stack: 4 F(3) exch stack: F(3) 4 2 sub stack: F(3) 2 fib
stack: F(3) F(2) add stack: F(3)+F(2) which is the expected result. This procedure does not use named variables, purely the stack. Named variables can be created by using the is a squaring procedure with a named variable stack: 3 /n exch stack: /n 3 def stack: empty (it has been defined) n stack: 3 n stack: 3 3 mul stack: 9 which is the expected result. Control and flowAs there exist anonymous procedures, flow control can arise naturally. Three pieces of data are required for an if-then-else statement: a condition, a procedure to be done if the condition is true, and one to be done if the condition is false. In PostScript for example, 2 3 gt { (2 is greater than three) = } { (2 is not greater than three) = } ifelse
performs the near equivalent in C: if (2 > 3) { printf("2 is greater than three\n"); } else { printf("2 is not greater than three\n"); }
Looping and other constructs are similar. Analysis of the language modelThe simple model provided in a stack-oriented language allows expressions and programs to be interpreted simply and theoretically evaluated much faster, since no syntax analysis needs to be done but lexical analysis. The way such programs are written facilitates being interpreted by machines, which is why PostScript suits printers well for its use. However, the slightly artificial way of writing PostScript programs can form an initial barrier to understanding stack-oriented languages such as PostScript. While the ability to shadow by overriding inbuilt and other definitions can make programs hard to debug, and irresponsible use of this feature can cause unpredictable behaviour, it can simplify some functions greatly. For example, in PostScript use, the See alsoReferences
|
Portal di Ensiklopedia Dunia