Javac编译器】的更多相关文章

在每个人学习java的第一步,都是安装jdk ,jre,配置java_home,classpath,path. 为什么要做这些?在阅读java-core的时候,看到了原理,p141. 一 关于类的共享 为了使类能被多个程序共享,需要做到以下几步: 1.把类放到同一个目录中,且该目录是package树状结构的root目录:如将com.horstmann.corejava.Employee类添加在目录home/user/classdir下,这个Employee.class类文件就必须位于子目录/ho…
java语言的“编译期”其实是一段“不确定”的操作过程,可能是指一个前端编译器把.java变成.class的过程,也可能是指虚拟机的后端运行期编译器(JLT)把字节码转变成机器码的过程,也有可能是使用静态提前编译器(AOT)直接把.java文件直接编译成本地机器代码的过程.现在讨论的是第一种编译器. Javac编译器 ①javac的源码与测试   运行com.sun.tools.javac.Main的main()方法来执行编译,与命令行中使用javac的命令没什么区别. 编译过程可以分为3个过程…
1.Javac概述 编译器可以将编程语言的代码转换为其他形式,如Javac,将Java语言转换为虚拟机能够识别的.class文件形式.而这种将java源代码(以.java做为文件存储格式)转换为class文件格式的过程一般也称为编译器的前端.要将字节码变为机器码还需要后端编译器,如JIT编译器(Just In Time Compiler).或者还可以通过AOT编译器直接将Java源代码编译为本地机器代码.本书涉及的主要内容就是Sun的Javac编译器. javac1.7中没有使用像Lex.YAC…
Javac编译器是把 *.java 文件转换为 *.class 文件,是一个前端编译器:对应着有一种把字节码转变为机器码的编译器,称为JIT编译器(Just In Time Compiler),比如 HotSpot VM 的C1.C2编译器:把 *.java 文件编译成机器码的编译器称为静态提前编译器: Javac编译器编译的过程可以为3个过程: 1.解析与填充符号表: 这个过程又可以细分为词法分析.语法分析和填充符号表: 词法分析:词法分析是将源代码的字符流转变为标记(Token)集合,单个字…
学习<深入了解Java虚拟机>有一段时间了,大概理解了Java从源代码编译到执行出结果的过程,也能明确的知道Java是半解释性语言.在执行源代码时,先通过Javac编译器对源代码进行词法分析.语法分析.生成抽象语法树.语义分析等,这部分操作是在Java虚拟机之外进行的,而解释器在虚拟机内部,所以Java程序的编译就是半独立的实现过程. 一.了解一下javac编译的详解过程 编译过程大致上分为三步:解析与填充符号表过程.插入式注解处理器的注解处理过程.分析与字节码生成过程.…
学习<深入了解Java虚拟机>有一段时间了,大概理解了Java从源代码编译到执行出结果的过程,也能明确的知道Java是半解释性语言.在执行源代码时,先通过Javac编译器对源代码进行词法分析.语法分析.生成抽象语法树.语义分析等,这部分操作是在Java虚拟机之外进行的,而解释器在虚拟机内部,所以Java程序的编译就是半独立的实现过程. 一.了解一下javac编译的详解过程 编译过程大致上分为三步:解析与填充符号表过程.插入式注解处理器的注解处理过程.分析与字节码生成过程. (1)词法.语法分析…
编译过程 Javac 编译过程大致可以分为1个准备过程和3个处理过程: 准备过程:初始化插入式注解处理器. 解析与填充符号表过程,包括: 词法.语法分析,将源代码的字符流转变为标记集合,构造出抽象语法树. 填充符号表,产生符号地址和符号信息. 插入式注解处理器的注解处理过程.可以把插入式注解处理器看作是一组编译器的插件,当这些插件工作时,允许读取.修改.添加抽象语法树中的任意元素.如Lombok注解. 分析与字节码生成过程,包括: 标注检查.对语法的静态信息进行检查. 数据流及控制流分析.对程序…
Javac是什么? 它是一种编译器,将Java对人非常友好的语言,编译转化对所有机器都非常友好的语言,即:JVM能够识别的语言,也就是Java字节码.而Java字节码,说白了就是一连串二进制数字. Javac中有什么?  既然它是编译器, 这时候就要回想一下大学所学<编译原理>:什么词法分析,语法分析,语义分析,目标代码生成,目标代码优化……好吧,我承认这方面,已经被我扔进回收站,等我好好还原一下: 恢复成功,有图为证: 下面详细讲一下,Javac中词法分析器的内部原理: 先上图,看一下词法分…
我的扩展功能描述如下: 在java的现有语法中加入var来声明变量,并且可以根据初始化数据来自动类型推导. 举两个例子: 例一: 如下JAVA代码(注意这里的var是新语法): import java.util.*; public class TestHello { private var i = new ArrayList<List<?>>(); } 在用我修改的编译器编译之后,再用反编译工具反编译之后会看到如下形式的代码: import java.util.ArrayList;…
一.概述 我们都知道 *.java 文件要首先被编译成 *.class 文件才能被 JVM 认识,这部分的工作主要由 Javac 来完成,类似于 Javac 这样的我们称之为前端编译器: 但是 *.class 文件也不是机器语言,怎么才能让机器识别呢?就需要 JVM 将 *.class 文件编译成机器码,这部分工作由JIT 编译器完成: 除了这两种编译器,还有一种直接把 *.java 文件编译成本地机器码的编译器,我们称之AOT 编译器. 二.javac 的编译过程 首先,我们先导一份 java…
One Compiler http://www.oracle.com/technetwork/java/jvmls2016-wimmer-3125555.pdf Hacking the OpenJDK compiler(JAVAC的源码分析) http://www.ahristov.com/tutorial/java-compiler.html http://download.java.net/openjdk/jdk8/ Hacking The Java Compiler For Fun and…
编译器与Javac编译原理 在前文我们知道了Java是一种编译语言和解释语言,它的源代码经过编译器Javac编译为能够被JVM识别的二进制语言,然后JVM将其解释为能够被平台识别的机器语言.那么什么是编译器呢?编译器的作用是什么呢?Javac又是如何进行工作的?下面我们一一来认识了解. 1 编译器(Compiler ) 简单讲,编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序.一个现代编译器的主要工作流程:源代码 (source code) → 预处理器 (…
编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块可以选择性实现.很容易看出,上图中间的那条分支是解释执行的过程(即一条字节码一条字节码地解释执行,如 JavaScript),而下面的那条分支就是传统编译原理中从源代码到目标机器代码的生成过程. 如今,基于物理机.虚拟机等的语言,大多都遵循这种基于现代经典编译原理的思路,在执行前先对程序源码进行词法解析和语法解析处理,把源码转化为抽…
从Sun Javac的代码来看,编译过程大致可以分为3个过程: 解析与填充符号表过程. 插入式注解处理器的注解处理过程. 分析与字节码生成过程. Javac编译动作的入口是com.sun.tools.javac.main.JavaCompiler类,上述3个过程的代码逻辑集中在这个类的compile()和compile2()方法中,整个编译最关键的处理就由图中标注的8个方法来完成,下面我们具体看一下这8个方法实现了什么功能. 解析与填充符号表 解析步骤由上图中的parseFiles()方法(过程…
编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块可以选择性实现.很容易看出,上图中间的那条分支是解释执行的过程(即一条字节码一条字节码地解释执行,如JavaScript),而下面的那条分支就是传统编译原理中从源代码到目标机器代码的生成过程. 如今,基于物理机.虚拟机等的语言,大多都遵循这种基于现代经典编译原理的思路,在执行前先对程序源码进行词法解析和语法解析处理,把源码转化为抽象…
我们都知道,计算机只能识别二进制语言,是不能直接识别java c c++等高级语言的.将高级语言转化成计算机可以是别的二进制语言,这个过程就叫编译. 有次面试,面试官问了一道“java的编译原理是什么”,当时给懵了,只知道是把java文件转换成class文件,然后由jvm执行,具体流程就不知道了.今天看了许令波编著的<深入分析java web技术内幕>一书,其中有一章讲的就是javac的编译原理,看了一遍,感觉有点云里雾里,不是很明白,接下还得多看看几遍,多上网查查资料深入透彻的学习一下. 今…
本文转载自:http://blog.csdn.net/ns_code/article/details/18009455 编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块可以选择性实现.很容易看出,上图中间的那条分支是解释执行的过程(即一条字节码一条字节码地解释执行,如JavaScript),而下面的那条分支就是传统编译原理中从源代码到目标机器代码的生成过程. 如今,基于物理机.虚…
转载请注明出处:http://blog.csdn.net/ns_code/article/details/18009455 编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块可以选择性实现.很容易看出,上图中间的那条分支是解释执行的过程(即一条字节码一条字节码地解释执行,如JavaScript),而下面的那条分支就是传统编译原理中从源代码到目标机器代码的生成过程. 如今,基于物理机…
javac编译器的作用就是将符合java语言规范的源代码转化成符合java虚拟机规范的java字节码 经历:词法分析器->语法分析器->语义分析器->编译字节码 四个过程生成字节码文件 1.词法分析:javacPaser根据java语言规范判断出哪些是动词,名词,标点符号之类,生成规范的token流.将这个类中的所有关键词匹配到Token类中的一项 2.语法分析:将词法分析器生成的Token流转化成更加结构化的语法树,也就是将一个个单词组成成一句话,一个完整的句子. 3.语义分析:语法分…
[深入Java虚拟机]之七:Javac编译与JIT编译 编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块可以选择性实现.很容易看出,上图中间的那条分支是解释执行的过程(即一条字节码一条字节码地解释执行,如JavaScript),而下面的那条分支就是传统编译原理中从源代码到目标机器代码的生成过程. 如今,基于物理机.虚拟机等的语言,大多都遵循这种基于现代经典编译原理的思路,在执行前…
枚举类在Javac中是被当作类来看待的. An enum type is implicitly final unless it contains at least one enum constant that has a class body. 举例如下: enum EnumTest { MON(1), TUE(2), WED(3), THU(4), FRI(5), SAT(6) { @Override public boolean isRest() { return true; } }, SU…
Java语言有Java语言的规范,,这个规范详细描述了Java语言有哪些词法.语法,而Java虚拟机也有其Java虚拟机的规范,同样Java虚拟机的规范和Java语言规范并不一样,它们都有自己的词法和语法解析规则,而且解析规则也是不同的.那么如何将Java的语法规则适应到Java虚拟机的语法规则呢?这个任务就由Javac编译器来完成.它的任务就是将Java语言规范转化成Java虚拟机语言规范,完成"翻译工作". 本文主要围绕如下三个方面来讲解: 第一.Javac是什么; 第二.Java…
1.Javac编译器 (1)Javac编译器介绍(主要介绍如何从java源代码到class的一个转换过程) (2)Javac的源码(说明其中哪个功能由哪个主要的类来完成) (3)Javac支持的命令及实现 2.文件加载与输出 (1)概述 编译一个Java源代码到class时会涉及到依赖文件的查找加载,并且需要将最终生成的class文件进行写出.这就需要一个统一的文件模块来处理,其中涉及到的主要类如下: 1.Paths.Path 2.ZipArchive 3.BaseFileObject 4.Ja…
在OptionName类中的枚举定义如下: XLINT("-Xlint"), XLINT_CUSTOM("-Xlint:"), -Xlint     Enable all recommended warnings. In this release, enabling all available warnings is recommended.-Xlint:all   Enable all recommended warnings. In this release,…
4.1 Javac是什么 是一种编译器,将JAVA源代码(.java文件)语言先转化成JVM能够识别的一种语言(.class文件),然后由JVM将JVM语言再转化成当前机器可以识别的机器语言. 4.2 javac编译器的基本结构 javac编译器的作用是将符合JAVA语言规范的源代码转化成符合JAVA虚拟机规范的JAVA字节码. 词法分析:从源代码中找出一些规范的token流,就像在人类的语言中分辨出哪些是词语,标点符号,动词,名词等. 语法分析:形成一个符合JAVA语言规范的抽象语法树.语法树…
Eclipse编译器对Javac编译器的优点如下: 1.Proceed on errors 如果使用Javac编译器,你除了在执行之前修复所有错误之外没有其它的选择.然而Eclipse编译器却可以不管这些允许你执行,其目的在于总是生成一个可运行的二进制文件:如果你的代码触及到编译时错误,Eclipse编译器会招聘一个运行时异常. 需要设置IDEA如下: 1)1.在编译器设置页面选中”Proceed on errors“ 2)在运行配置中用“Make, no error check”替换“Make…
Javac是什么 Javac编译器的基本结构 Javac工作原理分析 设计模式解析之访问者模式…
  .java为Java的源文件后缀,编写的代码需要写在.java文件中.     Javac编译器,用于读取Java源代码,并将其编译成字节代码.经过javac编译后形成.class,是字节码文件.     Java虚拟机(JVM)运行.class文件从而实现程序的运行. 1.JVM——java virtual machine,就是我们常说的java虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行,也就是说cl…
一个十足的技术迷,2013年毕业,做过ERP.游戏.计算广告,在大公司呆过,但终究不满足仅对技术的应用,在2018年末离开了公司,全职写了一本书<深入解析Java编译器:源码剖析与实例详解>,在近期就会上市销售了. 1.为什么要写这本书? 从去年年底离职到今天7月交完<深入解析Java编译器:源码剖析与实例详解>书稿,到现在上市发行也差不多一年过去了,也算是给了自己这一年一个交待吧.写书不赚钱,估计首次拿到的稿费还不如我在大公司呆一个月的收入吧,但是花费的时间和精力却是巨大的,而且…
优化1 对于byte/short/char三种类型来说,如果右侧赋值的数值没有超过范围,那么javac编译器将会自动隐含地为我们补上一个(byte)(short)(char). 如果没有超过左侧的范围,编译器补上强转. 如果右侧超过了左侧范围,那么直接编译器报错. 代码举例 public class MyDemo11Notice { public static void main(String[] args) { // 右侧确实是一个int数字,但是没有超过左侧的范围,就是正确的. // int…