<P> In most computers, individual instructions are stored as machine code with each instruction being given a unique number (its operation code or opcode for short). The command to add two numbers together would have one opcode; the command to multiply them would have a different opcode, and so on . The simplest computers are able to perform any of a handful of different instructions; the more complex computers have several hundred to choose from, each with a unique numerical code . Since the computer's memory is able to store numbers, it can also store the instruction codes . This leads to the important fact that entire programs (which are just lists of these instructions) can be represented as lists of numbers and can themselves be manipulated inside the computer in the same way as numeric data . The fundamental concept of storing programs in the computer's memory alongside the data they operate on is the crux of the von Neumann, or stored program, architecture . In some cases, a computer might store some or all of its program in memory that is kept separate from the data it operates on . This is called the Harvard architecture after the Harvard Mark I computer . Modern von Neumann computers display some traits of the Harvard architecture in their designs, such as in CPU caches . </P> <P> While it is possible to write computer programs as long lists of numbers (machine language) and while this technique was used with many early computers, it is extremely tedious and potentially error - prone to do so in practice, especially for complicated programs . Instead, each basic instruction can be given a short name that is indicative of its function and easy to remember--a mnemonic such as ADD, SUB, MULT or JUMP . These mnemonics are collectively known as a computer's assembly language . Converting programs written in assembly language into something the computer can actually understand (machine language) is usually done by a computer program called an assembler . </P> <P> Programming languages provide various ways of specifying programs for computers to run . Unlike natural languages, programming languages are designed to permit no ambiguity and to be concise . They are purely written languages and are often difficult to read aloud . They are generally either translated into machine code by a compiler or an assembler before being run, or translated directly at run time by an interpreter . Sometimes programs are executed by a hybrid method of the two techniques . </P> <P> Machine languages and the assembly languages that represent them (collectively termed low - level programming languages) tend to be unique to a particular type of computer . For instance, an ARM architecture computer (such as may be found in a smartphone or a hand - held videogame) cannot understand the machine language of an x86 CPU that might be in a PC . </P>

When was the fourth generation of computers invented