Java编译器:
JAVA编译器(javac.exe)的作用是将java源程序编译成中间代码字节码文件,是最基本的开发工具。
编译时首先读入java源程序(即在MS-DOS命令行下键入javac HelloWorld.java等文件名参数和其他选项参数),
然后进行语法检查,如果出现问题就终止编译。语法检查通过后,生成中间代码即字节码,字节码文件名和源文件名相同,
扩展名为.class。(百度百科的解释)
注:这里的javac编译器可称为前端编译器,具体可看
深入理解java虚拟机第二版P302(第十章 10.1概述)
解释器:
解释器(英语:Interpreter)又译为直译器,是一种电脑程序,能够把高级编程语言一行一行直接转译运行。
解释器不会一次把整个程序转译出来,它每转译一行程序叙述就立刻运行,然后再转译下一行,再运行,如此不停地进行下去。
使用解释器来运行程序会比直接运行编译过的机器码来得慢(百度百科的解释)
注:为什么解释器来运行程序会比直接运行编译过的机器码来得慢?
因为解释器是按行解释成机器码执行。而编译器需要将所有代码都编译成机器码并加入内存之后再逐行执行。
但是当程序需要迅速启动和执行时,解释器可以首先发挥作用,省去编译的时间,立即执行。
进入正题
最早学习java的时候,在记事本上敲代码,将文件保存为 helloworld.java ,再利用javac.exe
将 helloworld.java 文件编译成 字节码文件,即 helloworld.class 文件。在利用java.exe 执行 字节码文件 helloworld.class 。
这里利用 java.exe 执行 helloworld.class 文件时,会涉及到一个问题,就是 -x参数
(即非标准参数,如果是在idea上运行项目,可在edit configuration里的option什么那里设置标准参数或者非标准参数),-x参数列举如下:
1,在-Xint解释模式(interpreted mode)下,-Xint标记会强制JVM解释执行所有的字节码。
2,-Xcomp编译模式下,JVM在第一次使用时会把所有的字节码编译成 本地代码,从而带来大程度的优化。
3,-Xmixed是混合模式,将解释模式与编译模式进行混合使用, jvm默认的模式。
关于上述三类型参数的详细解释:
解释模式下是解释执行,解释执行,就是不经过jit直接由解释器解释执行所有字节码,
它每转译一行程序叙述就立刻运行,然后再转译下一行,再运行,如此不停地进行下去。执行效率不高。
编译模式下是编译执行,即不加筛选的将全部代码编译成机器码(或称本地代码),不考虑其执行的频率是否有编译的价值。
这里编译模式中,代码编译成机器码依靠的是JIT编译器(即时编译器),和javac编译器不同,
JIT编译器可称为后端运行期编译器(深入理解java虚拟机第二版P302)。虚拟机中内置了两个JIT编译器,
client compiler和server compiler,程序会根据虚拟机运行模式(client模式还是server模式)决定使用哪个编译器,
可通过标准参数设置虚拟机运行模式。(关于标准参数具体可看我的: )
-Xmixed混合模式是默认的模式,解释器(英语:Interpreter)和JIT编译器配合工作,程序最开始通过解释器,
进行解释执行,某个方法或代码块执行特频繁时,将其认定为热点代码,将热点代码编译成机器码,并进行优化。