`

Javac编译器的工作过程

阅读更多

       

        javac的任务是将Java源代码语言先转化成JVM能够识别的一种语言,然后由JVM将JVM语言再转化成当前这个机器能够识别的机器语言。

 

        Javac主要有四个模块,分别是词法分析器、语法分析器、语义分析器、代码生成器。

 

一、词法分析器

        当编译器要读取源代码,一个字节为一节地读进来,找出在这些字节中有那些是我们定义的语法关键词,这个步骤就是词法分析器。词法分析的结果就是从源代码中找出一些规范化的Token流。

 

二、语法分析器

        找出Token流后,检查这些关键词组合在一起是不是符合java语言规范,就是语法分析,结果就是形成一个符合java语言规范的抽象语法树。

 

三、语义分析器

        语义分析主要是把一些难懂的、复杂的语法转换成更加简单的语法。

        这个过程就是将语法分析后生成的抽象语法树在进行一些处理,如,给类增加默认的构造函数,检查变量在使用前是否经过初始化,将一些常量进行合并处理,检查操作变量类型是否匹配,检查所有的操作语句是否可达,检查checked exception异常是否已经捕获或抛出,接触java的语法糖(如将java中foreach转换成for循环结构。)

 

四、代码生成器

        最后一步是通过字节码生成器生成字节码,根据经过注解的抽象语法树生成字节码,结果也就是生成符合java虚拟机规范的字节码了。

1
2
分享到:
评论

相关推荐

    Java初学者怎么入门.md一份给Java初学者的入门指南

    3. 解释了Java编译和运行的过程,javac编译器和java虚拟机的作用。 4. 总结了Java编程语言的优点:跨平台、面向对象、高效、安全等。 5. 给出了10条学习Java的建议,如选择好的教材、掌握基本语法、多实践编程、注重...

    JAVA简易编译器不需创建工程速度快【修正版】

    1.修正了之前版本由于JAVA转EXE过程中失误而导致的在部分机器上跑不动的问题 2.修正了之前版本若把JAVA文件保存在较长的路径时会导致无法编译的问题 JAVA简易编译器,不需创建工程,速度快。无需用控制台javac命令。...

    jsp小示例显示日期

    javac – 编译器,将源程序转成字节码 jar – 打包工具,将相关的类文件打包成一个文件 javadoc – 文档生成器,从源码注释中提取文档 jdb – debugger,查错工具 java – 运行编译后的java程序(.class后缀的) ...

    jdk-6u45-windows-i586 & x64

    javac – 编译器,将源程序转成字节码 jar – 打包工具,将相关的类文件打包成一个文件 javadoc – 文档生成器,从源码注释中提取文档 jdb – debugger,查错工具 java – 运行编译后的java程序(.class后缀的) ...

    JavaEE所需的配置文件(JDK,JRE)

    javac – 编译器,将源程序转成字节码 jar – 打包工具,将相关的类文件打包成一个文件 javadoc – 文档生成器,从源码注释中提取文档 jdb – debugger,查错工具 java – 运行编译后的java程序(.class后缀的)...

    java 混淆工具,不可逆 jocky

    Jocky混淆编译器是在Sun JDK中提供的Java编译器(javac)的基础上完成的,修改了其中的代码生成过程,对编译器生成的中间代码进行混淆, 最后再生成class文件,这样编译和混淆只需要一个步骤就可以完成。另外可以在源...

    java8看不到源码-java8-plugin-persitent-local-vars:javac(openJDK8)的插件,增加了对Jav

    这样做的原因是编译器使用的偏移字段值是在初始解析之后计算的,因此,在注入新字段之前。 为了解决这个问题,必须在注入新字段时手动更新偏移值。 这是什么 与 C99 static关键字类似,它用于指示一个局部变量,该...

    jocky混淆器的使用方式v1.2

    Jocky混淆编译器是在Sun JDK中提供的Java编译器(javac)的基础上完成的,修改了其中的代码生成过程,对编译器生成的中间代码进行混淆,最后再生成class文件,这样编译和混淆只需要一个步骤就可以完成。 二、使用方法 ...

    CustomSSM:模仿SSM框架手写自己的框架,加深对框架的理解

    因为在java反射中我使用了1.8独有的一些技术在利用反射进行读取方法信息时,无法得到方法参数的准确名字,而这个反射技术是在1.8才提供的而我们必须配置javac编译器的参数 -parameter 这时才会在.class文件中保存...

    JDK1.8(32位和64位)正式版+JDK1.8API帮助文档

    javac – 编译器,将源程序转成字节码 jar – 打包工具,将相关的类文件打包成一个文件 javadoc – 文档生成器,从源码注释中提取文档 jdb – debugger,查错工具 java – 运行编译后的java程序(.class后缀的) ...

    java 混淆工具,不可逆 jocky 也许是最好的了

    -- 下面的编译,将使用正常的Javac编译器 --> <javac destdir="bin3" debug="on" target="1.4"> <src path="src"></src> </javac> </project> 的Ant脚本示例> 注意: Jocky for Ant在Ant 1.6.5上开发,推荐使用...

    jdk1.8版本的安装包

    javac – 编译器,将源程序转成字节码 jar – 打包工具,将相关的类文件打包成一个文件 javadoc – 文档生成器,从源码注释中提取文档 jdb – debugger,查错工具 java – 运行编译后的java程序(.class后缀的) ...

    joc eclipse plugin

    -- 下面的编译,将使用正常的Javac编译器 --> <javac destdir=\"bin3\" debug=\"on\" target=\"1.4\"> <src path=\"src\"></src> </javac> </project> 的Ant脚本示例> 注意: Jocky for Ant在Ant 1.6.5...

    jocky 混肴编译rar包(ant和插件俩个版本)

    -- 下面的编译,将使用正常的Javac编译器 --> 14 <javac destdir="bin3" debug="on" target="1.4"> 15 <src path="src"></src> 16 </javac> 17 18 的Ant脚本示例> 注意: Jocky for Ant在Ant 1.6.5上开发,...

    计算机二级Java语言复习资料

    Java的编译器和解释器的扩展名为.exe,他们分别是javac.exe、java.exe。 通过Java编译器编译生成的是二进制字节码文件,其扩展名为.class。 调用applet小程序的HTML文件的扩展名为.html或.htm。 2. Java语言的...

    JDK8_LINUX.zip

    在开发的过程中,合适版本的JDK会提供对应的开发功能,JDK是Java的软件开发工具包,用于移动设备,嵌入式...而且JDK包含了JRE,同时还包含了编译java源码的编译器javac,选择需要版本的JDK会让你在开发的时候更加流畅。

    semantic-analyzer:Java语义分析器应用程序,用于Java编程语言的子集

    :语义分析(也包括上下文敏感分析)是编译器构造过程中的一个过程,通常在解析后从源代码中收集必要的语义信息。 它通常包括类型检查,或确保在使用前声明了一个变量,该变量无法用扩展Backus–Naur形式描述,因此...

    JAVA自学考课后答案

    (2)编译Java源文件:使用Java编译器(javac.exe)编译源文件得到字节码文件; (3)运行Java程序:Java程序分为两类----Java应用程序必须通过Java解释器(java.exe)来解释执行其字节码文件;Java小应用程序必须通过支持Java...

    jdk-17-linux-x64-bin.rpm

    jdk-17_linux-x64_bin.rpm是一个针对Linux x64架构的Java开发工具包(JDK)的软件包。JDK是Java开发的核心工具...JDK 17提供了一系列强大的功能和工具,包括Java编译器(javac)、Java虚拟机(JVM)、调试器(jdb)和性

    Java虚拟机

    10.2 Javac编译器 10.2.1 Javac的源码与调试 10.2.2 解析与填充符号表 10.2.3 注解处理器 10.2.4 语义分析与字节码生成 10.3 Java语法糖的味道 10.3.1 泛型与类型擦除 10.3.2 自动装箱、拆箱与遍历循环 ...

Global site tag (gtag.js) - Google Analytics