A computer program (often simply called a program) is an example of computer software that prescribes the actions ("computations") that are to be carried out by a computer. Most programs consist of a loadable set of instructions which determines how the computer will react to user input when that program is running, i.e. when the instructions are 'loaded'.
The term program or computer program is used interchangeably with software and software application. The term software program is redundant and should not be used.
Running a program
To run a program, the computer is initialized to a starting state by loading the program and perhaps the data and then some mechanism to begin is invoked. At the lowest level this is begun with a boot sequence.
In most computers, an operating system, such as Linux, loads and executes programs. In this context, a computer program refers to the individual executable image rather than all the programming currently running on the computer.
The Von Neumann architecture
In a computer with the most common Von Neumann architecture or Harvard architecture the program is loaded from a peripheral device of some kind, often a hard drive. In a machine following the Von Neumann architecture, the program is loaded into main memory. The instruction sequence are then executed in order until a jump or branch instruction is executed or an interrupt occurs. These instructions change the program counter.
A computer program consists of a set of instructions that the computer understands. A computer of this architecture without a program does absolutely nothing.
The instructions in a computer program are in machine code; they are usually originally written in a computer programming language, and translated to machine code using a computer program called a compiler or an interpreter. Sometimes the programming language is simply a set of abbreviations for the machine code instructions, called assembly language – in this case, a program called an assembler is used to make the translation.
In neural network computers, many computing units with many connections between these units work in concert to solve problems. While there are many architectures following this general model, the programming of these computers often consists of weights on each connection and thresholds within the nodes. As the machine "learns", these weights and thresholds change. In most neural networks, the learned state can be saved and later restored, making it a computer program.
Some neural networks learn from scratch every time they are turned on, and don't have programs, per se.
Many programs today run in a virtual machine. An idealized instruction set is created on top of the actual instruction set of the machines that run the program inside of the virtual machine. Many non Von Neumann machines exist only as simulations implemented as virtual machines and have not been constructed using hardware.
In analog computers, as opposed to digital computers, the states saved are not discrete values like the zeros and ones of most common computers, but are rather saved as a more continuous value. For example, in the Water integrator the initial state was set by setting valve flow rates, and the amount of water in various containers of the machine.
Certain insectoid autonomous robots are good examples of this type of computer that has no program in the classic sense. They are hard wired and learn from their environment.
Programs and data
Some speakers distinguish between data that describe a computer program and data that does not describe a computer program; the former is called a "program", and the latter "data". However, this distinction between "program" and "data" is difficult to describe precisely, since all data can be regarded as implementing a program, depending on how it is processed.
Some computing paradigms provide especially steep challenges to this distinction. The weights in a neural network are a form of "data" stored in the network, yet it is precisely these weights that (combined with the topology of the network) define the network's behavior. It is therefore unclear whether these weights serve as "program" or mere "data". Analog computers present similar challenges: should the water stored in a water integrator be regarded as program or data?
In the face of this difficulty, some speakers deny that the distinction between program and data is not that useful. This denial has a long history in computing, and is especially common in the programming cultures of Lisp and other programming languages that provide strong support for metaprogramming.
An abstract program is sometimes called an algorithm, and these are the subject of various areas of mathematics – for example, algorithmic information theory studies the behavior of idealized computers executing randomly generated computer programs.
The iterative process of creating a computer program, and testing, analyzing, and refining it is one definition of computer program "development". You are "developing" an appropriate solution that performs some task at hand, as you may not have produced the best solution (or even a good one) in your first attempt. Those who practice this iterative process are called computer programmers; "developers", for short.
Another definition of "development", in the context of computer programming, is the process of fleshing out the work requirement(s) of a task that you want a computer to perform, creating an approach to accomplishing the task, deciding upon an implementation of that approach, expressing that approach in a way that a computer can understand, testing the suitability of the solution in either a simulated or real-world environment, and analyzing the tests' results. Once again, iterations of the above are often required.
Computer programmers are not always required to perform all of the steps laid out above, but the more experience a programmer has the more involved in the initial steps of this procedure they typically become, and the more critical their skills become during the requirements-gathering and solution-design phases.
The most junior-level programmers typically only get involved in the expression to the computer of the now-well-defined solution. This is called "writing code", or "coding". Coding is not the same as "developing". Calling a computer program-developer a "coder" is an insult; doing so disregards his or her analysis and design skills, skills gathered through experience.
Eric Baum What is Thought MIT Press 2004 ISBN 0-262-02548-5 - Chapter Two: The Mind is a Computer Program