Theories of Programming Languages by John C. Reynolds, Cambridge University Press, 1998.