Computer program
Program execution |
---|
General concepts |
Types of code |
Compilation strategies |
Notable runtimes |
|
Notable compilers & toolchains |
|
A computer is a tool that solves problems by means of programs written in a programming language.[1] These programs form a computer program which is usually written by a computer programmer. A computer program in its human-readable form is called source code. Source code needs another computer program to execute because computers can only execute their native machine instructions. Therefore, source code may be translated to machine instructions using the language's compiler. (Machine language programs are translated using an assembler.) The resulting file is called an executable. Alternatively, source code may execute within the language's interpreter. The programming language Java compiles into an a intermediate form which is then executed by a Java interpreter.[2]
If the executable is requested for execution, then the operating system loads it into memory and starts a process.[3] The central processing unit will soon switch to this process so it can fetch, decode, and then execute each machine instruction.[4]
If the source code is requested for execution, then the operating system loads the corresponding interpreter into memory and starts a process. The interpreter then loads the source code into memory to translate and execute each statement.[2]
A collection of computer programs, libraries, and related data are referred to as software. Computer programs may be categorized along functional categories, such as applications software and system software. The underlying method used for calculation or manipulation is known as an algorithm.
History
Early programmable machines
The earliest programmable machines preceded the invention of the digital computer. As early as the 9th century, a programmable music sequencer was invented by the Banu Musa brothers, who described an automated mechanical flute player in the Book of Ingenious Devices[5] In 1206, the engineer Al-Jazari invented a programmable drum machine that could play different rhythms.[6]
Pascaline
Blaise Pascal built the Pascaline in 1643 -- an adding machine for his father who was a tax collector in France. The brass box had six dials, each with ten notches. When a dial completed a revolution, it moved the next dial one place. A series of numbers could be entered, and a cumulative sum obtained.[7] The Pascaline was an analog computer in that it computed by measuring distance.[8]
Jacquard's loom
In 1801, Joseph-Marie Jacquard devised a loom that would weave a pattern by following a series of perforated cards. Patterns could be woven and repeated by arranging the cards.[9]
Analytical Engine
In 1837, Charles Babbage was inspired by Jacquard's loom to attempt to build the Analytical Engine.[9] The names of the components of the calculating device were borrowed from the textile industry. In the textile industry, yarn was brought from the store to be milled. The device would have had a "store"—memory to hold 1,000 numbers of 40 decimal digits each. Numbers from the "store" would then have then been transferred to the "mill" (analogous to the CPU of a modern machine), for processing. A "thread" is the execution of programmed instructions by the device. It was programmed using two sets of perforated cards—one to direct the operation and the other for the input variables.[9] [10] However, after more than 17,000 pounds of the British government's money, the thousands of cogged wheels and gears never fully worked together.[11]
During a nine-month period in 1842–43, Ada Lovelace translated the memoir of Italian mathematician Luigi Menabrea. The memoir covered the Analytical Engine. The translation contained Note G which completely detailed a method for calculating Bernoulli numbers using the Analytical Engine. This note is recognized by some historians as the world's first written computer program.[12]
Universal Turing machine
In 1936, Alan Turing introduced the Universal Turing machine—a theoretical device that can model every computation that can be performed on a Turing complete computing machine.[13] It is a finite-state machine that has an infinitely long read/write tape. The machine can move the tape back and forth, changing its contents as it performs an algorithm. The machine starts in the initial state, goes through a sequence of steps, and halts when it encounters the halt state.[14]
Early programmable computers
The Z3 computer, invented by Konrad Zuse (1941) in Germany, was a digital and programmable computer.[15] The Z3 contained 2,400 relays to create the circuits. The circuits provided a binary, floating-point, nine-instruction computer. Programming the Z3 was through a specially designed keyboard and punched tape.
The Electronic Numerical Integrator And Computer (ENIAC) was built between July 1943 and Fall 1945. It was a Turing complete, general-purpose computer that used 17,468 vacuum tubes to create the circuits. At its core, it was a series of Pascalines wired together.[16] Its 40 units weighed 30 tons, occupied 1,800 square feet (167 m2), and consumed $650 per hour (in 1940s currency) in electricity when idle.[16] It had 20 base-10 accumulators. Programming the ENIAC took up to two months.[16] Three function tables were on wheels and needed to be rolled to fixed function panels. Function tables were connected to function panels using heavy black cables. Each function table had 728 rotating knobs. Programming the ENIAC also involved setting some of the 3,000 switches. Debugging a program took a week.[16] The programmers of the ENIAC were women who were known collectively as the "ENIAC girls"[17] and included Jean Jennings Bartik, Betty Holberton, Marlyn Wescoff, Kathleen McNulty, Ruth Teitelbaum, and Frances Spence. [18] It ran from 1947 until 1955 at Aberdeen Proving Ground, calculating hydrogen bomb parameters, predicting weather patterns, and producing firing tables to aim artillery guns.[19]
Later computers
Computers manufactured until the 1970s had front-panel switches for programming. The computer program was written on paper for reference. An instruction was represented by a configuration of on/off settings. After setting the configuration, an execute button was pressed. This process was then repeated. Computer programs also were manually input via paper tape or punched cards. After the medium was loaded, the starting address was set via switches, and the execute button was pressed.[20]
In 1961, the Burroughs B5000 was built specifically to be programmed in the ALGOL 60 language. The hardware featured circuits to ease the compile phase.[21]
In 1964, the IBM System/360 was a line of six computers each having the same instruction set architecture. The Model 30 was the smallest and least expensive. Customers could upgrade and retain the same application software.[22] Each System/360 model featured multiprogramming. With operating system support, multiple programs could be in memory at once. When one was waiting for input/output, another could compute. Each model also could emulate other computers. Customers could upgrade to the System/360 and retain their IBM 7094 or IBM 1401 application software.[22]
Computer programming
Computer programming (also known as software development and software engineering) is the process of writing or editing source code. In a formal environment, a systems analyst will gather information from managers about all the business processes to automate. This professional then prepares a detailed plan for the new or modified system.[23] The plan is analogous to an architect's blueprint.[23] A computer programmer is a specialist responsible for modifying or writing the source code to implement the detailed plan.[23]
Programming languages
A programming language is a set of keywords, symbols, identifiers, and rules by which humans can communicate instructions to the computer.[24] They follow a set of rules called a syntax.[24]
- Keywords are reserved words to form declarations and statements.
- Symbols are characters to form operations, assignments, decisions, and separators.
- Identifiers are words created by programmers to form constants, structure names, variable names, and function names.
- Syntax Rules are defined in the Backus–Naur form.
Programming languages get their basis from formal languages.[25] The purpose of defining a solution in terms of its formal language is to generate an algorithm to solve the underlining problem.[25] An algorithm is a sequence of simple instructions that solve a problem.[26]
The evolution of programming languages began when the EDSAC used the first stored computer program in its von Neumann architecture.[27] Programming the EDSAC was in the first generation of programming languages.
- The first generation of programming languages is machine language.[28] Machine language requires the programmer to enter instructions using instruction numbers called machine code. For example, the ADD operation on the PDP-11 has instruction number 24576.[29]
- The second generation of programming languages is assembly language.[28] Assembly language allows the programmer to use mnemonic instructions instead of remembering instruction numbers. A computer program called an assembler translates each assembly language instruction into its machine language number. For example, on the PDP-11, the operation 24576 can be referenced as ADD in the source code.[29] The four basic arithmetic operations have assembly instructions like ADD, SUB, MUL, and DIV.[29] Computers also have instructions like DW or DC to reserve memory cells. Then the MOV instruction can copy integers between registers and memory.
- The basic structure of an assembly language statement is label, operation, operand, and comment.[30]
- Labels allow the programmer to work with variable names. The assembler will later translate labels into physical memory addresses.
- Operations allow the programmer to work with mnemonics. The assembler will later translate the mnemonics into instruction numbers.
- Operands tell the assembler which data the operation will process.
- Comments allow the programmer to articulate a narrative because the instructions alone are vague.
- The key characteristic of an assembly language program is it forms a one-to-one mapping to its corresponding machine language target.[31]
- The third generation of programming languages use compilers and interpreters to execute computer programs. Unlike assembly language, these languages generate many machine language instructions for each symbolic statement.[28] The distinguishing feature of third generation languages is their independence from a particular hardware.[32] They began with the languages of FORTRAN (1958), COBOL (1959), ALGOL 60 (1960), and BASIC (1964).[28] In 1973, C emerged as a high-level language that produced efficient machine language instructions.[33] Today, an entire paradigm of languages fill the imperative third generation spectrum.
- The fourth generation of programming languages emphasize what output results are desired, rather than how programming statements should be constructed.[28] Declarative languages attempt to limit side effects and allow programmers to write code with relatively few errors.[28] One popular fourth generation language is called Structured Query Language (SQL).[28] Database developers no longer need to process each database record one at a time. Also, a simple instruction can generate output records without having to understand how it's retrieved.
- The fifth generation of programming languages use visual tools to generate source code.[34] An integrated development environment allows the programmer to draw the graphical user interface (GUI) on the screen using a mouse. The programmer writes event handling functions that will executed when fields are hovered over, entered into, or exited from. The development system couples the functions to the GUI and outputs a computer program.[35]
Imperative languages
Imperative programming languages specify a sequential algorithm using declarations, expressions, and statements:[36]
- A declaration couples a variable name to a datatype – for example:
var x: integer;
- An expression yields a value – for example:
2 + 2
yields 4 - A statement might assign an expression to a variable or use the value of a variable to alter the program's control flow – for example:
x := 2 + 2; if x = 4 then do_something();
One criticism of imperative languages is the side effect of an assignment statement on a class of variables called non-local variables.[37]
Declarative languages
Declarative programming languages describe what computation should be performed and not how to compute it. Declarative programs omit the control flow and are considered sets of instructions. Two broad categories of declarative languages are functional languages and logical languages. The principle behind functional languages (like Haskell) is to not allow side effects, which makes it easier to reason about programs like mathematical functions.[37] The principle behind logical languages (like Prolog) is to define the problem to be solved – the goal – and leave the detailed solution to the Prolog system itself.[38] The goal is defined by providing a list of subgoals. Then each subgoal is defined by further providing a list of its subgoals, etc. If a path of subgoals fails to find a solution, then that subgoal is backtracked and another path is systematically attempted.
Compilation and interpretation
A computer program in the form of a human-readable, computer programming language is called source code. Source code may be converted into an executable image by a compiler or assembler, or executed immediately with the aid of an interpreter.
Compilers translate source code from a programming language into either object code or machine instructions.[39] Object code needs to be linked with other object code to become machine instructions. Compiled computer programs are commonly referred to as executables, binary images, or simply as binaries – a reference to their binary file format.
Interpreters execute source code from a programming language line-by-line. The interpreter parses each statement and performs its behavior. The advantage of interpreters is an interactive session may aid development. The programmer is presented with a prompt, and individual lines of code are typed in and performed immediately. Software development may be faster because testing and correcting is immediate.[2]
The main disadvantage of interpreters is computer programs run slower than when compiled. Interpreting code is slower because the interpreter must decode each statement and then perform it. Another disadvantage of interpreters is an interpreter must be present on the executing computer. By contrast, compiled computer programs need no compiler present during execution.
Just in time compilers pre-compile computer programs just before execution. For example, the Java virtual machine called HotSpot contains a Just In Time Compiler which selectively compiles Java bytecode into machine code – but only code which Hotspot predicts is likely to be used many times.
Either compiled or interpreted programs might be executed in a batch process without human interaction. Scripting languages are often used to create batch processes. One common scripting language is Unix shell, and its executing environment is called the command-line interface.
No properties of a programming language require it to be exclusively compiled or exclusively interpreted. The categorization usually reflects the most popular method of language execution. For example, Java is thought of as an interpreted language and C a compiled language, despite the existence of Java compilers and C interpreters.
Storage and execution
Typically, computer programs are stored in non-volatile memory until requested either directly or indirectly to be executed by the computer user. Upon such a request, the program is loaded into random-access memory, by a computer program called an operating system, where it can be accessed directly by the central processor. The central processor then executes ("runs") the program, instruction by instruction, until termination. A program in execution is called a process.[40] Termination is either by normal self-termination, by user intervention, or by error – software or hardware error.
Simultaneous execution
Many operating systems support multitasking which enables many computer programs to appear to run simultaneously on one computer. Operating systems may run multiple programs through process scheduling – a software mechanism to switch the CPU among processes often so users can interact with each program while it runs.[41] Within hardware, modern day multiprocessor computers or computers with multicore processors may run multiple programs.[42]
Functional categories
Computer programs may be categorized along functional lines. The main functional categories are application software and system software. System software includes the operating system which couples computer hardware with application software.[43] The purpose of the operating system is to provide an environment in which application software executes in a convenient and efficient manner.[43] In addition to the operating system, system software includes embedded programs, boot programs, and micro programs. Application software designed for end users have a user interface. Application software not designed for the end user includes middleware, which couples one application with another. Both system software and application software execute utility programs. The distinction between system software and application software is under debate.
Application software
Application software is the key to unlocking the potential of the computer system.[44] Enterprise application software bundles accounting, personnel, customer, and vendor applications. Examples include enterprise resource planning, customer relationship management, and supply chain management software.
Enterprise applications may be developed in-house as a one-of-a-kind proprietary software.[44] Alternatively, they may be purchased as off-the-shelf software. Purchased software may be modified to provide custom software. If the application is customized, then either the company's resources are used or the resources are outsourced. Outsourced software development may be from the original software vendor or a third-party developer.[44]
The advantages of proprietary software are features and reports may be exact to specification.[45] Management may also be involved in the development process and offer a level of control. Management may decide to counteract a competitor's new initiative or implement a customer or supplier requirement. A merger or acquisition will necessitate enterprise software changes.[45]
The disadvantages of proprietary software are the time and resource costs may be extensive.[45] Furthermore, risks concerning features and performance may be looming.
The advantages of off-the-shelf software are its identifiable upfront costs, the basic needs should be fulfilled, and its performance and reliability have a track record.[45]
The disadvantages of off-the-shelf software are it may have unnecessary features that confuse the end users, it may lack features the enterprise needs, and the data flow may not match the enterprise's work processes.[45]
One approach to economically obtaining a customized enterprise application is through an application service provider.[46] Specialty companies provide the hardware, custom software, and end-user support. They may speed development of new applications because they possess skilled information system staff. The biggest advantage is it frees in-house resources from staffing and managing complex computer projects.[46]
Many application service providers target small, fast-growing companies with limited information system resources.[46] On the other hand, larger companies with major systems likely have their technical infrastructure in place. One key risk is having to trust an external organization with sensitive information. Another key risk is having to trust the provider's infrastructure reliability.[46]
Other application software categories are:
- An application suite consists of multiple applications bundled together. Examples include Microsoft Office, LibreOffice, and iWork. They bundle a word processor, spreadsheet, and other applications.
- Enterprise infrastructure software supports the enterprise's software systems. Examples include databases, email servers, and network servers.
- Information worker software are designed for workers at the departmental level. Examples include time management, resource management, analytical, collaborative and documentation tools. Word processors, spreadsheets, email and blog clients, personal information system, and individual media editors may aid in multiple information worker tasks.
- Media development software generates print and electronic media for others to consume, most often in a commercial or educational setting. These produce graphics, publications, animations, and videos.
- Product engineering software is used to help develop large machines and other application software. Examples includes computer-aided design (CAD), computer-aided engineering (CAE), and integrated development environments.
- Entertainment Software can refer to video games, movie recorders and players, and music recorders and players.
- The word app came to being in 21st century. It is a clipping of the word "application". They have been designed for many platforms, but the word was first used for smaller mobile apps. Desktop apps are traditional computer programs that run on desktop computers. Mobile apps run on mobile devices. Web apps run inside a web browser. Both mobile and desktop apps may be downloaded from the developers' website or purchased from app stores such as Microsoft Store, Apple App Store, Mac App Store, Google Play or Intel AppUp.
Utility programs
Utility programs are designed to aid system administration and software execution. Operating systems execute hardware utility programs to check the status of disk drives, memory, speakers, and printers.[47] A utility program may optimize the placement of a file on a crowded disk. System utility programs monitor hardware and network performance. When a metric is outside an acceptable range, a trigger alert is generated.[48]
Operating system
An operating system is the low-level software that supports a computer's basic functions, such as scheduling tasks and controlling peripherals.[43]
In the 1950s, the programmer, who was also the operator, would write a program and run it. After the program finished executing, the output may have been printed, or it may have been punched onto paper tape or cards for later processing.[20] More often than not the program did not work. The programmer then looked at the console lights and fiddled with the console switches. If less fortunate, a memory printout was made for further study. In the 1960s, programmers reduced the amount of wasted time by automating the operator's job. A program called an operating system was kept in the computer at all times.[49]
The term operating system may refer to two levels of software.[50] The operating system may refer to the kernel program that manages the processes, memory, and devices. More broadly, the operating system may refer to the entire package of the central software that includes the kernel program, command-line interpreter, graphical user interface, utility programs, and editor.[50]
- The kernel program should perform process scheduling.[51] The kernel creates a process control block when a program is selected for execution. However, an executing program gets exclusive access to the central processing unit only for a time slice. To provide each user with the illusion of exclusive access, the kernel preempts the process control block to execute another one. The goal for system developers is to minimize latency.
- The kernel program should perform memory management.[51] The kernel insures that a process only accesses its own memory, and not that of the kernel or other processes. To save memory, the kernel may load only blocks of execution instructions from the disk drive, not the entire execution file completely.
- The kernel program should perform file system management.[51] The kernel has instructions to create, retrieve, update, and delete files.
- The kernel program should perform device management.[51] The kernel provides programs to standardize and simplify the interface to the mouse, keyboard, disk drives, and other devices. Moreover, the kernel should arbitrate access to a device if two processes requests it at the same time.
- The kernel program should perform network management.[52] The kernel transmits and receives packets on behalf of processes. One key service is to find an efficient route to the target system.
- The kernel program should provide system level functions for programmers to use.[53]
- Programmers access files through a relatively simple interface that in turn executes a relatively complicated low-level I/O interface. The low-level interface includes file creation, file descriptors, file seeking, physical reading, and physical writing.
- Programmers create processes through a relatively simple interface that in turn executes a relatively complicated low-level interface.
- Programmers perform date/time arithmetic through a relatively simple interface that in turn executes a relatively complicated low-level time interface.[54]
- The kernel program should provide a communication channel between executing processes.[55] For a large software system, it may be desirable to engineer the system into smaller processes. Processes may communicate with one another by sending and receiving signals.
Originally, operating systems were programmed in assembly; however, modern operating systems are typically written in higher level languages like C, C++, Objective-C, and Swift.
Boot program
A stored-program computer requires an initial computer program stored in its read-only memory to boot. The boot process is to identify and initialize all aspects of the system, from processor registers to device controllers to memory contents.[56] Following the initialization process, this initial computer program loads the operating system and sets the program counter to begin normal operations.
Embedded programs
Independent of the host computer, a hardware device might have embedded firmware to control its operation. Firmware is used when the computer program is rarely or never expected to change, or when the program must not be lost when the power is off.[49]
Microcode programs
The microcode program is the bottom level interpreter that controls the data path of software driven computers.[57] (Advances in hardware have migrated these operations to hardware execution circuits.)[57] Microcode instructions allow the programmer to more easily implement the digital logic level[58] -- the computer's real hardware. The digital logic level is the boundary between computer science and computer engineering.[59]
A gate is a tiny transistor that can return one of two signals -- on or off.[60]
- Having one transistor forms the NOT gate.
- Connecting two transistors in series forms the NAND gate.
- Connecting two transistors in parallel forms the NOR gate.
- Connecting a NOT gate to a NAND gate forms an AND gate.
- Connecting a NOT gate to a NOR gate forms an OR gate.
These five gates form the building blocks of binary algebra -- the digital logic functions of the computer.
Microcode instructions are mnemonics programmers may use to execute digital logic functions instead of forming them in binary algebra. They are stored in a central processing unit's (CPU) control store.[61] These hardware-level instructions move data throughout the data path.
Microcode instructions move data between a CPU's registers and throughout the motherboard. The micro-instruction cycle begins when the microsequencer uses its microprogram counter to fetch the next machine instruction from random access memory.[62] The next step is to decode the machine instruction by selecting the proper output line to the hardware module.[63] The final step is to execute the instruction using the hardware module's set of gates.
Instructions to perform arithmetic are passed through an arithmetic logic unit (ALU).[64] The ALU has circuits to perform elementary operations to add, shift, and compare integers. By combining and looping the elementary operations through the ALU, the CPU performs its complex arithmetic.
Microcode instructions move data between the CPU and the memory controller. Memory controller microcode instructions manipulate two registers. The memory address register is used to access each memory cell's address. The memory data register is used to set and read each cell's contents.[65]
Microcode instructions move data between the CPU and the many computer buses. The disk controller bus writes to and reads from the hard disk drives. Data is also moved between the CPU and other functional units via the peripheral component interconnect express bus.[66]
See also
References
- ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 2. ISBN 0-201-71012-9.
- ^ a b c Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 7. ISBN 0-201-71012-9.
- ^ Silberschatz, Abraham (1994). Operating System Concepts, Fourth Edition. Addison-Wesley. p. 98. ISBN 978-0-201-50480-4.
- ^ Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 32. ISBN 978-0-13-854662-5.
- ^ Koetsier, Teun (2001), "On the prehistory of programmable machines: musical automata, looms, calculators", Mechanism and Machine Theory, 36 (5), Elsevier: 589–603, doi:10.1016/S0094-114X(01)00005-2.
- ^ Noel Sharkey (2007), A 13th Century Programmable Robot, University of Sheffield
- ^ McCartney, Scott (1999). ENIAC – The Triumphs and Tragedies of the World's First Computer. Walker and Company. p. 13. ISBN 0-8027-1348-3.
- ^ McCartney, Scott (1999). ENIAC – The Triumphs and Tragedies of the World's First Computer. Walker and Company. p. 21. ISBN 0-8027-1348-3.
- ^ a b c McCartney, Scott (1999). ENIAC – The Triumphs and Tragedies of the World's First Computer. Walker and Company. p. 16. ISBN 978-0-8027-1348-3.
- ^ Bromley, Allan G. (1998). "Charles Babbage's Analytical Engine, 1838" (PDF). IEEE Annals of the History of Computing. 20 (4): 29–45. doi:10.1109/85.728228. S2CID 2285332.
- ^ Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 15. ISBN 978-0-13-854662-5.
- ^ J. Fuegi; J. Francis (October–December 2003), "Lovelace & Babbage and the creation of the 1843 'notes'", Annals of the History of Computing, 25 (4): 16, 19, 25, doi:10.1109/MAHC.2003.1253887
- ^ Rosen, Kenneth H. (1991). Discrete Mathematics and Its Applications. McGraw-Hill, Inc. p. 654. ISBN 978-0-07-053744-6.
- ^ Linz, Peter (1990). An Introduction to Formal Languages and Automata. D. C. Heath and Company. p. 234. ISBN 978-0-669-17342-0.
- ^ "History of Computing".
- ^ a b c d McCartney, Scott (1999). ENIAC – The Triumphs and Tragedies of the World's First Computer. Walker and Company. p. 102. ISBN 978-0-8027-1348-3.
- ^ Frink, Brenda D. (1 June 2011). "Researcher reveals how "Computer Geeks" replaced "Computer Girls"". Gender News. Stanford University. Archived from the original on 12 March 2015. Retrieved 22 October 2018.
- ^ Bartik, Jean Jennings (2013). Rickman, Jon; Todd, Kim D. (eds.). Pioneer programmer: Jean Jennings Bartik and the computer that changed the world. Truman State University Press.
- ^ McCartney, Scott (1999). ENIAC – The Triumphs and Tragedies of the World's First Computer. Walker and Company. p. 107. ISBN 978-0-8027-1348-3.
- ^ a b Silberschatz, Abraham (1994). Operating System Concepts, Fourth Edition. Addison-Wesley. p. 6. ISBN 978-0-201-50480-4.
- ^ Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 20. ISBN 978-0-13-854662-5.
- ^ a b Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 21. ISBN 978-0-13-854662-5.
- ^ a b c Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 507. ISBN 0-619-06489-7.
- ^ a b Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 159. ISBN 0-619-06489-7.
- ^ a b Linz, Peter (1990). An Introduction to Formal Languages and Automata. D. C. Heath and Company. p. 2. ISBN 978-0-669-17342-0.
- ^ Weiss, Mark Allen (1994). Data Structures and Algorithm Analysis in C++. Benjamin/Cummings Publishing Company, Inc. p. 29. ISBN 0-8053-5443-3.
- ^ Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 17. ISBN 978-0-13-854662-5.
- ^ a b c d e f g Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 160. ISBN 0-619-06489-7.
- ^ a b c Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 399. ISBN 978-0-13-854662-5.
- ^ Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 400. ISBN 978-0-13-854662-5.
- ^ Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 398. ISBN 978-0-13-854662-5.
- ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 26. ISBN 0-201-71012-9.
- ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 37. ISBN 0-201-71012-9.
- ^ Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 161. ISBN 0-619-06489-7.
- ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 321. ISBN 0-201-71012-9.
- ^ Wilson, Leslie B. (1993). Comparative Programming Languages, Second Edition. Addison-Wesley. p. 75. ISBN 978-0-201-56885-1.
- ^ a b Wilson, Leslie B. (1993). Comparative Programming Languages, Second Edition. Addison-Wesley. p. 213. ISBN 978-0-201-56885-1.
- ^ Wilson, Leslie B. (1993). Comparative Programming Languages, Second Edition. Addison-Wesley. p. 244. ISBN 978-0-201-56885-1.
- ^ "What is a Compiler?". Retrieved 2012-01-10.
- ^ Silberschatz, Abraham (1994). Operating System Concepts, Fourth Edition. Addison-Wesley. p. 97. ISBN 978-0-201-50480-4.
- ^ Silberschatz, Abraham (1994). Operating System Concepts, Fourth Edition. Addison-Wesley. p. 100. ISBN 978-0-201-50480-4.
- ^ Akhter, Shameem (2006). Multi-Core Programming. Richard Bowles (Intel Press). pp. 11–13. ISBN 978-0-9764832-4-3.
- ^ a b c Silberschatz, Abraham (1994). Operating System Concepts, Fourth Edition. Addison-Wesley. p. 1. ISBN 978-0-201-50480-4.
- ^ a b c Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 147. ISBN 0-619-06489-7.
- ^ a b c d e Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 148. ISBN 0-619-06489-7.
- ^ a b c d Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 149. ISBN 0-619-06489-7.
- ^ Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 145. ISBN 0-619-06489-7.
- ^ Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 146. ISBN 0-619-06489-7.
- ^ a b Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 11. ISBN 978-0-13-854662-5.
- ^ a b Kerrisk, Michael (2010). The Linux Programming Interface. No Starch Press. p. 21]. ISBN 978-1-59327-220-3.
- ^ a b c d Kerrisk, Michael (2010). The Linux Programming Interface. No Starch Press. p. 22]. ISBN 978-1-59327-220-3.
- ^ Kerrisk, Michael (2010). The Linux Programming Interface. No Starch Press. p. 23]. ISBN 978-1-59327-220-3.
- ^ Kernighan, Brian W. (1984). The Unix Programming Environment. Prentice Hall. p. 201. ISBN 0-13-937699-2.
- ^ Kerrisk, Michael (2010). The Linux Programming Interface. No Starch Press. p. 187]. ISBN 978-1-59327-220-3.
- ^ Haviland, Keith (1987). Unix System Programming. Addison-Wesley Publishing Company. p. 121]. ISBN 0-201-12919-1.
- ^ Silberschatz, Abraham (1994). Operating System Concepts, Fourth Edition. Addison-Wesley. p. 30. ISBN 978-0-201-50480-4.
- ^ a b Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition. Pearson. p. 6. ISBN 978-0-13-291652-3.
- ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition. Pearson. p. 243. ISBN 978-0-13-291652-3.
- ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition. Pearson. p. 147. ISBN 978-0-13-291652-3.
- ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition. Pearson. p. 148. ISBN 978-0-13-291652-3.
- ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition. Pearson. p. 253. ISBN 978-0-13-291652-3.
- ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition. Pearson. p. 255. ISBN 978-0-13-291652-3.
- ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition. Pearson. p. 161. ISBN 978-0-13-291652-3.
- ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition. Pearson. p. 166. ISBN 978-0-13-291652-3.
- ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition. Pearson. p. 249. ISBN 978-0-13-291652-3.
- ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition. Pearson. p. 111. ISBN 978-0-13-291652-3.
Further reading
- Knuth, Donald E. (1997). The Art of Computer Programming, Volume 1, 3rd Edition. Boston: Addison-Wesley. ISBN 978-0-201-89683-1.
- Knuth, Donald E. (1997). The Art of Computer Programming, Volume 2, 3rd Edition. Boston: Addison-Wesley. ISBN 978-0-201-89684-8.
- Knuth, Donald E. (1997). The Art of Computer Programming, Volume 3, 3rd Edition. Boston: Addison-Wesley. ISBN 978-0-201-89685-5.