第六篇 Java编译器与C/C++编译器的比较

概述:

       在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语言是可以动态扩展的语言,运行时加载的类可能改变程序类型的继承关系,这使得很多全局的优化都很难进行,因为编译器无法看到程序的全貌,许多全局的优化措施都只能以激进优化的方式来完成,编译器不得不时刻关注并随着类型的变化而在运行时撤销或重新进行一些优化。

5、Java语言中对象的内存分配实在堆上进行的,只有方法中的局部变量才能在栈上分配。而C/C++的对象则有多种内存分配方式,既能在堆上分配,也可以在栈上分配。如果可以在栈上分配线程私有的对象,将减轻内存回收的压力。

上面这么多全是Java编译器的劣势,倒不是真的说Java编译器就不如C/C++编译器。很多Java的有点C/C++是不具备的。

你可能感兴趣的:(第六篇 Java编译器与C/C++编译器的比较)