Abstract machine

Theoretical computer used for defining a model of computation

Not to be confused with Virtual machine.

An abstract machine is a computer science theoretical model that allows for a detailed and precise analysis of how a computer system functions.[1] It is analogous to a mathematical function in that it receives inputs and produces outputs based on predefined rules. Abstract machines vary from literal machines in that they are expected to perform correctly and independently of hardware.[2] Abstract machines are “machines” because they allow step-by-step execution of programmes; they are “abstract” because they ignore many aspects of actual (hardware) machines.[3] A typical abstract machine consists of a definition in terms of input, output, and the set of allowable operations used to turn the former into the latter. They can be used for purely theoretical reasons as well as models for real-world computer systems.[2] In the theory of computation, abstract machines are often used in thought experiments regarding computability or to analyse the complexity of algorithms.[3] This use of abstract machines is connected to the field of computational complexity theory, such as finite state machines , Mealy machines, push-down automata, and Turing machines.[4]

## Contents

* 1 Classification
* 2 Implementation of an Abstract Machine
* 3 Programming Language Implementation
* 3.1 Imperative Programming Languages
* 3.2 Object-oriented Programming Languages
* 3.3 String Processing Languages
* 3.4 Functional Programming Languages
* 3.5 Logic Programming Languages
* 4 Structure of an Abstract Machine
* 4.1 Operations for processing primitive data
* 4.2 Operations and data structures for sequence control
* 4.3 Operations and data structures for controlling data transfers
* 4.4 Operations and data structures for memory management
* 5 Hierarchies of Abstract Machines
* 6 See also
* 7 References
* 8 Further reading

## Classification[edit | edit source]

Abstract machines are generally classified into two types depending on the number of operations they are allowed to undertake at any one time: deterministic abstract machines and non-deterministic abstract machines.[2] A deterministic abstract machine is a system in which a particular beginning state or condition always yields the same outputs. There is no randomness or variation in how inputs are transformed into outputs.[5] Meanwhile, a non-deterministic abstract machine can provide various outputs for the same input on different executions.[2] In contrast to a deterministic algorithm, which gives the same result for the same input regardless of the number of iterations, a non-deterministic algorithm takes various paths to arrive to different outputs.[6] Non-deterministic algorithms are helpful for obtaining approximate answers when deriving a precise solution using a deterministic approach is difficult or costly.[7]

File:2-state 3-symbol Turing Machine.png

A run of a Turing machine.

The Turing machine, for example, is one of the most fundamental abstract machines in computer science.[2] This is a machine that can conduct operations on a tape (a string of symbols) of any length. It includes instructions for both modifying the symbols and changing the symbol that it is based on. The single command on a rudimentary Turing computer would be "convert symbol to 1 then move right", and this machine would only produce a string of 1s.[8] This basic Turing machine is deterministic, however nondeterministic Turing machines that can execute several actions given the same input may also be built.[2]

## Implementation of an Abstract Machine[edit | edit source]

Any implementation of an abstract machine in the case of physical implementation (in hardware) use some kind of physical device (mechanical, electronic, etc) to execute the instructions of a programming language. Abstract machine however can also be implemented in software or firmware at levels intermediate the abstract machine and underlying physical device.[9]

* Implementation in Hardware: The direct implementation of abstract machine in hardware is a matter of using physical devices such as memory, arithmetic and logic circuits, buses, etc., to implement a physical machine whose machine language coincides with the programming language. Once constructed, it would be virtually hard to change such a machine.[9] A computer processor (CPU) may be thought of as a concrete hardware realisation of an abstract machine, particularly the processor's design.[10]

* Simulation Using Software: Implementing an abstract machine with software entails writing programmes in a different language to implement the data structures and algorithms needed by the abstract machine. This provides the most flexibility since programmes implementing abstract machine constructs can be easily changed.[9] An abstract machine implemented as a software simulation, or for which an interpreter exists, is called a virtual machine.[11]

* Emulation Using Firmware: Firmware implementation sits between hardware and software implementation. It consists of microcode simulations of data structures and algorithms for abstract machines.[9] Microcode allows a computer programmer to write machine instructions without needing to fabricate electrical circuitry.[12]

## Programming Language Implementation[edit | edit source]

The term "machine" refers to a computing machine, which is a physical machine that executes algorithms that have been sufficiently formalised for the machine to "understand". An abstract machine is, intuitively, nothing more than an abstraction of the idea of a physical computer.[13] For actual execution, algorithms must be properly formalised using the constructs offered by a programming language. This implies that the algorithms to be executed must be expressed using programming language instructions.[3] The syntax of a programming language enables the construction of programs using a finite set of constructs known as instructions. Most abstract machines share a program store and a state, which often includes a stack and registers.[9][14] In digital computers, the stack is simply a memory unit with an address register that can count only positive integers (after an initial value is loaded into it). The address register for the stack is known as a stack pointer because its value always refers to the top item on the stack.[15] The program consists of a series of instructions, with a stack pointer indicating the next instruction to be performed. When the instruction is completed, a stack pointer is advanced. This fundamental control mechanism of an abstract machine is also known as its execution loop.[3] Thus, an abstract machine for programming language is any collection of data structures and algorithms capable of storing and running programs written in the programming language. It bridges the gap between the high level of a programming language and the low level of an actual machine by providing an intermediate language step for compilation. An abstract machine's instructions are adapted to the unique operations necessary to implement operations of a certain source language or set of source languages.[9]

### Imperative Programming Languages[edit | edit source]

In the late 1950s, the Association for Computing Machinery (ACM) and other allied organisations developed many proposals for Universal Computer Oriented Language (UNCOL), such as Conway's machine. The UNCOL concept is good, but it has not been widely used due to the poor performance of the generated code. In many areas of computing, its performance will continue to be an issue despite the development of the Java Virtual Machine in the late 1990s.[16] Algol Object Code (1964), P4-machine (1976), UCSD P-machine (1977), and Forth (1970) are some successful abstract machines of this kind.[3]

### Object-oriented Programming Languages[edit | edit source]

Abstract machines for object-oriented programming languages are often stack-based and have special access instructions for object fields and methods. In these machines, memory management is often implicit performed by a garbage collector (memory recovery feature built into programming languages).[17] Smalltalk-80 (1980), Self (1989), and Java (1994) are examples of this implementation.[3]

### String Processing Languages[edit | edit source]

A string processing language is a computer language that focuses on processing strings rather than numbers. There have been string processing languages in the form of command shells, programming tools, macro processors, and scripting languages for decades.[18] Using a suitable abstract machine has two benefits: increased execution speed and enhanced portability. Snobol4 and ML/I are two notable instances of early string processing languages that use an abstract machine to gain machine independence.[3]

### Functional Programming Languages[edit | edit source]

File:Machine de Krivine.jpg

Pictorial representation of a Krivine machine.

The early abstract machines for functional languages, including the SECD machine (1964) and Cardelli's Functional Abstract Machine (1983), defined strict evaluation, also known as eager or call-by-value evaluation,[3] in which function arguments are evaluated before to the call and precisely once. In recent years, the majority of research has been on lazy (or call-by-need) evaluation,[19] such as the G-machine (1984), Krivine machine (1985), and Three Instruction Machine (1986), in which function arguments are evaluated only if necessary and at most once. One reason is because effective implementation of strict evaluation is now well-understood, therefore the necessity for an abstract machine has diminished.[3]

### Logic Programming Languages[edit | edit source]

Predicate calculus (first order logic) is the foundation of logic programming languages. The most well-known logic programming language is Prolog. The rules in Prolog are written in a uniform format known as universally quantified 'Horn clauses', which means to begin the calculation that attempts to discover a proof of the objective. The Warren Abstract Machine WAM (1983),[3] which has become the de facto standard in Prolog program compilation, has been the focus of most study. It provides special purpose instructions such as data unification instructions and control flow instructions to support backtracking (searching algorithm).[20]

## Structure of an Abstract Machine[edit | edit source]

A generic abstract machine is made up of a memory and an interpreter. The memory is used to store data and programs, while the interpreter is the component that executes the instructions included in programs.[9]

File:The structure of an abstract machine.png

The structure of an abstract machine

The interpreter must carry out the operations that are unique to the language it is interpreting. However, given the variety of languages, it is conceivable to identify categories of operations and an "execution mechanism" shared by all interpreters. The interpreter's operations and accompanying data structures are divided into the following categories:[9][21]

1. Operations for processing primitive data:
2. Operations and data structures for controlling the sequence of execution of operations;
3. Operations and data structures for controlling data transfers;
4. Operations and data structures for memory management.

### Operations for processing primitive data[edit | edit source]

Even an abstract machine operates by executing algorithms, therefore it must contain operations for manipulating primitive data types such as strings and integers.[9] For example, integers (integer or real) are nearly universally considered basic data for both physical abstract machines and the abstract machines used by many programming languages. The machine immediately does the different arithmetic operations necessary (addition, multiplication, etc.)[22].

### Operations and data structures for sequence control[edit | edit source]

Operations and structures for "sequence control" allow controlling the execution flow of program instructions. When certain conditions are met, it is necessary to change the typical sequential execution of a program.[9] Therefore, the interpreter employs data structures (such as those used to store the address of the next instruction to execute) that are modified by operations distinct from those used for data manipulation (for example, operations to update the address of the next instruction to execute).[23]

### Operations and data structures for controlling data transfers[edit | edit source]

Data transfer operations are used to control how operands and data are transported from memory to the interpreter and vice versa. These operations deal with the store and the retrieval order of operands from the store.[9]

### Operations and data structures for memory management[edit | edit source]

Memory management is concerned with the operations performed in memory to allocate data and applications. In the abstract machine, data and programmes can be held indefinitely, or in the case of programming languages, memory can be allocated or deallocated using a more complex mechanism.[9]

## Hierarchies of Abstract Machines[edit | edit source]

File:A hierarchy of abstract machines.png

A hierarchy of abstract machines

Abstract machine hierarchies are often employed, in which each machine uses the functionality of the level immediately below and adds additional functionality of its own to meet the level immediately above.[9] A hardware computer, constructed with physical electronic devices, can be added at the most basic level. Above this level, the abstract microprogrammed machine level may be introduced. The abstract machine supplied by the operating system, which is implemented by program written in machine language, is located immediately above (or directly above the hardware if the firmware level is not there).[9][24] On the one hand, the operating system extends the capability of the physical machine by providing higher-level primitives that are not available on the physical machine (for example, primitives that act on files). The host machine is formed by the abstract machine given by the operating system, on which a high-level programming language is implemented using an intermediary machine, such as the Java Virtual machine and its bytecode language.[16][25] The level given by the abstract machine for the high-level language (for example, Java) is not usually the final level of hierarchy. At this point, one or more applications that deliver additional services together may be introduced. A "web machine" level, for example, can be added to implement the functionalities necessary to handle Web communications (communications protocols or HTML code presentation). The "Web Service" level is located above this, and it provides the functionalities necessary to make web services communicate, both in terms of interaction protocols and the behaviour of the processes involved.[26] At this level, entirely new languages that specify the behaviour of so-called "business processes" based on Web services may be developed (an example is the Business Process Execution Language). Finally, a specialised application can be found at the highest level (for example, E-commerce) which has very specific and limited functionality.[9]

## See also[edit | edit source]

* Abstraction (computer science)
* Abstract interpretation
* Bulk synchronous parallel
* Discrete time
* Finite-state machine
* Flynn's taxonomy
* Formal models of computation
* Krivine machine
* Model of computation
* Parallel random-access machine, the de facto standard model.[27]
* SECD machine
* State space
* Turing machine

## References[edit | edit source]

1. ^ Weisstein, Eric W. "Abstract Machine". mathworld.wolfram.com. Retrieved 2022-05-16.
2. ^ a b c d e f "What is an Abstract Machine?". EasyTechJunkie. Retrieved 2022-05-16.
3. ^ a b c d e f g h i j Diehl, Stephan; Hartel, Pieter; Sestoft, Peter (May 2000). "Abstract machines for programming language implementation". Future Generation Computer Systems. 16 (7): 739–751. doi:10.1016/S0167-739X(99)00088-6.
4. ^ "9.1.1: Finite-State Machine Overview". Engineering LibreTexts. 2021-04-29. Retrieved 2022-05-31.
5. ^ "What is Deterministic System? - Definition from Techopedia". Techopedia.com. Retrieved 2022-05-30.
6. ^ Stearns, Richard E. (January 2003). "Deterministic versus nondeterministic time and lower bound problems". Journal of the ACM. 50 (1): 91–95. doi:10.1145/602382.602409. ISSN 0004-5411. S2CID 2194820.
7. ^ Armoni, Michal; Gal-Ezer, Judith (December 2007). "Non-determinism: An abstract concept in computer science studies". Computer Science Education. 17 (4): 243–262. Bibcode:2007CSEd...17..243A. doi:10.1080/08993400701442885. ISSN 0899-3408. S2CID 41928460.
8. ^ Gill, John (December 1977). "Computational Complexity of Probabilistic Turing Machines". SIAM Journal on Computing. 6 (4): 675–695. doi:10.1137/0206049. ISSN 0097-5397.
9. ^ a b c d e f g h i j k l m n o Gabbrielli, Maurizio; Martini, Simone (2010), "Abstract Machines", Programming Languages: Principles and Paradigms, London: Springer London, pp. 1–25, doi:10.1007/978-1-84882-914-5_1, ISBN 978-1-84882-913-8, retrieved 2022-05-16
10. ^ Bair, Ray; Chien, Andrew; Cook, Jeanine; Donofrio, Dave; Grider, Gary; Kuehn, Jeff; Moore, Shirley; Shalf, John; Vetter, Jeff (2018-02-01). "Hardware Evaluation: Abstract Machine Models and Proxy Architectures for Exascale Computing". doi:10.2172/1733300. OSTI 1733300. `{{cite journal}}`: Cite journal requires `|journal=` (help)
11. ^ "abstract machine from FOLDOC". foldoc.org. Retrieved 2021-08-07.
12. ^ Gee, J.; Melvin, S. W.; Patt, Y. N. (1986). "The implementation of Prolog via VAX 8600 microcode". Proceedings of the 19th Annual Workshop on Microprogramming - MICRO 19. New York, New York, USA: ACM Press: 68–74. doi:10.1145/19551.19538. ISBN 081860736X. S2CID 3846072.
13. ^ "abstract machine". Oxford Reference. Retrieved 2022-05-16.
14. ^ García-Martín, Julio Manuel; Sutil-Martin, Miguel (1999-08-15). "A Pattern for Designing Abstract Machines". doi:10.13140/RG.2.1.3680.5203. `{{cite journal}}`: Cite journal requires `|journal=` (help)
15. ^ upscfever.com (2017-01-25). "Computer Organization and Architecture (Stack Organization) - UPSC FEVER". upscfever.com. Retrieved 2022-05-31.
16. ^ a b Tyson, Matthew (2020-01-17). "What is the JVM? Introducing the Java Virtual Machine". InfoWorld. Retrieved 2022-05-31.
17. ^ "What is Object-Oriented Programming (OOP)?". SearchAppArchitecture. Retrieved 2022-05-31.
18. ^ "Design considerations for string processing languages", A Study in String Processing Languages, Lecture Notes in Computer Science, Berlin, Heidelberg: Springer Berlin Heidelberg, vol. 205, pp. 17–37, 1985, doi:10.1007/3-540-16041-8_2, ISBN 978-3-540-16041-0, retrieved 2022-05-31
19. ^ Hackett, Jennifer; Hutton, Graham (2019-07-26). "Call-by-need is clairvoyant call-by-value". Proceedings of the ACM on Programming Languages. 3 (ICFP): 1–23. doi:10.1145/3341718. ISSN 2475-1421. S2CID 195782686.
20. ^ "Prolog | An Introduction". GeeksforGeeks. 2018-05-26. Retrieved 2022-05-31.
21. ^ Accattoli, Beniamino; Barenbaum, Pablo; Mazza, Damiano (2014-11-26). "Distilling abstract machines". ACM SIGPLAN Notices. 49 (9): 363–376. doi:10.1145/2692915.2628154. ISSN 0362-1340. S2CID 234775413.
22. ^ baeldung (2018-01-11). "Introduction to Java Primitives | Baeldung". www.baeldung.com. Retrieved 2022-05-31.
23. ^ "Interpreter", Software Architecture Design Patterns in Java, Auerbach Publications, 2004-04-27, doi:10.1201/9780203496213.ch34, ISBN 978-0-8493-2142-9, retrieved 2022-05-31
24. ^ "Hardware vs Software vs Firmware: What's the Difference?". Lifewire. Retrieved 2022-05-31.
25. ^ Accattoli, Beniamino; Barras, Bruno (2017-10-09). "Environments and the complexity of abstract machines". Proceedings of the 19th International Symposium on Principles and Practice of Declarative Programming. Namur Belgium: ACM: 4–16. doi:10.1145/3131851.3131855. ISBN 978-1-4503-5291-8. S2CID 11953081.
26. ^ "Web Services". reference.wolfram.com. Retrieved 2022-05-31.
27. ^ D. B. Skillicorn (2005). Foundations of Parallel Programming. Cambridge University Press. p. 18\. ISBN 978-0-521-01856-2.

## Further reading[edit | edit source]

* Peter van Emde Boas, Machine Models and Simulations pp. 3–66, appearing in:

Jan van Leeuwen, ed. "Handbook of Theoretical Computer Science. Volume A: Algorithms and Complexity, The MIT PRESS/Elsevier, 1990. ISBN 0-444-88071-2 (volume A). QA 76.H279 1990

* Stephan Diehl, Pieter Hartel and Peter Sestoft, Abstract Machines for Programming Language Implementation, Future Generation Computer Systems, Vol. 16(7), Elsevier, 2000.
* Werner Kluge (2006). Abstract Computing Machines: A Lambda Calculus Perspective. Springer. ISBN 978-3-540-27359-2.