java编译过程

Java编译原理
一、Java编译过程与c/c++编译过程不一样
Java编译程序将java源程序编译成jvm可执行代码--java字节码.

Java在编译过程当中通常会按照如下过程进行:
(1)JDK根据编译参数encoding肯定源代码字符集.若是不指定该参数,系统会根据操做系统的file.encoding参数来获取操做系统编码格式,国内的windows一般都是GBK.
(2)JDK根据上面的字符集信息,将源文件编译成JAVA内部的unicode模式,并将编译后的内容保存到内存中.
(3)JDK将内存保存无缺的内存信息写入.class文件,生成最后的二进制文件.

   不少人会发现本身在IDE中配置了源文件字符集为UTF-8(与操做系统默认字符集不一样)后,再直接运行javac就会出现错误,这就是由于不加 encoding参数的编译过程当中会默认使用系统的字符集的。在windows中默认为GBK。IDE中进行编译时,IDE会在编译参数中增长该参数.

  若是你使用ant来进行编译活动,那么请你确认你的源代码的字符集,而后再相应的ant编译任务中,增长encoding参数
这就意味着, 若是你以前的项目采用的是系统默认的字符集(GBK)来编辑你的源代码,那么若是你改用UTF-8,这就意味你须要从新修改ant脚本,从新打包你的产品。


c/c++编译过程:
当C编译器编译生成一个对象的代码时,该代码是为在某一特定硬件平台运行而生成的。所以在编译过程当中,编译程序经过查表将全部对符号的引用转换为特定的内存偏移量,以保证程序运行。

Java编译过程:
Java编译器却不将对变量和方法的引用编译为数值引用,也不肯定程序执行过程当中的内存布局,而是将些符号引用信息保留在字节码中,由解释器在运行过程当中创立内存布局,而后再经过查表来肯定一个方法所在的地址,这样就有效地保证了java的可移植性和安全性。

二、jvm工做原理
运行jvm字符码的工做是由解释器来完成的。解释执行过程分三步进行:代码的装入、代码的校验、和代码的执行。

装入代码的工做由“类装载器classloader”完成。类装载器负责装入运行一个程序须要的全部代码,这也包括程序代码中的类所继承的类和被调

用的类。当类装载器装入一个类时,该类被放在本身的名字空间中。除了经过符号引用本身名字空间之外的类,类之间没有其余办法能够影响其余类。在本 台计算机的全部类都在同一地址空间中,而全部从外部引进的类,都有一个本身独立的名字空间。这使得本地类经过共享相同的名字空间得到较高的运行效率,同时 又保证它们与从外部引进的类不会相互影响。

当装入了运行程序须要的全部类后,解释器即可肯定整个可执行程序的内存布局。解释器为符号引用与特定的地址空间创建对应关系及查询表。经过在这一阶段肯定代码的内布局,java很好地解决了由超类改变而使子类崩溃的问题,同时也防止了代码的非法访问。

随后,被装入的代码由字节码校验器进行检查。校验器能够发现操做数栈溢出、非法数据类型转化等多种错误。经过校验后,代码便开始执行了。 java字节码的执行有两种方式: 1)即时编译方式:解释器先将字节编译成机器码,而后再执行该机器码。 2)解释执行方式:解释器经过每次解释并执行一小段代码来完成java字节码程序的全部操做。
相关文章
相关标签/搜索