为什么几乎所有的OO语言都编译为字节码?

kei*_*ter 17 compiler-construction oop programming-languages bytecode

在我所知道的面向对象语言中,除了C++和Objective-C之外,几乎所有语言都编译为在某种虚拟机上运行的字节码.为什么有这么多不同的语言在编译成字节码时,而不是机器码?在princible中是否可以使用高级内存管理的OOP语言编译为机器代码?

编辑:我知道多平台支持通常是这种方法的优势.但是,很有可能在多个平台上进行本机编译,而无需为每个平台创建新的编译器.每个例子都可以发出C代码然后用GCC编译.

ffr*_*end 13

实际上没有理由,这是一种巧合.OOP现在是"大"编程中的领先概念,因此虚拟机就是如此.

另请注意,传统虚拟机有两个不同的部分 - 垃圾收集器字节码解释器/ JIT编译器,这些部分可以单独存在.例如,名为SBCL的Common Lisp实现将程序编译为本机代码,但在运行时大量使用垃圾收集.

  • 我认为你的意思是"重度"而不是"难以". (3认同)

Mic*_*eyn 12

这样做是为了允许VM或JIT编译器有机会根据需要为执行代码的体系结构最佳地编译代码.此外,它允许创建跨平台字节码一次,然后在多个硬件架构上执行.这允许将硬件特定的优化放入编译的代码中.

由于字节代码不限于微体系结构,因此它可以小于机器代码.可以表示复杂指令与现代CPU中可用的更原始的指令,因为CPU指令设计中的约束与设计字节码体系结构的约束非常不同.

然后是安全问题.字节码可以在执行之前进行验证和分析(即,没有缓冲区溢出,某种类型的变量被访问为它们不是),等等......

  • 这些是VM的引人注目的功能 - 但它们几乎与OOP正交. (8认同)