0
点赞
收藏
分享

微信扫一扫

从源代码到机器代码,Java语言中发生了什么?

通过Javac编译器,我们可以很容易地将Java源文件翻译成字节码文件。以Hello World为例:

public class Demo{

public static void main(String args[]){

Syst 需要zi料+ 绿色徽【vip1024b】

em.out.println("Hello World!");

}

}

当我们使用javac命令编译上面的类时,我们生成一个Demo.类文件:

javac Demo.java

ls

Demo.java Demo.class

当我们使用纯文本编辑器打开演示时。类文件,我们将发现一系列16位的二进制流。

从源代码到机器代码,Java语言中发生了什么?_编译器

运行Javac命令的过程实际上是解析Java源代码并通过Javac编译器生成字节码文件的过程。直截了当地说,Java语言规范实际上是通过使用Javac编译器转换成字节码语言规范的。javac编译器的过程可以分为以下四个阶段:

第一阶段是词汇和语法分析。在这个阶段,JVM扫描源代码的字符一次,最后生成一个抽象语法树。简单地说,在这个阶段,JVM将理解我们的代码真正想要做什么。正如我们分析一个句子一样,我们将它分为主语、谓语和宾语,并找出句子的意思。

第二阶段:填写符号表。我们知道类彼此引用,但是在编译阶段,我们不能确定它们的特定地址,所以我们使用符号代替。我们在这个阶段所做的是类似的,即抽象类或接口的符号填充。加载类时,JVM用特定的内存地址替换符号。

第三阶段:注释处理。我们知道Java支持注释,所以在这个阶段,注释将根据注释的作用被分析并恢复到特定的指令集。

第四阶段:分析和字节码生成。在这个阶段,JVM将基于以上阶段的结果生成字节码,并且最终输出是一个类文件。

我们一般称 javac 编译器为前端编译器,因为其发生在整个编译的前期。常见的前端编译器有 Sun 的 javac,Eclipse JDT 的增量式编译器(ECJ)。

JIT 编译器:从字节码到机器码

当源代码转换为字节码时,有两种选择可以运行程序。一种是使用Java解释器来解释执行字节码,另一种是使用JIT编译器将字节码转换成本地机器代码。

两种方法的区别在于前者启动速度快,但运行速度慢,而后者启动速度慢,但运行速度快。原因很简单。因为解释器不需要像JIT编译器那样将所有字节码转换为机器代码,所以它自然地减少了优化时间。当JIT编译器完成其第一次编译时,它将保存与字节代码对应的机器代码,并且可以在下次直接使用。正如我们所知,机器代码必须比Java解释器更有效。因此,在实践中,为了更快、更有效地运行,我们通常结合这两种方法编译和执行Java代码。

从源代码到机器代码,Java语言中发生了什么?_Java_02

HotSpot虚拟机内置了两个即时编译器,客户端编译器和服务器编译器。这两个不同的编译器派生了两种不同的编译模式,分别称为C1编译模式和C2编译模式。

注意:现在很多人都称客户端编译器C1编译器和服务器编译器C2编译器,但他们在Oracle官方文档中将其描述为编译器模式。所以C1编译器和C2编译器只是我们的习惯用语,而不是官方用语。这需要特别注意。

从源代码到机器代码,Java语言中发生了什么?_编译器_03

结语

小编也是很有感触,如果一直都是在中小公司,没有接触过大型的互联网架构设计的话,只靠自己看书去提升可能一辈子都很难达到高级架构师的技术和认知高度。向厉害的人去学习是最有效减少时间摸索、精力浪费的方式。

我们选择的这个行业就一直要持续的学习,又很吃青春饭。

虽然大家可能经常见到说程序员年薪几十万,但这样的人毕竟不是大部份,要么是有名校光环,要么是在阿里华为这样的大企业。年龄一大,更有可能被裁。

送给每一位想学习Java小伙伴,用来提升自己。

本文到这里就结束了,喜欢的朋友可以帮忙点赞和评论一下,感谢支持!

举报

相关推荐

0 条评论