首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Javac实现过程

主要介绍Javac实现过程及原理。 首先弄明白什么是JavacJavac是一种编译器,将一种语言转换为另一种语言规范。...编译器作用就是将符合java语言规范源代码转化为JVM虚拟机能够识别的字节码文件过程。 对于java而言。javac任务就是将java源代码转换为jvm能够识别的二进制码。...编译过程原理: 1、词法分析:首先将源代码按照字节方式读取,然后找出定义语法关键字(if/else/for等),然后判断哪些关键字是符合java语言规范,经过整理分析返回一些规范化Token流...语义分析实现步骤; 语义分析主要是在Enter类中完成,这个类主要有两个步骤 (1)将所有类中出现符号都输入到类自身符号表中,所有的类符号,类参数列表,超类符号,和继承接口类型符号都会存储到未处理符号列表中...按照JVM文件组织形式将字节码输出到后缀名为class字节码文件中 整个业务流程: ?  关于javac基本原理就介绍到这里,有兴趣可以研究下Javac源码,可以从OpenJdk下载到源码。

1.5K50

Javac实现过程

主要介绍Javac实现过程及原理。 首先弄明白什么是JavacJavac是一种编译器,将一种语言转换为另一种语言规范。...编译器作用就是将符合java语言规范源代码转化为JVM虚拟机能够识别的字节码文件过程。 对于java而言。javac任务就是将java源代码转换为jvm能够识别的二进制码。...编译过程原理: 1、词法分析:首先将源代码按照字节方式读取,然后找出定义语法关键字(if/else/for等),然后判断哪些关键字是符合java语言规范,经过整理分析返回一些规范化Token流...语义分析实现步骤; 语义分析主要是在Enter类中完成,这个类主要有两个步骤 (1)将所有类中出现符号都输入到类自身符号表中,所有的类符号,类参数列表,超类符号,和继承接口类型符号都会存储到未处理符号列表中...按照JVM文件组织形式将字节码输出到后缀名为class字节码文件中 整个业务流程: ?  关于javac基本原理就介绍到这里,有兴趣可以研究下Javac源码,可以从OpenJdk下载到源码。

80420
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    使用javac编译源码过程

    使用javac编译源码过程如下: 解析和填充符号表 包括解析包括词法分析和语法分析。 词法解析:将源代码字符流(每个字符)转变为标记(token,比如int a=b+2包括6个标记)集合。...填充符号表:主要记录抽象语法树顶级节点。 插入式注解处理器注解处理过程 如果插件在注解处理期间对抽象语法树进行了修改,编译期重新进入第一步,直到没有修改为止。...语义分析则是检查逻辑上性质,比如变量使用前是否声明,变量赋值类型是否正确,方法是否有返回值等。...字节码生成:将抽象语法树,符号表转化为字节码写到磁盘,并进行少量代码添加和替换,比如()方法,为了实例化子类过程为:先实例化父类构造器,再初始化变量,最后执行语句块。...替换:比如将字符串+,替换为StringBuffer或StringBuilderappend方法。 lombok在第二步增加getter和setter等方法定义相应树节点。

    1K30

    javac 编译过程

    javac 编译过程 ? 一、解析与填充符号表: 1. 语法、词法分析: a) 语法分析:将源代码字符流转换为标记(Token:编译过程最小元素)集合。...b) 词法分析:根据标记序列构造抽象语法树(AST:用来描述程序代码语法结构树形表示方式,每一个节点代表程序中一个语法结构。 2. 填充符号表: 一组符号地址和符号信息组成表格。...二、注解处理器:    插入式注解处理器,编译期间处理注解,读取,修改,删除语法树中任意元素,编译器会根据修改与否,重新回到解析及符号表填充阶段进行处理。   ...标注检查: 包括变量使用前是否已声明,变量与赋值之间数据类型是否匹配 +++ 常量折叠:int a = 1 + 2 ==> int a = 3 2....数据集控制流分析: 包括,局部变量是否赋值,方法路径返回值验证,受检异常正确处理。 3. 解语法糖: 泛型,装箱拆箱,for循环,条件编译等 4. 字节码生成: 转换字节写磁盘。

    1.2K20

    模拟Javac命令

    在前一篇关于Javac编译器文章发布后,公众号后台有小伙伴留言问我javac命令是如何将java文件变成class文件,我们能否实现一个这样命令。...所以这篇文章目的就是以Mac操作系统为例来模拟Javac命令。...首先javac命令在JDK/bin目录下,其实质可以认为是一个脚本,在Mac系统中javac是一个可执行 Unix文件,这里我们自己简单制作一个Unix可执行文件。..../" 才能运行这里简单说明下,我们执行一条Linux命令,本质是在运行一个程序,比如我们运行 javac 命令,那么机器首先会去alias中查找命令含义,然后去内置命令中查找,最后去环境变量PATH...知道命令是如何执行之后,我们来实现一个自己javac命令吧。

    1.1K30

    什么是Javac

    Javac 编译器任务就是讲java语言规范转化成Java虚拟机语言规范,完成 “翻译工作” 什么是Javac Javac 是一种编译器,能将一种语言规范转化成另外一种语言规范。...虽然这种机器码执行起来非常搞笑,但是对人太不友好了, 开发这个代码成本往往远高于剩下机器执行成本。 从某种意义上来说,有了编译器才有了程序语言繁荣,因为片一起是人类和机器沟通一个纽带。...那么回过头来,javac编译器也是将Java这种对人非常友好编程语言编译成对所有机器都非常友好语言。注意,这种语言不是针对某个机器,甚至包括不同种类,不同平台机器。...如何系哦啊出不同种类,不同机器之间差别,这个任务就由JVM来完成,而Javac任务就是将Java源代码语言先转化成JVM能够识别的一种语言,然后由JVM将JVM语言再转化成当前这个机器能够识别的机器语言...如下图所示,javac任务就是将java源码编译成Java字节码,也就是JVM能够识别的二进制码。

    1.3K30

    JAVAC原理「建议收藏」

    正文 将一组源文件编译成相应一组类文件过程并不简单,但是通常可以分为三个阶段。源文件不同部分可以在“按需”基础上以不同速率进行处理。...这个过程是由JavaCompiler类来处理: 将命令行上指定源文件进行读取,解析为语法树,然后将所有外部可见定义都输入到编译器符号表中 在编译过程中会调用适当注解处理器.如果在调用过程中,..., 使类变得完整).使类变得完整可能是按需发生,但是任何未以这种方式完成类最终将通过处理未完成队列来完成.使一个类完成需要如下条件: 确定类泛型参数,父类,接口 将该类所有符号输入到它所对应...这是通过在编译后类符号中安装completer对象来实现,编译后类为对应类树调用MemberEnter阶段。...Lower进行处理,它重写语法树以通过替换等价、简单树来消除特定类型子树。

    93710

    Java编译原理(javac)

    前端编译 前端编译大致主要有以下流程: 对源文件进行词法分析产生字符流 对字符流进行语法分析产生抽象语法树 对语法树进行语义分析,确保语义正常 语义分析通过以后生成中间代码(字节码) 下面我们站在javac...词法分析主要由com.sun.tools.javac.parser.Scannaer类来实现。...上述抽象语法树在Java中使用com.sun.tools.javac.tree.JCTree类来表示,之后所有的操作均建立在抽象语法树之上。...4.2.2 字节码生成 字节码生成是javac编译最后一个阶段。字节码生成阶段不仅仅是把各个步骤生成信息转换成字节码写到磁盘,还进行了代码添加和转换工作。...,就会填充了所有信息符号表交给com.sun.tools.javac.jvm.ClassWriter类,最后由该类writeClass()方法输出字节码。

    1.5K10

    Javac 编译速度缓慢 JDK Bug 定位

    ,并绘制了如下曲线(图中公式使用 Excel 趋势线进行拟合),见下图 2: 图 2:Tuple 总数与编译时间关系 可以看到,编译时间随 Tuple 数变化曲线,完美符合三次函数,即该算法时间复杂度约为...当程序运行一段时间后,我们找出了热点方法(见图 4),即 javac 编译起内部 List 相关调用;通过仔细追踪调用链,发现是 checkWithinBounds 方法过于缓慢。...图 4:找出热点方法 既然热点方法找到了,那么下面就需要探究这个方法在 javac 编译器中是做什么,它算法为什么这么慢,以及是否有优化方式。...在这个 2014 年就提出 JEP-215 中,开发者设计了一种新 javac 方法类型检测机制 TA(Tiered Attribution)来代替现有的 SA(Speculative Attribution...JDK 编译耗时 由此可见,这个 JEP-215 起到了立竿见影效果,让项目构建时间恢复了往日情景。

    60730

    Java底层-Javac编译器

    通常我们也叫Javac编译器为前端编译器,因为一个传统编译器编译结果是由源码到本地机器码一个过程,而由于Javac编译器只负责源码到字节码这一步,所以叫前端编译器;字节码到本地机器码这一步是由后端运行时编译器来完成...Javac编译是使用Java语言实现,是不是很疑惑,用Java语言编写一个javac编译器去编译Java,那Javac源码又是如何被编译执行呢(好像鸡生蛋还是蛋生鸡问题)?...到这里我们知道javac编译器是如何而来,那么我们程序中能不能使用javac编译器呢?答案是肯定。...tools.jar中com.sun.tools.javac包来调用Java编译器,在这个包根目录提供了主类完成编译功能,也就是我们是使用javac命令所执行程序, 但是由于tools.jar不是标准...,感兴趣可以通过OpenJDK来下载源码,然后自己编译javac源码, 也可以通过调用jdkcom.sun.tools.javac.main.Main类来手动编译指定

    2K30
    领券