Since the rising popularity of JavaScript, I found it intriguing to hear (even during the same speech) either about JavaScript engine, or about JavaScript virtual machine, or JavaScript interpreter, in the same context and referring to the same thing.
Therefore I've tried to do some research, why all those buzzwords do coexisting simultaneously (there must be a reason) and if there are some real (although slight) differences between them.
I'm trying to summarize what I've learnt so far, from many different sources (which I've quoted in the following lines). Feel free to correct me if I'm wrong/misleading with something.
Although I've found out that the runtime-duties of all of them are basically the sames, I've found also some main differences:
Process virtual machines
- are the most complex (implements even the IO, virtual instruction set etc.)
- always includes an interpreter + intermediate language
- besides may include also compilation (just-in-time and/or dynamic recompilation)
- applications run only inside VM process as a thread
- coupled to an runtime environment
- examples: Java Virtual Machine, Dalvik Virtual Machine
Runtimes
- does not abstract away from native code
- uses solely compilation techniques (either just-in-time or ahead-of-time)
- lacks a VM process/sandboxed applications
- tight-coupled/dependencies to the underlying operating system
- examples: Common Language Runtime, Android Runtime
Language Engines
- more lightweight
- may use either an interpreter or compilation (just-in-time and/or dynamic recompilation)
- decoupled from underlying environment/operating system
- exemples: all JavaScript engines, Zend Engine
Questions:
is the upper list accurate, or is it just a byproduct based on totally coincidental similarities between most common runtime systems, which use the same denomination?
are there also other noteworthy differences?