An operational approach to semantics and translation for concurrent programming languages