To describe the implementation of a dynamic programming language, I have seen the terms "Runtime" (e.g. Security transparency in the Python runtime), "Virtual Machine" (Python Virtual Machine (PVM), YARV (Yet another Ruby VM)) and "Interpreter" (Matz's Ruby Interpreter) used. JavaScript also uses the word "Engine".
IMO the word "Interpreter" strictly describes only part of a language implementation: that which steps through and executes bytecode. "Interpreter" excludes other parts of the implementation, such as a garbage collector.
Are the other terms, "Runtime", "Virtual Machine" and "Engine" synonymous with the language implementation as a whole? Are these terms interchangeable?