Movatterモバイル変換


[0]ホーム

URL:


Jump to content
WikipediaThe Free Encyclopedia
Search

Stack-oriented programming

From Wikipedia, the free encyclopedia
(Redirected fromStack-oriented programming language)
Programming paradigm that relies on a stack machine model
"Stack-based" redirects here. For other uses, seeStack-based memory allocation.
This article has multiple issues. Please helpimprove it or discuss these issues on thetalk page.(Learn how and when to remove these messages)
This articleneeds additional citations forverification. Please helpimprove this article byadding citations to reliable sources. Unsourced material may be challenged and removed.
Find sources: "Stack-oriented programming" – news ·newspapers ·books ·scholar ·JSTOR
(December 2009) (Learn how and when to remove this message)
This article'slead sectionmay need to be rewritten. The reason given is:Reflect the new title without "language". Please review thelead guide and helpimprove the lead of this article if you can.(June 2018) (Learn how and when to remove this message)
This article'stone or style may not reflect theencyclopedic tone used on Wikipedia. See Wikipedia'sguide to writing better articles for suggestions.(March 2019) (Learn how and when to remove this message)
(Learn how and when to remove this message)

Stack-oriented programming is aprogramming paradigm that relies on one or morestacks to manipulatedata 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 inpostfix orReverse Polish notation: arguments or parameters for a command are listed before that command. For example, postfix notation would be written2, 3, multiply instead ofmultiply, 2, 3 (prefix orPolish notation), or2 multiply 3 (infix notation). The programming languagesForth,Factor,RPL,PostScript,BibTeX style design language[2] and manyassembly languages fit this paradigm.

Stack-based algorithms manipulate data by popping data from and pushing data to the stack. Operators govern how the stack manipulatesdata. 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 thelanguage model allows expressions and programs to be interpreted simply.

Stack-based algorithms

[edit]

PostScript is an example of a postfix stack-based language. An expression example in this language is2 3 mul('mul' being the command for the multiplication operation). Calculating the expression involves understanding how stack orientation works.

Stack orientation can be presented as the following conveyor belt analogy. At the end of a conveyor belt (theinput), plates marked2,3, andmul are placed in sequence. The plate at the end of the conveyor (2) can be taken, however other plates cannot be accessed until the plate at the end is removed. The plates can only be stored in a stack, and can only be added or removed from atop the stack, not from the middle or bottom. Blank plates (and a marker) can be supplied and plates can be permanently discarded.

Take plate2 and put it on the stack, then take plate3 and put it on the stack. Next, take themul plate. This is an instruction to perform. Then, take the top two plates off the stack, multiply their labels (2 and3), and write the result (6) on a new plate. Discard the two old plates (2 and3) and the platemul, and put the new plate on the stack. With no more plates remaining on the conveyor, the result of the calculation (6) is shown on the plate atop the stack.

This is a very simple calculation. What if a more complex calculation is needed, such as(2 + 3) × 11 + 1? If it is first written in postfix form, that is,2 3 add 11 mul 1 add,the calculation can be performed in exactly the same manner and achieve the correct result. The steps of the calculation are shown in the table below. Each column shows an input element (the plate at the end of the conveyor), and the contents of the stack after processing that input.

Input23add11mul1add
Stack23
2
511
5
551
55
56

After processing all the input, the stack contains56, which is the answer.

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, termedpopping, and putting data back atop the stack, termedpushing. Any expression that can be writtenconventionally, 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 manipulation

[edit]

Since 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 aredup, to duplicate the element atop the stack,exch (orswap), to exchange elements atop the stack (the first becomes second and the second becomes first),roll, to cyclically permute elements in the stack or on part of the stack,pop (ordrop), to discard the element atop the stack (push is implicit), and others. These become key in studying procedures.

Stack effect diagrams

[edit]

As 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 )

Thefib function below is described:

fib( n -- n' )

It is equivalent topreconditions andpostconditions inHoare logic. Both comments may also be referenced asassertions, though not necessarily in the context of Stack-based languages.

PostScript stacks

[edit]

PostScript and some other stack languages have other separate stacks for other purposes.

Variables and dictionaries

[edit]

The 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 holdsdictionaries ofkey-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/, so/x is a name data object which can be associated with, for example, the number42. Thedefine command isdef, so

/x 42 def

associates with the namex with the number42 in the dictionary atop the stack. A difference exists between/x andx – the former is a data object representing a name, andx stands for what is defined under/x.

Procedures

[edit]

A procedure in a stack-based programming language is treated as a data object in its own right. In PostScript, procedures are denoted between{ and}.

For example, in PostScript syntax,

{ dup mul }

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 procedures

[edit]

Procedures often take arguments. They are handled by the procedure in a very specific way, different from that of other programming languages.

To examine aFibonacci number program in PostScript:

/fib{dupdup1eqexch0eqornot{dup1subfibexch2subfibadd}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 offib(4) :

                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
(recursive call here)
                stack: 4 F(3)   exch                stack: F(3) 4   2 sub                stack: F(3) 2   fib
(recursive call here)
                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/a exch def construct. For example,{/n exch def n n mul}

is a squaring procedure with a named variablen. Assuming that/sq {/n exch def n n mul} def and3 sq is called, the proceduresq is analysed in the following way:

               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 flow

[edit]

As there exist anonymous procedures, flow control can arise naturally. Three pieces of data are required for anif-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,

23gt{(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 model

[edit]

The simple model provided in a stack-oriented language allows expressions and programs to be interpreted simply and theoretically evaluated much faster, since nosyntax analysis needs to be done butlexical 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 byoverriding 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, theshow page operator can be overridden with a custom one that applies a certain style to the page, instead of having to define a custom operator or repeat code to generate the style.

See also

[edit]

References

[edit]
  1. ^Luerweg, T. (2015). Stack based programming paradigms. Concepts of Programming Languages–CoPL’15, 33.
  2. ^Oren Patashnik,Designing BibTeX styles(PDF)[dead link]
Imperative
Structured
Object-oriented
(comparison,list)
Declarative
Functional
(comparison)
Dataflow
Logic
DSL
Concurrent,
distributed,
parallel
Metaprogramming
Separation
of concerns
Level
Generation
Retrieved from "https://en.wikipedia.org/w/index.php?title=Stack-oriented_programming&oldid=1265415561"
Categories:
Hidden categories:

[8]ページ先頭

©2009-2025 Movatter.jp