概述:
在Java虚拟机中,Java的“编译期”是个不确定的过程,它可以指一个前端编译器将.Java文件编译为.class文件;也有可能指将虚拟机的后端运行期将.class字节码文件编译为机器码的过程(JIT编译器);还可能指使用静态提前编译器(AOT编译器)直接把.java文件编译为本地机器代码的过程。
Java编译器原理我们在这儿就不复习了,按照编译原理课程上老师的讲解就可以;不管是什么语言实现的编译器,原理都是一样的。
现在详细比较下Java编译器和C/C++编译器:
Java编译器和C/C++编译器的比较:
Java与C/C++编译器对比实际上代表了最经典的即时编译器与静态编译器的对比,很大程度上也决定了Java与C/C++的性能对比;因为虽然语言不同,编译的原理还是相同的。性能方面,除了各自的API之外,剩下的就是“拼编译器”和“拼输出代码质量”的游戏。
Java编译器与C/C++编译器对比之下,可能会产生以下劣势:
1、因为即时编译器(Java编译器)运行的时候占用的是用户程序的运行时间,具有很大的时间压力,它能提供的优化手段也严重受制于编译成本。如果编译速度不能达到要求,用户就可以感觉到。
2、Java语言是动态的类型安全语言,这就意味着需要由虚拟机来确定程序是不是违反了语言的语义或访问非结构化内存。从实现层面来看,这就意味着虚拟机必须频繁的进行动态检查,如检查实例是否空指针、数组是否越界等。这样总体上来说就消耗了很多运行时间。
3、Java语言虽然没有virtual关键字,但是使用虚方法的频率却远远大于C/C++语言,这就意味着运行时对方法接收者进行多态选择的频率要远远大于C/C++语言编译器。
4、Java语言是可以动态扩展的语言,运行时加载的类可能改变程序类型的继承关系,这使得很多全局的优化都很难进行,因为编译器无法看到程序的全貌,许多全局的优化措施都只能以

本文对比了Java编译器和C/C++编译器的工作原理和性能差异。Java编译器的即时编译(JIT)在时间压力下限制了优化,动态类型安全检查消耗运行时间,虚方法调用频率高,动态扩展影响全局优化,且对象内存分配在堆上。这些因素与C/C++静态编译的特性形成对比,展示了两种语言的不同优势和挑战。
最低0.47元/天 解锁文章
455

被折叠的 条评论
为什么被折叠?



