Computations are designed to solve problems. Programs are descriptions of computations written for
execution on computers. The field of computer science is concerned with the development of
methodologies for designing programs, and with the development of computers for executing programs.
It is therefore of central importance for those involved in the field that the characteristics of programs,
computers, problems, and computation be fully understood. Moreover, to clearly and accurately
communicate intuitive thoughts about these subjects, a precise and well-defined terminology is required.
This book explores some of the more important terminologies and questions concerning programs,
computers, problems, and computation. The exploration reduces in many cases to a study of
mathematical theories, such as those of automata and formal languages; theories that are interesting also
in their own right. These theories provide abstract models that are easier to explore, because their
formalisms avoid irrelevant details.