3 ms·
I think in everyday usage, the most common thing that distinguishes the two is that a compiler saves its output in some standard format that some other piece of
by haberman 10y ago
I think in everyday usage, the most common thing that distinguishes the two is that a compiler saves its output in some standard format that some other piece of software is expected to understand.
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.
- bretthoerner 10y ago> 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. I'd disagree, simply because this is exactly what javac does too.
- z92 10y agoBut javac doesn't run it. It's run by "java". Therefore javac is called the compiler. 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.
- haberman 10y agoJava bytecode is standardized. So any JVM implementing the spec should be able to interpret the output of javac: http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.2 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.
- dismantlethesun 10y agoColloquial usage really diverges strongly from technical usage. 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.
- pjmlp 10y agoMemory management is an implementation detail, doesn't have anything to do with being an interpreter or virtual machine.