Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么几乎所有的OO语言都编译成字节码? 我知道,几乎所有的C++语言和Objy-C都编译成在某种虚拟机上运行的字节码。为什么有这么多不同的语言决定编译成字节码,而不是机器码?在princible中是否可能有一种编译成机器代码的高级内存管理OOP语言_Oop_Compiler Construction_Programming Languages_Bytecode - Fatal编程技术网

为什么几乎所有的OO语言都编译成字节码? 我知道,几乎所有的C++语言和Objy-C都编译成在某种虚拟机上运行的字节码。为什么有这么多不同的语言决定编译成字节码,而不是机器码?在princible中是否可能有一种编译成机器代码的高级内存管理OOP语言

为什么几乎所有的OO语言都编译成字节码? 我知道,几乎所有的C++语言和Objy-C都编译成在某种虚拟机上运行的字节码。为什么有这么多不同的语言决定编译成字节码,而不是机器码?在princible中是否可能有一种编译成机器代码的高级内存管理OOP语言,oop,compiler-construction,programming-languages,bytecode,Oop,Compiler Construction,Programming Languages,Bytecode,编辑:我知道多平台支持通常是这种方法的一个优势。但是,可以在多个平台上进行本机编译,而无需为每个平台创建新的编译器。例如,我们可以发出C代码,然后用GCC编译它。这样做是为了让VM或JIT编译器有机会根据需要为执行代码的体系结构最佳地编译代码。此外,它允许跨平台字节码创建一次,然后在多个硬件架构上执行。这允许在编译代码中进行特定于硬件的优化 由于字节码不限于微体系结构,它可以比机器码小。由于CPU指令设计中的约束与字节码体系结构设计中的约束大不相同,因此复杂指令可以表示为现代CPU中可用的更原始

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

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

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


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

字节码是比机器码更灵活的媒介。首先,它提供了平台可移植性的基础,而无需编译器或提供源代码。因此,开发人员可以分发应用程序的单个版本,而无需放弃源代码、需要复杂的开发工具或预测潜在的目标平台。虽然后者并不总是可行,但它确实发生了。尤其是开发人员库,我发布了一个只在Windows上测试过的库,但其他人在Linux或Android上使用它。事实上,这种情况经常发生,而且大多数情况下它都能按预期工作

字节码通常比解释器更优化,因为它更接近机器指令,因此转换为机器指令的速度更快。并非所有的OO语言都是编译的。Ruby、Python甚至Javascript都是经过解释的,因此它们不会被编译成任何东西,因此Ruby解释器必须采用非常灵活的语言并将其转换为指令,但这种灵活性是以运行时为代价的:解析文本、生成AST、将AST翻译为机器代码,它也很容易进行优化,比如将字节码直接转换为机器码的JIT,甚至可以为特定硬件创建优化

最后,一种语言编译成字节码并不妨碍其他语言利用该字节码。现在,任何使用该字节码的优化都可以应用于这些可能知道如何将自己转换为该字节码的其他语言。这使得字节码成为其他语言可重用性的一个非常重要的层

OO和字节码编译可以追溯到70年代Smalltalk,我相信早在50/60年代就会有人说LISP。但是,直到90年代,它才真正开始在生产系统中大规模使用


本地编译听起来像是最佳途径,这可能也是为什么我们的行业花了20年或更长时间思考这是我们所有问题的答案,但在过去15年中,我们看到字节码编译占据了一席之地,与我们以前做的相比,这是一个显著的优势。回首往事,我们意识到在本机编译时浪费了多少时间,大部分都是手工完成的。

大多数解释语言(特别是OO语言)编译成字节码的最大原因是为了性能。解释代码最昂贵的部分是将文本源转换为中间表示。例如,执行以下操作:

foo + bar;
解释器必须扫描10个字符,将它们转换成4个标记,为操作构建一个AST,解析三个符号(+是一个符号,这取决于foo和bar的类型),所有这些都需要在执行任何实际取决于程序运行时状态的操作之前完成。所有这些都不能在不同的运行中更改,因此许多语言都试图存储某种形式的中间表示


字节码,而不是存储AST有一些优点。首先,字节码很容易序列化,因此IR可以写入磁盘并在下次调用时重用,从而进一步缩短解释时间。另一个原因是字节码通常占用更少的实际ram。值得注意的是,字节码表示通常很容易即时编译,因为它们在结构上通常与典型的机器码相似。

事实上,这是一种巧合。OOP现在是“大”编程的主导概念,虚拟机也是如此


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

作为另一个数据点,是GC'ed,OO,在C++中,Chubbard的回答是很高的,比java还高。

< p>我同意,在OO语言中,类型信息对于虚拟机或上一级编译器的优化非常重要,

Java使用字节码,因为它的最初设计目标中的两个是可移植性。紧凑性。这两种语言都源于一种语言的最初愿景