So for example, something like Babel for JS is considered a compiler, because its output is JavaScript, which is a standardized language.
On the other hand, Python is not usually considered a compiler, even though it writes .pyc files to disk, because its output is bytecode that only Python itself is expected to understand.
Even this is a little bit grey though, because we would say that Python contains a bytecode compiler as one of its components, but I don't think that most people would say that the Python binary is a compiler.
I'd disagree, simply because this is exactly what javac does too.
If things were such that "java" runs all .java files and creates those .class files as bytecode cache, then java won't have been called a compiler.
And similarly, if python had two different programs, one to create *.pyc files and the other runs it, the former one would have been called a python compiler.
http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.htm...
Python bytecode on the other hand is not standardized: its bytecode is considered an implementation detail of CPython and can vary from version to version.
Your example reinforces my point.
For example, CPython could be considered to technically be a virtual machine because it does garbage collection on dead objects since v 2.4 at least, rather than being pure reference counting.
Yet most people would call CPython a straight interpreter.
Now what if before building such a machine, I wanted to simulate one? I could write a "virtual" machine, which is really just a program that acts like a physical machine with native JavaScript instructions. Also known as a JavaScript interpreter.
In theory, compilation is reversible, execution is not.
If all you have are compilers, you can never run a program. All you can do is convert it between different languages. Fortunately your computer comes with an interpreter built in: you can think of your cpu as an interpreter for machine code, implemented in hardware.
Something that compiles to an executable format for your environment is most likely to be actually called a compiler. Some "interpreters" are actually compiling to opcodes for a virtual machine then running on the virtual machine.