This book is based on a course given to second-year computer science undergraduates at the University of Sussex in the spring of 1988 and 1989. It offers an elementary introduction to the semantics of programming languages in a form which is designed to be accessible to students who are not very advanced in their undergraduate career. All the material in the book may easily be covered in a one-term course. There are very few prerequisites. Students who have undertaken an introductory programming course and who are familiar with elementary mathematical notation should have little difficulty in following it. A first course in discrete mathematics would be more than sufficient to cover the required background material.