关于java语言的编译和解释

计算机不能直接理解高级语言,只能理解机器语言,所以得将高级语言翻译成机器语言,翻译的方式有两种:编译和解释,这两种方式只是翻译的时间不同。

编译型语言:将编译型语言的程序编译成机器语言的文件。如exe文件,以后使用时不用重复翻译。直接使用编译的结果,所以效率高
解释型语言:解释型语言执行程序的时候才翻译,每一个语句都是执行的时候才翻译。这样每执行一次就要翻译一次,效率低

C语言是编译型语言,不同平台上的编译器产生的可执行文件就只能在相应的平台运行,windows版本是Microsoft C,linux版本是gcc编译器,用不同的版本编译,只能运行于不同的环境。
java是编译 ->解释性语言,同时具备编译和和解释特性,(编译仅仅是javac编译器将.java文件编译成平台无关的.class文件,并不是像C一样编译成可执行的机器语言),编译成.class文件后,需要被java虚拟机翻译成本地的机器码才执行,而java虚拟机的翻译过程则是解释型的。

java开发工具提供了两个命令来完成编译和解释过程:javac.exe,java.exe。

借用《Java Web技术内幕》中的一段话来详细描述 javac编译器:
        通常编译器都是将便于人理解的语言规范转化成及机器容易理解的语言规范,如C、C++或者汇编语言都是将源码直接编译成目标机器码,这个目标机器码是CPU直接执行的指令集合。这些指令集合也就是底层的一种语言规范,机器能够直接识别这种语言规范,但是人不可能直接去写目标机器码。
        那么回过头来,Javac的编译器也是将Java这种对人非常友好的编程语言编译成对所有机器都非常友好的语言。注意这种语言不是针对某个机器的,甚至包括不同种类、不同平台的机器。如何消除不同种类、不同平台机器之间的差别,这个任务就由JVM来完成,Javac的任务就是将Java源码编译成Java字节码,也就是JVM能够识别的二进制码。形象一点就是将.java文件转成.class文件,而实际上是将Java的源代码转化成一连串二进制数字,这些二进制数字是有格式的,只有JVM能够正确识别它们到底表达了什么意思。

而将class文件加载到JVM中就涉及到了ClassLoader类加载器及类加载机制,这里不详细说明。

编译优化技术:

1、JIT编译器,也就是动态编译器,运行时期收集监控信息,把热点代码直接编译成本地相关的机器码进行缓存,这里就属于编译执行,缺点是收集监控信息影响程序运行;编译过程占用程序运行时间(如使得启动速度变慢);编译机器码占用内存;

2、AOT编译器:java9提供的直接将所有代码编译成本地机器码执行。可能会无法编译通过动态生成.class文件或者修改字节码的java代码(如lambda表达式、反射调用等)

猜你喜欢

转载自blog.csdn.net/qq_36277052/article/details/82906017