JVM(一):源文件的转变
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(一):源文件的转变的更多相关文章
- Servlet&jsp基础:第二部分
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 学习Java第一天,大致了解
第一章: java核心 1 了解 java的产生背景 2 了解java的体系结构和组成 3 了解java程序的编写 编译 运行 4 掌握java的 api文档的使用 5 了解 jdk的组成 1. ja ...
- Java语言概述_章节练习题及面试
学于尚硅谷开源课程 宋洪康老师主讲 感恩 尚硅谷官网:http://www.atguigu.com 尚硅谷b站:https://space.bilibili.com/302417610?from=se ...
- jvm系列(一):java类的加载机制
java类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装 ...
- 【JVM】JVM系列之类加载机制(四)
一.前言 前面分析了class文件具体含义,接着需要将class文件加载到虚拟机中,这个过程是怎样的呢,下面,我们来仔细分析. 二.什么是类加载机制 把class文件加载到内存,并对数据进行校验.转换 ...
- Java的一些常见问题,JRE,JDK,JVM,包等概念理解
Java常见错误: 文件名字应该与文件中public类的名字相同 public static void main(String[] args); 如何定位错误和解决错误. JVM,JRE,JDK解释和 ...
- 【转】JVM运行原理及JVM中的Stack和Heap的实现过程
来自: http://blog.csdn.net//u011067360/article/details/46047521 Java语言写的源程序通过Java编译器,编译成与平台无关的‘字节码程序’( ...
- 漫谈JVM
背景介绍 JVM已经是Java开发的必备技能了,JVM相当于Java的操作系统. JVM,java virtual machine, 即Java虚拟机,是运行java class文件的程序. Java ...
- 【转】JVM介绍
1. 什么是JVM? JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来 ...
随机推荐
- CF915C Permute Digits
思路: 从左到右贪心放置数字,要注意判断这个数字能否放置在当前位. 实现: #include <bits/stdc++.h> using namespace std; typedef lo ...
- CSS3 四边形 凹角写法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ascii - 在八进制,十进制,十六进制中的 ASCII 字符集编码
描述 ASCII 是美国对于信息交换的标准代码,它是7位码,许多8位码(比如 ISO 8859-1, Linux 的默认字符集)容纳 ASCII 作为它们的下半部分.对应的国际 ASSII 是 ISO ...
- Go语言 之md5加密
//方式一 func getMd5String1(str string) string { m := md5.New() _, err := io.WriteString(m, str) if err ...
- svn 版本库信息修改
root@hpcstack hpcweb]# svn info 路径: . URL: http://svn.pyindex.com/hpcweb 版本库根: http://svn.pyindex.co ...
- 第1节 MapReduce入门:11、mapreduce程序的入门
1.1.理解MapReduce思想 MapReduce思想在生活中处处可见.或多或少都曾接触过这种思想.MapReduce的思想核心是“分而治之”,适用于大量复杂的任务处理场景(大规模数据处理场景). ...
- 多线程之Java中的等待唤醒机制
多线程的问题中的经典问题是生产者和消费者的问题,就是如何让线程有序的进行执行,获取CPU执行时间片的过程是随机的,如何能够让线程有序的进行,Java中提供了等待唤醒机制很好的解决了这个问题! 生产者消 ...
- Oracle 学习之:ASCII,CHR函数的作用和用法
对于ASCII以及CHR函数的用法,Oracle给出的解释是: ASCII(x)gets the ASCII value of the character X, CHR() and ASCII() h ...
- Javascript创建对象几种方法解析
Javascript创建对象几种方法解析 Javascript面向对象编程一直是面试中的重点,将自己的理解整理如下,主要参考<Javascript高级程序设计 第三版>,欢迎批评指正. 通 ...
- <Redis> 入门X 分布式锁
分布式其实就是多进程的程序,当多个进程访问一个资源,会造成问题: 1.资源共享的竞争问题 2.数据的安全性 分布式锁的解决方案: 1.怎么去获取锁 数据库 zookeeper redis 2.怎么释放 ...