Java与C++编译过程比较

来源:互联网 发布:新浪通达信炒股软件 编辑:程序博客网 时间:2024/06/05 07:12

引言

前段时间读了周志明的 《深入理解Java虚拟机》,学习了java编译器的工作过程,同时也顺带复习了 C++的编译过程,将两者进行学习对比,希望对读者有所帮助。

Java编译过程

这里写图片描述
java的编译过程分为前端编译器(javac)与后端编译器(JIT),前端编译器生成字节码文件(xx.class),后端编译器生成机器码。

Java前端编译器(javac)

前端编译器流图
1 .注解处理:在JDK1.5之后开始支持注解,注解处理如果对抽象语法树进行了修改,则要重写生成抽象语法树,注解功能是Java中有的,而C++没有。
2.解语法糖:许多高级语言都有语法糖,为的是提高开发效率,而低级语言C++没有语法糖,解语法糖的相关操作是在前端编译器(javac)中完成的。Java语言的语法糖泛型和类型擦除,自动装箱 、拆箱与遍历循环等。

Java后端编译器(JIT)

这里写图片描述
Java后端编译器为JVM水平高低的体现,这里以广泛使用的虚拟机HotSpot为例,由于JVM需要和硬件打交道,所以JVM由C/c++实现。
抛开Java语言不谈,由于JVM的输入为xx.class文件,所以这些优化策略可以用于其他承载在JVM上的语言,如Scala,Clojure等。
Hotspot的JIT编译优化策略很多,有兴趣的可以查阅资料,比前端编译器的优化策略要多的多。这里主要分析下图示中的解释器与编译器共存的架构,以及何时选用解释器,何时选用编译器。
总体原则为解释器节约内存,编译器提升效率。这句话怎么理解呢?首先解释器可以理解为一边编译,一边运行。而某段”程序”经常出现,那么还是要又重新编译的,这样效率就会比较低。而编译器将经常出现的”程序”编译成”本地代码”,这样下次同一段程序过来,就不需要再次编译了,虽然浪费了内存,但是提高了效率。
而这种经常出现的代码就称为热点代码,Hotspot认为被多次调用的方法被多次执行的循环体热点代码,采用基于采样点的热点探测基于计数器的热点探测两种方式进行热点判定。

c++编译过程

这里写图片描述
前面的很多内容是我的读书笔记和自己的个人理解,这里复习下C++的编译过程作为对比。
C++与Java编译过程的不同之处在前面已经谈到很多,图示中标红的为C++相比Java所特有的。
C++中没有前端编译器和后端编译器之分,具体的编译策略就不详述了,其有特点的是链接器这一块,分为静态链接(编译时链接)和动态链接(运行时链接)
链接过程非常重要,对于C++而言,总不可避免引用外部以及标准库。
静态函数库:(xx.a(Linux) , xx.lib(Windows)),
优点:适用范围比较广,不用担心用户机器缺少某个库文件
缺点:安装包会比较大,而且多个应用程序之间,无法共享库文件
动态函数库: (xx.so(Linux), xx.dll(Windows)),
优点:安装包会比较小,多个应用程序可以共享库文件
缺点:用户必须事先安装好库文件,而且版本和安装位置都必须符合要求,否则就不能正常运行

参考:

http://www.ruanyifeng.com/blog/2014/11/compiler.html
http://blog.csdn.net/candycat1992/article/details/8069172

原创粉丝点击