The Formal Semantics Of Programming Languages by Glynn Winskel
A great introductary text covering operational, axiomatic and denotational semantics, showing their application to define a simple imperative and a simple higher typed functional language. The material is well ordered and clear, and has a lot of discussion around the various points that it makes. The proofs of the equivalence of the operational and denotational semantics are a good read and there’s an interesting chapter on concurrency. It contains some interesting exercises too.