VM 与语言无关。任何语言都可以在 VM 上运行(Java VM 已经有数百种语言)。
VM 可以运行一种不同类型的“汇编语言”,一种更适合编译器适应的“汇编语言”。在 VM 中完成的所有事情都可以在 CPU 中完成,因此将 VM 视为 CPU。(有些实际上是在硬件中实现的)。
它是极低级别的,并且在许多情况下严重基于堆栈——而不是寄存器,机器级数学都是相对于相对于当前堆栈指针的位置的。
对于普通的编译语言,一个步骤需要许多指令。a + 可能看起来像“将项目从相对于堆栈指针的点抓取到 reg a,将另一个抓取到 reg b。添加 reg a 和 b。将 reg a 放入相对于堆栈指针的位置。
VM 使用一条短指令完成所有这些操作,可能是一个或两个字节,而不是机器语言中的 4 或 8 个字节(取决于 32 或 64 位架构),这(猜测)应该意味着大约 16 或 32 个字节的 x86用于 1-2 字节的机器代码。(我可能是错的,我最后的 x86 编码是在 80286 时代。)
微软在其办公产品中使用(可能仍在使用)虚拟机来减少代码量。
创建 VM 代码的过程与创建机器语言的过程相同,只是处理器类型不同而已。
VM 还可以实现自己的与语言密切相关的安全、错误恢复和内存机制。
我在这里的一些描述是总结和记忆。如果您想自己探索字节码定义,这很有趣:
http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.doc.html