博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java代码编译与C/C++代码编译的区别
阅读量:5126 次
发布时间:2019-06-13

本文共 1424 字,大约阅读时间需要 4 分钟。

Java编译原理 

1、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的可移植性和安全性。 
2、jvm工作原理 
运行jvm字符码的工作是由解释器来完成的。解释执行过程分三步进行:代码的装入、代码的校验、和代码的执行。 
装入代码的工作由“类装载器classloader”完成。类装载器负责装入运行一个程序需要的所有代码,这也包括程序代码中的类所继承的类和被调 
用的类。当类装载器装入一个类时,该类被放在自己的名字空间中。除了通过符号引用自己名字空间以外的类,类之间没有其他办法可以影响其他类。在本台计算机的所有类都在同一地址空间中,而所有从外部引进的类,都有一个自己独立的名字空间。这使得本地类通过共享相同的名字空间获得较高的运行效率,同时又保证它们与从外部引进的类不会相互影响。 
当装入了运行程序需要的所有类后,解释器便可确定整个可执行程序的内存布局。解释器为符号引用与特定的地址空间建立对应关系及查询表。通过在这一阶段确定代码的内布局,java很好地解决了由超类改变而使子类崩溃的问题,同时也防止了代码的非法访问。 
随后,被装入的代码由字节码校验器进行检查。校验器可以发现操作数栈溢出、非法数据类型转化等多种错误。通过校验后,代码便开始执行了。 
java字节码的执行有两种方式: 
1)即时编译方式:解释器先将字节编译成机器码,然后再执行该机器码。 
2)解释执行方式:解释器通过每次解释并执行一小段代码来完成java字节码程序的所有操作。 

转载于:https://www.cnblogs.com/qxxnxxFight/p/4313471.html

你可能感兴趣的文章
Iroha and a Grid AtCoder - 1974(思维水题)
查看>>
gzip
查看>>
转负二进制(个人模版)
查看>>
LintCode-Backpack
查看>>
查询数据库锁
查看>>
[LeetCode] Palindrome Number
查看>>
我对于脚本程序的理解——百度轻应用有感
查看>>
SQL更新某列包含XX的所有值
查看>>
网易味央第二座猪场落户江西 面积超过3300亩
查看>>
面试时被问到的问题
查看>>
spring 事务管理
查看>>
VS2008 去掉msvcr90的依赖
查看>>
当前记录已被另一个用户锁定
查看>>
Bootstrap
查看>>
Node.js 连接 MySQL
查看>>
ACM-ICPC 2018 world final A题 Catch the Plane
查看>>
那些年,那些书
查看>>
面向对象六大基本原则的理解
查看>>
注解小结
查看>>
java代码编译与C/C++代码编译的区别
查看>>