JVM(一):源文件的转变

本文讲述一个.java源文件是如何经过javac编译器的一系列操作变为.class文件的.

编译

说到编译,大家都能想到是编译器经过一系列方法将源代码转变为目标机器代码,但Java作为一个平台无关性语言,前端编译的主要作用是将源代码转变为JVM能识别出的语言,而具体与机器相关的机器代码生成由后续JVM自己掌控.

Java中的编译分为前端编译后端编译两种,本文讲解的主要是前端编译,后端编译是JVM运行期的时候将Java代码编译为本地机器码的过程,因为Java是一门动态性语言,大部分的代码优化都是放在后端编译中,展开来讲篇幅比较长,因此具体的优化方式放在后续文章再详细描述.

javac

如上文所说,javac编译器能做到将一门高级语言转变为JVM能识别出的语言,而若要完成这些功能需要javac拥有哪些模块和功能,下面就由笔者来为大家讲解一下.

ps:因笔者对汇编语言也不甚了解,所以讲述的编译细节也不是十分具体,此外若有错误,请大家积极指出,谢谢!

javac的构成

词法分析

词法分析的作用是将源代码一个一个字节的读取出来,识别出哪些字节是Java语言中的关键字,如if,while,for等,哪些是程序员自定义字节,如a,b等.举例来说,Java中的一句

int a = b + 1;

句中就包含了 int , a , = , b , + , 1 , ;七个字节.

语法分析

语法分析的作用是对上一步得到的Token字节流进行分析,验证其是否符合Java语言规范,如在int后面是否紧跟着一个符合Java命名规范的变量名.=前的变量是否可赋值等等.

在这一步会得到一个语法树,其功能是将语言的主要词法用一个结构化的形式组织在一起.

语义分析

在上一步得到了一个语法树,但其无法保证这个语法树是逻辑正确的,例如coder可能会为一个还没有声明的变量赋值,这个错误在前两步是无法检查出的,只有在这一步通过语义分析才能检查出错误.另外在这一步还会对语法糖进行解糖(desugar)操作,将复杂难懂的语法转变为简单易懂的语法.

具体Java中有哪些语法糖,每个语法糖对应的基础结构留待下篇文章再详细讲解.

语法糖:计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。(来自百度百科)

例如Java中的自动拆装箱,foreach循环等都属于语法糖的范畴.

字节码生成

字节码生成是javac编译过程的最后一个阶段.其作用是将前面各个步骤生成的信息转化为字节码写到磁盘中,生成.class文件,也宣布了整个编译过程的结束.

总结

本文主要描述Java中的前端编译,叙述了Java源代码是如何经过 词法分析,语法分析,语义分析,字节码生成 4个步骤变为.class文件的.具体的实现细节,笔者因对汇编不是十分了解,且认为不是十分重要而没有具体展开,若读者有兴趣,可以自行翻阅<<深入理解Java虚拟机>>进行学习.

文章在公众号"iceWang"第一手更新,有兴趣的朋友可以关注公众号,第一时间看到笔者分享的各项知识点,谢谢!笔芯.

本系列文章主要借鉴自<深入分析JavaWeb技术内幕>和<深入理解Java虚拟机-JVM高级特性与最佳实践>.

JVM(一):源文件的转变的更多相关文章

  1. Servlet&jsp基础:第二部分

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  2. 学习Java第一天,大致了解

    第一章: java核心 1 了解 java的产生背景 2 了解java的体系结构和组成 3 了解java程序的编写 编译 运行 4 掌握java的 api文档的使用 5 了解 jdk的组成 1. ja ...

  3. Java语言概述_章节练习题及面试

    学于尚硅谷开源课程 宋洪康老师主讲 感恩 尚硅谷官网:http://www.atguigu.com 尚硅谷b站:https://space.bilibili.com/302417610?from=se ...

  4. jvm系列(一):java类的加载机制

    java类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装 ...

  5. 【JVM】JVM系列之类加载机制(四)

    一.前言 前面分析了class文件具体含义,接着需要将class文件加载到虚拟机中,这个过程是怎样的呢,下面,我们来仔细分析. 二.什么是类加载机制 把class文件加载到内存,并对数据进行校验.转换 ...

  6. Java的一些常见问题,JRE,JDK,JVM,包等概念理解

    Java常见错误: 文件名字应该与文件中public类的名字相同 public static void main(String[] args); 如何定位错误和解决错误. JVM,JRE,JDK解释和 ...

  7. 【转】JVM运行原理及JVM中的Stack和Heap的实现过程

    来自: http://blog.csdn.net//u011067360/article/details/46047521 Java语言写的源程序通过Java编译器,编译成与平台无关的‘字节码程序’( ...

  8. 漫谈JVM

    背景介绍 JVM已经是Java开发的必备技能了,JVM相当于Java的操作系统. JVM,java virtual machine, 即Java虚拟机,是运行java class文件的程序. Java ...

  9. 【转】JVM介绍

    1. 什么是JVM? JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来 ...

随机推荐

  1. Android与H5互调(通过实例来了解Hybrid App)

    前些日子,Android原生开发将被取缔的吵得火热,JavaScript是能做一个完全的APP,但只使用JavaScript做出来的APP也不会牛逼到哪里去.最好的是混合(Hybrid)开发,在需要的 ...

  2. 轻松搞定Spring+quartz的定时任务

    1.spring 的定时任务写法有两种:一种是继承工作类,一种是普通的Bean,定时写法有两种写法:一种是以时间间隔启动任务SimpleTriggerBean,一种是以时刻启动任务CronTrigge ...

  3. IntelliJ IDEA导入JDK出现The selected directory is not a valid home for JDK问题的解决方法

    JDK版本与IDEA版本不兼容: JDK版本过高可能会造成这个问题,需与IDEA相兼容的JDK才行. 比如,用IDEA2016.3.8版本的,JDK用jdk-10.0.1_windows-x64_bi ...

  4. Jquery+ashx实现Ajax

    一 Ajax的实现方式 1.使用一般的webform,在页面用jQuery ajax调用,再从取得的html数据中取得<body>内的内容,写入DOM 优点:不用改变现有的asp.net开 ...

  5. date - 打印或设置系统日期和时间

    总览 date [选项]... [+格式] date [选项] [MMDDhhmm[[CC]YY][.ss]] 描述 根据指定格式显示当前时间或设置系统时间. -d, --date=STRING 显示 ...

  6. POJ中和质数相关的三个例题(POJ 2262、POJ 2739、POJ 3006)

    质数(prime number)又称素数,有无限个.一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数:否则称为合数.      最小的质数 ...

  7. js 或jquery定义方法时,参数不固定是怎么实现的

    //①不定义接受参数的方式来接受参数(arguments) function getparams(){ //利用arguments来接受参数,arguments表示参数集合, //里面存放的调用这个方 ...

  8. Linux从入门到适应(四):Ubuntu 16.04环境下,安装Nvidia驱动,cuda9.2和 cudnn

    在安装深度学习框架之前,cuda和cudnn是必须要提前安装的,现在按照流程而nvidia驱动的版本和cuda版本有这一些对应关系,所以需要按照版本进行安装,现在说一下如何安装: 1 安装nvidia ...

  9. 安装php扩展(以swoole)为例

    一.下载swoole到/usr/local/src目录下,操作 git clone https://gitee.com/swoole/swoole.git; 二.cd swoole,phpize(如果 ...

  10. 第二次:Ubuntu16.04 安装Docker

    sudo apt-get update, 就这一个命令执行了多半天,不知道网络缘故还是怎么的,管他呢,装完总是好的. # step 1: 安装必要的一些系统工具 sudo apt-get update ...